Sebastian Gomez
Potencia tu agente con herramientas personalizadas
Notebook de la lección: https://github.com/seagomezar/ADK Blog Posts/blob/main/Lesson_2.ipynb
En esta segunda entrega extendemos el agente con una herramienta propia y reforzamos el flujo conversacional para que las respuestas sean útiles y consistentes. Además, conectamos las ideas del video sobre Sesión, Estado y Memoria, que dan soporte a conversaciones persistentes.
Panorama general
- Añadir dependencias como
yfinancey repasar utilidades de ADK. - Crear un proyecto
app03y definir una herramienta propia (get_financial_context). - Combinar herramientas: búsqueda web y datos financieros en un mismo agente.
- Redactar instrucciones que guían el diálogo paso a paso.
- Probar el agente en
adk webe iterar rápido.
2.1 Preparativos iniciales
Asegura google-adk y yfinance instalados si estás fuera del entorno del curso.
Sobre credenciales: ADK lee .env cuando ejecutas adk web o adk run desde la carpeta adecuada. Usa GOOGLE_API_KEY (AI Studio) o variables de Vertex AI. Si usas notebooks con load_env(), aclara que es un helper del curso y que en producción usarás .env.
Tip: crea un entorno virtual por proyecto (python -m venv.venv && source.venv/bin/activate).
2.2 Configuración del proyecto
Genera la app con el scaffolding de ADK. La estructura resultante es:
app03/agent.py: lógica del agente..env: credenciales.__init__.py: organización del paquete.
2.3 Construyendo un Function Tool a medida
get_financial_context consulta Yahoo Finance vía yfinance para devolver el precio y la variación porcentual de cada ticker.
from typing import Dict, List
import yfinance as yf
def get_financial_context(tickers: List[str]) -> Dict[str, str]:
"""Obtiene precio y variación diaria de cada ticker."""
financial_data: Dict[str, str] = {}
for ticker_symbol in tickers:
try:
stock = yf.Ticker(ticker_symbol)
info = stock.info
price = info.get("currentPrice") or info.get("regularMarketPrice")
change_percent = info.get("regularMarketChangePercent")
if price is not None and change_percent is not None:
# regularMarketChangePercent ya viene en puntos porcentuales
# (p. ej. 1.23 significa +1.23%), así que NO multiplicamos por 100.
change_str = f"{change_percent:+.2f}%"
financial_data[ticker_symbol] = f"${price:.2f} ({change_str})"
else:
financial_data[ticker_symbol] = "Price data not available."
except Exception:
financial_data[ticker_symbol] = "Invalid Ticker or Data Error"
return financial_dataCuidado con el porcentaje. El campo regularMarketChangePercent de Yahoo ya está expresado en puntos porcentuales, por lo que multiplicarlo por 100 (como hacía la versión original) producía valores inflados 100 veces, por ejemplo +123.00% en lugar de +1.23%. Por eso aquí lo formateamos directamente.
`yfinance` usa una API no oficial. La librería raspa el endpoint público de Yahoo Finance, así que los nombres de campos como currentPrice o regularMarketChangePercent cambian de vez en cuando y .info es propenso a rate limits. Para algo más estable y rápido considera stock.fast_info (por ejemplo fast_info["last_price"]) y fija una versión en tus dependencias, por ejemplo yfinance==0.2.*, para evitar sorpresas.
Claves del Financial Tool
- Tipado explícito (
List[str],Dict[str, str]): ADK genera el esquema automáticamente. - Docstring descriptivo: el agente entiende cuándo usar la herramienta.
- Errores controlados: evita que un ticker inválido rompa la conversación.
- Formato consistente: devuelve un diccionario fácil de leer.
2.4 Instrucciones del agente principal
Integramos google_search y get_financial_context en un mismo Agent y usamos instrucciones para orquestar el flujo:
root_agent = Agent(
name="ai_news_chat_assistant",
model="gemini-2.5-flash-live",
instruction="""...""",
tools=[google_search, get_financial_context],
)Los model ids de Live cambian seguido. La versión original usaba gemini-2.0-flash-live-001, un modelo Live en preview de la familia Gemini 2.0 que ya fue retirado. La Live API se mueve a la familia Gemini 2.5 (variantes de tipo gemini-2.5-flash-live y de audio nativo). Como estos identificadores rotan con cada release, te recomiendo consultar siempre la lista canónica de modelos en https://ai.google.dev/gemini api/docs/models y elegir el Live vigente en vez de fijar un id de preview.
Puntos clave de la instrucción:
- Claridad en el flujo: primero pregunta cuántas noticias quiere la persona.
- Uso forzado de herramientas: buscar titulares y luego enriquecer con datos de bolsa.
- Formato obligatorio: lista numerada citando herramientas y fuentes.
- Conversación guiada: tras responder, entrega el turno ("¿cuál te interesa?").
- Reglas estrictas: solo IA y empresas listadas en EE.UU.; rechazos corteses si está fuera de alcance.
2.5 Pruebas y flujo conversacional
Inicia la UI local:
- Desde la carpeta padre:
adk web --reload_agentsy selecciona "app03". - O directo:
adk web --port 8000 --reload_agents app03.
En Windows, si ves _make_subprocess_transport NotImplementedError, usa --no-reload. Detén con Ctrl-C.
Guion sugerido:
- "Dame noticias de IA": el agente pregunta cuántas notas quieres.
- "3": devuelve tres titulares con contexto financiero.
- Elige una: amplía SOLO esa y vuelve a preguntar qué sigue.
- Induce errores (tickers desconocidos, preguntas fuera de tema) para verificar las reglas.
Nota sobre Google Search: google_search funciona con modelos Gemini 2 y posteriores (incluida la familia 2.5). Si el modelo devuelve "Search suggestions", muéstralas en tu UI (política de Grounding). Más info: https://google.github.io/adk docs/tools/built in tools/
2.6 Desafíos propuestos
- Nuevo tool: conecta otra API (sentimiento, datos macro, papers). Sigue el patrón de tipado, docstring y manejo de errores.
- Refina las instrucciones: pide preferencia de cantidad, agrega disclaimers financieros e incluye timestamps.
- Ensaya el diálogo: mezcla industrias y prueba ramificaciones.
- Simula fallos: datos faltantes o desconexiones con mensajes claros.
2.7 Recursos y referencias
- Guía de Tools de ADK: https://google.github.io/adk docs/tools/
- Function Tools: https://google.github.io/adk docs/tools/function tools/
- yfinance en PyPI: https://pypi.org/project/yfinance/
Buenas prácticas y próximos pasos
- Documenta variantes (
app03, etc.) con fecha, prompts y resultados. - Incluye pruebas manuales en los PRs para evidenciar el flujo conversacional.
- Mantén las claves fuera del repo y rota las API keys periódicamente.
- Si evolucionas a un podcast, evalúa memoria persistente para recordar preferencias.
Resumen en 3 puntos
- Un Function Tool bien tipado y documentado deja que ADK genere el esquema y que el agente sepa cuándo invocarlo.
- Combinar
google_searchcon datos financieros propios, guiados por instrucciones claras, produce respuestas útiles y consistentes. - Prueba e itera rápido en
adk web, y trata las APIs externas comoyfinancecon cuidado, ya que son no oficiales y pueden cambiar.
Eso es todo, espero que esta lección te sea de utilidad y la puedas aplicar a algún agente que tengas en mente. Déjame un comentario si te sirvió o si tienes dudas, y si te gustó compártelo usando los links a las redes sociales aquí abajo.
Lección anterior: https://www.sebastian gomez.com/category/inteligencia artificial/adk clase-1-construye tu primer agente con google adk
Siguiente lección: https://www.sebastian gomez.com/category/inteligencia artificial/adk clase-3-construye un agente investigador en segundo plano
Este contenido se basa en el curso "Building Live Voice Agents with Google's ADK!" de DeepLearning.AI (https://learn.deeplearning.ai/courses/building live voice agents with googles adk/). Este blog busca acercar el material de ADK al español.
Sebastian Gomez
Creador de contenido principalmente acerca de tecnología.