diff --git a/brancheneinstufung.py b/brancheneinstufung.py index 2a2c3321..460accf4 100644 --- a/brancheneinstufung.py +++ b/brancheneinstufung.py @@ -183,8 +183,78 @@ class Config: # --- Globale Spalten-Mapping (WICHTIG: MUSS ZU IHREM SHEET PASSEN!) --- +# --- Globale Spalten-Mapping (WICHTIG: MUSS ZU IHREM SHEET PASSEN!) --- +# Version 1.7.3 - 56 Spalten (A-BD) COLUMN_MAP = { - "ReEval Flag": 0, "CRM Name": 1, "CRM Kurzform": 2, "CRM Website": 3, "CRM Ort": 4, "CRM Beschreibung": 5, "CRM Branche": 6, "CRM Beschreibung Branche extern": 7, "CRM Anzahl Techniker": 8, "CRM Umsatz": 9, "CRM Anzahl Mitarbeiter": 10, "CRM Vorschlag Wiki URL": 11, "Wiki URL": 12, "Wiki Absatz": 13, "Wiki Branche": 14, "Wiki Umsatz": 15, "Wiki Mitarbeiter": 16, "Wiki Kategorien": 17, "Chat Wiki Konsistenzpruefung": 18, "Chat Begruendung Wiki Inkonsistenz": 19, "Chat Vorschlag Wiki Artikel": 20, "Begruendung bei Abweichung": 21, "Chat Vorschlag Branche": 22, "Chat Konsistenz Branche": 23, "Chat Begruendung Abweichung Branche": 24, "Chat Pruefung FSM Relevanz": 25, "Chat Begruendung fuer FSM Relevanz": 26, "Chat Schaetzung Anzahl Mitarbeiter": 27, "Chat Konsistenzpruefung Mitarbeiterzahl": 28, "Chat Begruendung Abweichung Mitarbeiterzahl": 29, "Chat Einschaetzung Anzahl Servicetechniker": 30, "Chat Begruendung Abweichung Anzahl Servicetechniker": 31, "Chat Schaetzung Umsatz": 32, "Chat Begruendung Abweichung Umsatz": 33, "Linked Serviceleiter gefunden": 34, "Linked It-Leiter gefunden": 35, "Linked Management gefunden": 36, "Linked Disponent gefunden": 37, "Contact Search Timestamp": 38, "Wikipedia Timestamp": 39, "Timestamp letzte Pruefung": 40, "Version": 41, "Tokens": 42, "Website Rohtext": 43, "Website Zusammenfassung": 44, "Website Scrape Timestamp": 45, "Geschaetzter Techniker Bucket": 46, "Finaler Umsatz (Wiki>CRM)": 47, "Finaler Mitarbeiter (Wiki>CRM)": 48, "Wiki Verif. Timestamp": 49, "SerpAPI Wiki Search Timestamp": 50 + # ReEval Flag & CRM-Daten (A-M) + "ReEval Flag": 0, # A + "CRM Name": 1, # B + "CRM Kurzform": 2, # C + "CRM Website": 3, # D + "CRM Ort": 4, # E + "CRM Land": 5, # F (NEU) + "CRM Beschreibung": 6, # G + "CRM Branche": 7, # H + "CRM Beschreibung Branche extern": 8, # I + "CRM Anzahl Techniker": 9, # J + "CRM Umsatz": 10, # K + "CRM Anzahl Mitarbeiter": 11, # L + "CRM Vorschlag Wiki URL": 12, # M + + # Wikipedia-Daten & -Status (N-AB) + "Wiki URL": 13, # N + "Wiki Sitz Stadt": 14, # O (NEU) + "Wiki Sitz Land": 15, # P (NEU) + "Wiki Absatz": 16, # Q + "Wiki Branche": 17, # R + "Wiki Umsatz": 18, # S + "Wiki Mitarbeiter": 19, # T + "Wiki Kategorien": 20, # U + "Wikipedia Timestamp": 21, # V (vorher AN) + "Wiki Verif. Timestamp": 22, # W (vorher AX) + "SerpAPI Wiki Search Timestamp": 23, # X (vorher AY) + "Chat Wiki Konsistenzpruefung": 24, # Y (vorher S) + "Chat Begründung Wiki Inkonsistenz": 25, # Z (vorher T) + "Chat Vorschlag Wiki Artikel": 26, # AA (vorher U) + "Begründung bei Abweichung": 27, # AB (vorher V) + + # Website-Daten (AC-AG) + "Website Rohtext": 28, # AC (vorher AR) + "Website Zusammenfassung": 29, # AD (vorher AS) + "Website Meta-Details": 30, # AE (NEU) + "Website Scrape Timestamp": 31, # AF (vorher AT) + "URL Prüfstatus": 32, # AG (NEU für URL_CHECK_NEEDED etc.) + + # ChatGPT Branchen- & weitere Schätzungen (AH-AT) + "Chat Vorschlag Branche": 33, # AH (vorher W) + "Chat Konsistenz Branche": 34, # AI (vorher X) + "Chat Begründung Abweichung Branche": 35, # AJ (vorher Y) + "Chat Prüfung FSM Relevanz": 36, # AK (vorher Z) + "Chat Begründung für FSM Relevanz": 37, # AL (vorher AA) + "Chat Schätzung Anzahl Mitarbeiter": 38, # AM (vorher AB) + "Chat Konsistenzprüfung Mitarbeiterzahl": 39, # AN (vorher AC) + "Chat Begründung Abweichung Mitarbeiterzahl": 40, # AO (vorher AD) + "Chat Einschätzung Anzahl Servicetechniker": 41, # AP (vorher AE) + "Chat Begründung Abweichung Anzahl Servicetechniker": 42, # AQ (vorher AF) + "Chat Schätzung Umsatz": 43, # AR (vorher AG) + "Chat Begründung Abweichung Umsatz": 44, # AS (vorher AH) + + # LinkedIn-Kontakte (AT-AW) + "Linked Serviceleiter gefunden": 45, # AT (vorher AI) + "Linked It-Leiter gefunden": 46, # AU (vorher AJ) + "Linked Management gefunden": 47, # AV (vorher AK) + "Linked Disponent gefunden": 48, # AW (vorher AL) + + # Konsolidierte Werte & ML (AX-AZ) + "Finaler Umsatz (Wiki>CRM)": 49, # AX (vorher AV) + "Finaler Mitarbeiter (Wiki>CRM)": 50, # AY (vorher AW) + "Geschaetzter Techniker Bucket": 51, # AZ (vorher AU) + + # Timestamps (Rest) & System (BA-BD) + "Contact Search Timestamp": 52, # BA (vorher AM) + "Timestamp letzte Prüfung": 53, # BB (vorher AO, ChatGPT-bezogen) + "Version": 54, # BC (vorher AP) + "Tokens": 55, # BD (vorher AQ) } # --- Globale Variablen fuer Branch Mapping (werden von load_target_schema() befuellt) --- @@ -2371,170 +2441,154 @@ def is_valid_wikipedia_article_url(url_to_check, lang=None): def alignment_demo(sheet): logger = logging.getLogger(__name__) + logger.info("Starte Alignment Demo für das Hauptblatt...") new_headers = [ [ # Zeile 1: Spaltenname - "ReEval Flag", "CRM Name", "CRM Kurzform", "CRM Website", "CRM Ort", "CRM Beschreibung", "CRM Branche", "CRM Beschreibung Branche extern", "CRM Anzahl Techniker", "CRM Umsatz", "CRM Anzahl Mitarbeiter", "CRM Vorschlag Wiki URL", - "Wiki URL", "Wiki Absatz", "Wiki Branche", "Wiki Umsatz", "Wiki Mitarbeiter", "Wiki Kategorien", - "Chat Wiki Konsistenzpruefung", "Chat Begründung Wiki Inkonsistenz", "Chat Vorschlag Wiki Artikel", "Begründung bei Abweichung", - "Chat Vorschlag Branche", "Chat Konsistenz Branche", "Chat Begründung Abweichung Branche", - "Chat Prüfung FSM Relevanz", "Chat Begründung für FSM Relevanz", - "Chat Schätzung Anzahl Mitarbeiter", "Chat Konsistenzprüfung Mitarbeiterzahl", "Chat Begründung Abweichung Mitarbeiterzahl", - "Chat Einschätzung Anzahl Servicetechniker", "Chat Begründung Abweichung Anzahl Servicetechniker", - "Chat Schätzung Umsatz", "Chat Begründung Abweichung Umsatz", + "ReEval Flag", "CRM Name", "CRM Kurzform", "CRM Website", "CRM Ort", "CRM Land", "CRM Beschreibung", "CRM Branche", "CRM Beschreibung Branche extern", "CRM Anzahl Techniker", "CRM Umsatz", "CRM Anzahl Mitarbeiter", "CRM Vorschlag Wiki URL", + "Wiki URL", "Wiki Sitz Stadt", "Wiki Sitz Land", "Wiki Absatz", "Wiki Branche", "Wiki Umsatz", "Wiki Mitarbeiter", "Wiki Kategorien", "Wikipedia Timestamp", "Wiki Verif. Timestamp", "SerpAPI Wiki Search Timestamp", "Chat Wiki Konsistenzpruefung", "Chat Begründung Wiki Inkonsistenz", "Chat Vorschlag Wiki Artikel", "Begründung bei Abweichung", + "Website Rohtext", "Website Zusammenfassung", "Website Meta-Details", "Website Scrape Timestamp", "URL Prüfstatus", + "Chat Vorschlag Branche", "Chat Konsistenz Branche", "Chat Begründung Abweichung Branche", "Chat Prüfung FSM Relevanz", "Chat Begründung für FSM Relevanz", "Chat Schätzung Anzahl Mitarbeiter", "Chat Konsistenzprüfung Mitarbeiterzahl", "Chat Begründung Abweichung Mitarbeiterzahl", "Chat Einschätzung Anzahl Servicetechniker", "Chat Begründung Abweichung Anzahl Servicetechniker", "Chat Schätzung Umsatz", "Chat Begründung Abweichung Umsatz", "Linked Serviceleiter gefunden", "Linked It-Leiter gefunden", "Linked Management gefunden", "Linked Disponent gefunden", - "Contact Search Timestamp", "Wikipedia Timestamp", "Timestamp letzte Prüfung", "Version", "Tokens", - "Website Rohtext", "Website Zusammenfassung", "Website Scrape Timestamp", - "Geschaetzter Techniker Bucket", "Finaler Umsatz (Wiki>CRM)", "Finaler Mitarbeiter (Wiki>CRM)", - "Wiki Verif. Timestamp", "SerpAPI Wiki Search Timestamp", - "Website Meta-Details" # <<< NEUE SPALTE AZ + "Finaler Umsatz (Wiki>CRM)", "Finaler Mitarbeiter (Wiki>CRM)", "Geschaetzter Techniker Bucket", + "Contact Search Timestamp", "Timestamp letzte Prüfung", "Version", "Tokens" ], [ # Zeile 2: Quelle der Daten - "CRM", "CRM", "CRM", "CRM", "CRM", "CRM", "CRM", "CRM", "CRM", "CRM", "CRM", "CRM", - "Wikipediascraper/SerpAPI/ChatGPT/Manuell", "Wikipediascraper", "Wikipediascraper", "Wikipediascraper", "Wikipediascraper", "Wikipediascraper", - "ChatGPT API", "ChatGPT API", "ChatGPT API", "System/Manuell", - "ChatGPT API", "System/ChatGPT API", "ChatGPT API", - "ChatGPT API", "ChatGPT API", - "ChatGPT API", "System/ChatGPT API", "ChatGPT API", - "ChatGPT API", "ChatGPT API", - "ChatGPT API", "ChatGPT API", + "CRM", "CRM", "CRM", "CRM", "CRM", "CRM/Manuell", "CRM", "CRM", "CRM", "CRM", "CRM", "CRM", "CRM", + "Wikipediascraper/SerpAPI/ChatGPT/Manuell", "Wikipediascraper", "Wikipediascraper", "Wikipediascraper", "Wikipediascraper", "Wikipediascraper", "Wikipediascraper", "Wikipediascraper", "System", "System", "System", "ChatGPT API", "ChatGPT API", "ChatGPT API", "System/Manuell", + "Web Scraper", "ChatGPT API", "Web Scraper", "System", "System/Web Scraper", + "ChatGPT API", "System/ChatGPT API", "ChatGPT API", "ChatGPT API", "ChatGPT API", "ChatGPT API", "System/ChatGPT API", "ChatGPT API", "ChatGPT API", "ChatGPT API", "ChatGPT API", "ChatGPT API", "LinkedIn (via SerpApi)", "LinkedIn (via SerpApi)", "LinkedIn (via SerpApi)", "LinkedIn (via SerpApi)", - "System", "System", "System", "System", "System", - "Web Scraper", "ChatGPT API", "System", - "ML Modell / Skript", "Skript (Wiki/CRM Logik)", "Skript (Wiki/CRM Logik)", - "System", "System", - "Web Scraper (Modus 'website_details')" # <<< NEUE SPALTE AZ + "Skript (Wiki/CRM Logik)", "Skript (Wiki/CRM Logik)", "ML Modell / Skript", + "System", "System", "System", "System" ], [ # Zeile 3: Feldkategorie - "Prozess", "Firmenname", "Firmenname", "Website", "Ort", "Beschreibung (Text)", "Branche", "Branche", "Anzahl Servicetechniker", "Umsatz", "Anzahl Mitarbeiter", "Wikipedia Artikel URL", - "Wikipedia Artikel URL", "Beschreibung (Text)", "Branche", "Umsatz", "Anzahl Mitarbeiter", "Kategorien (Text)", - "Verifizierung Wiki-Artikel", "Begründung Verifizierung", "Wikipedia Artikel URL (Vorschlag)", "Begründung URL-Abweichung", - "Branche (Vorschlag KI)", "Branche (Konsistenz)", "Branche (Begründung KI)", - "FSM Relevanz (KI)", "FSM Relevanz (Begründung KI)", - "Anzahl Mitarbeiter (KI)", "Anzahl Mitarbeiter (Konsistenz KI)", "Anzahl Mitarbeiter (Begründung KI)", - "Anzahl Servicetechniker (KI)", "Anzahl Servicetechniker (Begründung KI)", - "Umsatz (KI)", "Umsatz (Begründung KI)", + "Prozess", "Firmenname", "Firmenname", "Website", "Ort", "Land", "Beschreibung (Text)", "Branche", "Branche", "Anzahl Servicetechniker", "Umsatz", "Anzahl Mitarbeiter", "Wikipedia Artikel URL", + "Wikipedia Artikel URL", "Ort", "Land", "Beschreibung (Text)", "Branche", "Umsatz", "Anzahl Mitarbeiter", "Kategorien (Text)", "Timestamp", "Timestamp", "Timestamp", "Verifizierung Wiki-Artikel", "Begründung Verifizierung", "Wikipedia Artikel URL (Vorschlag)", "Begründung URL-Abweichung", + "Website-Content", "Website-Content (Zusammenfassung)", "Website-Content (Meta)", "Timestamp", "Prozess-Status", + "Branche (Vorschlag KI)", "Branche (Konsistenz)", "Branche (Begründung KI)", "FSM Relevanz (KI)", "FSM Relevanz (Begründung KI)", "Anzahl Mitarbeiter (KI)", "Anzahl Mitarbeiter (Konsistenz KI)", "Anzahl Mitarbeiter (Begründung KI)", "Anzahl Servicetechniker (KI)", "Anzahl Servicetechniker (Begründung KI)", "Umsatz (KI)", "Umsatz (Begründung KI)", "Kontakte (Anzahl)", "Kontakte (Anzahl)", "Kontakte (Anzahl)", "Kontakte (Anzahl)", - "Timestamp", "Timestamp", "Timestamp", "Skript Version", "API Tokens", - "Website-Content", "Website-Content (Zusammenfassung)", "Timestamp", - "Anzahl Servicetechniker (Bucket ML)", "Umsatz (Konsolidiert)", "Anzahl Mitarbeiter (Konsolidiert)", - "Timestamp", "Timestamp", - "Website-Content (Meta)" # <<< NEUE SPALTE AZ + "Umsatz (Konsolidiert)", "Anzahl Mitarbeiter (Konsolidiert)", "Anzahl Servicetechniker (Bucket ML)", + "Timestamp", "Timestamp", "Skript Version", "API Tokens" ], [ # Zeile 4: Kurze Beschreibung - "Systemspalte, irrelevant für den Prompt. Wird genutzt um die manuelle Neuprüfung dieses Accounts durchzuführen ('x' setzen).", - "Enthält den Firmennamen nach bestem Gewissen...", # (wie gehabt) - "Enthält eine manuell gepflegte (normalisierte) Kurzform des Firmennamens...", # (wie gehabt) - "Von uns ermittelte Website des Unternehmens, sofern verfügbar. Kann durch Modi 'website_lookup' oder 'check_urls' aktualisiert werden.", - "Von uns ermittelter Ort des Unternehmens.", - "Kurze Beschreibung des Unternehmens aus CRM.", - "Aktuelle Branchenzuweisung entsprechend unserem Ziel-Branchenschema (manuell oder aus Altsystem).", - "Von Dealfront gelieferte externe Beschreibung der Branche...", # (wie gehabt) - "Von uns Recherchierte Anzahl der Servicetechniker...", # (wie gehabt) - "Von uns recherchierter Umsatz in Mio. € (aus CRM).", - "Von uns recherchierte Anzahl der Mitarbeiter (aus CRM).", - "Enthält aus einer alten Recherche Vorschläge für die Wikipedia URL zum Unternehmen...", # (wie gehabt) - "Finale Wikipedia URL des Unternehmens. Quelle: Wikipedia-Scraper (Suche/Extraktion), SerpAPI (Neusuche), ChatGPT (Vorschlag U nach Prüfung), oder manuelle Eingabe.", - "Erster aussagekräftiger Absatz des Wikipedia-Artikels (M).", - "Aus der Wikipedia-Infobox extrahierte Branche(n).", - "Aus der Wikipedia-Infobox extrahierter Umsatz (normalisiert in Mio. €).", - "Aus der Wikipedia-Infobox extrahierte Mitarbeiterzahl (normalisiert).", - "Komma-separierte Liste der Kategorien, denen der Artikel in Wikipedia zugewiesen wurde...", # (wie gehabt) - "Ergebnis der ChatGPT-Prüfung, ob der Wiki-Artikel (M) zum Unternehmen passt. Mögliche Werte: 'OK', 'X', '?' (Verifizierung ausstehend/erneut nötig), 'X (URL Copied)', 'X (Invalid Suggestion)', 'FEHLER'.", - "Von ChatGPT generierte Begründung, falls der Wiki-Artikel (M) als inkonsistent zum Unternehmen bewertet wurde.", - "Von ChatGPT vorgeschlagene alternative Wikipedia-URL, falls der Artikel in M als unpassend bewertet wurde. Kann auch 'Kein passender Artikel gefunden' enthalten.", - "Wird derzeit primär geleert bei Wiki-Updates/-Verifizierung. Ursprünglich gedacht für Begründung bei Abweichung CRM-Vorschlag-URL (L) vs. gefundener Wiki-URL (M).", - "Branchenvorschlag von ChatGPT basierend auf allen verfügbaren Informationen (CRM, Wiki, Website), abgeglichen mit dem Ziel-Branchenschema.", - "Konsistenzprüfung: 'ok', wenn ChatGPT-Vorschlag (W) mit der extrahierten CRM-Kurzform (aus G) übereinstimmt; 'X' bei Abweichung; oder spezifischer Status bei Fallback-Logik in `evaluate_branche_chatgpt`.", - "Von ChatGPT generierte Begründung für den Branchenvorschlag (W) und ggf. für die Abweichung zur CRM-Branche.", - "Bewertung der FSM-Relevanz durch ChatGPT (z.B. 'Ja', 'Nein', 'Vielleicht'). Platzhalter für zukünftige Implementierung.", - "Von ChatGPT generierte Begründung für die Einschätzung der FSM-Relevanz. Platzhalter.", - "Von ChatGPT geschätzte Anzahl der Mitarbeiter. Platzhalter für zukünftige Implementierung.", - "Konsistenzprüfung der von ChatGPT geschätzten Mitarbeiterzahl (AB) mit CRM (K) und Wiki (Q) Werten. Platzhalter.", - "Von ChatGPT generierte Begründung bei signifikanter Abweichung der geschätzten Mitarbeiterzahl. Platzhalter.", - "Von ChatGPT geschätzte Anzahl der Servicetechniker (als Bucket oder konkrete Zahl). Platzhalter für zukünftige Implementierung.", - "Von ChatGPT generierte Begründung für die Einschätzung der Servicetechniker-Anzahl, insbesondere bei Abweichung zu CRM (I). Platzhalter.", - "Von ChatGPT geschätzter Umsatz. Platzhalter für zukünftige Implementierung.", - "Von ChatGPT generierte Begründung bei signifikanter Abweichung der geschätzten Umsatzzahlen. Platzhalter.", - "Anzahl der via SerpAPI gefundenen LinkedIn-Kontakte für die Kategorie 'Serviceleiter'.", - "Anzahl der via SerpAPI gefundenen LinkedIn-Kontakte für die Kategorie 'IT-Leiter'.", - "Anzahl der via SerpAPI gefundenen LinkedIn-Kontakte für die Kategorie 'Management'.", - "Anzahl der via SerpAPI gefundenen LinkedIn-Kontakte für die Kategorie 'Disponent'.", - "Zeitstempel der letzten Kontaktsuche via SerpAPI für diese Zeile.", - "Zeitstempel der letzten Wikipedia-Suche und Datenextraktion für diese Zeile.", - "Zeitstempel der letzten übergreifenden Prüfung/Bewertung durch ChatGPT (z.B. Branchenevaluation).", - "Version des Skripts, die diese Zeile zuletzt signifikant bearbeitet hat.", - "Geschätzte oder gezählte Anzahl der Tokens, die für OpenAI API-Aufrufe für diese Zeile verbraucht wurden (kumulativ oder letzter Call).", - "Roh extrahierter, unformatierter Textinhalt des Haupt-Content-Bereichs der Unternehmenswebsite (nach Entfernung von Bannern, Skripten, Styles). Dient als Basis für die KI-Zusammenfassung. Kann auch Fehlermeldungen enthalten (z.B. \"k.A. (Timeout)\", \"URL_CHECK_NEEDED\").", - "KI-generierte, prägnante Zusammenfassung des Website-Rohtextes (AR). Fokus auf Haupttätigkeit, Produkte/Dienstleistungen, Zielgruppe.", - "Zeitstempel des letzten Versuchs, die Website zu scrapen und den Rohtext (AR) sowie die Zusammenfassung (AS) zu generieren.", - "Ergebnis der Schätzung durch das trainierte Machine-Learning-Modell. Gibt den wahrscheinlichsten Bucket für die Anzahl der Servicetechniker an.", - "Konsolidierter Umsatzwert in Mio. €. Priorisiert den Wert aus Wikipedia (P), falls vorhanden und numerisch, ansonsten den Wert aus CRM (J).", - "Konsolidierte Mitarbeiterzahl. Priorisiert den Wert aus Wikipedia (Q), falls vorhanden und numerisch, ansonsten den Wert aus CRM (K).", - "Zeitstempel der letzten Wikipedia-Artikel-Verifizierung durch ChatGPT (Spalten S-U).", - "Zeitstempel des letzten Versuchs, eine fehlende Wikipedia-URL (M) über SerpAPI zu suchen (Modi `find_wiki_serp` oder `check_urls`).", - "Extrahierte Meta-Daten der Website: Title, Meta-Description, H1-H3 Überschriften. Wird vom Modus 'website_details' befüllt." # <<< NEUE SPALTE AZ + "Systemspalte, irrelevant für den Prompt. 'x' markiert Zeile für Re-Evaluation.", #A + "Enthält den Firmennamen nach bestem Gewissen...", #B + "Enthält eine manuell gepflegte (normalisierte) Kurzform des Firmennamens...", #C + "Von uns ermittelte Website des Unternehmens. Kann durch 'website_lookup' oder 'check_urls' aktualisiert werden.", #D + "Von uns ermittelter Ort des Unternehmens.", #E + "Land des Unternehmenssitzes laut CRM (manuell zu pflegen).", #F NEU + "Kurze Beschreibung des Unternehmens aus CRM.", #G + "Aktuelle Branchenzuweisung entsprechend unserem Ziel-Branchenschema (manuell oder aus Altsystem).", #H + "Von Dealfront gelieferte externe Beschreibung der Branche...", #I + "Von uns Recherchierte Anzahl der Servicetechniker...", #J + "Von uns recherchierter Umsatz in Mio. € (aus CRM).", #K + "Von uns recherchierte Anzahl der Mitarbeiter (aus CRM).", #L + "Enthält aus einer alten Recherche Vorschläge für die Wikipedia URL zum Unternehmen...", #M + "Finale Wikipedia URL des Unternehmens.", #N + "Aus Wikipedia-Infobox extrahierte Stadt des Unternehmenssitzes.", #O NEU + "Aus Wikipedia-Infobox extrahiertes Land des Unternehmenssitzes.", #P NEU + "Erster aussagekräftiger Absatz des Wikipedia-Artikels (N).", #Q + "Aus der Wikipedia-Infobox extrahierte Branche(n).", #R + "Aus der Wikipedia-Infobox extrahierter Umsatz (normalisiert in Mio. €).", #S + "Aus der Wikipedia-Infobox extrahierte Mitarbeiterzahl (normalisiert).", #T + "Komma-separierte Liste der Kategorien, denen der Artikel in Wikipedia zugewiesen wurde...", #U + "Zeitstempel der letzten Wikipedia-Suche und Datenextraktion für diese Zeile.", #V + "Zeitstempel der letzten Wikipedia-Artikel-Verifizierung durch ChatGPT (Spalten Y-AA).", #W + "Zeitstempel des letzten Versuchs, eine fehlende Wiki-URL (N) über SerpAPI zu suchen.", #X + "Ergebnis der ChatGPT-Prüfung, ob der Wiki-Artikel (N) zum Unternehmen passt. ('OK', 'X', '?', 'FEHLER', etc.)", #Y + "Von ChatGPT generierte Begründung, falls der Wiki-Artikel (N) als inkonsistent zum Unternehmen bewertet wurde.", #Z + "Von ChatGPT vorgeschlagene alternative Wikipedia-URL, falls der Artikel in N als unpassend bewertet wurde.", #AA + "Wird derzeit primär geleert. Ursprünglich für Begründung bei Abweichung CRM Vorschlag Wiki URL (M alt) vs. gefundener Wiki-URL (N).", #AB + "Roh extrahierter Textinhalt der Website. Basis für Zusammenfassung. Kann auch Fehlermeldungen oder Marker enthalten.", #AC + "KI-generierte Zusammenfassung des Website-Rohtextes (AC).", #AD + "Extrahierte Meta-Daten der Website: Title, Meta-Description, H1-H3 Überschriften.", #AE NEU + "Zeitstempel des letzten Website-Scraping/Summarization-Versuchs (für AC, AD).", #AF + "Status der URL-Prüfung (z.B. 'URL_CHECK_NEEDED', 'URL_OK').", #AG NEU + "Branchenvorschlag von ChatGPT basierend auf allen verfügbaren Informationen.", #AH + "Konsistenzprüfung: 'ok', wenn ChatGPT-Vorschlag (AH) mit CRM-Branche (H) übereinstimmt.", #AI + "Von ChatGPT generierte Begründung für den Branchenvorschlag (AH).", #AJ + "Bewertung der FSM-Relevanz durch ChatGPT. (Platzhalter)", #AK + "Von ChatGPT generierte Begründung für die Einschätzung der FSM-Relevanz. (Platzhalter)", #AL + "Von ChatGPT geschätzte Anzahl der Mitarbeiter. (Platzhalter)", #AM + "Konsistenzprüfung der von ChatGPT geschätzten Mitarbeiterzahl (AM). (Platzhalter)", #AN + "Von ChatGPT generierte Begründung bei signifikanter Abweichung der geschätzten Mitarbeiterzahl. (Platzhalter)", #AO + "Von ChatGPT geschätzte Anzahl der Servicetechniker. (Platzhalter)", #AP + "Von ChatGPT generierte Begründung für die Einschätzung der Servicetechniker-Anzahl. (Platzhalter)", #AQ + "Von ChatGPT geschätzter Umsatz. (Platzhalter)", #AR + "Von ChatGPT generierte Begründung bei signifikanter Abweichung der geschätzten Umsatzzahlen. (Platzhalter)", #AS + "Anzahl der via SerpAPI gefundenen LinkedIn-Kontakte für die Kategorie 'Serviceleiter'.", #AT + "Anzahl der via SerpAPI gefundenen LinkedIn-Kontakte für die Kategorie 'IT-Leiter'.", #AU + "Anzahl der via SerpAPI gefundenen LinkedIn-Kontakte für die Kategorie 'Management'.", #AV + "Anzahl der via SerpAPI gefundenen LinkedIn-Kontakte für die Kategorie 'Disponent'.", #AW + "Konsolidierter Umsatzwert in Mio. €. Priorisiert Wiki (S) > CRM (K).", #AX + "Konsolidierte Mitarbeiterzahl. Priorisiert Wiki (T) > CRM (L).", #AY + "Ergebnis der Schätzung durch das trainierte Machine-Learning-Modell.", #AZ + "Zeitstempel der letzten Kontaktsuche via SerpAPI für diese Zeile.", #BA + "Zeitstempel der letzten übergreifenden Prüfung/Bewertung durch ChatGPT (z.B. Branchenevaluation AH-AS).", #BB + "Version des Skripts, die diese Zeile zuletzt signifikant bearbeitet hat.", #BC + "Verbrauchte Tokens für OpenAI API-Aufrufe für diese Zeile." #BD ], [ # Zeile 5: Aufgabe / Funktion - "Datenquelle/Prozesssteuerung: 'x' markiert Zeile für Re-Evaluation in Modus 'reeval'.", - "Datenquelle: Firmenname aus CRM.", # (wie gehabt) - "Datenquelle: Manuell gepflegte Kurzform des Firmennamens, primär für API-Suchen (LinkedIn, SerpAPI) genutzt.", # (wie gehabt) - "Datenquelle/Ziel: Website des Unternehmens. Kann durch 'website_lookup' oder 'check_urls' aktualisiert werden.", - "Datenquelle: Ort des Unternehmens aus CRM.", - "Datenquelle: Beschreibung aus CRM. Input für KI-Analysen.", - "Datenquelle: Branchenkategorie aus CRM. Referenz für KI-Branchenbewertung.", - "Datenquelle: Externe Branchenbeschreibung (z.B. Dealfront). Input für KI-Branchenbewertung.", - "Datenquelle: Recherchierte Anzahl Servicetechniker. Dient als Ground Truth für ML-Training und Validierung der KI-Schätzung.", - "Datenquelle: Umsatz aus CRM. Input für Konsolidierung und ML.", - "Datenquelle: Mitarbeiterzahl aus CRM. Input für Konsolidierung und ML.", - "Datenquelle: Alte/vorgeschlagene Wiki-URL aus CRM. Dient als initialer Input für Wiki-Prozess.", - "Ziel/Quelle: Finale, als relevant erachtete Wikipedia-URL. Quelle: Wikipedia-Scraper (Suche/Extraktion), SerpAPI (Neusuche), ChatGPT (Vorschlag U nach Prüfung) oder manuelle Eingabe.", - "Quelle: Erster Absatz des Wikipedia-Artikels (M). Input für KI-Analysen, z.B. Wiki-Verifizierung.", - "Quelle: Aus Wikipedia-Infobox extrahierte Branche(n). Input für KI-Branchenbewertung.", - "Quelle: Aus Wikipedia-Infobox extrahierter Umsatz. Input für Konsolidierung und ML.", - "Quelle: Aus Wikipedia-Infobox extrahierte Mitarbeiterzahl. Input für Konsolidierung und ML.", - "Quelle: Wikipedia-Kategorien des Artikels (M). Input für KI-Analysen, z.B. Wiki-Verifizierung und Branchenbewertung.", - "Ziel: Ergebnis der ChatGPT-Konsistenzprüfung für Wiki-Artikel (M). Status '?' triggert erneute Prüfung im Modus 'wiki_verify'.", - "Ziel: Begründung von ChatGPT, falls Wiki-Artikel (M) als inkonsistent bewertet wurde.", - "Ziel: Von ChatGPT vorgeschlagene alternative Wiki-URL. Wird von Modus 'update_wiki_suggestions' verarbeitet.", - "Ziel/Info: Wird aktuell primär geleert. Könnte für detaillierte Begründungen bei URL-Abweichungen (z.B. CRM-Vorschlag vs. finaler URL) genutzt werden.", - "Ziel: Von ChatGPT final vorgeschlagene Branche gemäß Zielschema. Hauptziel der Branchenklassifizierung.", - "Ziel: Ergebnis des Abgleichs zwischen KI-Branchenvorschlag (W) und CRM-Branche (G).", - "Ziel: Von ChatGPT generierte Begründung für den Branchenvorschlag (W).", - "Ziel: Ergebnis der FSM-Relevanzprüfung durch ChatGPT. (Platzhalter)", - "Ziel: Begründung von ChatGPT für die FSM-Relevanz. (Platzhalter)", - "Ziel: Von ChatGPT geschätzte Mitarbeiterzahl. (Platzhalter)", - "Ziel: Konsistenzprüfung der KI-Mitarbeiterschätzung. (Platzhalter)", - "Ziel: Begründung von ChatGPT bei Abweichung der Mitarbeiterschätzung. (Platzhalter)", - "Ziel: Von ChatGPT geschätzte Anzahl Servicetechniker. (Platzhalter)", - "Ziel: Begründung von ChatGPT bei Abweichung der Technikerzahl-Schätzung. (Platzhalter)", - "Ziel: Von ChatGPT geschätzter Umsatz. (Platzhalter)", - "Ziel: Begründung von ChatGPT bei Abweichung der Umsatzschätzung. (Platzhalter)", - "Ziel: Anzahl gefundener LinkedIn-Kontakte (Serviceleiter) via SerpAPI.", - "Ziel: Anzahl gefundener LinkedIn-Kontakte (IT-Leiter) via SerpAPI.", - "Ziel: Anzahl gefundener LinkedIn-Kontakte (Management) via SerpAPI.", - "Ziel: Anzahl gefundener LinkedIn-Kontakte (Disponent) via SerpAPI.", - "System: Timestamp der letzten Kontaktsuche (Modus 'contacts'). Steuert Wiederholung.", - "System: Timestamp der letzten Wikipedia-Suche/Extraktion (Modi 'wiki', 'full_run', 'reeval', 'wiki_reextract_missing_an'). Steuert Wiederholung.", - "System: Timestamp der letzten übergreifenden ChatGPT-Evaluation (Modi 'chat', 'full_run', 'reeval', 'branch_eval'). Steuert Wiederholung.", - "System: Skriptversion, die die Zeile zuletzt signifikant bearbeitet hat.", - "System: Verbrauchte Tokens für OpenAI-Aufrufe für diese Zeile. (Implementierung ausstehend)", - "Ziel: Rohtext der Website. Input für Zusammenfassung (AS).", - "Ziel: KI-generierte Zusammenfassung des Website-Rohtextes (AR). Input für Branchenbewertung (W).", - "System: Timestamp des letzten Website-Scraping/Summarization-Versuchs. Steuert Wiederholung.", - "Ziel: Vom ML-Modell vorhergesagter Bucket für die Anzahl der Servicetechniker.", - "Ziel: Konsolidierter Umsatz (Wiki-Wert > CRM-Wert). Input für ML-Modell.", - "Ziel: Konsolidierte Mitarbeiterzahl (Wiki-Wert > CRM-Wert). Input für ML-Modell.", - "System: Timestamp der letzten Wiki-Verifizierung durch ChatGPT (Modus 'wiki_verify'). Steuert Wiederholung.", - "System: Timestamp der letzten SerpAPI-Suche nach einer fehlenden Wiki-URL (Modi 'find_wiki_serp', 'check_urls'). Steuert Wiederholung.", - "Quelle/Ziel: Strukturierte Meta-Daten der Website (Title, Description, H-Tags). Wird vom Modus 'website_details' befüllt und kann für Analysen/Validierungen genutzt werden." # <<< NEUE SPALTE AZ + "Datenquelle/Prozesssteuerung: 'x' markiert Zeile für Re-Evaluation in Modus 'reeval'.", #A + "Datenquelle: Firmenname aus CRM.", #B + "Datenquelle: Manuell gepflegte Kurzform des Firmennamens, primär für API-Suchen (LinkedIn, SerpAPI) genutzt.", #C + "Datenquelle/Ziel: Website des Unternehmens. Kann durch 'website_lookup' oder 'check_urls' aktualisiert werden.", #D + "Datenquelle: Ort des Unternehmens aus CRM.", #E + "Datenquelle: Land des Unternehmenssitzes laut CRM (manuell pflegen). Wichtig für DACH-Region-Analyse.", #F NEU + "Datenquelle: Beschreibung aus CRM. Input für KI-Analysen.", #G + "Datenquelle: Branchenkategorie aus CRM. Referenz für KI-Branchenbewertung.", #H + "Datenquelle: Externe Branchenbeschreibung (z.B. Dealfront). Input für KI-Branchenbewertung.", #I + "Datenquelle: Recherchierte Anzahl Servicetechniker. Dient als Ground Truth für ML-Training und Validierung der KI-Schätzung.", #J + "Datenquelle: Umsatz aus CRM. Input für Konsolidierung und ML.", #K + "Datenquelle: Mitarbeiterzahl aus CRM. Input für Konsolidierung und ML.", #L + "Datenquelle: Alte/vorgeschlagene Wiki-URL aus CRM. Dient als initialer Input für Wiki-Prozess.", #M + "Ziel/Quelle: Finale, als relevant erachtete Wikipedia-URL. Quelle: Wikipedia-Scraper (Suche/Extraktion), SerpAPI (Neusuche), ChatGPT (Vorschlag AA nach Prüfung), oder manuelle Eingabe.", #N + "Quelle: Aus Wikipedia-Infobox extrahierte Stadt des Unternehmenssitzes. Ziel: Geografische Analyse.", #O NEU + "Quelle: Aus Wikipedia-Infobox extrahiertes Land des Unternehmenssitzes. Ziel: Geografische Analyse (DACH).", #P NEU + "Quelle: Erster aussagekräftiger Absatz des Wikipedia-Artikels (N). Input für KI-Analysen, z.B. Wiki-Verifizierung.", #Q + "Quelle: Aus der Wikipedia-Infobox extrahierte Branche(n). Input für KI-Branchenbewertung.", #R + "Quelle: Aus der Wikipedia-Infobox extrahierter Umsatz. Input für Konsolidierung und ML.", #S + "Quelle: Aus der Wikipedia-Infobox extrahierte Mitarbeiterzahl. Input für Konsolidierung und ML.", #T + "Quelle: Wikipedia-Kategorien des Artikels (N). Input für KI-Analysen, z.B. Wiki-Verifizierung und Branchenbewertung.", #U + "System: Timestamp der letzten Wikipedia-Suche/Datenextraktion (für N-U). Steuert Wiederholung von Wiki-Extraktion.", #V + "System: Timestamp der letzten ChatGPT-Verifizierung des Wiki-Artikels (N) (Ergebnis in Y-AA). Steuert Wiederholung der Verifizierung.", #W + "System: Timestamp des letzten Versuchs, eine fehlende Wiki-URL (N) via SerpAPI zu suchen. Steuert Wiederholung der SerpAPI-Suche.", #X + "Ziel: Ergebnis der ChatGPT-Konsistenzprüfung für Wiki-Artikel (N). Status '?' triggert erneute Prüfung im Modus 'wiki_verify'.", #Y + "Ziel: Begründung von ChatGPT, falls Wiki-Artikel (N) als inkonsistent bewertet wurde.", #Z + "Ziel: Von ChatGPT vorgeschlagene alternative Wikipedia-URL. Wird von Modus 'update_wiki_suggestions' verarbeitet.", #AA + "Ziel/Info: Wird aktuell primär geleert. Kann für spezifische Begründungen bei URL-Abweichungen genutzt werden.", #AB + "Ziel: Rohtext der Website. Input für Zusammenfassung (AD).", #AC + "Ziel: KI-generierte Zusammenfassung des Website-Rohtextes (AC). Input für Branchenbewertung (AH).", #AD + "Ziel: Strukturierte Meta-Daten der Website (Title, Description, H-Tags). Für schnelle Analyse & Validierung.", #AE NEU + "System: Timestamp des letzten Website-Scraping/Summarization-Versuchs (für AC, AD, AE). Steuert Wiederholung.", #AF + "System/Ziel: Status der URL-Prüfung. 'URL_CHECK_NEEDED' triggert Neusuche im Modus 'check_urls'. Wird dort aktualisiert.", #AG NEU + "Ziel: Von ChatGPT final vorgeschlagene Branche gemäß Zielschema. Hauptziel der Branchenklassifizierung.", #AH + "Ziel: Ergebnis des Abgleichs zwischen KI-Branchenvorschlag (AH) und CRM-Branche (H).", #AI + "Ziel: Von ChatGPT generierte Begründung für den Branchenvorschlag (AH).", #AJ + "Ziel: Ergebnis der FSM-Relevanzprüfung durch ChatGPT. (Platzhalter)", #AK + "Ziel: Begründung von ChatGPT für die FSM-Relevanz. (Platzhalter)", #AL + "Ziel: Von ChatGPT geschätzte Mitarbeiterzahl. (Platzhalter)", #AM + "Ziel: Konsistenzprüfung der KI-Mitarbeiterschätzung. (Platzhalter)", #AN + "Ziel: Begründung von ChatGPT bei Abweichung der Mitarbeiterschätzung. (Platzhalter)", #AO + "Ziel: Von ChatGPT geschätzte Anzahl Servicetechniker. (Platzhalter)", #AP + "Ziel: Begründung von ChatGPT bei Abweichung der Technikerzahl-Schätzung. (Platzhalter)", #AQ + "Ziel: Von ChatGPT geschätzter Umsatz. (Platzhalter)", #AR + "Ziel: Begründung von ChatGPT bei Abweichung der Umsatzschätzung. (Platzhalter)", #AS + "Ziel: Anzahl gefundener LinkedIn-Kontakte (Serviceleiter) via SerpAPI.", #AT + "Ziel: Anzahl gefundener LinkedIn-Kontakte (IT-Leiter) via SerpAPI.", #AU + "Ziel: Anzahl gefundener LinkedIn-Kontakte (Management) via SerpAPI.", #AV + "Ziel: Anzahl gefundener LinkedIn-Kontakte (Disponent) via SerpAPI.", #AW + "Ziel: Konsolidierter Umsatz (Wiki-Wert (S) > CRM-Wert (K)). Input für ML-Modell.", #AX + "Ziel: Konsolidierte Mitarbeiterzahl (Wiki-Wert (T) > CRM-Wert (L)). Input für ML-Modell.", #AY + "Ziel: Vom ML-Modell vorhergesagter Bucket für die Anzahl der Servicetechniker.", #AZ + "System: Timestamp der letzten Kontaktsuche (Modus 'contacts'). Steuert Wiederholung.", #BA + "System: Timestamp der letzten übergreifenden ChatGPT-Evaluation (Branchen, FSM etc.). Steuert Wiederholung.", #BB + "System: Skriptversion, die die Zeile zuletzt signifikant bearbeitet hat.", #BC + "System: Verbrauchte Tokens für OpenAI API-Aufrufe für diese Zeile." #BD ] ] - # Sicherstellen, dass die Anzahl der Spalten in allen Header-Zeilen gleich ist - # (Rest der Funktion bleibt gleich wie in meinem vorherigen Vorschlag) - # ... (colnum_string, header_range Berechnung, sheet.update call) ... - num_cols = len(new_headers[0]) if not all(len(row) == num_cols for row in new_headers): logger.critical(f"FEHLER in alignment_demo: Die Anzahl der Spalten in den Header-Zeilen ist nicht konsistent! Erwartet {num_cols} Spalten pro Zeile, aber Längen sind: {[len(row) for row in new_headers]}.") @@ -2550,18 +2604,9 @@ def alignment_demo(sheet): string = chr(65 + remainder) + string return string - end_col_letter = colnum_string(num_cols) # Sollte jetzt "AY" oder "AZ" sein, je nach Zählung - # Da wir jetzt Spalte AZ (Index 51) haben, ist die letzte Spalte AZ. - # Die Anzahl der Spalten ist 52 (Index 0 bis 51). - # colnum_string(52) sollte "AZ" ergeben. - # Wenn num_cols = 51 (für Index 0-50), dann end_col_letter = "AY" - # Wenn num_cols = 52 (für Index 0-51), dann end_col_letter = "AZ" - - # Korrekte Berechnung für den Bereich, wenn num_cols die Anzahl der Spalten ist: end_col_letter = colnum_string(num_cols) header_range = f"A1:{end_col_letter}{len(new_headers)}" - logger.info(f"Schreibe Alignment-Demo Header in Bereich {header_range}...") try: sheet.update(values=new_headers, range_name=header_range, value_input_option='USER_ENTERED')