FSM Pitch angepasst
This commit is contained in:
@@ -529,34 +529,34 @@ class DataProcessor:
|
|||||||
})
|
})
|
||||||
|
|
||||||
# --- NEUER SCHRITT: FSM Pitch generieren ---
|
# --- NEUER SCHRITT: FSM Pitch generieren ---
|
||||||
self.logger.info(f" Zeile {row_num_in_sheet}: Generiere FSM Pitch...")
|
if 'fsm_pitch' in chat_steps_to_run and self._needs_fsm_pitch(row_data, force_reeval):
|
||||||
try:
|
self.logger.info(f" -> Generiere FSM Pitch...")
|
||||||
# Hole die konsolidierten Mitarbeiter- und bekannten Technikerzahlen für den Pitch
|
try:
|
||||||
final_ma_val = self._get_cell_value_safe(row_data, "Finaler Mitarbeiter (Wiki>CRM)")
|
# Daten für den Pitch sammeln, die in diesem Durchlauf relevant sind
|
||||||
crm_techniker_val = self._get_cell_value_safe(row_data, "CRM Anzahl Techniker")
|
# Priorisiere die frisch generierte Branche, falle zurück auf Sheet-Daten
|
||||||
|
ki_branche = branch_result.get("branch") if branch_result else self._get_cell_value_safe(row_data, "Chat Vorschlag Branche")
|
||||||
# Verwende die validierte Branche aus dem vorherigen Schritt
|
if not ki_branche or "FEHLER" in ki_branche:
|
||||||
validierte_branche_fuer_pitch = branch_result.get("branch", crm_branche)
|
ki_branche = self._get_cell_value_safe(row_data, "CRM Branche")
|
||||||
if "FEHLER" in validierte_branche_fuer_pitch: validierte_branche_fuer_pitch = crm_branche
|
|
||||||
|
|
||||||
fsm_pitch_text = generate_fsm_argument(
|
# Rufe die neue, verbesserte Pitch-Funktion auf
|
||||||
company_name,
|
fsm_pitch_text = generate_fsm_pitch(
|
||||||
validierte_branche_fuer_pitch,
|
company_name=self._get_cell_value_safe(row_data, "CRM Name"),
|
||||||
website_summary,
|
company_short_name=self._get_cell_value_safe(row_data, "CRM Kurzform"),
|
||||||
final_wiki_data.get('first_paragraph', 'k.A.'),
|
ki_branche=ki_branche,
|
||||||
final_ma_val,
|
website_summary=self._get_cell_value_safe(row_data, "Website Zusammenfassung"),
|
||||||
crm_techniker_val
|
wiki_absatz=final_wiki_data.get('first_paragraph'), # Nutze die frischen Wiki-Daten
|
||||||
)
|
anzahl_ma=self._get_cell_value_safe(row_data, "Finaler Mitarbeiter (Wiki>CRM)"),
|
||||||
updates.append({
|
anzahl_techniker=self._get_cell_value_safe(row_data, "CRM Anzahl Techniker"),
|
||||||
'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["FSM Pitch"] + 1)}{row_num_in_sheet}',
|
techniker_bucket_ml=self._get_cell_value_safe(row_data, "Geschaetzter Techniker Bucket")
|
||||||
'values': [[fsm_pitch_text]]
|
)
|
||||||
})
|
|
||||||
except Exception as e_fsm_pitch:
|
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["FSM Pitch"] + 1)}{row_num_in_sheet}', 'values': [[fsm_pitch_text]]})
|
||||||
self.logger.error(f"FEHLER bei FSM-Pitch-Generierung für Zeile {row_num_in_sheet}: {e_fsm_pitch}")
|
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["FSM Pitch Timestamp"] + 1)}{row_num_in_sheet}', 'values': [[now_timestamp]]})
|
||||||
updates.append({
|
any_processing_done = True
|
||||||
'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["FSM Pitch"] + 1)}{row_num_in_sheet}',
|
chat_eval_just_ran = True # Signal, dass eine KI-Aktion stattfand
|
||||||
'values': [['k.A. (Fehler bei Generierung)']]
|
except Exception as e_fsm_pitch:
|
||||||
})
|
self.logger.error(f"FEHLER bei FSM-Pitch-Generierung für Zeile {row_num_in_sheet}: {e_fsm_pitch}")
|
||||||
|
updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["FSM Pitch"] + 1)}{row_num_in_sheet}', 'values': [['FEHLER (Generierung)']]} )
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1094,12 +1094,12 @@ class DataProcessor:
|
|||||||
|
|
||||||
self.logger.info(f"Re-Evaluierung abgeschlossen. {processed_count_actual} Zeilen verarbeitet.")
|
self.logger.info(f"Re-Evaluierung abgeschlossen. {processed_count_actual} Zeilen verarbeitet.")
|
||||||
|
|
||||||
def process_fsm_pitch(self, start_sheet_row=None, end_sheet_row=None, limit=None):
|
def process_fsm_pitch(self, start_sheet_row=None, end_sheet_row=None, limit=None):
|
||||||
"""
|
"""
|
||||||
Generiert FSM-Pitches für alle Zeilen, bei denen der FSM Pitch Timestamp fehlt,
|
Generiert FSM-Pitches für alle Zeilen, bei denen der Pitch oder der Timestamp fehlt.
|
||||||
aber die notwendigen Daten vorhanden sind.
|
Nutzt die neue, verbesserte generate_fsm_pitch Funktion.
|
||||||
"""
|
"""
|
||||||
self.logger.info(f"Starte Modus 'fsm_pitch'. Bereich: {start_sheet_row or 'Start'}-{end_sheet_row or 'Ende'}, Limit: {limit or 'Unbegrenzt'}")
|
self.logger.info(f"Starte Batch-Modus 'fsm_pitch'. Bereich: {start_sheet_row or 'Start'}-{end_sheet_row or 'Ende'}, Limit: {limit or 'Unbegrenzt'}")
|
||||||
|
|
||||||
if not self.sheet_handler.load_data():
|
if not self.sheet_handler.load_data():
|
||||||
self.logger.error("Fehler beim Laden der Daten für FSM-Pitch-Generierung.")
|
self.logger.error("Fehler beim Laden der Daten für FSM-Pitch-Generierung.")
|
||||||
@@ -1112,21 +1112,17 @@ class DataProcessor:
|
|||||||
effective_end = end_sheet_row if end_sheet_row is not None else len(all_data)
|
effective_end = end_sheet_row if end_sheet_row is not None else len(all_data)
|
||||||
|
|
||||||
tasks = []
|
tasks = []
|
||||||
# Sammle alle Zeilen, die für die Verarbeitung in Frage kommen
|
|
||||||
for i in range(effective_start - 1, effective_end):
|
for i in range(effective_start - 1, effective_end):
|
||||||
if limit is not None and len(tasks) >= limit:
|
if limit is not None and len(tasks) >= limit:
|
||||||
self.logger.info(f"Limit von {limit} zu verarbeitenden Zeilen erreicht. Stoppe das Sammeln von Tasks.")
|
|
||||||
break
|
break
|
||||||
|
|
||||||
row_data = all_data[i]
|
row_data = all_data[i]
|
||||||
# NEUE PRÜFUNG: Nur Zeilen ohne Timestamp verarbeiten
|
|
||||||
timestamp = self._get_cell_value_safe(row_data, "FSM Pitch Timestamp").strip()
|
timestamp = self._get_cell_value_safe(row_data, "FSM Pitch Timestamp").strip()
|
||||||
|
pitch = self._get_cell_value_safe(row_data, "FSM Pitch").strip()
|
||||||
|
|
||||||
if not timestamp:
|
if not timestamp or "fehler" in pitch.lower():
|
||||||
company_name = self._get_cell_value_safe(row_data, "CRM Name").strip()
|
company_name = self._get_cell_value_safe(row_data, "CRM Name").strip()
|
||||||
branche = self._get_cell_value_safe(row_data, "Chat Vorschlag Branche").strip() or self._get_cell_value_safe(row_data, "CRM Branche").strip()
|
if company_name:
|
||||||
|
|
||||||
if company_name and branche:
|
|
||||||
tasks.append({'row_num': i + 1, 'data': row_data})
|
tasks.append({'row_num': i + 1, 'data': row_data})
|
||||||
|
|
||||||
if not tasks:
|
if not tasks:
|
||||||
@@ -1146,73 +1142,36 @@ class DataProcessor:
|
|||||||
|
|
||||||
self.logger.debug(f"Verarbeite FSM-Pitch für Zeile {row_num}...")
|
self.logger.debug(f"Verarbeite FSM-Pitch für Zeile {row_num}...")
|
||||||
|
|
||||||
# --- NEUE PRÜFUNG ---
|
|
||||||
# Extrahiere die Beschreibungen VOR dem API-Call
|
|
||||||
website_summary = self._get_cell_value_safe(row_data, "Website Zusammenfassung")
|
|
||||||
wiki_absatz = self._get_cell_value_safe(row_data, "Wiki Absatz")
|
|
||||||
beschreibung = website_summary if website_summary and website_summary.lower() not in ['k.a.', ''] else wiki_absatz
|
|
||||||
|
|
||||||
# Wenn keine sinnvolle Beschreibung vorhanden ist, überspringe den API-Call
|
|
||||||
if not beschreibung or beschreibung.lower() in ['k.a.', '']:
|
|
||||||
self.logger.warning(f"Zeile {row_num}: Überspringe FSM-Pitch-Generierung, da keine Beschreibung vorhanden ist.")
|
|
||||||
all_sheet_updates.append({
|
|
||||||
'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["FSM Pitch"] + 1)}{row_num}',
|
|
||||||
'values': [['k.A. (Beschreibung fehlt)']]
|
|
||||||
})
|
|
||||||
# Wichtig: Trotzdem den Timestamp setzen, um diese Zeile nicht erneut zu versuchen
|
|
||||||
all_sheet_updates.append({
|
|
||||||
'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["FSM Pitch Timestamp"] + 1)}{row_num}',
|
|
||||||
'values': [[now_timestamp]]
|
|
||||||
})
|
|
||||||
processed_count += 1
|
|
||||||
continue # Springe zum nächsten Task in der Schleife
|
|
||||||
# --- ENDE NEUE PRÜFUNG ---
|
|
||||||
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# Extrahiere die restlichen Daten für den Pitch
|
# Rufe die neue, verbesserte Pitch-Funktion mit Daten aus dem Sheet auf
|
||||||
company_name = self._get_cell_value_safe(row_data, "CRM Name")
|
fsm_pitch_text = generate_fsm_pitch(
|
||||||
branche = self._get_cell_value_safe(row_data, "Chat Vorschlag Branche") or self._get_cell_value_safe(row_data, "CRM Branche")
|
company_name=self._get_cell_value_safe(row_data, "CRM Name"),
|
||||||
final_ma_val_str = self._get_cell_value_safe(row_data, "Finaler Mitarbeiter (Wiki>CRM)")
|
company_short_name=self._get_cell_value_safe(row_data, "CRM Kurzform"),
|
||||||
crm_techniker_val_str = self._get_cell_value_safe(row_data, "CRM Anzahl Techniker")
|
ki_branche=self._get_cell_value_safe(row_data, "Chat Vorschlag Branche"),
|
||||||
|
website_summary=self._get_cell_value_safe(row_data, "Website Zusammenfassung"),
|
||||||
fsm_pitch_text = generate_fsm_argument(
|
wiki_absatz=self._get_cell_value_safe(row_data, "Wiki Absatz"),
|
||||||
company_name,
|
anzahl_ma=self._get_cell_value_safe(row_data, "Finaler Mitarbeiter (Wiki>CRM)"),
|
||||||
branche,
|
anzahl_techniker=self._get_cell_value_safe(row_data, "CRM Anzahl Techniker"),
|
||||||
website_summary, # Wir übergeben die bereits ermittelten Werte
|
techniker_bucket_ml=self._get_cell_value_safe(row_data, "Geschaetzter Techniker Bucket")
|
||||||
wiki_absatz,
|
|
||||||
final_ma_val_str,
|
|
||||||
crm_techniker_val_str
|
|
||||||
)
|
)
|
||||||
|
|
||||||
all_sheet_updates.append({
|
all_sheet_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["FSM Pitch"] + 1)}{row_num}', 'values': [[fsm_pitch_text]]})
|
||||||
'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["FSM Pitch"] + 1)}{row_num}',
|
|
||||||
'values': [[fsm_pitch_text]]
|
|
||||||
})
|
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.logger.error(f"FEHLER bei FSM-Pitch-Generierung für Zeile {row_num}: {e}")
|
self.logger.error(f"FEHLER bei FSM-Pitch-Generierung für Zeile {row_num}: {e}")
|
||||||
all_sheet_updates.append({
|
all_sheet_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["FSM Pitch"] + 1)}{row_num}', 'values': [['FEHLER (Generierung)']]} )
|
||||||
'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["FSM Pitch"] + 1)}{row_num}',
|
|
||||||
'values': [['k.A. (Fehler bei Generierung)']]
|
|
||||||
})
|
|
||||||
|
|
||||||
# IMMER den Timestamp setzen
|
# IMMER den Timestamp setzen, auch bei Fehler, um Endlosschleifen zu vermeiden
|
||||||
all_sheet_updates.append({
|
all_sheet_updates.append({'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["FSM Pitch Timestamp"] + 1)}{row_num}', 'values': [[now_timestamp]]})
|
||||||
'range': f'{self.sheet_handler._get_col_letter(COLUMN_MAP["FSM Pitch Timestamp"] + 1)}{row_num}',
|
|
||||||
'values': [[now_timestamp]]
|
|
||||||
})
|
|
||||||
processed_count += 1
|
processed_count += 1
|
||||||
|
|
||||||
# NEU: Batch-Update, wenn die Größe erreicht ist oder es der letzte Task ist
|
# Batch-Update Logik
|
||||||
if (idx + 1) % update_batch_size == 0 or (idx + 1) == len(tasks):
|
if (idx + 1) % update_batch_size == 0 or (idx + 1) == len(tasks):
|
||||||
if all_sheet_updates:
|
if all_sheet_updates:
|
||||||
# Die Anzahl der bearbeiteten Zeilen in diesem Batch ist len(all_sheet_updates) / 2
|
|
||||||
num_rows_in_batch = len(all_sheet_updates) // 2
|
num_rows_in_batch = len(all_sheet_updates) // 2
|
||||||
self.logger.info(f"Sende Batch-Update für {num_rows_in_batch} FSM-Pitches (Verarbeitet bisher: {processed_count}/{len(tasks)})...")
|
self.logger.info(f"Sende Batch-Update für {num_rows_in_batch} FSM-Pitches (Verarbeitet bisher: {processed_count}/{len(tasks)})...")
|
||||||
self.sheet_handler.batch_update_cells(all_sheet_updates)
|
self.sheet_handler.batch_update_cells(all_sheet_updates)
|
||||||
all_sheet_updates = [] # Liste für den nächsten Batch leeren
|
all_sheet_updates = []
|
||||||
time.sleep(1) # Kurze Pause nach jedem Schreibvorgang
|
time.sleep(1)
|
||||||
|
|
||||||
self.logger.info(f"FSM-Pitch-Generierung abgeschlossen. {processed_count} Zeilen bearbeitet.")
|
self.logger.info(f"FSM-Pitch-Generierung abgeschlossen. {processed_count} Zeilen bearbeitet.")
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user