fix(gtm): Resolve f-string SyntaxError and helpers.py incompatibility in orchestrator
This commit is contained in:
@@ -50,7 +50,19 @@ Das Projekt nutzt ein geteiltes `helpers.py`, das auf der alten OpenAI Python Li
|
|||||||
```text
|
```text
|
||||||
openai==0.28.1
|
openai==0.28.1
|
||||||
# weitere deps...
|
# weitere deps...
|
||||||
|
### 1.5 Python Syntax & F-Strings
|
||||||
|
Multi-Line f-Strings mit JSON-Beispielen (`{...}`) sind extrem fehleranfällig (Escaping, Einrückung).
|
||||||
|
* **Best Practice:** Komplexe JSON-Daten oder Strings **vorher** in Variablen speichern und dann einfügen.
|
||||||
|
```python
|
||||||
|
# Schlecht:
|
||||||
|
prompt = f"""Daten: {json.dumps(data.get('nested'))}"""
|
||||||
|
|
||||||
|
# Gut:
|
||||||
|
nested_json = json.dumps(data.get('nested'))
|
||||||
|
prompt = f"""Daten: {nested_json}"""
|
||||||
```
|
```
|
||||||
|
* **Signaturen prüfen:** Shared Libraries (`helpers.py`) haben oft ältere Signaturen.
|
||||||
|
* Beispiel: `call_openai_chat` unterstützt oft kein `system_message` Argument. Stattdessen Prompt manuell zusammenbauen (`sys_instr + "\n\n" + prompt`).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -154,14 +154,17 @@ Output JSON format ONLY.
|
|||||||
"""
|
"""
|
||||||
# Fix: Prepend system instruction manually
|
# Fix: Prepend system instruction manually
|
||||||
full_extraction_prompt = sys_instr + "\n\n" + extraction_prompt
|
full_extraction_prompt = sys_instr + "\n\n" + extraction_prompt
|
||||||
extraction_response = call_openai_chat(full_extraction_prompt, json_mode=True)
|
extraction_response = call_openai_chat(full_extraction_prompt, response_format_json=True)
|
||||||
extraction_data = json.loads(extraction_response)
|
extraction_data = json.loads(extraction_response)
|
||||||
|
|
||||||
|
features_json = json.dumps(extraction_data.get('features'))
|
||||||
|
constraints_json = json.dumps(extraction_data.get('constraints'))
|
||||||
|
|
||||||
conflict_prompt = f"""
|
conflict_prompt = f"""
|
||||||
PHASE 1-B: PORTFOLIO CONFLICT CHECK
|
PHASE 1-B: PORTFOLIO CONFLICT CHECK
|
||||||
|
|
||||||
New Product Features: {json.dumps(extraction_data.get('features'))}
|
New Product Features: {features_json}
|
||||||
New Product Constraints: {json.dumps(extraction_data.get('constraints'))}
|
New Product Constraints: {constraints_json}
|
||||||
|
|
||||||
Existing Portfolio:
|
Existing Portfolio:
|
||||||
1. "Indoor Scrubber 50": Indoor cleaning, hard floor, supermarkets.
|
1. "Indoor Scrubber 50": Indoor cleaning, hard floor, supermarkets.
|
||||||
@@ -174,8 +177,8 @@ Output JSON format ONLY.
|
|||||||
""" if lang == 'en' else f"""
|
""" if lang == 'en' else f"""
|
||||||
PHASE 1-B: PORTFOLIO CONFLICT CHECK
|
PHASE 1-B: PORTFOLIO CONFLICT CHECK
|
||||||
|
|
||||||
Neue Produkt-Features: {json.dumps(extraction_data.get('features'))}
|
Neue Produkt-Features: {features_json}
|
||||||
Neue Produkt-Constraints: {json.dumps(extraction_data.get('constraints'))}
|
Neue Produkt-Constraints: {constraints_json}
|
||||||
|
|
||||||
Existierendes Portfolio:
|
Existierendes Portfolio:
|
||||||
1. "Indoor Scrubber 50": Innenreinigung, Hartboden, Supermärkte.
|
1. "Indoor Scrubber 50": Innenreinigung, Hartboden, Supermärkte.
|
||||||
@@ -188,7 +191,7 @@ Output JSON format ONLY.
|
|||||||
"""
|
"""
|
||||||
# Fix: Prepend system instruction manually
|
# Fix: Prepend system instruction manually
|
||||||
full_conflict_prompt = sys_instr + "\n\n" + conflict_prompt
|
full_conflict_prompt = sys_instr + "\n\n" + conflict_prompt
|
||||||
conflict_response = call_openai_chat(full_conflict_prompt, json_mode=True)
|
conflict_response = call_openai_chat(full_conflict_prompt, response_format_json=True)
|
||||||
conflict_data = json.loads(conflict_response)
|
conflict_data = json.loads(conflict_response)
|
||||||
|
|
||||||
final_result = {{**extraction_data, **conflict_data}}
|
final_result = {{**extraction_data, **conflict_data}}
|
||||||
@@ -199,10 +202,13 @@ def discover_icps(data):
|
|||||||
lang = data.get('language', 'de')
|
lang = data.get('language', 'de')
|
||||||
sys_instr = get_system_instruction(lang)
|
sys_instr = get_system_instruction(lang)
|
||||||
|
|
||||||
|
features_json = json.dumps(phase1_result.get('features'))
|
||||||
|
constraints_json = json.dumps(phase1_result.get('constraints'))
|
||||||
|
|
||||||
prompt = f"""
|
prompt = f"""
|
||||||
PHASE 2: ICP DISCOVERY & DATA PROXIES
|
PHASE 2: ICP DISCOVERY & DATA PROXIES
|
||||||
Based on the product features: {json.dumps(phase1_result.get('features'))}
|
Based on the product features: {features_json}
|
||||||
And constraints: {json.dumps(phase1_result.get('constraints'))}
|
And constraints: {constraints_json}
|
||||||
|
|
||||||
Output JSON format ONLY:
|
Output JSON format ONLY:
|
||||||
{{
|
{{
|
||||||
@@ -211,8 +217,8 @@ Output JSON format ONLY:
|
|||||||
}}
|
}}
|
||||||
""" if lang == 'en' else f"""
|
""" if lang == 'en' else f"""
|
||||||
PHASE 2: ICP DISCOVERY & DATA PROXIES
|
PHASE 2: ICP DISCOVERY & DATA PROXIES
|
||||||
Basierend auf Features: {json.dumps(phase1_result.get('features'))}
|
Basierend auf Features: {features_json}
|
||||||
Und Constraints: {json.dumps(phase1_result.get('constraints'))}
|
Und Constraints: {constraints_json}
|
||||||
|
|
||||||
Output JSON format ONLY:
|
Output JSON format ONLY:
|
||||||
{{
|
{{
|
||||||
@@ -222,17 +228,18 @@ Output JSON format ONLY:
|
|||||||
"""
|
"""
|
||||||
# Fix: Prepend system instruction manually
|
# Fix: Prepend system instruction manually
|
||||||
full_prompt = sys_instr + "\n\n" + prompt
|
full_prompt = sys_instr + "\n\n" + prompt
|
||||||
response = call_openai_chat(full_prompt, json_mode=True)
|
response = call_openai_chat(full_prompt, response_format_json=True)
|
||||||
print(response)
|
print(response)
|
||||||
|
|
||||||
def hunt_whales(data):
|
def hunt_whales(data):
|
||||||
phase2_result = data.get('phase2Result')
|
phase2_result = data.get('phase2Result')
|
||||||
lang = data.get('language', 'de')
|
lang = data.get('language', 'de')
|
||||||
sys_instr = get_system_instruction(lang)
|
sys_instr = get_system_instruction(lang)
|
||||||
prompt = f"PHASE 3: WHALE HUNTING for {json.dumps(phase2_result.get('icps'))}. Identify 3-5 concrete DACH companies per industry and buying center roles. Output JSON ONLY."
|
icps_json = json.dumps(phase2_result.get('icps'))
|
||||||
|
prompt = f"PHASE 3: WHALE HUNTING for {icps_json}. Identify 3-5 concrete DACH companies per industry and buying center roles. Output JSON ONLY."
|
||||||
# Fix: Prepend system instruction manually
|
# Fix: Prepend system instruction manually
|
||||||
full_prompt = sys_instr + "\n\n" + prompt
|
full_prompt = sys_instr + "\n\n" + prompt
|
||||||
response = call_openai_chat(full_prompt, json_mode=True)
|
response = call_openai_chat(full_prompt, response_format_json=True)
|
||||||
print(response)
|
print(response)
|
||||||
|
|
||||||
def develop_strategy(data):
|
def develop_strategy(data):
|
||||||
@@ -240,16 +247,18 @@ def develop_strategy(data):
|
|||||||
phase1_result = data.get('phase1Result')
|
phase1_result = data.get('phase1Result')
|
||||||
lang = data.get('language', 'de')
|
lang = data.get('language', 'de')
|
||||||
sys_instr = get_system_instruction(lang)
|
sys_instr = get_system_instruction(lang)
|
||||||
prompt = f"PHASE 4: STRATEGY Matrix for {json.dumps(phase3_result)}. Apply Hybrid logic. Output JSON ONLY."
|
phase3_json = json.dumps(phase3_result)
|
||||||
|
prompt = f"PHASE 4: STRATEGY Matrix for {phase3_json}. Apply Hybrid logic. Output JSON ONLY."
|
||||||
# Fix: Prepend system instruction manually
|
# Fix: Prepend system instruction manually
|
||||||
full_prompt = sys_instr + "\n\n" + prompt
|
full_prompt = sys_instr + "\n\n" + prompt
|
||||||
response = call_openai_chat(full_prompt, json_mode=True)
|
response = call_openai_chat(full_prompt, response_format_json=True)
|
||||||
print(response)
|
print(response)
|
||||||
|
|
||||||
def generate_assets(data):
|
def generate_assets(data):
|
||||||
lang = data.get('language', 'de')
|
lang = data.get('language', 'de')
|
||||||
sys_instr = get_system_instruction(lang)
|
sys_instr = get_system_instruction(lang)
|
||||||
prompt = f"PHASE 5: GTM STRATEGY REPORT Markdown. Use facts, TCO, ROI. Data: {json.dumps(data)}"
|
data_json = json.dumps(data)
|
||||||
|
prompt = f"PHASE 5: GTM STRATEGY REPORT Markdown. Use facts, TCO, ROI. Data: {data_json}"
|
||||||
# Fix: Prepend system instruction manually
|
# Fix: Prepend system instruction manually
|
||||||
full_prompt = sys_instr + "\n\n" + prompt
|
full_prompt = sys_instr + "\n\n" + prompt
|
||||||
response = call_openai_chat(full_prompt)
|
response = call_openai_chat(full_prompt)
|
||||||
@@ -258,10 +267,11 @@ def generate_assets(data):
|
|||||||
def generate_sales_enablement(data):
|
def generate_sales_enablement(data):
|
||||||
lang = data.get('language', 'de')
|
lang = data.get('language', 'de')
|
||||||
sys_instr = get_system_instruction(lang)
|
sys_instr = get_system_instruction(lang)
|
||||||
prompt = f"PHASE 6: Battlecards and MJ Prompts. Data: {json.dumps(data)}. Output JSON ONLY."
|
data_json = json.dumps(data)
|
||||||
|
prompt = f"PHASE 6: Battlecards and MJ Prompts. Data: {data_json}. Output JSON ONLY."
|
||||||
# Fix: Prepend system instruction manually
|
# Fix: Prepend system instruction manually
|
||||||
full_prompt = sys_instr + "\n\n" + prompt
|
full_prompt = sys_instr + "\n\n" + prompt
|
||||||
response = call_openai_chat(full_prompt, json_mode=True)
|
response = call_openai_chat(full_prompt, response_format_json=True)
|
||||||
print(response)
|
print(response)
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
|||||||
Reference in New Issue
Block a user