File size: 3,994 Bytes
67cc066
c31edec
ec80e4b
67cc066
 
2167be3
488c650
67cc066
a7f165e
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
037f971
c31edec
 
 
6506311
c31edec
 
2167be3
6506311
c31edec
 
724a384
 
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
"""
Flare – Prompt Builder  (v5 Β· improved parameter prompt)
==============================================================
"""

from typing import List, Dict
from utils import log


# ─────────────────────────────────────────────────────────────────────────────
# 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:
    
    parts: List[str] = [
        "You are extracting parameters from user messages.",
        "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:
            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