Ir al contenido

Presupuestos y Kill-Switch

El trabajo del Agent puede ser gratuito, basado en consumo o redirigido externamente. Por eso verificas la Wallet y las reglas de presupuesto antes de acciones que impliquen costes.

Todos los campos de consumo y presupuesto del Gateway están expresados en Credits. Los campos de pago o facturación pueden llevar una moneda como EUR; en ese caso es la moneda del comprobante o del proveedor, no la unidad de consumo del Agent-Gateway.

Tras el Owner-OTP-Claim y la activación de webRichtung, wallet.balance.get lee el saldo actual de la Wallet del Owner de la organización. Es de solo lectura y utiliza el scope billing.wallet:read.

La Capability wallet.agent_budget.guard.check verifica si una operación planificada está dentro del presupuesto, Cap y Kill-Switch. Úsala antes de una Capability de destino de pago; repite la verificación si cambia la intención, los parámetros o la estimación de coste.

Envía al Guard la estimación de coste del dry_run de destino. estimated_cost.amount_max es un string decimal en el dry_run; para estimated_cost_credits pasas el mismo valor como número JSON:

{
"id": "wallet.agent_budget.guard.check",
"params": {
"capability_id": "documents.document.upload",
"estimated_cost_credits": 0.09,
"window": "task"
}
}
CampoRegla
capability_idObligatorio. Capability que quieres ejecutar después.
estimated_cost_creditsObligatorio. Número en Credits. Usa dry_run.estimated_cost.amount_max; dry_run.estimated_cost.currency debe ser credits.
windowOpcional. task, daily o monthly; si no estás seguro, comienza con task.

El Guard se ejecuta a través de /mcp/invoke. La respuesta exitosa utiliza la envoltura normal de Invoke; la decisión del Guard está bajo result:

{
"interface_version": "1.0",
"status": "succeeded",
"capability_id": "wallet.agent_budget.guard.check",
"resolved_version": "1.0.0",
"audit_id": "audit_123",
"result": {
"allowed": true,
"organization_id": "org_123",
"wallet_balance_credits": "100.00",
"estimated_cost_credits": 0.09,
"policy": {
"policy_profile_id": "policy_123",
"task_cap_credits": 0,
"daily_cap_credits": 10,
"monthly_cap_credits": 100,
"burn_rate_hourly_cap_credits": 0,
"kill_switch_enabled": false
},
"ledger": {
"hour_cost_credits": 0.2,
"today_cost_credits": 0.5,
"month_cost_credits": 2
}
}
}

Todos los campos de Cap y Ledger terminan en _credits. Si status no es succeeded o result.allowed no es true, no ejecutas la Capability de destino.

Semántica del Cap: Un campo Cap solo limita si su valor numérico es mayor que 0. 0 significa que no hay Cap activo en esa ventana. No es un valor predeterminado, ni un bloqueo ni un estado desconocido. Una respuesta con result.allowed: true y valores individuales de Cap en 0 es por tanto correcta si la Wallet, otros Caps activos y kill_switch_enabled no bloquean.

Contenido útil bajo result:

CampoSignificado
allowedtrue si la Wallet, los Caps y el Kill-Switch no bloquean la operación planificada.
organization_idOrganización Owner cuya Wallet y Policy fueron verificadas.
wallet_balance_creditsSaldo actual de la Wallet del Owner como string decimal en Credits.
estimated_cost_creditsEstimación verificada como número en Credits.
policy.policy_profile_idPerfil de Policy activo o null.
policy.task_cap_creditsCap para esta operación en Credits; solo valores > 0 están activos, 0 significa que no hay Cap activo.
policy.daily_cap_creditsCap diario en Credits; solo valores > 0 están activos, 0 significa que no hay Cap activo.
policy.monthly_cap_creditsCap mensual en Credits; solo valores > 0 están activos, 0 significa que no hay Cap activo.
policy.burn_rate_hourly_cap_creditsCap de tasa de consumo por hora en Credits; solo valores > 0 están activos, 0 significa que no hay Cap activo.
policy.kill_switch_enabledtrue detiene nuevas ejecuciones del Agent.
ledger.hour_cost_creditsCredits ya contabilizados en la ventana horaria actual.
ledger.today_cost_creditsCredits ya contabilizados en la ventana diaria actual.
ledger.month_cost_creditsCredits ya contabilizados en la ventana mensual actual.

Un Kill-Switch detiene las ejecuciones del Agent hasta que una persona autorizada lo libere nuevamente. Trata capability_disabled como un bloqueo absoluto y no intentes evitarlo.

  1. Leer describe de la Capability de destino.
  2. Si describe.dry_run tiene el valor required, ejecutar primero un dry_run exitoso con los mismos parámetros.
  3. Para acciones de pago ejecutar un preflight de coste y enviar dry_run.estimated_cost.amount_max como número JSON a wallet.agent_budget.guard.check.
  4. Solo con status: "succeeded" y result.allowed: true ejecutar la Capability de destino.
  5. En caso de error de presupuesto: no ejecutar, sino usar Handover o feedback.

dry_run y preflight de coste