File size: 6,664 Bytes
67cc066
3bd94e0
ec80e4b
67cc066
 
2167be3
3bd94e0
488c650
67cc066
a7f165e
3bd94e0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
037f971
ec80e4b
037f971
2167be3
 
037f971
724a384
ec80e4b
037f971
 
724a384
 
e7addaf
724a384
037f971
ec80e4b
 
724a384
ec80e4b
037f971
 
ec80e4b
037f971
2167be3
 
037f971
2167be3
 
037f971
 
2167be3
 
037f971
2167be3
 
 
037f971
c31edec
037f971
c31edec
2167be3
724a384
2167be3
 
 
6506311
3bd94e0
 
037f971
3bd94e0
 
c31edec
 
6506311
c31edec
 
2167be3
6506311
c31edec
 
724a384
 
3bd94e0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6506311
c31edec
 
 
 
037f971
6506311
c31edec
037f971
2167be3
 
6506311
2167be3
6506311
037f971
2167be3
 
6506311
c31edec
724a384
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
"""
Flare – Prompt Builder  (v6 Β· date handling)
==============================================================
"""

from typing import List, Dict
from datetime import datetime, timedelta
from utils import log


# Date helper for Turkish date expressions
def _get_date_context() -> Dict[str, str]:
    """Generate date context for Turkish date expressions"""
    now = datetime.now()
    
    # Weekday names in Turkish
    weekdays_tr = ["Pazartesi", "SalΔ±", "Γ‡arşamba", "Perşembe", "Cuma", "Cumartesi", "Pazar"]
    today_weekday = weekdays_tr[now.weekday()]
    
    # Calculate various dates
    dates = {
        "today": now.strftime("%Y-%m-%d"),
        "tomorrow": (now + timedelta(days=1)).strftime("%Y-%m-%d"),
        "day_after_tomorrow": (now + timedelta(days=2)).strftime("%Y-%m-%d"),
        "this_weekend_saturday": (now + timedelta(days=(5-now.weekday())%7)).strftime("%Y-%m-%d"),
        "this_weekend_sunday": (now + timedelta(days=(6-now.weekday())%7)).strftime("%Y-%m-%d"),
        "next_week_same_day": (now + timedelta(days=7)).strftime("%Y-%m-%d"),
        "two_weeks_later": (now + timedelta(days=14)).strftime("%Y-%m-%d"),
        "today_weekday": today_weekday,
        "today_day": now.day,
        "today_month": now.month,
        "today_year": now.year
    }
    
    return dates


# ─────────────────────────────────────────────────────────────────────────────
# INTENT PROMPT
# ─────────────────────────────────────────────────────────────────────────────
def build_intent_prompt(general_prompt: str,
                        conversation: List[Dict[str, str]],
                        user_input: str,
                        intents: List) -> str:
    # === INTENT INDEX ===
    lines = ["### INTENT INDEX ###"]
    for it in intents:
        # IntentConfig object attribute access
        det = it.detection_prompt.strip() if it.detection_prompt else ""
        det_part = f'  β€’ detection_prompt β†’ "{det}"' if det else ""
        exs = " | ".join(it.examples) if it.examples else ""
        ex_part = f"  β€’ examples β†’ {exs}" if exs else ""

        newline_between = "\n" if det_part and ex_part else ""
        lines.append(f"{it.name}:{det_part}{newline_between}{ex_part}")

    intent_index = "\n".join(lines)

    # === HISTORY ===
    history_block = "\n".join(
        f"{m['role'].upper()}: {m['content']}" for m in conversation[-10:]
    )

    prompt = (
        f"{general_prompt}\n\n"
        f"{intent_index}\n\n"
        f"Conversation so far:\n{history_block}\n\n"
        f"USER: {user_input.strip()}"
    )
    log("βœ… Intent prompt built (index with detection_prompt)")
    return prompt


# ─────────────────────────────────────────────────────────────────────────────
# PARAMETER PROMPT - Improved version
# ─────────────────────────────────────────────────────────────────────────────
_FMT = """#PARAMETERS:{"extracted":[{"name":"<param>","value":"<val>"},...],"missing":["<param>",...]}"""

def build_parameter_prompt(intent_cfg,
                           missing_params: List[str],
                           user_input: str,
                           conversation: List[Dict[str, str]]) -> str:
    
    date_ctx = _get_date_context()
    
    parts: List[str] = [
        "You are extracting parameters from user messages in TURKISH.",
        f"Today is {date_ctx['today']} ({date_ctx['today_weekday']}). Tomorrow is {date_ctx['tomorrow']}.",
        "Extract ONLY the parameters listed below from the conversation.",
        "Look at BOTH the current message AND previous messages to find parameter values.",
        "If a parameter cannot be found, is invalid, or wasn't provided, keep it in the \"missing\" list.",
        "Never guess or make up values. Only extract values explicitly given by the user.",
        ""
    ]
    
    # Add parameter descriptions
    parts.append("Parameters to extract:")
    for p in intent_cfg.parameters:
        if p.name in missing_params:
            # Special handling for date type parameters
            if p.type == "date":
                date_prompt = (
                    f"β€’ {p.name}: {p.extraction_prompt}\n"
                    f"  IMPORTANT DATE RULES:\n"
                    f"  - 'bugΓΌn' = {date_ctx['today']}\n"
                    f"  - 'yarΔ±n' = {date_ctx['tomorrow']}\n"
                    f"  - 'ΓΆbΓΌr gΓΌn' = {date_ctx['day_after_tomorrow']}\n"
                    f"  - 'bu hafta sonu' = {date_ctx['this_weekend_saturday']} or {date_ctx['this_weekend_sunday']}\n"
                    f"  - 'bu cumartesi' = {date_ctx['this_weekend_saturday']}\n"
                    f"  - 'bu pazar' = {date_ctx['this_weekend_sunday']}\n"
                    f"  - 'haftaya' or 'gelecek hafta' = add 7 days to current date\n"
                    f"  - 'haftaya bugΓΌn' = {date_ctx['next_week_same_day']}\n"
                    f"  - 'iki hafta sonra' = {date_ctx['two_weeks_later']}\n"
                    f"  - '15 gΓΌn sonra' = add 15 days to today\n"
                    f"  - '10 Temmuz' = {date_ctx['today_year']}-07-10\n"
                    f"  - Turkish months: Ocak=01, Şubat=02, Mart=03, Nisan=04, Mayıs=05, Haziran=06, "
                    f"Temmuz=07, Ağustos=08, Eylül=09, Ekim=10, Kasım=11, Aralık=12"
                )
                parts.append(date_prompt)
            else:
                parts.append(f"β€’ {p.name}: {p.extraction_prompt}")
    
    # Add format instruction
    parts.append("")
    parts.append("IMPORTANT: Your response must start with '#PARAMETERS:' followed by the JSON.")
    parts.append("Return ONLY this format with no extra text before or after:")
    parts.append(_FMT)
    
    # Add conversation history
    history_block = "\n".join(
        f"{m['role'].upper()}: {m['content']}" for m in conversation[-10:]
    )
    
    prompt = (
        "\n".join(parts) + 
        "\n\nConversation so far:\n" + history_block +
        "\n\nUSER: " + user_input.strip()
    )
    
    log(f"πŸ“ Parameter prompt built for missing: {missing_params}")
    return prompt