Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

Integrar MongoDB con el SDK de agentes de OpenAI

Puede utilizar MongoDB como base de datos de respaldo para los agentes que compile con el OpenAI Agents SDK. El SDK de agentes es un marco de Python para compilar aplicaciones de agentes a partir de un pequeño conjunto de primitivas:

  • Agentes, que son grandes modelos de lenguaje (LLM) configurados con instrucciones y herramientas.

  • Transferencias, que permiten a un agente delegar una tarea en otro agente.

  • Guardrails, que validan las entradas y salidas de un agente.

  • Sesiones, que almacenan el historial de conversaciones en todas las ejecuciones del agente.

El SDK sigue dos principios de diseño. Incluye suficientes funcionalidades para compilar aplicaciones reales, pero pocos primitivos para aprender en poco tiempo. Sus valores predeterminados también producen buenos resultados, y puedes personalizar cada paso de la ejecución de un agente.

El SDK de agentes proporciona MongoDBSession, una implementación de sesión que mantiene el historial de conversaciones en MongoDB. Almacenar ese historial en MongoDB ofrece a sus agentes las siguientes ventajas:

  • Almacenamiento de sesiones multiproceso y escalable horizontalmente. El estado de la sesión reside en tu clúster en lugar de en la memoria de un único proceso, por lo que cualquier trabajador, contenedor o función sin servidor que se conecte al mismo clúster puede continuar una conversación. Cada mensaje lleva un contador seq que aumenta de forma monótona, que conserva el orden de los mensajes entre escritores simultáneos.

  • Una base de datos para conversaciones y datos de aplicaciones. Si su aplicación ya utiliza MongoDB, sus agentes leen los datos operativos y guardan el historial de sesión a través de la misma conexión y el mismo driver, sin necesidad de implementar ni proteger un servicio de memoria independiente.

  • Documentos flexibles para el estado del agente. El modelo orientado a documentos almacena los turnos de conversación, las llamadas a herramientas y las salidas estructuradas a medida que evolucionan, de modo que puede ampliar lo que registra sin una migración de esquema.

  • Historial de agente consultable. El historial de sesiones se almacena en colecciones ordinarias, por lo que puedes consultar query, agregarlo e indexar índice para auditar el comportamiento del agente o compilar análisis.

  • Una ruta para la recuperación. Dado que sus agentes ya se conectan a MongoDB, puede añadir MongoDB búsqueda vectorial al mismo clúster para proporcionarles recuperación semántica sobre sus datos. Para obtener más información, consulte RAG con agente.

En este tutorial, compilarás un asistente de viajes multiagente. Un agente de clasificación responde a las preguntas llamando a dos agentes especialistas como herramientas, y ambos especialistas leen datos de referencia del mismo clúster que almacena la sesión de conversación.

Para completar este tutorial, debes tener lo siguiente:

  • Python 3.10 o posterior.

  • Uno de los siguientes tipos de clúster de MongoDB:

    • Un clúster de Atlas que ejecuta la versión 6.0.11, 7.0.2 o posterior de MongoDB. Es necesario garantizar que la dirección IP esté incluida en la lista de acceso del proyecto Atlas.

    • A local Atlas deployment created using Python and Docker. Install atlas-local-lib-py (pip install atlas-local-lib-py) to programmatically create and manage local deployments. To learn more, see the atlas-local-lib-py repository.

    • A MongoDB Community cluster with Search and Vector Search installed.

  • Una llave de API de OpenAI. Debes tener una cuenta de OpenAI con créditos disponibles para las solicitudes de API. Para obtener más información sobre cómo registrar una cuenta de OpenAI, consulta el sitio web de la API de OpenAI.

1

Este tutorial utiliza uv para gestionar el entorno:

uv venv
source .venv/bin/activate
2

Instale el SDK de agente con el extra mongodb. Ponga el nombre del paquete entre comillas para que su shell no interprete los corchetes:

uv pip install "openai-agents[mongodb]"

El extra instala la versión pymongo 4.14 o posterior, que proporciona la clase AsyncMongoClient que utilizan tanto la sesión como las herramientas del agente.

3

La aplicación lee su cadena de conexión de Atlas de ATLAS_URI, y el Agents SDK lee su clave de OPENAI_API_KEY:

export ATLAS_URI="<connection-string>"
export OPENAI_API_KEY="<api-key>"

Reemplaza el valor del marcador de posición <connection-string> con la SRV cadena de conexión para tu clúster.

Su cadena de conexión debe usar el siguiente formato:

mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net
1

Cree un archivo llamado multi_agent_app.py y pegue el siguiente código en él. Los comentarios en línea explican cómo cada parte de la aplicación utiliza MongoDB.

