Skip to content

Commit 391a52b

Browse files
authored
Merge pull request #4 from madebygps/fix-spanish-naming
Spanish updates
2 parents a23e190 + 147ac67 commit 391a52b

12 files changed

Lines changed: 937 additions & 270 deletions

examples/spanish/agent_mcp_local.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,12 @@
4646
async def main() -> None:
4747
"""Ejecuta un agente conectado a un servidor MCP local para registrar gastos."""
4848
async with (
49-
MCPStreamableHTTPTool(name="Servidor MCP de Gastos", url=MCP_SERVER_URL) as mcp_server,
49+
MCPStreamableHTTPTool(name="Expenses MCP Server", url=MCP_SERVER_URL) as mcp_server,
5050
ChatAgent(
5151
chat_client=client,
5252
instructions=(
5353
"Ayudas a la gente con tareas usando las herramientas disponibles. "
5454
f"La fecha de hoy es {datetime.now().strftime('%Y-%m-%d')}. "
55-
"Responde en español."
5655
),
5756
tools=[mcp_server],
5857
) as agent,

examples/spanish/agent_mcp_remote.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ async def main() -> None:
5353
instructions=(
5454
"Ayudas con preguntas sobre la documentación de Microsoft. "
5555
"Usa las herramientas disponibles para buscar documentación relevante. "
56-
"Responde en español."
5756
),
5857
tools=[mcp_server],
5958
) as agent,

examples/spanish/agent_middleware.py

