Update api.py
Browse files
api.py
CHANGED
|
@@ -134,6 +134,16 @@ def system_prompt_fallback() -> str:
|
|
| 134 |
"Bleibe menschlich und authentisch in deiner Ausdrucksweise."
|
| 135 |
)
|
| 136 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 137 |
|
| 138 |
|
| 139 |
|
|
@@ -165,6 +175,89 @@ def health():
|
|
| 165 |
}
|
| 166 |
)
|
| 167 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 168 |
@app.route("/ask", methods=["POST", "OPTIONS"])
|
| 169 |
def ask():
|
| 170 |
if request.method == "OPTIONS":
|
|
|
|
| 134 |
"Bleibe menschlich und authentisch in deiner Ausdrucksweise."
|
| 135 |
)
|
| 136 |
|
| 137 |
+
def system_prompt_youtube_script() -> str:
|
| 138 |
+
return (
|
| 139 |
+
"Du bist **Javid Niazi-Hoffmann**, erfolgreicher Unternehmer und Mentor bei J&P Mentoring. "
|
| 140 |
+
"Du erstellst **starke YouTube-Video-Skripte auf Deutsch**. "
|
| 141 |
+
"Sprich immer auf **Deutsch**, sei klar, inspirierend und bodenständig. "
|
| 142 |
+
"Schreibe so, dass der Text direkt vom Teleprompter abgelesen werden kann – "
|
| 143 |
+
"mit natürlicher Sprache, kurzen Sätzen und klaren Übergängen. "
|
| 144 |
+
"Nutze Du-Ansprache, sei motivierend und ergebnisorientiert."
|
| 145 |
+
)
|
| 146 |
+
|
| 147 |
|
| 148 |
|
| 149 |
|
|
|
|
| 175 |
}
|
| 176 |
)
|
| 177 |
|
| 178 |
+
@app.route("/youtube-script", methods=["POST", "OPTIONS"])
|
| 179 |
+
def youtube_script():
|
| 180 |
+
# Handle CORS preflight
|
| 181 |
+
if request.method == "OPTIONS":
|
| 182 |
+
return ("", 204)
|
| 183 |
+
|
| 184 |
+
if client is None:
|
| 185 |
+
return jsonify({"error": "⚠️ No language model initialized."}), 500
|
| 186 |
+
|
| 187 |
+
try:
|
| 188 |
+
data = request.get_json(force=True) or {}
|
| 189 |
+
except Exception:
|
| 190 |
+
return jsonify({"error": "Invalid JSON body."}), 400
|
| 191 |
+
|
| 192 |
+
# Expecting these keys from the frontend
|
| 193 |
+
topic = (data.get("topic") or "").strip()
|
| 194 |
+
duration_minutes = (data.get("duration_minutes") or "").strip()
|
| 195 |
+
tone = (data.get("tone") or "").strip()
|
| 196 |
+
target_audience = (data.get("target_audience") or "").strip()
|
| 197 |
+
|
| 198 |
+
if not topic:
|
| 199 |
+
return jsonify({"error": "Video topic is required."}), 400
|
| 200 |
+
|
| 201 |
+
# Fallback defaults
|
| 202 |
+
if not duration_minutes:
|
| 203 |
+
duration_minutes = "10"
|
| 204 |
+
if not tone:
|
| 205 |
+
tone = "inspirierend, klar, authentisch"
|
| 206 |
+
if not target_audience:
|
| 207 |
+
target_audience = "Menschen, die finanziell und persönlich wachsen wollen"
|
| 208 |
+
|
| 209 |
+
# Build user prompt for GPT
|
| 210 |
+
user_prompt = f"""
|
| 211 |
+
Erstelle ein ausführliches YouTube-Video-Skript auf Deutsch.
|
| 212 |
+
|
| 213 |
+
Thema: {topic}
|
| 214 |
+
Ziel-Videolänge: ca. {duration_minutes} Minuten
|
| 215 |
+
Tonfall: {tone}
|
| 216 |
+
Zielgruppe: {target_audience}
|
| 217 |
+
|
| 218 |
+
Struktur des Skripts:
|
| 219 |
+
1. Starker Hook in den ersten 5–10 Sekunden (sofortige Aufmerksamkeit, großes Versprechen).
|
| 220 |
+
2. Kurze Begrüßung und Positionierung von Javid Niazi-Hoffmann.
|
| 221 |
+
3. Klar strukturierter Hauptteil mit mehreren Abschnitten:
|
| 222 |
+
- Erkläre das Thema verständlich.
|
| 223 |
+
- Nutze Beispiele, Metaphern oder kurze Stories.
|
| 224 |
+
- Gib konkrete Tipps oder Schritte.
|
| 225 |
+
4. Übergänge zwischen den Abschnitten, damit das Skript natürlich fließt.
|
| 226 |
+
5. Starker Call-to-Action am Ende
|
| 227 |
+
(z.B. Kanal abonnieren, Kommentar schreiben, kostenloses Erstgespräch, Link in der Beschreibung).
|
| 228 |
+
|
| 229 |
+
Format:
|
| 230 |
+
- Schreibe den Text als gesprochenes Skript in der Du-Form.
|
| 231 |
+
- Markiere die Abschnitte mit kurzen Zwischenüberschriften (z.B. [HOOK], [EINSTIEG], [TIPP 1], [CTA]).
|
| 232 |
+
- Kein Fließtext-Roman, sondern gut lesbare Absätze.
|
| 233 |
+
"""
|
| 234 |
+
|
| 235 |
+
try:
|
| 236 |
+
response = client.chat.completions.create(
|
| 237 |
+
model="gpt-4o",
|
| 238 |
+
messages=[
|
| 239 |
+
{"role": "system", "content": system_prompt_youtube_script()},
|
| 240 |
+
{"role": "user", "content": user_prompt},
|
| 241 |
+
],
|
| 242 |
+
max_tokens=1500,
|
| 243 |
+
)
|
| 244 |
+
script_text = response.choices[0].message.content.strip()
|
| 245 |
+
except Exception as e:
|
| 246 |
+
traceback.print_exc()
|
| 247 |
+
return jsonify({"error": f"⚠️ LLM call failed: {e}"}), 500
|
| 248 |
+
|
| 249 |
+
# Response for the frontend
|
| 250 |
+
return jsonify(
|
| 251 |
+
{
|
| 252 |
+
"topic": topic,
|
| 253 |
+
"duration_minutes": duration_minutes,
|
| 254 |
+
"tone": tone,
|
| 255 |
+
"target_audience": target_audience,
|
| 256 |
+
"script": script_text,
|
| 257 |
+
}
|
| 258 |
+
), 200
|
| 259 |
+
|
| 260 |
+
|
| 261 |
@app.route("/ask", methods=["POST", "OPTIONS"])
|
| 262 |
def ask():
|
| 263 |
if request.method == "OPTIONS":
|