multi_agent_app.py
"""Multi-agent travel assistant backed by MongoDB Atlas.
A triage agent answers travel questions by calling two specialist
agents as tools. Both specialists read reference data from the same
Atlas cluster that stores the conversation session, so every agent in
the application shares one database.
"""
import asyncio
import os
from agents import Agent, Runner, function_tool
from agents.extensions.memory import MongoDBSession
from pymongo import AsyncMongoClient
# The script reads your credentials from the environment so that you
# don't commit them to source control.
REQUIRED_ENV_VARS = ("ATLAS_URI", "OPENAI_API_KEY")
DATABASE_NAME = "travel_assistant"
# One client serves both the agent tools and the session store. Because
# you create the client yourself, your application owns its lifecycle.
# main() assigns both of these after it validates the environment.
client: AsyncMongoClient | None = None
database = None
@function_tool
async def lookup_destination(city: str) -> str:
"""Look up travel guidance for a destination city."""
# Sub-agent tools query the shared database directly, so the agents
# answer from your data instead of from model training data.
document = await database.destinations.find_one({"city": city})
if document is None:
return f"No destination guide found for {city}."
return (
f"{document['city']}: best months are {document['best_months']}. "
f"{document['summary']}"
)
@function_tool
async def lookup_policy(topic: str) -> str:
"""Look up the company travel policy for a topic."""
document = await database.policies.find_one({"topic": topic})
if document is None:
return f"No policy found for {topic}."
return f"{document['topic']}: {document['rule']}"
# Each specialist is a full agent with its own instructions and tools.
destination_agent = Agent(
name="Destination expert",
instructions=(
"You advise travelers on destinations. Always call "
"lookup_destination and answer only from what it returns."
),
tools=[lookup_destination],
)
policy_agent = Agent(
name="Policy expert",
instructions=(
"You answer questions about the company travel policy. Always "
"call lookup_policy and answer only from what it returns."
),
tools=[lookup_policy],
)
# The as_tool() pattern turns each specialist into a tool that the
# triage agent can call. Unlike a handoff, control returns to the
# triage agent after each call, so it can combine both answers in one
# reply.
triage_agent = Agent(
name="Travel assistant",
instructions=(
"You are a travel assistant. Use the destination and policy "
"tools to gather facts before you answer, and call both when "
"the question needs both. Remember details the traveler shared "
"earlier in the conversation."
),
tools=[
destination_agent.as_tool(
tool_name="ask_destination_expert",
tool_description="Get travel guidance about a city.",
),
policy_agent.as_tool(
tool_name="ask_policy_expert",
tool_description="Get the company travel policy for a topic.",
),
],
)
async def seed_reference_data() -> None:
"""Load the sample data that the specialist agents read."""
await database.destinations.delete_many({})
await database.policies.delete_many({})
await database.destinations.insert_many(
[
{
"city": "Lisbon",
"best_months": "March through May",
"summary": "Mild spring weather and low hotel rates.",
},
{
"city": "Reykjavik",
"best_months": "June through August",
"summary": "Long daylight hours and open highland roads.",
},
]
)
await database.policies.insert_many(
[
{"topic": "flights", "rule": "Book economy for flights under six hours."},
{"topic": "hotels", "rule": "Nightly rates must stay under 250 USD."},
]
)
async def main() -> None:
global client, database
# Fail fast with a clear message instead of surfacing a connection
# error or an authentication error later in the run.
missing = [name for name in REQUIRED_ENV_VARS if not os.environ.get(name)]
if missing:
raise SystemExit(
"Set these environment variables before you run this script: "
+ ", ".join(missing)
)
client = AsyncMongoClient(os.environ["ATLAS_URI"])
database = client[DATABASE_NAME]
await seed_reference_data()
# The session stores conversation history in Atlas. Pass the
# existing client so the session and the agent tools share one
# connection pool.
session = MongoDBSession(
session_id="traveler-123",
client=client,
database=DATABASE_NAME,
)
# Confirm connectivity before the first run.
await session.ping()
# The Runner loads prior turns from the session and writes the new
# turn back, so the second question resolves "there" without you
# passing the history yourself.
first = await Runner.run(
triage_agent,
"I'm planning a trip to Lisbon. When should I go?",
session=session,
)
print(first.final_output)
second = await Runner.run(
triage_agent,
"What's our hotel budget for that trip?",
session=session,
)
print(second.final_output)
# session.close() is a no-op when you supply the client, so close
# the client yourself.
await client.close()
if __name__ == "__main__":
asyncio.run(main())
2
python multi_agent_app.py

El agente responde a la primera pregunta de la colección destinations y a la segunda pregunta de la colección policies. Debido a que la sesión almacena el primer turno en MongoDB, el asistente resuelve "ese viaje" en la segunda pregunta sin que usted pase el historial usted mismo.

Su resultado podría diferir, ya que el modelo genera una nueva respuesta para cada ejecución.

For Lisbon, the best time to go is **March through May**.
That's the sweet spot for **mild weather**, comfortable sightseeing, **fewer crowds**, and generally **better hotel rates** than peak summer. If you want the best single month, I'd pick **May** for warmer days while still avoiding the biggest summer crowds.
I still don't see a company policy entry for a **Lisbon hotel budget/nightly cap**.
Best next step: check the company booking tool or ask your travel/admin team to confirm the approved lodging allowance for Lisbon.

La aplicación crea un AsyncMongoClient y lo comparte entre los agentes y la sesión:

  • Los agentes especialistas consultan las colecciones destinations y policies de sus funciones de herramientas, por lo que responden a partir de tus datos.

  • MongoDBSession guarda cada turno de conversación en las colecciones agent_sessions y agent_messages de la misma base de datos. Ambos nombres de colección son configurables, y la sesión crea los índices necesarios en el primer uso.

Debido a que la aplicación construye el cliente en sí, el ciclo de vida del cliente pertenece a la aplicación y session.close() no hace nada. Para que la sesión sea propietaria del cliente, créala con MongoDBSession.from_uri().

Para aprender más sobre la coordinación de múltiple agente con el SDK de agente, consulte las siguientes páginas de la documentación de OpenAI:

  • Orquestación de múltiple agente para las compensaciones entre la orquestación a través de código y la orquestación a través de un LLM.

  • Handoffs para delegar una conversación a otro agente en lugar de llamarlo como una herramienta.

  • Guardrails para validar las entradas y salidas del agente.

  • Sessions para la referencia completa de MongoDBSession.