Lines changed: 28 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
66
77
┌─────────────────────────────────────────────┐
8-
│ Middleware de Agente
8+
Agent Middleware
99
│ (temporización, bloqueo, registro) │
1010
│ │
1111
│ ┌───────────────────────────────────────┐ │
12-
│ │ Middleware de Chat │ │
12+
│ │ Chat Middleware │ │
1313
│ │ (registro, conteo de mensajes) │ │
1414
│ │ │ │
1515
│ │ ┌──────────────┐ │ │
@@ -18,7 +18,7 @@
1818
│ │ │ llamadas a funciones │ │
1919
│ │ ▼ │ │
2020
│ │ ┌──────────────────────────────────┐ │ │
21-
│ │ │ Middleware de Funciones │ │ │
21+
│ │ │ Function Middleware │ │ │
2222
│ │ │ (registro, temporización) │ │ │
2323
│ │ │ │ │ │
2424
│ │ │ get_weather(), get_date(), ... │ │ │
@@ -49,7 +49,7 @@
4949
from agent_framework import (
5050
AgentMiddleware,
5151
AgentRunContext,
52-
AgentRunResponse,
52+
AgentResponse,
5353
ChatAgent,
5454
ChatContext,
5555
ChatMessage,
@@ -98,9 +98,9 @@
9898

9999

100100
def get_weather(
101-
city: Annotated[str, Field(description="La ciudad para consultar el clima.")],
101+
city: Annotated[str, Field(description="The city to get the weather for.")],
102102
) -> dict:
103-
"""Devuelve datos del clima para una ciudad dada, un diccionario con temperatura y descripción."""
103+
"""Devuelve datos del clima para una ciudad dada, con temperatura y descripción."""
104104
logger.info(f"Obteniendo clima para {city}")
105105
if random.random() < 0.05:
106106
return {"temperature": 22, "description": "Soleado"}
@@ -109,12 +109,12 @@ def get_weather(
109109

110110

111111
def get_current_date() -> str:
112-
"""Obtiene la fecha actual del sistema y la devuelve como texto en formato AAAA-MM-DD."""
112+
"""Obtiene la fecha actual del sistema en texto con formato YYYY-MM-DD."""
113113
logger.info("Obteniendo fecha actual")
114114
return datetime.now().strftime("%Y-%m-%d")
115115

116116

117-
# ---- Middleware basado en funciones ----
117+
# ---- Function-based middleware ----
118118

119119

120120
async def timing_agent_middleware(
@@ -123,38 +123,38 @@ async def timing_agent_middleware(
123123
) -> None:
124124
"""Middleware de agente que registra el tiempo de ejecución."""
125125
start = time.perf_counter()
126-
logger.info("[⏲️ Temporización][ Middleware de Agente] Iniciando ejecución del agente")
126+
logger.info("[⏲️ Temporización][ Agent Middleware] Iniciando ejecución del agente")
127127

128128
await next(context)
129129

130130
elapsed = time.perf_counter() - start
131-
logger.info(f"[⏲️ Temporización][ Middleware de Agente] Ejecución completada en {elapsed:.2f}s")
131+
logger.info(f"[⏲️ Temporización][ Agent Middleware] Ejecución completada en {elapsed:.2f}s")
132132

133133

134134
async def logging_function_middleware(
135135
context: FunctionInvocationContext,
136136
next: Callable[[FunctionInvocationContext], Awaitable[None]],
137137
) -> None:
138-
"""Middleware de función que registra las llamadas y resultados de funciones."""
138+
"""Middleware de función que registra llamadas y resultados."""
139139
logger.info(
140-
f"[🪵 Registro][ Middleware de Función] Llamando a {context.function.name} con args: {context.arguments}"
140+
f"[🪵 Registro][ Function Middleware] Llamando a {context.function.name} con args: {context.arguments}"
141141
)
142142

143143
await next(context)
144144

145-
logger.info(f"[🪵 Registro][ Middleware de Función] {context.function.name} devolvió: {context.result}")
145+
logger.info(f"[🪵 Registro][ Function Middleware] {context.function.name} devolvió: {context.result}")
146146

147147

148148
async def logging_chat_middleware(
149149
context: ChatContext,
150150
next: Callable[[ChatContext], Awaitable[None]],
151151
) -> None:
152-
"""Middleware de chat que registra las interacciones con la IA."""
153-
logger.info(f"[💬 Registro][ Middleware de Chat] Enviando {len(context.messages)} mensajes a la IA")
152+
"""Middleware de chat que registra interacciones con la IA."""
153+
logger.info(f"[💬 Registro][ Chat Middleware] Enviando {len(context.messages)} mensajes a la IA")
154154

155155
await next(context)
156156

157-
logger.info("[💬 Registro][ Middleware de Chat] Respuesta de la IA recibida")
157+
logger.info("[💬 Registro][ Chat Middleware] Respuesta de la IA recibida")
158158

159159

160160
# ---- Middleware basado en clases ----
@@ -172,14 +172,14 @@ async def process(
172172
context: AgentRunContext,
173173
next: Callable[[AgentRunContext], Awaitable[None]],
174174
) -> None:
175-
"""Verifica los mensajes en busca de contenido bloqueado y termina si lo encuentra."""
175+
"""Verifica mensajes con contenido bloqueado y termina si lo encuentra."""
176176
last_message = context.messages[-1] if context.messages else None
177177
if last_message and last_message.text:
178178
for word in self.blocked_words:
179179
if word.lower() in last_message.text.lower():
180-
logger.warning(f"[❌ Bloqueo][ Middleware de Agente] Solicitud bloqueada: contiene '{word}'")
180+
logger.warning(f"[❌ Bloqueo][ Agent Middleware] Solicitud bloqueada: contiene '{word}'")
181181
context.terminate = True
182-
context.result = AgentRunResponse(
182+
context.result = AgentResponse(
183183
messages=[
184184
ChatMessage(
185185
role=Role.ASSISTANT, text=f"Lo siento, no puedo procesar solicitudes sobre '{word}'."
@@ -192,7 +192,7 @@ async def process(
192192

193193

194194
class TimingFunctionMiddleware(FunctionMiddleware):
195-
"""Middleware de función que mide el tiempo de ejecución de cada llamada a función."""
195+
"""Middleware de función que mide el tiempo de ejecución de cada llamada."""
196196

197197
async def process(
198198
self,
@@ -201,16 +201,16 @@ async def process(
201201
) -> None:
202202
"""Mide el tiempo de ejecución de la función y registra la duración."""
203203
start = time.perf_counter()
204-
logger.info(f"[⌚️ Temporización][ Middleware de Función] Iniciando {context.function.name}")
204+
logger.info(f"[⌚️ Temporización][ Function Middleware] Iniciando {context.function.name}")
205205

206206
await next(context)
207207

208208
elapsed = time.perf_counter() - start
209-
logger.info(f"[⌚️ Temporización][ Middleware de Función] {context.function.name} tardó {elapsed:.4f}s")
209+
logger.info(f"[⌚️ Temporización][ Function Middleware] {context.function.name} tardó {elapsed:.4f}s")
210210

211211

212212
class MessageCountChatMiddleware(ChatMiddleware):
213-
"""Middleware de chat que cuenta el número total de mensajes enviados a la IA."""
213+
"""Middleware de chat que cuenta el total de mensajes enviados a la IA."""
214214

215215
def __init__(self) -> None:
216216
"""Inicializa el contador de mensajes."""
@@ -224,14 +224,14 @@ async def process(
224224
"""Cuenta los mensajes y registra el total acumulado."""
225225
self.total_messages += len(context.messages)
226226
logger.info(
227-
"[🔢 Conteo][ Middleware de Chat] Mensajes en esta solicitud: %s, total hasta ahora: %s",
227+
"[🔢 Conteo][ Chat Middleware] Mensajes en esta solicitud: %s, total hasta ahora: %s",
228228
len(context.messages),
229229
self.total_messages,
230230
)
231231

232232
await next(context)
233233

234-
logger.info("[🔢 Conteo][ Middleware de Chat] Respuesta de chat recibida")
234+
logger.info("[🔢 Conteo][ Chat Middleware] Respuesta de chat recibida")
235235

236236

237237
# ---- Configuración del agente ----
@@ -247,7 +247,6 @@ async def process(
247247
instructions=(
248248
"Ayudas a la gente a planificar su fin de semana. "
249249
"Usa las herramientas disponibles para consultar el clima y la fecha. "
250-
"Responde en español."
251250
),
252251
tools=[get_weather, get_current_date],
253252
middleware=[
@@ -281,10 +280,10 @@ async def extra_agent_middleware(
281280
context: AgentRunContext,
282281
next: Callable[[AgentRunContext], Awaitable[None]],
283282
) -> None:
284-
"""Middleware a nivel de ejecución que solo aplica a esta ejecución específica."""
285-
logger.info("[🏃🏽‍♀️ Middleware de Ejecución] Este middleware solo aplica a esta ejecución")
283+
"""Middleware de ejecución que solo aplica a esta ejecución específica."""
284+
logger.info("[🏃🏽‍♀️ Execution Middleware] Este middleware solo aplica a esta ejecución")
286285
await next(context)
287-
logger.info("[🏃🏽‍♀️ Middleware de Ejecución] Ejecución completada")
286+
logger.info("[🏃🏽‍♀️ Execution Middleware] Ejecución completada")
288287

289288
response = await agent.run(
290289
"¿Cómo estará el clima en Barcelona?",

examples/spanish/agent_supervisor.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@
5151

5252

5353
def get_weather(
54-
city: Annotated[str, Field(description="Ciudad para consultar el clima.")],
55-
date: Annotated[str, Field(description="Fecha (YYYY-MM-DD) para la que se quiere el clima.")],
54+
city: Annotated[str, Field(description="City to fetch the weather for.")],
55+
date: Annotated[str, Field(description="Date (YYYY-MM-DD) to fetch the weather for.")],
5656
) -> dict:
5757
"""Devuelve datos meteorológicos para una ciudad y fecha dadas."""
5858
logger.info(f"Obteniendo el clima para {city} en {date}")
@@ -63,8 +63,8 @@ def get_weather(
6363

6464

6565
def get_activities(
66-
city: Annotated[str, Field(description="Ciudad para consultar actividades.")],
67-
date: Annotated[str, Field(description="Fecha (YYYY-MM-DD) para consultar actividades.")],
66+
city: Annotated[str, Field(description="City to fetch activities for.")],
67+
date: Annotated[str, Field(description="Date (YYYY-MM-DD) to fetch activities for.")],
6868
) -> list[dict]:
6969
"""Devuelve una lista de actividades para la ciudad y la fecha indicadas."""
7070
logger.info(f"Obteniendo actividades para {city} en {date}")
@@ -105,7 +105,7 @@ async def plan_weekend(query: str) -> str:
105105

106106

107107
def find_recipes(
108-
query: Annotated[str, Field(description="Consulta del usuario o comida/ingrediente deseado")],
108+
query: Annotated[str, Field(description="User query or desired meal/ingredient")],
109109
) -> list[dict]:
110110
"""Devuelve recetas (JSON) basadas en una consulta."""
111111
logger.info(f"Buscando recetas para '{query}'")

examples/spanish/agent_tool.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444

4545

4646
def get_weather(
47-
city: Annotated[str, Field(description="Nombre de la ciudad")],
47+
city: Annotated[str, Field(description="City name")],
4848
) -> dict:
4949
"""Devuelve datos meteorológicos para una ciudad: temperatura y descripción."""
5050
logger.info(f"Obteniendo el clima para {city}")

examples/spanish/agent_tools.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646

4747

4848
def get_weather(
49-
city: Annotated[str, Field(description="La ciudad para consultar el clima.")],
49+
city: Annotated[str, Field(description="City to fetch the weather for.")],
5050
) -> dict:
5151
"""Devuelve datos meteorológicos para una ciudad: temperatura y descripción."""
5252
logger.info(f"Obteniendo el clima para {city}")
@@ -63,8 +63,8 @@ def get_weather(
6363

6464

6565
def get_activities(
66-
city: Annotated[str, Field(description="La ciudad para consultar actividades.")],
67-
date: Annotated[str, Field(description="La fecha (YYYY-MM-DD) para consultar actividades.")],
66+
city: Annotated[str, Field(description="City to fetch activities for.")],
67+
date: Annotated[str, Field(description="Date (YYYY-MM-DD) to fetch activities for.")],
6868
) -> list[dict]:
6969
"""Devuelve una lista de actividades para una ciudad y fecha dadas."""
7070
logger.info(f"Obteniendo actividades para {city} en {date}")

examples/spanish/mcp_server.py

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,47 +16,47 @@
1616
from fastmcp import FastMCP
1717

1818
logging.basicConfig(level=logging.WARNING, format="%(asctime)s - %(message)s")
19-
logger = logging.getLogger("GastosMCP")
19+
logger = logging.getLogger("ExpensesMCP")
2020
logger.setLevel(logging.INFO)
2121

2222
SCRIPT_DIR = Path(__file__).parent
2323
EXPENSES_FILE = SCRIPT_DIR / "expenses.csv"
2424

25-
mcp = FastMCP("Rastreador de Gastos")
25+
mcp = FastMCP("Expenses Tracker")
2626

2727

28-
class MetodoPago(Enum):
29-
"""Métodos de pago que puedes usar para gastos."""
28+
class PaymentMethod(Enum):
29+
"""Métodos de pago aceptados para gastos."""
3030

3131
AMEX = "amex"
3232
VISA = "visa"
33-
EFECTIVO = "efectivo"
33+
CASH = "cash"
3434

3535

36-
class Categoria(Enum):
37-
"""Categorías de gastos para clasificar."""
36+
class Category(Enum):
37+
"""Categorías de gastos para clasificación."""
3838

39-
COMIDA = "comida"
40-
TRANSPORTE = "transporte"
41-
ENTRETENIMIENTO = "entretenimiento"
42-
COMPRAS = "compras"
43-
TECNOLOGIA = "tecnologia"
44-
OTRO = "otro"
39+
FOOD = "comida"
40+
TRANSPORT = "transporte"
41+
ENTERTAINMENT = "entretenimiento"
42+
SHOPPING = "compras"
43+
GADGET = "tecnologia"
44+
OTHER = "otro"
4545

4646

4747
@mcp.tool
48-
async def agregar_gasto(
49-
fecha_gasto: Annotated[date, "Fecha del gasto en formato AAAA-MM-DD"],
50-
amount: Annotated[float, "Monto numérico positivo del gasto"],
51-
category: Annotated[Categoria, "Etiqueta de categoría"],
52-
description: Annotated[str, "Descripción legible del gasto"],
53-
payment_method: Annotated[MetodoPago, "Método de pago utilizado"],
48+
async def add_expense(
49+
expense_date: Annotated[date, "Expense date in YYYY-MM-DD format"],
50+
amount: Annotated[float, "Positive numeric expense amount"],
51+
category: Annotated[Category, "Category label"],
52+
description: Annotated[str, "Human-readable expense description"],
53+
payment_method: Annotated[PaymentMethod, "Payment method used"],
5454
) -> str:
5555
"""Agrega un nuevo gasto al archivo expenses.csv."""
5656
if amount <= 0:
5757
return "Error: El monto debe ser positivo"
5858

59-
date_iso = fecha_gasto.isoformat()
59+
date_iso = expense_date.isoformat()
6060
logger.info(f"Agregando gasto: ${amount} por {description} el {date_iso}")
6161

6262
try:
@@ -76,7 +76,7 @@ async def agregar_gasto(
7676

7777

7878
@mcp.resource("resource://expenses")
79-
async def obtener_datos_gastos() -> str:
79+
async def get_expenses_data() -> str:
8080
"""Obtiene los datos de gastos desde el archivo CSV."""
8181
logger.info("Datos de gastos consultados")
8282

examples/spanish/openai_tool_calling.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,17 +42,17 @@ def lookup_weather(city_name: str | None = None, zip_code: str | None = None) ->
4242
"type": "function",
4343
"function": {
4444
"name": "lookup_weather",
45-
"description": "Consulta el clima para un nombre de ciudad o código postal dado.",
45+
"description": "Look up weather for a given city name or zip code.",
4646
"parameters": {
4747
"type": "object",
4848
"properties": {
4949
"city_name": {
5050
"type": "string",
51-
"description": "El nombre de la ciudad",
51+
"description": "City name",
5252
},
5353
"zip_code": {
5454
"type": "string",
55-
"description": "El código postal",
55+
"description": "Zip code",
5656
},
5757
},
5858
"strict": True,
@@ -63,7 +63,7 @@ def lookup_weather(city_name: str | None = None, zip_code: str | None = None) ->
6363
]
6464

6565
messages = [
66-
{"role": "system", "content": "Eres un chatbot del clima. Responde en español."},
66+
{"role": "system", "content": "Eres un chatbot del clima"},
6767
{"role": "user", "content": "¿Está soleado en Madrid?"},
6868
]
6969
response = client.chat.completions.create(

0 commit comments

Comments
 (0)