Aprenda a compilar un libro mayor de mandatos inmutable en MongoDB Atlas para crear una capa de confianza para el comercio de 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 las tareas, 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 los supuestos básicos del comercio tradicional y crea una crisis de confianza.
Los sistemas de pago existentes no pueden verificar la autoridad de un agente, autenticar la verdadera intención de un cliente o definir una clara responsabilidad de las transacciones. Esto crea desafíos clave:
Autorización: Verificación de que un cliente autorizó al agente para una compra en particular.
Autenticidad: verificar que la solicitud de un agente refleje con precisión la verdadera intención del cliente, sin errores ni alucinaciones.
Responsabilidad: Determinar quién es responsable si una transacción falla: el cliente, el desarrollador del agente, el comerciante o el emisor.
Para abordar estos desafíos, se requiere un estándar compartido en el que todos los participantes, incluidos los clientes, los comerciantes y las 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 a través de credenciales digitales verificables (VDC), cargas útiles de JSON criptográficamente firmadas 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 compras con presencia humana.
El mandato de pago: crea una capa de visibilidad compartida directamente con la red de pago para señalar de forma segura la participación del agente de IA.
Los VDC actúan como contratos digitales permanentes. Los agentes firman criptográficamente estas cargas útiles para capturar la intención del cliente. Este proceso crea una pista no repudiable para auditar para cada paso de la experiencia de compra.
Figura 2. Una conversación contractual con pruebas verificables en cada paso
Figura 3. Visualización de intenciones en la interfaz de usuario, que muestra cómo se representa cada intención dentro de la conversación
Garantice la responsabilidad con MongoDB Atlas
Para que estos VDC criptográficos sigan siendo fiables, los sistemas deben almacenarlos en un entorno seguro y verificable. El servicio Mandate Ledger 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 la seguridad de nivel empresarial diseñada para admitir una pista de auditar a prueba de manipulaciones. Compile esta arquitectura para crear la capa de confianza inmutable, el servicio de libro mayor de mandatos, necesario para escalar el comercio agente seguro.
Imagine a un cliente pidiéndole a un asistente de IA que compre un nuevo teléfono inteligente. El agente de compras negocia de forma autónoma con los comerciantes para encontrar la oferta perfecta. El servicio de libro mayor de mandatos registra todo este recorrido 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 un simple chat en una prueba de intención permanente e irrefutable.
Esta solución muestra cómo compilar 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 proporcionar seguridad y una clara responsabilidad de las transacciones. Cada actor de este ecosistema tiene responsabilidades distintas para simplificar la integración y proteger la privacidad del cliente.
Figura 4. Arquitectura del servicio de contabilidad de mandatos de MongoDB
Haga una revisión de los roles clave definidos 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: realiza interacción directamente con el cliente para descubrir productos, negociar el carrito y firmar mandatos.
El agente comercial: Representa al vendedor para mostrar 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 comerciante: construye y enruta el mensaje de autorización de la transacción directamente a la red de pagos y al emisor.
El agente de auditoría: 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 libro mayor de mandatos: actúa como middleware de protección entre los agentes de IA y MongoDB Atlas para almacenar los mandatos criptográficamente firmados de forma nativa como documentos JSON. MongoDB Atlas sirve como libro mayor central e inmutable.
Esta solución utiliza una arquitectura multiagente donde los agentes se comunican mediante el protocolo Agente a Agente (A A).2 AP2 también admite el Protocolo de Comercio Universal (UCP) para ejecutar transacciones.
El Ledger Service: un escudo protector
El servicio de contabilidad de mandatos actúa como un middleware de protección que conecta al agente comercial con la base de datos. Compila este servicio con FastAPI o gRPC.
Figura 5. Arquitectura detallada del servicio de contabilidad de mandatos
Procese todas las solicitudes de agente a través de tres capas seguras y distintas:
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) por tipo de agente para aplicar permisos estrictos de agente.
La capa de lógica empresarial: ejecuta la validación de solicitudes principales y el control de concurrencia. Aplica la idempotencia para reintentos de red seguros y admite la inmutabilidad estricta del mandato.
La capa de acceso a los datos: utiliza el cliente de MongoDB y la indexación optimizada para ejecutar operaciones de base de datos. Esta capa define el campo
_idcomo inmutable y bloquea todas las operaciones de actualizar y borrar a través de la validación de esquema.
La cadena de mandatos: del intento al pago
Cada transacción de AP2 avanza a través de una secuencia estructurada de mandatos firmados criptográficamente. Cada paso produce un registro inmutable en MongoDB Atlas, creando una pista de auditoría completa desde la intención hasta el pago.
Figura 6. Flujo de datos
Para mover una transacción de la intención al pago, los agentes de AP2 completan la siguiente secuencia de transacciones:
Capture la intención del cliente. El agente de compras traduce la solicitud del cliente, como una descripción en lenguaje natural de "zapatillas de correr", en un mandato de intención estructurado. El mandato de intención captura el comerciante objetivo, los requisitos de reembolsabilidad, las preferencias de confirmación del carrito y una ventana de vencimiento. El agente de compras firma el mandato utilizando EdDSA en nombre del cliente y lo envía al agente comercial con un estado de
signedy un hash de versión que bloquea su contenido.Almacene el mandato de intención. El agente comercial guarda el mandato de intención en Atlas a través del servicio de libro mayor de mandatos. El servicio de libro mayor valida la solicitud, aplica el control de acceso basado en roles y anexa el registro de forma inmutable.
Cree el mandato del carrito. El agente comercial compila una oferta de carrito que contiene todos los detalles del producto: nombre del artículo, precio, divisa, métodos de pago aceptados y fecha de caducidad. El agente comercial lo almacena en Atlas a través del servicio de libro mayor de mandatos, donde el registro recibe un estado de
proposedy una encriptada de versión para garantizar la integridad.Ofrezca el carrito al cliente. El agente comercial devuelve el mandato de carrito propuesto 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 cofirma el mandato del carrito en nombre del cliente utilizando una clave de dispositivo respaldada por hardware y envía el mandato aceptado de vuelta al agente comercial.
Refrende y finalice el mandato del carrito. El agente comercial añade su firma criptográfica al carrito aceptado y almacena el mandato del carrito totalmente firmado por dos partes en Atlas, bloqueando los términos acordados con un estado
signed.Cree el mandato de pago. El agente de compras query al proveedor de credenciales para recuperar el token de pago adecuado. A continuación, el agente de compras crea y firma el mandato de pago en nombre del cliente y lo envía al agente comercial. El proveedor de credenciales nunca devuelve números de tarjeta de crédito completos, lo que garantiza que el agente de compras nunca acceda a datos sin procesar.
Almacenar el mandato de pago. El agente comercial guarda el mandato de pago firmado en Atlas a través del servicio de libro mayor de mandatos. El servicio de libro mayor comparte este mandato directamente con las instituciones financieras para marcar la participación del agente de IA, y el procesador de pagos utiliza este mandato para enrutar la autorización a la red de pagos.
Los agentes no pueden modificar ni borrar registros existentes. MongoDB Atlas aplica guardar de solo anexar, por lo que la cadena de mandatos completa —Intención, Carrito y Pago— permanece intacta y puede ser verificada de forma independiente por el agente de auditoría en cualquier momento.
Enfoque de modelo de datos
Estructurar la base de datos de MongoDB utilizando cinco colecciones principales para admitir el comercio electrónico a escala:
mandate_ledger: Almacena de forma segura versiones de mandatos inmutables.payments: Almacena registros de finalización de pagos ultraligeros.api_keys: gestiona las claves de API para identificar a los agentes de forma segura.audit_log: Mantiene un registro de auditoría de operaciones completo.idempotency_records: Almacena en caché los datos de solicitud para deduplicar las operaciones.
El libro mayor de mandatos: un almacén polimórfico para almacenar documentos
La colección mandate_ledger almacena los tres tipos de mandatos en una sola colección. Utiliza el campo entity_type para distinguirlos en el momento de la query, lo que elimina la necesidad de uniones o colecciones separadas por 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, comerciantes objetivo, SKU específicos, requisitos de reembolsabilidad y una ventana 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 con EdDSA antes de enviarlo al agente comercial. El documento entra en el libro mayor con una carga útil de "status": "signed" y un valor de current_version_hash que bloqueo su contenido.
CartMandate
El documento CartMandate contiene la oferta comercial completa, incluidos los artículos con precios y monedas, los costos de envío, los impuestos, los métodos de pago aceptados y una ventana de vencimiento 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 entra en el libro mayor con una designación "status": "proposed". Cuando el cliente acepta la oferta, el agente de compras la firma conjuntamente. A continuación, el agente comercial guarda un nuevo documento en el libro mayor con el mismo transaction_id, un version incrementado y un campo "status": "signed". La inclusión de ambas firmas en el arreglo hace que los términos acordados sean bilateralmente vinculantes:
"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" } ]
PaymentMandate
El documento PaymentMandate vincula el carrito acordado a un token de pago específico recuperado del proveedor de credenciales e incluye los detalles 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 evita que el token de pago se reproduzca en otra transacción.
Requisitos de indexación
Cree un índice en los campos transaction_id y entity_type para recuperar la cadena de mandato completa de cualquier transacción en una sola query.
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 la incrustación del contenido completo del mandato, cada documento almacena solo el ID del mandato y la firma autorizada para cada uno de los tres mandatos. Este diseño mantiene el registro de pagos pequeño y rápido de leer, al tiempo que conserva un puntero directo a los datos completos en la colección mandate_ledger cuando se requiere un seguimiento completo para auditar.
{ "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 mantiene intencionalmente el documento pequeño. Los términos completos, las partidas y las pruebas criptográficas residen en la colección mandate_ledger. El registro de pago solo existe para confirmar que la transacción está completa y para proporcionar los tres punteros necesarios para reconstruir la cadena de auditar completa. Utilice el campo transaction_id para unirse a ambas colecciones cuando se requiera un seguimiento completo.
Claves de API: identificación segura del agente
La colección api_keys gestionado/gestionada las claves API para identificar de forma segura a los agentes. Utilice esta colección para almacenar las claves asociadas con cada agente que llama al servicio.
Registro de auditoría: la ruta operativa
La colección audit_log almacena todas las operaciones de la API para el cumplimiento y la depuración. Utilice esta colección para registrar eventos a nivel de servicio, como la creación de mandatos, los intentos de acceso y los resultados de la validación. Este enfoque evita la expansión del propio libro mayor de mandatos inmutable. Agregue un índice TTL para remover automáticamente los registros después de 90 días. Esto conserva un rastro operativo útil mientras mantiene la colección limitada.
La colección incluye los siguientes campos clave:
event_type: Identifica el tipo de operación, comomandate.created.entity_id: Hace referencia al mandato relacionado.actor_agent_id: captura qué agente realizó la acción.event_timestamp: Registra cuándo ocurrió el evento y admite la política de TTL.expires_at: Define cuándo MongoDB borra automáticamente el registro.
Registros de idempotencia: gestión segura de reintentos
La colección idempotency_records almacena claves de idempotencia para evitar operaciones duplicadas. Utilice esta colección para retener la clave proporcionada por el cliente, el agente que realizó la solicitud y la entrada del libro mayor creada para esa operación. Agregue un índice TTL para remover automáticamente los registros después de 24 horas.
La colección incluye los siguientes campos clave:
idempotency_key: Almacena 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 borra 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
Instalar el servicio de contabilidad
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 . Cree 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 en su lugar:
docker build -t mandate-ledger . docker run --rm \ -p 5000:5000 \ --env-file .env \ mandate-ledger
Generar claves API del agente
Abra un nuevo terminal y ejecute:
cd mandate_ledger_service source .venv/bin/activate PYTHONPATH=. python3 scripts/setup_agent_keys.py Copia la clave API del agente comercial del resultado. Establezca
ENABLE_BOOTSTRAP_AUTH=falseen su archivo.envy reinicie el servicio.
Nota de producción: utilice un administrador 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_KEYen el 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 Compilar y ejecutar 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 backend principal)
8000
Agente comercial
8001
Agente proveedor de credenciales
8002
Agente de procesador de pagos de comerciantes
8003
Agente auditor
8004
Configurar el frontend
El frontend es una aplicación Siguiente.js que tiene interacción con el servicio /backend.
Copie el archivo
.envde ejemplo y establezca los puntos finales del backend y del asistente:cd frontend cp EXAMPLE.env .env.local Actualice
frontend/.env.localcon sus valores:MONGODB_URI=<your-mongodb-string> MONGODB_DATABASE=<your-database-name> NEXT_PUBLIC_BACKEND_ENDPOINT=http://localhost:8000 ASSISTANT_ENDPOINT=http://localhost:3333 Instale las dependencias y ejecute el frontend:
npm install npm run dev Para ejecutar el frontend como un contenedor, utilice el Dockerfile raíz.
Habilitar respuestas sugeridas en la Interfaz de Usuario del 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
Establecer confianza en el comercio de agentes. Supere la crisis de confianza anclando las transacciones de IA a pruebas deterministas e irrefutables de la intención del cliente:
Garantizar la inmutabilidad de las transacciones: aplique reglas de solo anexar en su servicio de libro mayor de mandatos para crear una pista para auditar a prueba de manipulaciones.
Conservar firmas criptográficas: Utilice el modelo orientado a documentos de MongoDB para almacenar de forma nativa los mandatos JSON profundamente anidados exactamente como los generan los agentes.
Controlar el acceso de los agentes: Implementar el control de acceso basado en rol para garantizar que los agentes de IA solo realicen acción autorizadas en función de su rol específico.
Evite cargos duplicados: aplique claves de idempotencia en su capa de servicio para gestionar de forma segura los reintentos de red sin cobrar dos veces al cliente.
Autores
Angelica Guemes, MongoDB
Florencia Arin, MongoDB
Sakshi Garg, MongoDB
Genevive Broadhead, MongoDB
Antonio Membrides, MongoDB
Daniel Jamir, MongoDB