diff --git a/helpers.py b/helpers.py index bc4e8f1b..d8592d44 100644 --- a/helpers.py +++ b/helpers.py @@ -845,97 +845,7 @@ def summarize_wikipedia_article(full_text, company_name): return "FEHLER (API-Fehler bei Zusammenfassung)" -@retry_on_failure -def summarize_batch_openai(tasks_data): - """ - Fasst eine Liste von Rohtexten in einem einzigen OpenAI API Call zusammen. - Args: - tasks_data (list): Eine Liste von Dictionaries, jedes enthaelt: - {'row_num': int, 'raw_text': str} - - Returns: - dict: Ein Dictionary, das Zeilennummern auf ihre Zusammenfassungen mappt. - """ - logger = logging.getLogger(__name__) - if not tasks_data: return {} - - valid_tasks = [t for t in tasks_data if t.get("raw_text") and str(t["raw_text"]).strip().lower() not in ["k.a.", "k.a. (nur cookie-banner erkannt)", "k.a. (fehler)"]] - if not valid_tasks: - logger.debug("Keine gueltigen Rohtexte fuer Batch-Zusammenfassung gefunden.") - return {t['row_num']: "k.A. (Kein gueltiger Rohtext im Batch)" for t in tasks_data} - - logger.debug(f"Starte Batch-Zusammenfassung fuer {len(valid_tasks)} gueltige Texte (Zeilen: {[t['row_num'] for t in valid_tasks]})...") - - prompt_parts = [ - "Du bist ein KI-Assistent, der Webinhalte analysiert.", - "Fasse fuer JEDEN der folgenden Texte einer Unternehmenswebsite praegnant zusammen. ", - "Konzentriere dich dabei auf:\n" - "- Haupttaetigkeitsfeld des Unternehmens\n" - "- Wichtigste Produkte und/oder Dienstleistungen\n" - "- Zielgruppe (falls erkennbar)\n\n" - "Gib das Ergebnis fuer JEDEN Text im folgenden Format aus, auf einer neuen Zeile:\n" - "RESULTAT : \n\n", - "Halte jede Zusammenfassung kurz, max. 100 Woerter.\n\n", - "--- Texte zur Zusammenfassung ---" - ] - text_block = "" - row_numbers_in_batch = [] - max_chars_per_single_text_in_batch = 1500 - - for task in valid_tasks: - row_num = task['row_num'] - raw_text = str(task['raw_text']) - raw_text_short = raw_text[:max_chars_per_single_text_in_batch] - entry_text = f"\n--- TEXT Zeile {row_num} ---\n{raw_text_short}\n--- ENDE TEXT Zeile {row_num} ---\n" - text_block += entry_text - row_numbers_in_batch.append(row_num) - - if not row_numbers_in_batch: - logger.debug("Keine Zeilen uebrig fuer OpenAI Prompt nach Filterung/Kuerzung im Batch.") - return {t['row_num']: "k.A. (Kein Rohtext im Batch)" for t in tasks_data} - - prompt_parts.append(text_block) - prompt_parts.append("\n--- Ende der Texte ---") - prompt_parts.append("\nBitte gib NUR die 'RESULTAT : ...' Zeilen zurueck.") - final_prompt = "\n".join(prompt_parts) - - chat_response = None - try: - chat_response = call_openai_chat(final_prompt, temperature=0.2) - if not chat_response: - raise openai.error.APIError("Keine Antwort von OpenAI erhalten fuer Batch-Zusammenfassung.") - except Exception as e: - logger.error(f"Endgueltiger FEHLER beim OpenAI-Batch-Aufruf fuer Zusammenfassung: {e}") - return {row_num: f"FEHLER API: {str(e)[:100]}" for row_num in row_numbers_in_batch} - - summaries = {} - lines = chat_response.strip().split('\n') - parsed_count = 0 - for line in lines: - match = re.match(r"RESULTAT (\d+): (.*)", line.strip()) - if match: - row_num = int(match.group(1)) - summary_text = match.group(2).strip() - if row_num in row_numbers_in_batch: - summaries[row_num] = summary_text - parsed_count += 1 - - logger.debug(f"Batch-Zusammenfassung: {parsed_count} von {len(row_numbers_in_batch)} Zeilen erfolgreich geparst.") - - if parsed_count < len(row_numbers_in_batch): - logger.warning(f"Nicht alle Zeilen aus dem Batch ({len(row_numbers_in_batch)}) konnten in der OpenAI-Antwort ({len(lines)} Zeilen) geparst werden.") - logger.debug(f"Unerwartete Antwortteile (erste 500 Zeichen): {chat_response[:500]}") - for row_num in row_numbers_in_batch: - if row_num not in summaries: - summaries[row_num] = "FEHLER: Antwort nicht geparst" - - original_row_nums = {t['row_num'] for t in tasks_data} - for row_num in original_row_nums: - if row_num not in summaries: - summaries[row_num] = "k.A. (Kein gueltiger Rohtext im Batch)" - - return summaries # ============================================================================== # 9. OPENAI API WRAPPER (BRANCH EVALUATION)