@agentguard-run/spend 0.2.2 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -1
- package/LICENSE +1 -1
- package/README.es-419.md +37 -100
- package/README.md +58 -121
- package/README.pt-BR.md +37 -100
- package/dist/bindings/anthropic.d.ts +11 -0
- package/dist/bindings/anthropic.d.ts.map +1 -0
- package/dist/bindings/anthropic.js +116 -0
- package/dist/bindings/anthropic.js.map +1 -0
- package/dist/bindings/bedrock.d.ts +11 -0
- package/dist/bindings/bedrock.d.ts.map +1 -0
- package/dist/bindings/bedrock.js +177 -0
- package/dist/bindings/bedrock.js.map +1 -0
- package/dist/cli/auth.d.ts +7 -0
- package/dist/cli/auth.d.ts.map +1 -0
- package/dist/cli/auth.js +189 -0
- package/dist/cli/auth.js.map +1 -0
- package/dist/cli/coach.d.ts +5 -0
- package/dist/cli/coach.d.ts.map +1 -0
- package/dist/cli/coach.js +257 -0
- package/dist/cli/coach.js.map +1 -0
- package/dist/cli/colors.d.ts +8 -3
- package/dist/cli/colors.d.ts.map +1 -1
- package/dist/cli/colors.js +93 -4
- package/dist/cli/colors.js.map +1 -1
- package/dist/cli/demo.d.ts.map +1 -1
- package/dist/cli/demo.js +23 -2
- package/dist/cli/demo.js.map +1 -1
- package/dist/cli/main.d.ts +0 -6
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +42 -16
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/models.d.ts +18 -0
- package/dist/cli/models.d.ts.map +1 -0
- package/dist/cli/models.js +277 -0
- package/dist/cli/models.js.map +1 -0
- package/dist/cli/tips.d.ts +21 -0
- package/dist/cli/tips.d.ts.map +1 -0
- package/dist/cli/tips.js +191 -0
- package/dist/cli/tips.js.map +1 -0
- package/dist/cli/wizard.d.ts +27 -0
- package/dist/cli/wizard.d.ts.map +1 -0
- package/dist/cli/wizard.js +182 -0
- package/dist/cli/wizard.js.map +1 -0
- package/dist/coach/anomaly.d.ts +26 -0
- package/dist/coach/anomaly.d.ts.map +1 -0
- package/dist/coach/anomaly.js +119 -0
- package/dist/coach/anomaly.js.map +1 -0
- package/dist/coach/conversation.d.ts +69 -0
- package/dist/coach/conversation.d.ts.map +1 -0
- package/dist/coach/conversation.js +228 -0
- package/dist/coach/conversation.js.map +1 -0
- package/dist/coach/forecast.d.ts +19 -0
- package/dist/coach/forecast.d.ts.map +1 -0
- package/dist/coach/forecast.js +57 -0
- package/dist/coach/forecast.js.map +1 -0
- package/dist/coach/llm-client.d.ts +41 -0
- package/dist/coach/llm-client.d.ts.map +1 -0
- package/dist/coach/llm-client.js +248 -0
- package/dist/coach/llm-client.js.map +1 -0
- package/dist/coach/output.d.ts +41 -0
- package/dist/coach/output.d.ts.map +1 -0
- package/dist/coach/output.js +173 -0
- package/dist/coach/output.js.map +1 -0
- package/dist/coach/system-prompt.d.ts +20 -0
- package/dist/coach/system-prompt.d.ts.map +1 -0
- package/dist/coach/system-prompt.js +177 -0
- package/dist/coach/system-prompt.js.map +1 -0
- package/dist/cost-table.d.ts +11 -36
- package/dist/cost-table.d.ts.map +1 -1
- package/dist/cost-table.js +114 -45
- package/dist/cost-table.js.map +1 -1
- package/dist/index.d.ts +9 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +30 -2
- package/dist/index.js.map +1 -1
- package/dist/openrouter-catalog.d.ts +56 -0
- package/dist/openrouter-catalog.d.ts.map +1 -0
- package/dist/openrouter-catalog.js +183 -0
- package/dist/openrouter-catalog.js.map +1 -0
- package/dist/spend-guard.d.ts +38 -55
- package/dist/spend-guard.d.ts.map +1 -1
- package/dist/spend-guard.js +268 -83
- package/dist/spend-guard.js.map +1 -1
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +52 -21
- package/dist/telemetry.js.map +1 -1
- package/dist/templates/index.d.ts +17 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +100 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/types.d.ts +18 -3
- package/dist/types.d.ts.map +1 -1
- package/package.json +39 -4
- package/src/bindings/anthropic.ts +142 -0
- package/src/bindings/bedrock.ts +200 -0
- package/src/cli/auth.ts +145 -0
- package/src/cli/coach.ts +249 -0
- package/src/cli/models.ts +236 -0
- package/src/cli/tips.ts +161 -0
- package/src/cli/wizard.ts +160 -0
- package/src/coach/anomaly.ts +98 -0
- package/src/coach/conversation.ts +248 -0
- package/src/coach/forecast.ts +64 -0
- package/src/coach/llm-client.ts +247 -0
- package/src/coach/output.ts +172 -0
- package/src/coach/system-prompt.ts +181 -0
- package/src/openrouter-catalog.ts +180 -0
- package/src/templates/agent-support.yaml +30 -0
- package/src/templates/chargeback-evidence.yaml +30 -0
- package/src/templates/code-scan.yaml +30 -0
- package/src/templates/index.ts +109 -0
- package/src/templates/payment-approval.yaml +30 -0
- package/src/templates/risk-review.yaml +30 -0
- package/tests/fixtures/openrouter-catalog.json +1 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,8 +1,21 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.4.0
|
|
4
|
+
|
|
5
|
+
- Added `agentguard coach` subcommand: local LLM-driven policy setup via your OpenRouter key.
|
|
6
|
+
- Added local Coach session logs, policy and quickstart writers, projected savings output, and review and forecast skeletons.
|
|
7
|
+
|
|
8
|
+
## 0.3.0
|
|
9
|
+
|
|
10
|
+
- Added streaming true-up for OpenAI, Anthropic, and Bedrock, including signed settlement entries.
|
|
11
|
+
- Added native TypeScript Anthropic and Bedrock bindings.
|
|
12
|
+
- Added OpenRouter model aliases, catalog sync, local pricing overrides, and auth CLI.
|
|
13
|
+
- Added models picker, guided wizard, tips system, and five task templates.
|
|
14
|
+
- Added public verifier demo receipt export and README quickstarts for the wizard flow.
|
|
15
|
+
|
|
3
16
|
## 0.2.2
|
|
4
17
|
|
|
5
|
-
- Emit opt-in sdk_init beacon on package import so
|
|
18
|
+
- Emit opt-in sdk_init beacon on package import so adoption metrics capture executed SDK loads before guard construction. Install IDs persist in ~/.agentguard/install.json and telemetry remains best effort.
|
|
6
19
|
|
|
7
20
|
## 0.2.1
|
|
8
21
|
|
package/LICENSE
CHANGED
package/README.es-419.md
CHANGED
|
@@ -1,128 +1,65 @@
|
|
|
1
1
|
# @agentguard-run/spend
|
|
2
2
|
|
|
3
|
-
> Límites de gasto
|
|
4
|
-
|
|
5
|
-
Cada decisión de política se ejecuta dentro de su proceso. Los prompts, claves API del proveedor y claves de firma nunca salen de su entorno de ejecución. Cada decisión de aplicación produce un recibo firmado con Ed25519, encadenado por hash, apto para auditoría y revisión de cumplimiento.
|
|
3
|
+
> Límites de gasto en runtime local, enrutamiento de modelos por capacidad y recibos firmados para agentes de IA.
|
|
6
4
|
|
|
7
5
|
> Disponible también en: [English](README.md) · [Português (BR)](README.pt-BR.md)
|
|
8
6
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
Cada competidor financiado en gobernanza del gasto en IA (Portkey, Helicone, LiteLLM, Cloudflare AI Gateway, Vercel AI Gateway) usa proxy sobre su tráfico. Eso significa que sus prompts y claves de proveedor pasan por la infraestructura de ellos. `@agentguard-run/spend` nunca ve nada de eso. La política corre en su proceso. El registro firmado vive en su almacenamiento.
|
|
7
|
+
Cada decisión de política corre dentro de su proceso. Prompts, respuestas, claves API del proveedor, claves de firma, políticas y overrides de costo nunca van a infraestructura de AgentGuard. Las llamadas a OpenRouter salen directo desde su runtime hacia `openrouter.ai` con su clave.
|
|
12
8
|
|
|
13
|
-
##
|
|
9
|
+
## Quickstart en 90 segundos
|
|
14
10
|
|
|
15
11
|
```bash
|
|
16
12
|
npm install @agentguard-run/spend
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
# o
|
|
20
|
-
yarn add @agentguard-run/spend
|
|
13
|
+
agentguard auth openrouter
|
|
14
|
+
agentguard wizard
|
|
21
15
|
```
|
|
22
16
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
import { randomBytes } from 'crypto';
|
|
33
|
-
|
|
34
|
-
const policy: SpendPolicy = {
|
|
35
|
-
id: 'finance-ops-v1',
|
|
36
|
-
name: 'Límites diarios de operaciones financieras',
|
|
37
|
-
scope: { tenantId: 'acme-corp' },
|
|
38
|
-
caps: [
|
|
39
|
-
{
|
|
40
|
-
amountCents: 500,
|
|
41
|
-
window: 'per_day',
|
|
42
|
-
action: 'downgrade',
|
|
43
|
-
downgradeTo: 'gpt-4o-mini',
|
|
44
|
-
reason: 'Límite blando diario alcanzado, enrutando al modelo más económico',
|
|
45
|
-
},
|
|
46
|
-
{
|
|
47
|
-
amountCents: 2000,
|
|
48
|
-
window: 'per_day',
|
|
49
|
-
action: 'block',
|
|
50
|
-
reason: 'Tope diario duro',
|
|
51
|
-
},
|
|
52
|
-
],
|
|
53
|
-
mode: 'enforce',
|
|
54
|
-
version: 1,
|
|
55
|
-
effectiveFrom: '2026-05-24T00:00:00Z',
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
const privateKey = new Uint8Array(randomBytes(32));
|
|
59
|
-
|
|
60
|
-
const client = withSpendGuard(new OpenAI(), {
|
|
61
|
-
policy,
|
|
62
|
-
scope: { tenantId: 'acme-corp', agentId: 'finance-bot' },
|
|
63
|
-
config: {
|
|
64
|
-
policy,
|
|
65
|
-
signingKeys: {
|
|
66
|
-
privateKey,
|
|
67
|
-
publicKey: new Uint8Array(32), // derivar de privateKey en producción
|
|
68
|
-
},
|
|
69
|
-
locale: 'es-419', // opcional - también detecta automáticamente
|
|
70
|
-
},
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
try {
|
|
74
|
-
const completion = await client.chat.completions.create({
|
|
75
|
-
model: 'gpt-4o',
|
|
76
|
-
messages: [{ role: 'user', content: 'Hola' }],
|
|
77
|
-
});
|
|
78
|
-
} catch (err) {
|
|
79
|
-
if (err instanceof AgentGuardBlockedError) {
|
|
80
|
-
// El mensaje será mostrado en español por el detector de locale
|
|
81
|
-
console.error(err.message);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
17
|
+
El wizard escribe `~/.agentguard/policy.yaml`, `~/.agentguard/quickstart.ts` y `~/.agentguard/quickstart.py`. También imprime el snippet listo para pegar en su app.
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
## ¿Necesita ayuda configurando? Ejecute `agentguard coach`
|
|
21
|
+
|
|
22
|
+
`agentguard coach` usa su clave de OpenRouter, o cualquier endpoint compatible con OpenAI vía `--base-url`, para guiar la configuración en su terminal. La infraestructura de AgentGuard nunca ve prompts, respuestas, claves, detalles de política ni el log de sesión.
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
agentguard coach
|
|
84
26
|
```
|
|
85
27
|
|
|
86
|
-
|
|
28
|
+
Coach escribe `~/.agentguard/policy.yaml`, un quickstart según el lenguaje, la matemática de ahorro proyectado y un log JSONL local en `~/.agentguard/coach-sessions/`.
|
|
87
29
|
|
|
88
|
-
|
|
89
|
-
|-------------|------------------------------------------------------------------------------------|
|
|
90
|
-
| `allow` | La llamada pasa sin modificaciones |
|
|
91
|
-
| `downgrade` | El parámetro `model` se reescribe a `downgradeTo`, luego la llamada continúa |
|
|
92
|
-
| `block` | Se lanza `AgentGuardBlockedError` antes de contactar al proveedor |
|
|
93
|
-
| `shadow` | La llamada pasa; la decisión se registra solo para análisis |
|
|
30
|
+
## Por qué OpenRouter
|
|
94
31
|
|
|
95
|
-
|
|
32
|
+
Una clave de OpenRouter da acceso a cientos de modelos de muchos proveedores. Finanzas ve una factura. AgentGuard aplica quién usa qué, qué tiers de tarea pueden llegar a qué modelos y cuánto puede gastar cada llamada. La clave vive en `OPENROUTER_API_KEY` o `~/.agentguard/openrouter-key` con modo `600`.
|
|
96
33
|
|
|
97
|
-
|
|
34
|
+
```bash
|
|
35
|
+
agentguard models --sync-pricing
|
|
36
|
+
agentguard models --task payment-approval
|
|
37
|
+
agentguard models --search gpt-4o --json
|
|
38
|
+
```
|
|
98
39
|
|
|
99
|
-
|
|
100
|
-
2. Variable de entorno: `export AGENTGUARD_LOCALE=es-419`
|
|
101
|
-
3. Variables de entorno del sistema: `LC_ALL`, `LC_MESSAGES`, `LANG`
|
|
102
|
-
4. `Intl.DateTimeFormat().resolvedOptions().locale` (navegador / Deno / Bun)
|
|
103
|
-
5. Respaldo: `en-US`
|
|
40
|
+
Los overrides de precios se guardan localmente en `~/.agentguard/cost-overrides.json`.
|
|
104
41
|
|
|
105
|
-
##
|
|
42
|
+
## Verificar cualquier recibo
|
|
106
43
|
|
|
107
|
-
|
|
44
|
+
Comparta https://agentguard.run/verify con su auditor. Pegue un recibo y la clave pública en el navegador para verificar firma Ed25519, hash de entrada y enlace de cadena. El recibo nunca sale de la página.
|
|
108
45
|
|
|
109
|
-
|
|
46
|
+
```bash
|
|
47
|
+
agentguard demo
|
|
48
|
+
agentguard verify --trace latest
|
|
49
|
+
```
|
|
110
50
|
|
|
111
|
-
##
|
|
51
|
+
## Templates de tarea
|
|
112
52
|
|
|
113
|
-
|
|
53
|
+
`agentguard wizard` incluye `risk-review`, `payment-approval`, `chargeback-evidence`, `agent-support` y `code-scan`. Cada template define modelos OpenRouter recomendados, tier de capacidad, fallback, caps e instrucciones de sistema.
|
|
114
54
|
|
|
115
|
-
|
|
116
|
-
- Despliegues de producción que procesan **hasta 10 000 llamadas de aplicación por mes calendario**
|
|
55
|
+
## Sin proxy
|
|
117
56
|
|
|
118
|
-
|
|
57
|
+
AgentGuard Spend es una biblioteca, no un gateway. No proxyea tráfico, no guarda prompts, no retiene claves de proveedor y no aloja estado de política. El log firmado vive en su almacenamiento.
|
|
119
58
|
|
|
120
|
-
##
|
|
59
|
+
## Telemetría
|
|
121
60
|
|
|
122
|
-
|
|
61
|
+
La telemetría es opt-in. Use `AGENTGUARD_TELEMETRY=1` o `agentguard telemetry enable`. El beacon envía solo versión del SDK, runtime, familia de OS, ID anónimo de instalación, flag de CI, flag de TTY y nombre del evento. No envía prompts, respuestas, claves de proveedor, claves de firma, detalles de política ni overrides de costo.
|
|
123
62
|
|
|
124
|
-
##
|
|
63
|
+
## Aviso de patentes
|
|
125
64
|
|
|
126
|
-
|
|
127
|
-
- Contacto: `invest@agentguard.run`
|
|
128
|
-
- SDK Python: [`agentguard-spend`](https://pypi.org/project/agentguard-spend/)
|
|
65
|
+
Protegido por tecnología con patente pendiente en EE. UU. (App. Nos. 63/983,615; 63/983,621; 63/983,843; 63/984,626; 64/071,781; 64/071,789). Aviso constructivo bajo 35 U.S.C. § 287. Patentes adicionales pendientes.
|
package/README.md
CHANGED
|
@@ -1,165 +1,102 @@
|
|
|
1
1
|
# @agentguard-run/spend
|
|
2
2
|
|
|
3
|
-
> Local-runtime spend caps
|
|
3
|
+
> Local-runtime spend caps, capability-gated model routing, and signed receipts for AI agents.
|
|
4
4
|
|
|
5
5
|
> Also available in: [Español (LATAM)](README.es-419.md) · [Português (BR)](README.pt-BR.md)
|
|
6
6
|
|
|
7
|
-
Every policy decision runs inside your process. Prompts, provider API keys,
|
|
7
|
+
Every policy decision runs inside your process. Prompts, completions, provider API keys, signing keys, policies, and cost overrides never go to AgentGuard infrastructure. OpenRouter calls go directly from your runtime to `openrouter.ai` with your key.
|
|
8
8
|
|
|
9
|
-
##
|
|
9
|
+
## Quickstart in 90 seconds
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
11
|
+
```bash
|
|
12
|
+
npm install @agentguard-run/spend
|
|
13
|
+
agentguard auth openrouter
|
|
14
|
+
agentguard wizard
|
|
15
|
+
```
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
The wizard writes:
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
- `~/.agentguard/policy.yaml`
|
|
20
|
+
- `~/.agentguard/quickstart.ts`
|
|
21
|
+
- `~/.agentguard/quickstart.py`
|
|
20
22
|
|
|
21
|
-
|
|
23
|
+
It also prints the snippet to paste into your app:
|
|
22
24
|
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
├── estimate tokens
|
|
29
|
-
├── evaluatePolicy() ──► SpendStore (your storage)
|
|
30
|
-
├── signDecision() with Ed25519
|
|
31
|
-
├── append to DecisionLog (your storage)
|
|
32
|
-
└── pass-through / downgrade / block
|
|
33
|
-
│
|
|
34
|
-
▼
|
|
35
|
-
Provider (OpenAI / Anthropic / Bedrock)
|
|
25
|
+
```ts
|
|
26
|
+
const response = await guardedClient.chat.completions.create({
|
|
27
|
+
model: 'openai/gpt-4o-mini',
|
|
28
|
+
messages: [{ role: 'user', content: 'Run the governed task.' }],
|
|
29
|
+
});
|
|
36
30
|
```
|
|
37
31
|
|
|
38
|
-
|
|
32
|
+
Then run your agent. AgentGuard decides locally before any provider call starts, signs the receipt, and applies allow, downgrade, shadow, or block.
|
|
39
33
|
|
|
40
|
-
## Quick start
|
|
41
34
|
|
|
42
|
-
|
|
43
|
-
npm install @agentguard-run/spend
|
|
44
|
-
```
|
|
35
|
+
## Need help configuring? Run `agentguard coach`
|
|
45
36
|
|
|
46
|
-
|
|
47
|
-
import OpenAI from 'openai';
|
|
48
|
-
import { randomBytes } from 'node:crypto';
|
|
49
|
-
import * as ed from '@noble/ed25519';
|
|
50
|
-
import {
|
|
51
|
-
withSpendGuard,
|
|
52
|
-
type SpendPolicy,
|
|
53
|
-
} from '@agentguard-run/spend';
|
|
54
|
-
|
|
55
|
-
// Generate or load your signing keys. They never leave your runtime.
|
|
56
|
-
// In production these come from your HSM / KMS / Vault.
|
|
57
|
-
const privateKey = randomBytes(32); // 32-byte Ed25519 secret seed
|
|
58
|
-
const publicKey = await ed.getPublicKeyAsync(privateKey);
|
|
59
|
-
|
|
60
|
-
const policy: SpendPolicy = {
|
|
61
|
-
id: 'finance-ops-v1',
|
|
62
|
-
name: 'Finance ops daily caps',
|
|
63
|
-
version: 1,
|
|
64
|
-
effectiveFrom: new Date().toISOString(),
|
|
65
|
-
mode: 'enforce',
|
|
66
|
-
scope: { tenantId: 'acme-corp' },
|
|
67
|
-
caps: [
|
|
68
|
-
{
|
|
69
|
-
amountCents: 500,
|
|
70
|
-
window: 'per_day',
|
|
71
|
-
action: 'downgrade',
|
|
72
|
-
downgradeTo: 'claude-sonnet-4-6',
|
|
73
|
-
reason: 'Opus daily soft cap reached, route to Sonnet',
|
|
74
|
-
},
|
|
75
|
-
{
|
|
76
|
-
amountCents: 1000,
|
|
77
|
-
window: 'per_day',
|
|
78
|
-
action: 'block',
|
|
79
|
-
reason: 'Hard daily ceiling',
|
|
80
|
-
},
|
|
81
|
-
],
|
|
82
|
-
};
|
|
83
|
-
|
|
84
|
-
const openai = new OpenAI();
|
|
85
|
-
const guarded = withSpendGuard(openai, {
|
|
86
|
-
policy,
|
|
87
|
-
scope: { tenantId: 'acme-corp', userId: 'alice', agentId: 'finance-bot' },
|
|
88
|
-
config: { signingKeys: { privateKey, publicKey } },
|
|
89
|
-
});
|
|
37
|
+
`agentguard coach` uses your OpenRouter key, or any OpenAI-compatible endpoint you pass with `--base-url`, to run a local setup dialogue in your terminal. AgentGuard infrastructure never sees the prompts, completions, keys, policy details, or session log.
|
|
90
38
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
model: 'gpt-4o',
|
|
94
|
-
messages: [{ role: 'user', content: 'Hello' }],
|
|
95
|
-
});
|
|
39
|
+
```bash
|
|
40
|
+
agentguard coach
|
|
96
41
|
```
|
|
97
42
|
|
|
98
|
-
|
|
43
|
+
Coach writes `~/.agentguard/policy.yaml`, a language-aware quickstart file, projected savings math, and a local JSONL session log under `~/.agentguard/coach-sessions/`.
|
|
99
44
|
|
|
100
|
-
|
|
101
|
-
|---|---|
|
|
102
|
-
| `allow` | Call passes through unchanged |
|
|
103
|
-
| `downgrade` | The `model` parameter is rewritten to `downgradeTo`, then the call proceeds |
|
|
104
|
-
| `block` | An `AgentGuardBlockedError` is thrown before the provider is contacted |
|
|
105
|
-
| `shadow` | Call passes through; the decision is logged for analysis but no enforcement happens |
|
|
45
|
+
## Why OpenRouter?
|
|
106
46
|
|
|
107
|
-
|
|
47
|
+
One OpenRouter key gives your team access to hundreds of models across many providers. Your CFO sees one invoice. AgentGuard enforces who uses what, which task tiers can reach which models, and what each call can spend. The OpenRouter key can live in `OPENROUTER_API_KEY` or `~/.agentguard/openrouter-key` with mode `600`.
|
|
108
48
|
|
|
109
|
-
|
|
49
|
+
Sync pricing when you want local cost math refreshed:
|
|
110
50
|
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
};
|
|
51
|
+
```bash
|
|
52
|
+
agentguard models --sync-pricing
|
|
53
|
+
agentguard models --task payment-approval
|
|
54
|
+
agentguard models --search gpt-4o --json
|
|
116
55
|
```
|
|
117
56
|
|
|
118
|
-
|
|
57
|
+
Pricing overrides are stored locally in `~/.agentguard/cost-overrides.json`.
|
|
119
58
|
|
|
120
|
-
##
|
|
59
|
+
## Verify any receipt
|
|
121
60
|
|
|
122
|
-
|
|
61
|
+
Share https://agentguard.run/verify with an auditor or reviewer. Paste a receipt and public key in the browser to verify the Ed25519 signature, entry hash, and chain link. The receipt never leaves the page.
|
|
123
62
|
|
|
124
|
-
|
|
125
|
-
import { verifyChain } from '@agentguard-run/spend';
|
|
63
|
+
CLI verification is still local:
|
|
126
64
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
console.error('chain invalid at sequence', result.sequence, ':', result.reason);
|
|
131
|
-
}
|
|
65
|
+
```bash
|
|
66
|
+
agentguard demo
|
|
67
|
+
agentguard verify --trace latest
|
|
132
68
|
```
|
|
133
69
|
|
|
134
|
-
|
|
70
|
+
## Task templates
|
|
135
71
|
|
|
136
|
-
|
|
72
|
+
`agentguard wizard` ships templates for:
|
|
137
73
|
|
|
138
|
-
|
|
74
|
+
- `risk-review`: read-only review with a $0.50 per-call cap
|
|
75
|
+
- `payment-approval`: payment initiation review with a $5.00 per-call cap
|
|
76
|
+
- `chargeback-evidence`: evidence assembly with a $1.00 per-call cap
|
|
77
|
+
- `agent-support`: data-write support workflow with a $0.25 per-call cap
|
|
78
|
+
- `code-scan`: long-context read-only scan with a $0.10 per-call cap
|
|
139
79
|
|
|
140
|
-
|
|
141
|
-
- Production deployments processing **up to 10,000 enforcement calls per calendar month**
|
|
80
|
+
Each template sets recommended OpenRouter model assignments, capability tier, fallback model, caps, and system instructions.
|
|
142
81
|
|
|
143
|
-
|
|
82
|
+
## Provider bindings
|
|
144
83
|
|
|
145
|
-
|
|
146
|
-
- Deployments operated as a service to third parties
|
|
147
|
-
- Redistribution, sublicensing, public hosting, republication
|
|
84
|
+
TypeScript includes native OpenAI, Anthropic, and Bedrock bindings. Streaming usage is settled from provider usage events when available, with local token-estimator fallback when usage is missing. Settlement entries are signed into the same hash chain as enforcement decisions.
|
|
148
85
|
|
|
149
|
-
|
|
86
|
+
Python includes OpenAI, Anthropic, Bedrock, LangChain, CrewAI, and LlamaIndex integration helpers.
|
|
150
87
|
|
|
151
|
-
|
|
88
|
+
## No proxy
|
|
152
89
|
|
|
153
|
-
|
|
90
|
+
AgentGuard Spend is a library, not a gateway. It does not proxy traffic, store prompts, hold provider keys, or host policy state. The signed log lives in your storage.
|
|
154
91
|
|
|
155
|
-
|
|
92
|
+
## Telemetry
|
|
156
93
|
|
|
157
|
-
-
|
|
158
|
-
- 64/071,781 · 64/071,789 (filed May 21, 2026)
|
|
94
|
+
Telemetry is opt-in. Set `AGENTGUARD_TELEMETRY=1` or run `agentguard telemetry enable`. The beacon sends only SDK version, runtime, OS family, anonymous install ID, CI flag, TTY flag, and event name. No prompts, completions, provider keys, signing keys, policy details, or cost overrides are sent.
|
|
159
95
|
|
|
160
|
-
|
|
96
|
+
## License and usage thresholds
|
|
161
97
|
|
|
162
|
-
|
|
98
|
+
The SDK is free for evaluation, prototyping, non-commercial development, and production deployments processing up to 10,000 enforcement calls per calendar month. Commercial use above that threshold requires a paid license from Dunecrest Ventures Inc. Full terms are in `LICENSE`.
|
|
99
|
+
|
|
100
|
+
## Patent notice
|
|
163
101
|
|
|
164
|
-
-
|
|
165
|
-
- Contact: `invest@agentguard.run`
|
|
102
|
+
Protected by U.S. patent-pending technology (App. Nos. 63/983,615; 63/983,621; 63/983,843; 63/984,626; 64/071,781; 64/071,789). 35 U.S.C. § 287 constructive notice. Additional patents pending.
|
package/README.pt-BR.md
CHANGED
|
@@ -1,128 +1,65 @@
|
|
|
1
1
|
# @agentguard-run/spend
|
|
2
2
|
|
|
3
|
-
> Limites de gasto
|
|
4
|
-
|
|
5
|
-
Toda decisão de política é executada dentro do seu processo. Prompts, chaves de API do provedor e chaves de assinatura nunca saem do seu runtime. Cada decisão de aplicação produz um recibo assinado com Ed25519, encadeado por hash, adequado para auditoria e revisão de compliance.
|
|
3
|
+
> Limites de gasto no runtime local, roteamento de modelos por capacidade e recibos assinados para agentes de IA.
|
|
6
4
|
|
|
7
5
|
> Disponível também em: [English](README.md) · [Español (LATAM)](README.es-419.md)
|
|
8
6
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
Todo concorrente financiado em governança de gasto em IA (Portkey, Helicone, LiteLLM, Cloudflare AI Gateway, Vercel AI Gateway) faz proxy do seu tráfego. Isso significa que seus prompts e chaves de provedor passam pela infraestrutura deles. `@agentguard-run/spend` nunca vê nada disso. A política roda no seu processo. O log assinado vive no seu armazenamento.
|
|
7
|
+
Cada decisão de política roda dentro do seu processo. Prompts, respostas, chaves API do provedor, chaves de assinatura, políticas e overrides de custo nunca vão para a infraestrutura da AgentGuard. Chamadas OpenRouter saem direto do seu runtime para `openrouter.ai` com a sua chave.
|
|
12
8
|
|
|
13
|
-
##
|
|
9
|
+
## Quickstart em 90 segundos
|
|
14
10
|
|
|
15
11
|
```bash
|
|
16
12
|
npm install @agentguard-run/spend
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
# ou
|
|
20
|
-
yarn add @agentguard-run/spend
|
|
13
|
+
agentguard auth openrouter
|
|
14
|
+
agentguard wizard
|
|
21
15
|
```
|
|
22
16
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
import { randomBytes } from 'crypto';
|
|
33
|
-
|
|
34
|
-
const policy: SpendPolicy = {
|
|
35
|
-
id: 'finance-ops-v1',
|
|
36
|
-
name: 'Limites diários de operações financeiras',
|
|
37
|
-
scope: { tenantId: 'acme-corp' },
|
|
38
|
-
caps: [
|
|
39
|
-
{
|
|
40
|
-
amountCents: 500,
|
|
41
|
-
window: 'per_day',
|
|
42
|
-
action: 'downgrade',
|
|
43
|
-
downgradeTo: 'gpt-4o-mini',
|
|
44
|
-
reason: 'Limite leve diário atingido, redirecionando para modelo mais barato',
|
|
45
|
-
},
|
|
46
|
-
{
|
|
47
|
-
amountCents: 2000,
|
|
48
|
-
window: 'per_day',
|
|
49
|
-
action: 'block',
|
|
50
|
-
reason: 'Teto diário rígido',
|
|
51
|
-
},
|
|
52
|
-
],
|
|
53
|
-
mode: 'enforce',
|
|
54
|
-
version: 1,
|
|
55
|
-
effectiveFrom: '2026-05-24T00:00:00Z',
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
const privateKey = new Uint8Array(randomBytes(32));
|
|
59
|
-
|
|
60
|
-
const client = withSpendGuard(new OpenAI(), {
|
|
61
|
-
policy,
|
|
62
|
-
scope: { tenantId: 'acme-corp', agentId: 'finance-bot' },
|
|
63
|
-
config: {
|
|
64
|
-
policy,
|
|
65
|
-
signingKeys: {
|
|
66
|
-
privateKey,
|
|
67
|
-
publicKey: new Uint8Array(32), // derivar de privateKey em produção
|
|
68
|
-
},
|
|
69
|
-
locale: 'pt-BR', // opcional - também detecta automaticamente
|
|
70
|
-
},
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
try {
|
|
74
|
-
const completion = await client.chat.completions.create({
|
|
75
|
-
model: 'gpt-4o',
|
|
76
|
-
messages: [{ role: 'user', content: 'Olá' }],
|
|
77
|
-
});
|
|
78
|
-
} catch (err) {
|
|
79
|
-
if (err instanceof AgentGuardBlockedError) {
|
|
80
|
-
// A mensagem será exibida em português pelo detector de locale
|
|
81
|
-
console.error(err.message);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
17
|
+
O wizard escreve `~/.agentguard/policy.yaml`, `~/.agentguard/quickstart.ts` e `~/.agentguard/quickstart.py`. Ele também imprime o snippet pronto para colar no app.
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
## Precisa de ajuda para configurar? Rode `agentguard coach`
|
|
21
|
+
|
|
22
|
+
`agentguard coach` usa sua chave OpenRouter, ou qualquer endpoint compatível com OpenAI via `--base-url`, para guiar a configuração no terminal. A infraestrutura da AgentGuard nunca vê prompts, respostas, chaves, detalhes de política nem o log de sessão.
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
agentguard coach
|
|
84
26
|
```
|
|
85
27
|
|
|
86
|
-
|
|
28
|
+
Coach escreve `~/.agentguard/policy.yaml`, um quickstart conforme a linguagem, a matemática de economia projetada e um log JSONL local em `~/.agentguard/coach-sessions/`.
|
|
87
29
|
|
|
88
|
-
|
|
89
|
-
|-------------|------------------------------------------------------------------------------------------|
|
|
90
|
-
| `allow` | A chamada passa sem alterações |
|
|
91
|
-
| `downgrade` | O parâmetro `model` é reescrito para `downgradeTo`, então a chamada prossegue |
|
|
92
|
-
| `block` | `AgentGuardBlockedError` é lançado antes de contatar o provedor |
|
|
93
|
-
| `shadow` | A chamada passa; a decisão é registrada apenas para análise |
|
|
30
|
+
## Por que OpenRouter
|
|
94
31
|
|
|
95
|
-
|
|
32
|
+
Uma chave OpenRouter dá acesso a centenas de modelos de muitos provedores. Finanças vê uma fatura. AgentGuard aplica quem usa o quê, quais tiers de tarefa podem acessar quais modelos e quanto cada chamada pode gastar. A chave fica em `OPENROUTER_API_KEY` ou `~/.agentguard/openrouter-key` com modo `600`.
|
|
96
33
|
|
|
97
|
-
|
|
34
|
+
```bash
|
|
35
|
+
agentguard models --sync-pricing
|
|
36
|
+
agentguard models --task payment-approval
|
|
37
|
+
agentguard models --search gpt-4o --json
|
|
38
|
+
```
|
|
98
39
|
|
|
99
|
-
|
|
100
|
-
2. Variável de ambiente: `export AGENTGUARD_LOCALE=pt-BR`
|
|
101
|
-
3. Variáveis de ambiente do sistema: `LC_ALL`, `LC_MESSAGES`, `LANG`
|
|
102
|
-
4. `Intl.DateTimeFormat().resolvedOptions().locale` (browser / Deno / Bun)
|
|
103
|
-
5. Fallback: `en-US`
|
|
40
|
+
Overrides de preço ficam localmente em `~/.agentguard/cost-overrides.json`.
|
|
104
41
|
|
|
105
|
-
##
|
|
42
|
+
## Verificar qualquer recibo
|
|
106
43
|
|
|
107
|
-
|
|
44
|
+
Compartilhe https://agentguard.run/verify com seu auditor. Cole um recibo e a chave pública no navegador para verificar assinatura Ed25519, hash da entrada e link da cadeia. O recibo nunca sai da página.
|
|
108
45
|
|
|
109
|
-
|
|
46
|
+
```bash
|
|
47
|
+
agentguard demo
|
|
48
|
+
agentguard verify --trace latest
|
|
49
|
+
```
|
|
110
50
|
|
|
111
|
-
##
|
|
51
|
+
## Templates de tarefa
|
|
112
52
|
|
|
113
|
-
|
|
53
|
+
`agentguard wizard` inclui `risk-review`, `payment-approval`, `chargeback-evidence`, `agent-support` e `code-scan`. Cada template define modelos OpenRouter recomendados, tier de capacidade, fallback, caps e instruções de sistema.
|
|
114
54
|
|
|
115
|
-
|
|
116
|
-
- Implantações de produção processando **até 10.000 chamadas de aplicação por mês calendário**
|
|
55
|
+
## Sem proxy
|
|
117
56
|
|
|
118
|
-
|
|
57
|
+
AgentGuard Spend é uma biblioteca, não um gateway. Não faz proxy de tráfego, não guarda prompts, não retém chaves de provedor e não hospeda estado de política. O log assinado vive no seu armazenamento.
|
|
119
58
|
|
|
120
|
-
##
|
|
59
|
+
## Telemetria
|
|
121
60
|
|
|
122
|
-
|
|
61
|
+
A telemetria é opt-in. Use `AGENTGUARD_TELEMETRY=1` ou `agentguard telemetry enable`. O beacon envia somente versão do SDK, runtime, família de OS, ID anônimo de instalação, flag de CI, flag de TTY e nome do evento. Não envia prompts, respostas, chaves de provedor, chaves de assinatura, detalhes de política nem overrides de custo.
|
|
123
62
|
|
|
124
|
-
##
|
|
63
|
+
## Aviso de patentes
|
|
125
64
|
|
|
126
|
-
|
|
127
|
-
- Contato: `invest@agentguard.run`
|
|
128
|
-
- SDK Python: [`agentguard-spend`](https://pypi.org/project/agentguard-spend/)
|
|
65
|
+
Protegido por tecnologia com patente pendente nos EUA (App. Nos. 63/983,615; 63/983,621; 63/983,843; 63/984,626; 64/071,781; 64/071,789). Aviso construtivo sob 35 U.S.C. § 287. Patentes adicionais pendentes.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Native Anthropic binding for AgentGuard Spend. */
|
|
2
|
+
import type { CapabilityTier, SpendPolicy, SpendScope } from '../types';
|
|
3
|
+
import { type SpendGuardConfig } from '../spend-guard';
|
|
4
|
+
export interface AnthropicBindingOptions {
|
|
5
|
+
policy: SpendPolicy;
|
|
6
|
+
scope: SpendScope;
|
|
7
|
+
capabilityClaim?: CapabilityTier;
|
|
8
|
+
config?: Omit<SpendGuardConfig, 'policy'>;
|
|
9
|
+
}
|
|
10
|
+
export declare function withSpendGuardAnthropic(client: any, opts: AnthropicBindingOptions): any;
|
|
11
|
+
//# sourceMappingURL=anthropic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/bindings/anthropic.ts"],"names":[],"mappings":"AAAA,qDAAqD;AAErD,OAAO,KAAK,EAAE,cAAc,EAAyB,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC/F,OAAO,EAGL,KAAK,gBAAgB,EAMtB,MAAM,gBAAgB,CAAC;AAExB,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,UAAU,CAAC;IAClB,eAAe,CAAC,EAAE,cAAc,CAAC;IACjC,MAAM,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;CAC3C;AAED,wBAAgB,uBAAuB,CAErC,MAAM,EAAE,GAAG,EACX,IAAI,EAAE,uBAAuB,GAE5B,GAAG,CAyCL"}
|