File size: 2,555 Bytes
348e214
 
 
 
eb803dd
 
 
 
 
 
 
 
 
 
 
 
 
 
348e214
 
 
 
 
f6e3d73
348e214
 
f6e3d73
348e214
 
 
 
 
f6e3d73
348e214
 
 
 
f6e3d73
 
348e214
f6e3d73
 
 
 
 
 
 
 
 
eb803dd
f6e3d73
 
 
eb803dd
 
f6e3d73
 
 
 
eb803dd
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
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