127 lines
4.2 KiB
Python
127 lines
4.2 KiB
Python
import os
|
|
import json
|
|
import requests
|
|
from dotenv import load_dotenv
|
|
|
|
# Load environment variables
|
|
load_dotenv(override=True)
|
|
|
|
GEMINI_API_KEY = os.getenv("GEMINI_API_KEY")
|
|
NOTION_API_KEY = os.getenv("NOTION_API_KEY")
|
|
|
|
# Configuration
|
|
NOTION_DB_INDUSTRIES = "2ec88f4285448014ab38ea664b4c2b81" # ID aus deinen Links
|
|
|
|
def get_vertical_data(vertical_name):
|
|
"""Fetches Pains/Gains for a specific Vertical from Notion."""
|
|
url = f"https://api.notion.com/v1/databases/{NOTION_DB_INDUSTRIES}/query"
|
|
headers = {
|
|
"Authorization": f"Bearer {NOTION_API_KEY}",
|
|
"Notion-Version": "2022-06-28",
|
|
"Content-Type": "application/json"
|
|
}
|
|
payload = {
|
|
"filter": {
|
|
"property": "Vertical",
|
|
"title": {
|
|
"contains": vertical_name
|
|
}
|
|
}
|
|
}
|
|
|
|
response = requests.post(url, headers=headers, json=payload)
|
|
if response.status_code == 200:
|
|
results = response.json().get("results", [])
|
|
if results:
|
|
page = results[0]
|
|
props = page['properties']
|
|
|
|
# Extract Text from Rich Text fields
|
|
pains = props.get('Pains', {}).get('rich_text', [])
|
|
gains = props.get('Gains', {}).get('rich_text', [])
|
|
|
|
pain_text = pains[0]['plain_text'] if pains else "N/A"
|
|
gain_text = gains[0]['plain_text'] if gains else "N/A"
|
|
|
|
return {
|
|
"vertical": vertical_name,
|
|
"pains": pain_text,
|
|
"gains": gain_text
|
|
}
|
|
return None
|
|
|
|
def generate_copy_with_gemini(vertical_data, persona_role, persona_pains):
|
|
"""
|
|
Generates the 3 text blocks using Gemini.
|
|
"""
|
|
url = f"https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key={GEMINI_API_KEY}"
|
|
|
|
# Der Prompt (Dein Template)
|
|
prompt_text = f"""
|
|
Du bist ein kompetenter Lösungsberater und brillanter Texter.
|
|
AUFGABE: Erstelle 3 Textblöcke (Subject, Introduction_Textonly, Industry_References_Textonly) für eine E-Mail.
|
|
|
|
--- KONTEXT ---
|
|
ZIELBRANCHE: {vertical_data['vertical']}
|
|
BRANCHEN-HERAUSFORDERUNGEN (PAIN POINTS): {vertical_data['pains']}
|
|
LÖSUNGS-VORTEILE (GAINS): {vertical_data['gains']}
|
|
|
|
ANSPRECHPARTNER: {persona_role}
|
|
PERSÖNLICHE HERAUSFORDERUNGEN DES ANSPRECHPARTNERS: {persona_pains}
|
|
|
|
REFERENZKUNDEN: "Wir arbeiten bereits mit Marktführern in Ihrer Branche." (Platzhalter)
|
|
|
|
--- DEINE AUFGABE ---
|
|
1. Subject: Formuliere eine kurze Betreffzeile (max. 5 Wörter). Richte sie direkt an einem Pain Point aus.
|
|
2. Introduction_Textonly: Formuliere einen Einleitungstext (2 Sätze).
|
|
- Fokus: Brücke zwischen Problem und Lösung.
|
|
3. Industry_References_Textonly: Formuliere einen Social Proof Satz.
|
|
|
|
--- FORMAT ---
|
|
Antworte NUR mit reinem JSON:
|
|
{{
|
|
"Subject": "...",
|
|
"Introduction_Textonly": "...",
|
|
"Industry_References_Textonly": "..."
|
|
}}
|
|
"""
|
|
|
|
payload = {
|
|
"contents": [{"parts": [{"text": prompt_text}]}],
|
|
"generationConfig": {"responseMimeType": "application/json"}
|
|
}
|
|
|
|
try:
|
|
response = requests.post(url, json=payload)
|
|
if response.status_code == 200:
|
|
return json.loads(response.json()['candidates'][0]['content']['parts'][0]['text'])
|
|
else:
|
|
print(f"Gemini Error: {response.text}")
|
|
return None
|
|
except Exception as e:
|
|
print(f"Error: {e}")
|
|
return None
|
|
|
|
if __name__ == "__main__":
|
|
# TEST RUN
|
|
|
|
# 1. Daten holen (Beispiel: Logistics)
|
|
print("Fetching Vertical Data...")
|
|
vertical = get_vertical_data("Logistics - Warehouse")
|
|
|
|
if vertical:
|
|
print(f"Loaded: {vertical['vertical']}")
|
|
|
|
# 2. Persona definieren (Beispiel: Operativer Entscheider)
|
|
role = "Logistikleiter / Operations Manager"
|
|
role_pains = "Stillstand, Personalmangel, Stress, Unfallgefahr"
|
|
|
|
# 3. Generieren
|
|
print("Generating Copy...")
|
|
copy = generate_copy_with_gemini(vertical, role, role_pains)
|
|
|
|
print("\n--- RESULT ---")
|
|
print(json.dumps(copy, indent=2, ensure_ascii=False))
|
|
else:
|
|
print("Vertical not found.")
|