File size: 3,120 Bytes
373f549
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import json

from agents import AgentJoy, ProfessorOak, RotomDex
from llm_client import LLMClient
from memory import SimpleMemory


class PokeSupportTown:
    """Controlador principal de la simulaci贸n."""

    def __init__(self, use_llm=False):
        self.memory = SimpleMemory()
        self.llm_client = LLMClient(use_llm=use_llm)
        self.agent_joy = AgentJoy()
        self.professor_oak = ProfessorOak()
        self.rotom_dex = RotomDex(self.memory)

    def reset(self):
        self.memory.reset()

    def build_fallback_response(self, joy_decision, oak_response, rotom_response):
        lines = [
            f"**Entrenador:** {joy_decision['trainer']}",
            f"**Categor铆a:** {joy_decision['category']}",
            f"**Prioridad:** {joy_decision['priority']}",
            "",
            f"{oak_response['description']}",
            "",
            "**Recomendaci贸n:**",
        ]
        for step in oak_response["solution"][:2]:
            lines.append(f"- {step}")
        if oak_response["detail"]:
            lines.append(f"- {oak_response['detail']}")
        if rotom_response["pattern"]:
            lines.append(f"- Aviso de Rotom Dex: {rotom_response['pattern']['message']}")
        if rotom_response["ticket"]:
            ticket = rotom_response["ticket"]
            lines.append(f"- Se crea el ticket {ticket['id']} con estado {ticket['status']}.")
        else:
            lines.append("- No se crea ticket en esta iteraci贸n.")
        return "\n".join(lines)

    def build_llm_prompt(self, query, joy_decision, oak_response, rotom_response):
        context = {
            "consulta_usuario": query,
            "decision_agente_joy": joy_decision,
            "respuesta_profesor_oak": oak_response,
            "respuesta_rotom_dex": rotom_response,
            "eventos_recientes": self.memory.recent_events(),
            "conversacion_reciente": self.memory.recent_conversation(),
            "resumen_memoria": self.memory.summary(),
        }
        return (
            "Redacta la respuesta final para el entrenador usando solo esta informaci贸n. "
            "Mant茅n un tono acad茅mico, claro y breve. No inventes datos externos.\n\n"
            + json.dumps(context, ensure_ascii=False, indent=2)
        )

    def process_query(self, query):
        joy_decision = self.agent_joy.run(query)
        oak_response = self.professor_oak.run(query, joy_decision, self.memory)
        rotom_response = self.rotom_dex.run(query, joy_decision, oak_response)
        fallback_response = self.build_fallback_response(joy_decision, oak_response, rotom_response)
        llm_prompt = self.build_llm_prompt(query, joy_decision, oak_response, rotom_response)
        final_response = self.llm_client.generate(llm_prompt, fallback_response)
        self.memory.add_conversation_turn(query, final_response)
        return {
            "query": query,
            "joy": joy_decision,
            "oak": oak_response,
            "rotom": rotom_response,
            "final_response": final_response,
            "memory_summary": self.memory.summary(),
        }