cardserver / app /core /generator.py
GitHub Actions
🚀 Auto-deploy from GitHub
eb803dd
from jinja2 import Template
from pathlib import Path
import datetime
# Handle import for both package and direct execution
try:
from ..services.request_logger import RequestEventLogger
except ImportError:
# If relative import fails, try absolute import or create a dummy logger
try:
from app.services.request_logger import RequestEventLogger
except ImportError:
# Create a dummy logger class if import fails
class RequestEventLogger:
@staticmethod
def log_generator_prompt(*args, **kwargs):
pass
""" MMDD → MM = Monat, DD = Tag
120 = 01.20. → Ende Steinbock
218 = 02.18. → Ende Wassermann
"""
def get_constellation(birthdate: str) -> str:
"""Leitet das Sternzeichen aus dem Geburtsdatum ab."""
date = datetime.datetime.strptime(birthdate, "%Y-%m-%d").date()
constellations = [
(120, "Steinbock"), (218, "Wassermann"), (320, "Fische"), (420, "Widder"),
(521, "Stier"), (621, "Zwillinge"), (722, "Krebs"), (823, "Löwe"),
(923, "Jungfrau"), (1023, "Waage"), (1122, "Skorpion"), (1222, "Schütze"), (1231, "Steinbock")
]
date_as_number = int(f"{date.month:02d}{date.day:02d}")
for boundary, sign in constellations:
if date_as_number <= boundary:
return sign
return "Steinbock"
PROMPT_TEMPLATE = Template("""
Du bist ein Sexoskop-Orakel. Erstelle einen kurzen, prägnanten Horoskoptext (maximal 1-2 Sätze) für eine Person, basierend auf folgenden Informationen:
Sprache: {{ lang }}
Datum: {{ card_date }} {# Geändert von birthdate #}
Sternzeichen: {{ constellation }}
Schlüsselbegriffe: {{ terms_str }}
Der Text soll die Schlüsselbegriffe kreativ und subtil einbinden und zum angegebenen Datum passen.
Antworte nur mit dem Horoskoptext.
""")
def build_prompt(lang: str, card_date: str, terms: list[str], request_id: str | None = None) -> str:
"""Baut den Prompt für das LLM basierend auf Geburtsdatum und Begriffen."""
constellation = get_constellation(card_date)
terms_str = ", ".join(terms)
prompt = PROMPT_TEMPLATE.render(
lang=lang,
card_date=card_date,
constellation=constellation,
terms_str=terms_str
)
# Log the generator prompt
if request_id:
RequestEventLogger.log_generator_prompt(
request_id=request_id,
prompt=prompt,
terms=terms,
card_date=card_date,
constellation=constellation,
lang=lang
)
return prompt