|
14 | 14 | import asyncio |
15 | 15 | import os |
16 | 16 | import sys |
17 | | -from typing import Any |
| 17 | +from typing import Annotated, Any |
18 | 18 |
|
19 | | -from agent_framework import Agent, AgentResponse, AgentResponseUpdate |
| 19 | +from agent_framework import Agent, AgentResponse, AgentResponseUpdate, tool |
20 | 20 | from agent_framework.openai import OpenAIChatClient |
21 | 21 | from agent_framework.orchestrations import HandoffAgentUserRequest, HandoffBuilder |
22 | 22 | from azure.identity.aio import DefaultAzureCredential, get_bearer_token_provider |
|
47 | 47 | ) |
48 | 48 |
|
49 | 49 |
|
| 50 | +# --- Herramientas --- |
| 51 | + |
| 52 | + |
| 53 | +@tool |
| 54 | +def process_return( |
| 55 | + order_number: Annotated[str, "The 3-digit order number"], |
| 56 | + return_type: Annotated[str, "Either 'refund' or 'replacement'"], |
| 57 | +) -> str: |
| 58 | + """Process a product return for the given order.""" |
| 59 | + return f"Return processed for order {order_number}: {return_type} approved. Confirmation email sent." |
| 60 | + |
| 61 | + |
50 | 62 | # --- Agentes --- |
51 | 63 |
|
52 | 64 | triage_agent = Agent( |
|
56 | 68 | "Eres un agente de triaje de soporte al cliente. Saluda al cliente, entiende su problema " |
57 | 69 | "y transfiere al especialista correcto: order_agent para consultas de pedidos, " |
58 | 70 | "return_agent para devoluciones. No puedes manejar problemas específicos tú mismo — siempre transfiere. " |
| 71 | + "Si un especialista acaba de terminar de ayudar, pregunta al cliente si necesita algo más " |
| 72 | + "— NO reenvíes al mismo especialista. " |
59 | 73 | "NO pidas información de contacto, correo electrónico ni número de teléfono. " |
60 | 74 | "NO digas 'Adiós' hasta que el cliente confirme explícitamente que no tiene más preguntas." |
61 | 75 | ), |
|
65 | 79 | client=client, |
66 | 80 | name="order_agent", |
67 | 81 | instructions=( |
68 | | - "Te encargas de consultas sobre el estado de pedidos. Ayuda al cliente con su pedido. " |
| 82 | + "Eres el especialista en seguimiento de pedidos. Ayuda al cliente a verificar el estado de su pedido. " |
69 | 83 | "Cuando termines, transfiere de vuelta a triage_agent." |
70 | 84 | ), |
71 | 85 | ) |
|
74 | 88 | client=client, |
75 | 89 | name="return_agent", |
76 | 90 | instructions=( |
77 | | - "Te encargas de devoluciones de productos. Ayuda al cliente a iniciar una devolución. " |
| 91 | + "Eres el especialista en devoluciones. Ayuda al cliente a iniciar una devolución. " |
78 | 92 | "Los únicos datos que necesitas son el número de pedido (3 dígitos) y si quieren un reembolso o reemplazo. " |
79 | | - "Mantenlo simple y rápido. Cuando termines, transfiere de vuelta a triage_agent." |
| 93 | + "Mantenlo simple y rápido. Una vez que el cliente confirme, llama a process_return para completar la devolución. " |
| 94 | + "Después de procesar la devolución, transfiere de vuelta a triage_agent." |
80 | 95 | ), |
| 96 | + tools=[process_return], |
81 | 97 | ) |
82 | 98 |
|
83 | 99 |
|
@@ -131,11 +147,9 @@ async def main() -> None: |
131 | 147 | if isinstance(request_event.data, HandoffAgentUserRequest): |
132 | 148 | # Muestra la respuesta del agente |
133 | 149 | agent_response = request_event.data.agent_response |
134 | | - if agent_response.messages: |
135 | | - for msg in agent_response.messages[-3:]: |
136 | | - if msg.text: |
137 | | - speaker = msg.author_name or msg.role |
138 | | - print(f"🤖 {speaker}: {msg.text}") |
| 150 | + for msg in agent_response.messages: |
| 151 | + if msg.text: |
| 152 | + print(f"🤖 {msg.author_name}: {msg.text}") |
139 | 153 |
|
140 | 154 | # Obtiene la entrada del usuario |
141 | 155 | user_input = input("\n👤 Tú: ").strip() |
|
0 commit comments