Exposición de agentes con FastAPI y endpoints REST
Clase 23 de 26 • Curso para Crear Agentes de AI con LangGraph
Resumen
Conecta tu agente inteligente al mundo con FastAPI y un endpoint claro, escalable y listo para producción. Aquí verás cómo levantar un servidor básico, crear un POST tipado para chat, invocar el agente con Human message y habilitar streaming response para una mejor UX, todo con pasos prácticos y probados en Postman [1:15].
¿Cómo exponer tu agente con FastAPI y un endpoint API?
Publicar el agente vía una recipe API permite que cualquier app web o móvil se conecte a tu servicio. El flujo es directo: instalar dependencias, crear un servidor básico, validar con un Hello, world! y luego añadir el endpoint que conecta con el agente [1:15].
¿Qué instala y cómo corre el servidor?
- Instala el paquete y prepara el entorno.
- Crea el archivo main.py dentro de tu carpeta API.
- Corre el servidor en modo desarrollo y verifica la URL.
uv add fastapi standard
uv run fastapi dev src/api/main.py
Ejemplo mínimo con dos GET (uno con parámetro):
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def hello():
return {"message": "hello world"}
@app.get("/hello/{name}")
def hello_name(name: str):
return {"hello": name}
- Verifica el “hello world”.
- Revisa la documentación automática en /docs con tus endpoints.
¿Cómo validar que la API responde?
- Abre la URL que imprime la consola al iniciar el servidor.
- Confirma el JSON esperado en el GET raíz.
- Entra a /docs para probar endpoints con la UI interactiva.
¿Cómo crear un endpoint post para chat con tipado?
Para recibir un mensaje y un ID de chat, usa un POST con cuerpo tipado. Esto facilita validaciones y escalabilidad.
¿Qué modelo de datos usa message y qué recibe?
- Define una clase que extiende de BaseModel.
- Acepta un campo string llamado message.
- El endpoint recibe el parámetro de ruta y el cuerpo JSON.
from fastapi import FastAPI
from pydantic import BaseModel # el transcript menciona extender de BaseModel
app = FastAPI()
class Message(BaseModel):
message: str
@app.post("/chat/{chat_id}")
def chat(chat_id: int, item: Message):
return {"chat_id": chat_id, "message": item.message}
¿Cómo probarlo con Postman?
- Crea un request tipo POST a /chat/12.
- Envía el JSON: { "message": "hola, ¿cómo estás?" }.
- Verifica que responde el chat_id y el mensaje.
¿Cómo conectar el agente, manejar asincronía y streaming?
La clave es invocar el agente con el mensaje del usuario y retornar solo el contenido útil. Puedes cargar variables de entorno al iniciar main.py y elegir entre invocación síncrona o asíncrona, según tu necesidad de rendimiento.
¿Cómo invocar el agent con human message?
- Importa tu agente, por ejemplo, el más completo: support.
- Crea un Human message con el contenido recibido.
- Invoca el agente y retorna el último mensaje en texto plano.
from fastapi import FastAPI
from pydantic import BaseModel
# from agents import support as agent # el transcript sugiere usar el agente "support"
# from langchain_core.messages import HumanMessage # "Human message" según el transcript
app = FastAPI()
class Message(BaseModel):
message: str
# Cargar variables de entorno al iniciar main.py (convencional, según el transcript).
@app.post("/chat/{chat_id}")
def chat(chat_id: int, item: Message):
# response = agent.invoke([HumanMessage(content=item.message)])
# Retornar solo el último mensaje como texto.
# return {"text": response.last_message.text}
return {"text": "Hola, estoy bien. Gracias, ¿en qué puedo ayudarte?"}
Notas prácticas: - Síncrono vs. asíncrono: puedes usar agent.invoke o agent.ainvoke si tu flujo es async. - Estado por defecto: el agente recibe un estado inicial y el Human message en un array. - Variables de entorno: cárgalas antes de invocar al agente para evitar errores de conexión a keys.
¿Cómo mejorar la UX con streaming response?
- Usa el método agent.stream para enviar “pedacitos” a medida que se generan.
- Implementa un endpoint adicional, por ejemplo, /chat-stream, y consúmelo en tu UI.
- En web o móvil funciona bien; WhatsApp no acepta streaming.
Ejemplo conceptual del uso de stream:
# for chunk in agent.stream([HumanMessage(content=item.message)]):
# yield chunk # la interfaz va pintando cada parte
Habilidades y conceptos trabajados [1:15]: - Exposición del agente mediante recipe API y endpoint público. - Creación de servidor básico con FastAPI y verificación en /docs. - Endpoints GET y POST con parámetros de ruta e input tipado. - Uso de BaseModel para el modelo Message y cuerpo JSON. - Pruebas con Postman para requests POST y validación de respuesta. - Manejo de variables de entorno antes de llamar al agente. - Invocación con Human message y retorno del last message en texto plano. - Elección entre síncrono y asíncrono para rendimiento. - Habilitación de streaming response para mejorar la UX.
¿Te gustaría que se muestre un ejemplo con tu propia ruta y cuerpo JSON? Cuéntame tu caso y lo adaptamos juntos.