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("/")defhello():return{"message":"hello world"}@app.get("/hello/{name}")defhello_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 BaseModelapp = FastAPI()classMessage(BaseModel): message:str@app.post("/chat/{chat_id}")defchat(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 transcriptapp = FastAPI()classMessage(BaseModel): message:str# Cargar variables de entorno al iniciar main.py (convencional, según el transcript).@app.post("/chat/{chat_id}")defchat(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.
Lo usaria como primer filtro antes de llamar cualquiera de las tools, si matchea -> respuesta rapida.
Lo que a mi me ha estado pasando es que es importante que la carga de las variables de entorno se ejecute antes de la importación del agent para que funcione correctamente. Por si a alguien le ayuda, ya que no se menciona en la clase.
porque al correr uv add fastapi queda arriba langgraph?
En el curso usamos 2 comandos, uno con uv langgraph dev y otro que es uv fastapi dev; el primero levanta el LangGraph Studio y el segundo levanta una REST API que corre el agent. Los 2 ponen el agente a disposición, pero de diferente manera.
holaa una consulta
vi en la documentacion que ya se tiene una api disponible internamente cuando se lanza el server de langraft
seria genial que se explicara como usarla en futuas clases pliss
saludos
Esta parte es paga, es decir, cuando usas el LangSmit Platform para desplegar tu agent usando LangGraph te da una REST API ya lista para operar. Podríamos hacer una clase bonus con esto, pero tener en cuenta que esto hace parte de la parte paga de LangGraph.
Me gusta mucho! Una duda, esto también habría podido ser hecho con Django Rest Framework? soy principiante y estoy pensando por ejemplo que ese tendría la facilidad de incluir autenticación. Porque como principiante me da miedo estar llamando APIs y que de pronto haga algo mal configurado y luego el consumo de API de OpenAI sea gigante
Es correcto, también lo puedes hacer usando Django. Por aquí encontré un ejemplo de un repo usando Django