Aprende a crear un Libro Mayor de Mandatos inmutable en MongoDB Atlas para establecer una capa de confianza para el comercio entre agentes y garantizar la rendición de cuentas.
caso de uso: Inteligencia artificial, Pagos
Industrias: Comercio minorista
Productos: MongoDB Atlas
emparejar: Google Cloud
Descripción general de la solución
Los agentes de IA transforman el comercio digital al gestionar de forma autónoma tareas que van desde el descubrimiento de productos hasta el pago final. Sin embargo, cuando un agente de IA inicia un pago en nombre de un cliente, rompe con los principios fundamentales del comercio tradicional y genera una crisis de confianza.
Los sistemas de pago actuales no pueden verificar la autoridad de un agente, autenticar la verdadera intención de un cliente ni definir una clara responsabilidad en las transacciones. Esto genera desafíos clave:
Autorización: Verificar que un cliente haya autorizado al agente para una compra específica.
Autenticidad: Verificar que la solicitud de un agente refleje con precisión la verdadera intención del cliente, sin errores ni ilusiones.
Responsabilidad: Determinar quién es responsable si una transacción falla: el cliente, el desarrollador del agente, el comerciante o el emisor.
Para afrontar estos retos se necesita un estándar común en el que todos los participantes, incluidos clientes, comerciantes e instituciones financieras, puedan confiar.
Establecer confianza con AP2
El Protocolo de Pagos para Agentes de Google2 (AP) proporciona un protocolo abierto, seguro e interoperable que crea un ecosistema de confianza para comerciantes, instituciones financieras y clientes cotidianos.
Figura 1. La capa de confianza
AP2 protege las transacciones mediante Credenciales Digitales Verificables (VDC), cargas útiles JSON firmadas criptográficamente y a prueba de manipulaciones que los agentes crean e intercambian. AP2 clasifica estas VDC en tres mandatos principales:
El mandato de intención: Describe lo que el cliente requiere y define las condiciones bajo las cuales un agente de IA puede realizar una compra en nombre del cliente.
El mandato del carrito: Proporciona un recibo digital firmado tanto por el comerciante como por el cliente para autorizar las compras realizadas en presencia del comprador.
El mandato de pago: Crea una capa de visibilidad compartida directamente con la red de pagos para indicar de forma segura la participación de un agente de IA.
Los VDC funcionan como contratos digitales permanentes. Los agentes firman criptográficamente estas cargas útiles para capturar la intención del cliente. Este proceso crea un registro de auditoría irrefutable para cada paso de la experiencia de compra.
Figura 2. Una conversación contractual con prueba verificable en cada paso.
Figura 3. Visualización de la intención en la interfaz de usuario, que muestra cómo se representa cada intención dentro de la conversación.
Garantice la rendición de cuentas con MongoDB Atlas
Para que estos VDC criptográficos sigan siendo fiables, los sistemas deben almacenarlos en un entorno seguro y verificable. El Servicio de Libro Mayor de Mandatos actúa como middleware de protección entre los agentes de IA y la base de datos. Detrás de este middleware se encuentra MongoDB Atlas.
Atlas proporciona seguridad de nivel empresarial diseñada para admitir un registro de auditoría a prueba de manipulaciones. Cree esta arquitectura para desarrollar la capa de confianza inmutable, el Servicio de Libro Mayor de Mandatos, necesaria para escalar el comercio seguro entre agentes.
Imagina a un cliente pidiéndole a un asistente de IA que le compre un nuevo smartphone. El agente de compras negocia de forma autónoma con los comercios para encontrar la mejor oferta. El servicio Mandate Ledger registra todo este proceso, empaquetando cada solicitud, aprobación y paso de pago en mandatos JSON firmados criptográficamente. MongoDB Atlas almacena cada mandato como un documento inmutable. Este proceso transforma una simple conversación en una prueba de intención permanente e irrefutable.
Esta solución muestra cómo construir el Servicio de Libro Mayor de Mandatos sobre una arquitectura que utiliza el protocolo AP2.
Arquitecturas de Referencia
AP2 utiliza una arquitectura basada en roles diseñada para brindar seguridad y una clara rendición de cuentas en las transacciones. Cada participante en este ecosistema tiene responsabilidades específicas para simplificar la integración y proteger la privacidad del cliente.
Figura 4. Arquitectura del servicio MongoDB Mandate Ledger.
Revise las funciones clave definidas en esta arquitectura:
El cliente: Interactúa directamente con el agente de compras para iniciar la búsqueda de productos y las solicitudes de compra.
El agente de compras: Interactúa directamente con el cliente para descubrir productos, negociar el carrito de compra y firmar los contratos.
El agente comercial: Representa al vendedor para exhibir el inventario, negociar ofertas y firmar mandatos para garantizar el cumplimiento de los pedidos.
El proveedor de credenciales: gestiona de forma segura los métodos de pago del cliente y selecciona los tokens de pago adecuados para la transacción.
El procesador de pagos del comercio: Construye y enruta el mensaje de autorización de la transacción directamente a la red de pagos y al emisor.
El agente auditor: Inspecciona el registro de auditoría inmutable después de una transacción para verificar los pagos y las firmas mediante acceso de solo lectura.
El servicio de registro de mandatos actúa como middleware de protección entre los agentes de IA y MongoDB Atlas para almacenar los mandatos firmados criptográficamente de forma nativa como documentos JSON. MongoDB Atlas funciona como el registro central e inmutable.
Esta solución utiliza una arquitectura multiagente donde los agentes se comunican mediante el protocolo Agente a Agente2 (A3A). AP152 también admite el Protocolo de Comercio Universal (UCP) para ejecutar transacciones.
El Servicio de Libro Mayor: Un Escudo Protector
El servicio Mandate Ledger actúa como un middleware de protección que conecta al agente comercial con la base de datos. Desarrolle este servicio utilizando FastAPI o gRPC.
Figura 5. Arquitectura detallada del servicio de registro de mandatos
Procese todas las solicitudes de los agentes a través de tres capas distintas y seguras:
La capa de autenticación: valida las claves API para identificar de forma segura a los agentes. Aplica el control de acceso basado en roles (RBAC) según el tipo de agente para garantizar permisos estrictos para los agentes.
La capa de lógica de negocio: Ejecuta la validación de solicitudes principales y el control de concurrencia. Garantiza la idempotencia para reintentos de red seguros y admite la inmutabilidad estricta de los mandatos.
Capa de acceso a datos: Utiliza el cliente de MongoDB y la indexación optimizada para ejecutar operaciones de base de datos. Esta capa define el
_idcampo como inmutable y bloquea todas las operaciones de actualización y eliminación mediante la validación del esquema.
La cadena de mandatos: desde la intención hasta el pago.
Cada transacción AP2 avanza a través de una secuencia estructurada de mandatos firmados criptográficamente. Cada paso genera un registro inmutable en MongoDB Atlas, creando un registro de auditoría completo desde la intención hasta el pago.
Figura 6. Flujo de datos
Para pasar una transacción de intención a pago, los agentes AP2 completan la siguiente secuencia de transacciones:
Captura la intención del cliente. El Agente de Compras traduce la solicitud del cliente, como una descripción en lenguaje natural de "zapatillas para correr", en un Mandato de Intención estructurado. El Mandato de Intención captura el comercio objetivo, los requisitos de reembolso, las preferencias de confirmación del carrito y un plazo de caducidad. El Agente de Compras firma el mandato usando EdDSA en nombre del cliente y lo envía al Agente del Comercio con un estado de
signedy un hash de versión que bloquea su contenido.Almacene el Mandato de Intención. El Agente Comercial escribe el Mandato de Intención en Atlas a través del Servicio de Registro de Mandatos. El servicio de registro valida la solicitud, aplica el Control de Acceso Basado en Reglas (RBAC) y agrega el registro de forma inmutable.
Cree el mandato del carrito. El agente comercial crea una oferta de carrito con todos los detalles del producto: nombre del artículo, precio, moneda, métodos de pago aceptados y fecha de vencimiento. A continuación, el agente comercial la almacena en Atlas a través del servicio de registro de mandatos, donde el registro recibe un estado de
proposedy un hash de versión para garantizar su integridad.Ofrezca el carrito al cliente. El agente comercial devuelve la orden de compra propuesta al agente de compras, que presenta las opciones de productos disponibles al cliente.
Acepte el mandato del carrito. El cliente selecciona una opción. El agente de compras firma conjuntamente el mandato del carrito en nombre del cliente mediante una llave de dispositivo con respaldo de hardware y envía el mandato aceptado de vuelta al agente del comercio.
Refrenda y finalice el mandato del carrito. El agente comercial agrega su firma criptográfica al carrito aceptado y almacena el mandato del carrito con doble firma en Atlas, bloqueando los términos acordados con un
signedestado.Cree el mandato de pago. El agente de compras consulta al proveedor de credenciales para obtener el token de pago correspondiente. A continuación, el agente de compras crea y firma el mandato de pago en nombre del cliente y lo envía al agente del comercio. El proveedor de credenciales nunca devuelve los números completos de la tarjeta de crédito, lo que garantiza que el agente de compras nunca acceda a los datos sin procesar.
Almacene el mandato de pago. El agente comercial envía el mandato de pago firmado a Atlas a través del servicio de registro de mandatos. Este servicio comparte dicho mandato directamente con las instituciones financieras para indicar la participación del agente de IA, y el procesador de pagos utiliza este mandato para enviar la autorización a la red de pagos.
Los agentes no pueden modificar ni eliminar registros existentes. MongoDB Atlas aplica escrituras de solo adición, por lo que la cadena completa de mandatos (Intención, Carrito y Pago) permanece intacta y el Agente Auditor puede verificarla de forma independiente en cualquier momento.
Enfoque de modelo de datos
Estructure la base de datos MongoDB utilizando cinco colecciones principales para dar soporte al comercio electrónico a gran escala:
mandate_ledger: Almacena de forma segura versiones inmutables de mandatos.payments: Almacena registros de finalización de pagos ultraligeros.api_keysGestiona las claves API para identificar a los agentes de forma segura.audit_logMantiene un registro completo de auditoría de las operaciones.idempotency_records: Almacena en caché los datos de solicitud para realizar operaciones de deduplicación.
El Libro Mayor de Mandatos: Un Almacén de Documentos Polimórfico
La colección mandate_ledger almacena los tres tipos de mandato en una sola colección. Utilice el campo entity_type para distinguirlos en el momento de la consulta, lo que elimina la necesidad de uniones o colecciones separadas para cada tipo de mandato.
Todos los documentos comparten una estructura de sobre común:
{ "entity_id": "IntentMandate_955181ea-11c3-4379-92c4-3e27c5f278d3", "entity_type": "IntentMandate", "version": 1, "status": "signed", "transaction_id": "txn_fca7db66-c769-4206-b891-7140af37f8f4", "user_id": "hunter-d53910cf-b9e2-4876-8668-8251c990e203", "created_by_agent": "merchant_agent_dev", "created_by_agent_type": "merchant-agent", "current_version_hash": "4a822a01468a27dfd...", "signatures": [...], "mandate_data": { ... } }
El campo mandate_data contiene la carga útil específica del tipo, donde cada tipo de mandato almacena una estructura de datos diferente:
IntentMandate
El documento IntentMandate captura la intención de compra del cliente como datos estructurados. Estos datos incluyen una descripción en lenguaje natural, comercios objetivo, SKU específicos, requisitos de reembolso y un período de vencimiento:
"mandate_data": { "natural_language_description": "cheapest french press coffee maker", "merchants": [], "skus": [], "requires_refundability": true, "user_cart_confirmation_required": true, "intent_expiry": "2026-04-18T20:00:03.651746+00:00" }
El agente de compras firma este documento usando EdDSA antes de enviarlo al agente comercial. El documento ingresa al libro mayor con una carga útil "status": "signed" y un valor current_version_hash que bloquea su contenido.
CartMandate
El documento CartMandate contiene la oferta comercial completa, incluyendo artículos con precios y monedas, costos de envío, impuestos, métodos de pago aceptados y un plazo de caducidad del carrito:
"mandate_data": { "contents": { "payment_request": { "method_data": [{ "supported_methods": "CARD", "data": { "network": ["mastercard", "paypal", "amex"] }}], "details": { "display_items": [ { "label": "Standard Laptop", "amount": { "currency": "USD", "value": 1203.50 }, "refund_period": 30 }, { "label": "Shipping", "amount": { "currency": "USD", "value": 2.00 }}, { "label": "Tax", "amount": { "currency": "USD", "value": 1.50 }} ], "total": { "label": "Total", "amount": { "currency": "USD", "value": 1203.50 }} } }, "shipping_address": { "recipient": "Bugs Bunny", "address_line": ["123 Main St"], "city": "Sample City", "country": "US" }, "cart_expiry": "2026-04-17T20:29:05.197984+00:00" }, "merchant_authorization": "eyJhbGciOiJSUzI1NiIs..." }
Este documento se registra en el libro mayor con la "status": "proposed" designación. Cuando el cliente acepta la oferta, el agente de compras la firma conjuntamente. A continuación, el agente comercial registra un nuevo documento en el libro mayor con el transaction_id mismo, un incrementado version y un "status": "signed" campo. Incluir ambas firmas en la matriz hace que los términos acordados sean vinculantes bilateralmente.
"signatures": [ { "signer_type": "shopping-agent", "algorithm": "EdDSA", "signed_at": "2026-04-17T19:59:49Z" }, { "signer_type": "merchant-agent", "algorithm": "JWT", "signed_at": "2026-04-17T19:59:50Z" } ]
Mandato de pago
El documento PaymentMandate vincula el carrito acordado a un token de pago específico obtenido del Proveedor de Credenciales e incluye los datos de envío y contacto del pagador:
"mandate_data": { "payment_mandate_contents": { "payment_details_total": { "label": "Total", "amount": { "currency": "USD", "value": 1203.50 }}, "payment_response": { "method_name": "CARD", "details": { "token": { "value": "fake_payment_credential_token_5" }}, "shipping_address": { "recipient": "Bugs Bunny", "address_line": ["123 Main St"], "city": "Sample City" }, "payer_email": "bugsbunny@gmail.com" }, "merchant_agent": "Generic Merchant", "timestamp": "2026-04-17T20:00:22.603453+00:00" }, "user_authorization": "fake_cart_mandate_hash_cart_fb1b4c86..._fake_payment_mandate_hash_812843b2..." }
El hash user_authorization vincula criptográficamente este PaymentMandate con el CartMandate aceptado, lo que impide que el token de pago se vuelva a utilizar en otra transacción.
Requisitos de indexación
Cree un índice en los campos transaction_id y entity_type para recuperar la cadena completa de mandatos para cualquier transacción en una sola consulta.
Pagos: El registro de finalización ultraligero
La payments colección almacena un documento por cada transacción completada. Esta colección aplica el patrón de referencia extendida.
En lugar de incluir el contenido completo del mandato, cada documento almacena únicamente el ID del mandato y la firma de autorización para cada uno de los tres mandatos. Este diseño permite que el registro de pago sea pequeño y de lectura rápida, a la vez que conserva un puntero directo a los datos completos en la colección mandate_ledger cuando se requiere un seguimiento de auditoría completo.
{ "payment_id": "pay_123c25ac-7b56-4e45-8dd1-30cdcda944c7", "transaction_id": "txn_6fbab918-2b5d-4ddd-89d8-fdb96e5648d9", "user_id": "hunter-263b752e-92be-4001-ab9d-38847811c663", "intent_mandate": { "mandate_id": "IntentMandate_41bbeacf-...", "signature": "0x_shopping_agent_sig_...", "timestamp": "2026-04-15T19:50:57Z" }, "cart_mandate": { "mandate_id": "CartMandate_c0e8f369-...", "signature": "eyJhbGciOiJSUzI1NiIs...", "timestamp": "2026-04-15T19:52:07Z" }, "payment_mandate": { "mandate_id": "PaymentMandate_33c39b8c-...", "signature": "fake_cart_mandate_hash_...", "timestamp": "2026-04-15T19:53:53Z" }, "amount": 28, "currency": "USD", "status": "SUCCESS", "payment_method_type": "CARD", "merchant_agent": "merchant_agent_dev", "payment_processor_agent": "payment_processor", "processed_at": "2026-04-15T19:54:14Z" }
Este diseño busca mantener el documento pequeño intencionadamente. Los términos completos, las partidas y las pruebas criptográficas se encuentran en la colección mandate_ledger. El registro de pago solo sirve para confirmar que la transacción se ha completado y para proporcionar los tres punteros necesarios para reconstruir la cadena de auditoría completa. Utilice el campo transaction_id para combinar ambas colecciones cuando se requiera un seguimiento completo.
Claves API: Identificación segura de agentes
La colección api_keys gestiona las claves API para identificar de forma segura a los agentes. Utilice esta colección para almacenar las claves asociadas a cada agente que llame al servicio.
Registro de auditoría: El rastro operativo
La colección audit_log almacena todas las operaciones de la API para fines de cumplimiento y depuración. Utilice esta colección para registrar eventos de nivel de servicio, como la creación de mandatos, los intentos de acceso y los resultados de validación. Este enfoque evita la expansión del propio libro mayor de mandatos inmutable. Añada un índice TTL para eliminar automáticamente los registros después de 90 días. Esto conserva un registro operativo útil a la vez que mantiene la colección delimitada.
La colección incluye los siguientes campos clave:
event_type: Identifica el tipo de operación, como por ejemplomandate.created.entity_id: Hace referencia al mandato correspondiente.actor_agent_id: Registra qué agente realizó la acción.event_timestamp: Registra cuándo ocurrió el evento y admite la política TTL.expires_at: Define cuándo MongoDB elimina automáticamente el registro.
Registros de idempotencia: Manejo seguro de reintentos
La colección idempotency_records almacena claves de idempotencia para evitar operaciones duplicadas. Utilice esta colección para conservar la clave proporcionada por el cliente, el agente que realizó la solicitud y el asiento contable creado para dicha operación. Añada un índice TTL para eliminar automáticamente los registros después de 24 horas.
La colección incluye los siguientes campos clave:
idempotency_keyAlmacena la clave única proporcionada por el cliente y requiere un índice.agent_id: Identifica al agente que realizó la solicitud.ledger_entry_id: Hace referencia al mandato creado para la solicitud original.expires_at: Define cuándo MongoDB elimina automáticamente el registro.
Compilar la solución
Requisitos previos
Antes de comenzar, asegúrese de instalar y configurar lo siguiente:
MongoDB Atlas o MongoDB autogestionado 7.0 o posterior
Python 3.13 (versión 3.13.x)
uv para la gestión de dependencias
Una clave API de Google o acceso a Vertex AI
Docker para ejecutar servicios como contenedores
Node.js y npm para la aplicación frontend
Procedimiento
Instale el servicio Ledger.
Clona el repositorio e instala el servicio Mandate Ledger:
git clone https://github.com/mongodb-industry-solutions/retail-agent-shopping-ap2-ucp.git cd retail-agent-shopping-ap2-ucp/mandate_ledger_service python3.13 -m venv .venv source .venv/bin/activate pip install -e . Crea un archivo
.enven el directoriomandate_ledger_service/:MONGODB_URI= # Your connection string MONGODB_DATABASE=mandate_ledger SERVICE_NAME=mandate-ledger-service ENVIRONMENT=development Bootstrap Auth (dev only — set to false after Step 2) BOOTSTRAP_ADMIN_KEY=**** # Generate: openssl rand -hex 32 ENABLE_BOOTSTRAP_AUTH=true ALLOWED_CORS_ORIGINS=* DEFAULT_RATE_LIMIT_PER_MINUTE=60 Inicie el servicio:
uvicorn src.main:app --reload --port 5000 Para ejecutar el servicio con Docker:
docker build -t mandate-ledger . docker run --rm \ -p 5000:5000 \ --env-file .env \ mandate-ledger
Generar claves API de agente
Abre una nueva terminal y ejecuta:
cd mandate_ledger_service source .venv/bin/activate PYTHONPATH=. python3 scripts/setup_agent_keys.py Copie la clave API del agente comercial de la salida. Establezca
ENABLE_BOOTSTRAP_AUTH=falseen su.envarchivo y reinicie el servicio.
Nota de producción: Utilice un gestor de secretos como Google Secret Manager o AWS Secrets Manager e implemente la rotación de claves.
Configure el Backend
El /backend servicio interactúa con el Servicio de Libro Mayor de Mandatos y agrega nuevos mandatos al libro mayor. Este servicio está adaptado del repositorio AP de Google2 utilizando el ejemplo AP2 + A2A.
Cree un archivo
.enven/backend. EstablezcaMANDATE_LEDGER_API_KEYal valormlsk_merchant_keygenerado en el paso 2:GOOGLE_API_KEY= MANDATE_LEDGER_SERVICE_URL=http://localhost:5000 MANDATE_LEDGER_API_KEY= Para Vertex AI, reemplace la primera línea con:
GOOGLE_GENAI_USE_VERTEXAI=true GOOGLE_CLOUD_PROJECT=your-project-id GOOGLE_CLOUD_LOCATION=us-central1 Construye y ejecuta el contenedor de backend:
docker build -f backend/Dockerfile -t retail-backend ./backend docker run --rm \ -p 8000:8000 \ -p 8001:8001 \ -p 8002:8002 \ -p 8003:8003 \ -p 8004:8004 \ --env-file backend/.env \ retail-backend La API de backend se inicia en http://localhost:8000 y lanza automáticamente los siguientes2 agentes AP:
agentePuertoAgente de compras (integrado en el sistema backend principal)
8000
Agente comercial
8001
Agente proveedor de credenciales
8002
Agente procesador de pagos de comerciantes
8003
Agente auditor
8004
Configurar el frontend
El frontend es una aplicación Next.js que interactúa con el servicio /backend.
Copie el archivo de ejemplo
.envy configure los puntos finales del backend y del asistente:cd frontend cp EXAMPLE.env .env.local Actualiza
frontend/.env.localcon tus valores:MONGODB_URI=<your-mongodb-string> MONGODB_DATABASE=<your-database-name> NEXT_PUBLIC_BACKEND_ENDPOINT=http://localhost:8000 ASSISTANT_ENDPOINT=http://localhost:3333 Instala las dependencias y ejecuta el frontend:
npm install npm run dev Para ejecutar el frontend como un contenedor, utilice el Dockerfile raíz.
Habilitar las respuestas sugeridas en la interfaz de chat
La interfaz de chat genera sugerencias de respuesta mediante un microservicio de asistente externo. Para activar esta función, configure y ejecute el microservicio de asistente antes de iniciar la demostración. Sin este servicio, la aplicación se carga, pero no genera sugerencias de respuesta.
Ejecutar la demostración
Inicie los tres servicios en terminales separadas y luego abra la aplicación en http://localhost:.8080
La API de backend sigue estando disponible en http://localhost:.8000
Consulte la Guía del usuario para obtener instrucciones completas sobre cómo navegar por la aplicación.
Lecciones clave
Generar confianza en el comercio basado en agentes. Superar la crisis de confianza vinculando las transacciones de IA a pruebas deterministas e irrefutables de la intención del cliente:
Garantice la inmutabilidad de las transacciones: aplique reglas de solo escritura en su Servicio de Libro Mayor de Mandatos para crear un registro de auditoría a prueba de manipulaciones.
Conservar las firmas criptográficas: utilice el modelo de documentos de MongoDB para almacenar de forma nativa mandatos JSON anidados en profundidad, tal como los generan los agentes.
Controla el acceso de los agentes: Implementa un control de acceso basado en roles para garantizar que los agentes de IA solo realicen acciones autorizadas según sus roles específicos.
Evite cargos duplicados: implemente claves de idempotencia en su capa de servicio para gestionar de forma segura los reintentos de red sin cobrar dos veces al cliente.
Autores
Angélica Guemes, MongoDB
Florencia Arin, MongoDB
Sakshi Garg, MongoDB
Genevive Broadhead, MongoDB
Antonio Membrides, MongoDB
Daniel Jamir, MongoDB