@agentguard-run/spend 0.2.1 → 0.3.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 +12 -0
- package/LICENSE +1 -1
- package/README.es-419.md +28 -102
- package/README.md +50 -124
- package/README.pt-BR.md +28 -102
- 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/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 +36 -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/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 +6 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -8
- 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 +32 -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/models.ts +236 -0
- package/src/cli/tips.ts +161 -0
- package/src/cli/wizard.ts +160 -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,5 +1,17 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.3.0
|
|
4
|
+
|
|
5
|
+
- Added streaming true-up for OpenAI, Anthropic, and Bedrock, including signed settlement entries.
|
|
6
|
+
- Added native TypeScript Anthropic and Bedrock bindings.
|
|
7
|
+
- Added OpenRouter model aliases, catalog sync, local pricing overrides, and auth CLI.
|
|
8
|
+
- Added models picker, guided wizard, tips system, and five task templates.
|
|
9
|
+
- Added public verifier demo receipt export and README quickstarts for the wizard flow.
|
|
10
|
+
|
|
11
|
+
## 0.2.2
|
|
12
|
+
|
|
13
|
+
- 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.
|
|
14
|
+
|
|
3
15
|
## 0.2.1
|
|
4
16
|
|
|
5
17
|
- Beacon endpoint moved from merchantguard.ai to agentguard.run for clean positioning. No SDK behavior change.
|
package/LICENSE
CHANGED
package/README.es-419.md
CHANGED
|
@@ -1,128 +1,54 @@
|
|
|
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
|
-
```ts
|
|
26
|
-
import OpenAI from 'openai';
|
|
27
|
-
import {
|
|
28
|
-
withSpendGuard,
|
|
29
|
-
AgentGuardBlockedError,
|
|
30
|
-
type SpendPolicy,
|
|
31
|
-
} from '@agentguard-run/spend';
|
|
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
|
-
}
|
|
84
|
-
```
|
|
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.
|
|
85
18
|
|
|
86
|
-
|
|
19
|
+
## Por qué OpenRouter
|
|
87
20
|
|
|
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 |
|
|
21
|
+
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`.
|
|
94
22
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
23
|
+
```bash
|
|
24
|
+
agentguard models --sync-pricing
|
|
25
|
+
agentguard models --task payment-approval
|
|
26
|
+
agentguard models --search gpt-4o --json
|
|
27
|
+
```
|
|
98
28
|
|
|
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`
|
|
29
|
+
Los overrides de precios se guardan localmente en `~/.agentguard/cost-overrides.json`.
|
|
104
30
|
|
|
105
|
-
##
|
|
31
|
+
## Verificar cualquier recibo
|
|
106
32
|
|
|
107
|
-
|
|
33
|
+
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
34
|
|
|
109
|
-
|
|
35
|
+
```bash
|
|
36
|
+
agentguard demo
|
|
37
|
+
agentguard verify --trace latest
|
|
38
|
+
```
|
|
110
39
|
|
|
111
|
-
##
|
|
40
|
+
## Templates de tarea
|
|
112
41
|
|
|
113
|
-
|
|
42
|
+
`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
43
|
|
|
115
|
-
|
|
116
|
-
- Despliegues de producción que procesan **hasta 10 000 llamadas de aplicación por mes calendario**
|
|
44
|
+
## Sin proxy
|
|
117
45
|
|
|
118
|
-
|
|
46
|
+
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
47
|
|
|
120
|
-
##
|
|
48
|
+
## Telemetría
|
|
121
49
|
|
|
122
|
-
|
|
50
|
+
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
51
|
|
|
124
|
-
##
|
|
52
|
+
## Aviso de patentes
|
|
125
53
|
|
|
126
|
-
|
|
127
|
-
- Contacto: `invest@agentguard.run`
|
|
128
|
-
- SDK Python: [`agentguard-spend`](https://pypi.org/project/agentguard-spend/)
|
|
54
|
+
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,91 @@
|
|
|
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
|
-
## Status
|
|
16
|
-
|
|
17
|
-
Private preview. Designed for enterprise, OEM, and platform integration.
|
|
18
|
-
|
|
19
|
-
For evaluation access, OEM licensing, or strategic partnership inquiries: `invest@agentguard.run`
|
|
20
|
-
|
|
21
|
-
## Architecture
|
|
22
|
-
|
|
23
|
-
```
|
|
24
|
-
Your code
|
|
25
|
-
│
|
|
26
|
-
▼
|
|
27
|
-
withSpendGuard(openai, { policy, scope })
|
|
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)
|
|
11
|
+
```bash
|
|
12
|
+
npm install @agentguard-run/spend
|
|
13
|
+
agentguard auth openrouter
|
|
14
|
+
agentguard wizard
|
|
36
15
|
```
|
|
37
16
|
|
|
38
|
-
|
|
17
|
+
The wizard writes:
|
|
39
18
|
|
|
40
|
-
|
|
19
|
+
- `~/.agentguard/policy.yaml`
|
|
20
|
+
- `~/.agentguard/quickstart.ts`
|
|
21
|
+
- `~/.agentguard/quickstart.py`
|
|
41
22
|
|
|
42
|
-
|
|
43
|
-
npm install @agentguard-run/spend
|
|
44
|
-
```
|
|
23
|
+
It also prints the snippet to paste into your app:
|
|
45
24
|
|
|
46
25
|
```ts
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
-
});
|
|
90
|
-
|
|
91
|
-
// Drop-in: same API as openai.chat.completions.create
|
|
92
|
-
const completion = await guarded.chat.completions.create({
|
|
93
|
-
model: 'gpt-4o',
|
|
94
|
-
messages: [{ role: 'user', content: 'Hello' }],
|
|
26
|
+
const response = await guardedClient.chat.completions.create({
|
|
27
|
+
model: 'openai/gpt-4o-mini',
|
|
28
|
+
messages: [{ role: 'user', content: 'Run the governed task.' }],
|
|
95
29
|
});
|
|
96
30
|
```
|
|
97
31
|
|
|
98
|
-
|
|
32
|
+
Then run your agent. AgentGuard decides locally before any provider call starts, signs the receipt, and applies allow, downgrade, shadow, or block.
|
|
99
33
|
|
|
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 |
|
|
34
|
+
## Why OpenRouter?
|
|
106
35
|
|
|
107
|
-
|
|
36
|
+
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
37
|
|
|
109
|
-
|
|
38
|
+
Sync pricing when you want local cost math refreshed:
|
|
110
39
|
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
};
|
|
40
|
+
```bash
|
|
41
|
+
agentguard models --sync-pricing
|
|
42
|
+
agentguard models --task payment-approval
|
|
43
|
+
agentguard models --search gpt-4o --json
|
|
116
44
|
```
|
|
117
45
|
|
|
118
|
-
|
|
46
|
+
Pricing overrides are stored locally in `~/.agentguard/cost-overrides.json`.
|
|
119
47
|
|
|
120
|
-
##
|
|
48
|
+
## Verify any receipt
|
|
121
49
|
|
|
122
|
-
|
|
50
|
+
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
51
|
|
|
124
|
-
|
|
125
|
-
import { verifyChain } from '@agentguard-run/spend';
|
|
52
|
+
CLI verification is still local:
|
|
126
53
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
console.error('chain invalid at sequence', result.sequence, ':', result.reason);
|
|
131
|
-
}
|
|
54
|
+
```bash
|
|
55
|
+
agentguard demo
|
|
56
|
+
agentguard verify --trace latest
|
|
132
57
|
```
|
|
133
58
|
|
|
134
|
-
|
|
59
|
+
## Task templates
|
|
135
60
|
|
|
136
|
-
|
|
61
|
+
`agentguard wizard` ships templates for:
|
|
137
62
|
|
|
138
|
-
|
|
63
|
+
- `risk-review`: read-only review with a $0.50 per-call cap
|
|
64
|
+
- `payment-approval`: payment initiation review with a $5.00 per-call cap
|
|
65
|
+
- `chargeback-evidence`: evidence assembly with a $1.00 per-call cap
|
|
66
|
+
- `agent-support`: data-write support workflow with a $0.25 per-call cap
|
|
67
|
+
- `code-scan`: long-context read-only scan with a $0.10 per-call cap
|
|
139
68
|
|
|
140
|
-
|
|
141
|
-
- Production deployments processing **up to 10,000 enforcement calls per calendar month**
|
|
69
|
+
Each template sets recommended OpenRouter model assignments, capability tier, fallback model, caps, and system instructions.
|
|
142
70
|
|
|
143
|
-
|
|
71
|
+
## Provider bindings
|
|
144
72
|
|
|
145
|
-
|
|
146
|
-
- Deployments operated as a service to third parties
|
|
147
|
-
- Redistribution, sublicensing, public hosting, republication
|
|
73
|
+
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
74
|
|
|
149
|
-
|
|
75
|
+
Python includes OpenAI, Anthropic, Bedrock, LangChain, CrewAI, and LlamaIndex integration helpers.
|
|
150
76
|
|
|
151
|
-
|
|
77
|
+
## No proxy
|
|
152
78
|
|
|
153
|
-
|
|
79
|
+
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
80
|
|
|
155
|
-
|
|
81
|
+
## Telemetry
|
|
156
82
|
|
|
157
|
-
-
|
|
158
|
-
- 64/071,781 · 64/071,789 (filed May 21, 2026)
|
|
83
|
+
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
84
|
|
|
160
|
-
|
|
85
|
+
## License and usage thresholds
|
|
161
86
|
|
|
162
|
-
|
|
87
|
+
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`.
|
|
88
|
+
|
|
89
|
+
## Patent notice
|
|
163
90
|
|
|
164
|
-
-
|
|
165
|
-
- Contact: `invest@agentguard.run`
|
|
91
|
+
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,54 @@
|
|
|
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
|
-
```ts
|
|
26
|
-
import OpenAI from 'openai';
|
|
27
|
-
import {
|
|
28
|
-
withSpendGuard,
|
|
29
|
-
AgentGuardBlockedError,
|
|
30
|
-
type SpendPolicy,
|
|
31
|
-
} from '@agentguard-run/spend';
|
|
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
|
-
}
|
|
84
|
-
```
|
|
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.
|
|
85
18
|
|
|
86
|
-
|
|
19
|
+
## Por que OpenRouter
|
|
87
20
|
|
|
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 |
|
|
21
|
+
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`.
|
|
94
22
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
23
|
+
```bash
|
|
24
|
+
agentguard models --sync-pricing
|
|
25
|
+
agentguard models --task payment-approval
|
|
26
|
+
agentguard models --search gpt-4o --json
|
|
27
|
+
```
|
|
98
28
|
|
|
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`
|
|
29
|
+
Overrides de preço ficam localmente em `~/.agentguard/cost-overrides.json`.
|
|
104
30
|
|
|
105
|
-
##
|
|
31
|
+
## Verificar qualquer recibo
|
|
106
32
|
|
|
107
|
-
|
|
33
|
+
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
34
|
|
|
109
|
-
|
|
35
|
+
```bash
|
|
36
|
+
agentguard demo
|
|
37
|
+
agentguard verify --trace latest
|
|
38
|
+
```
|
|
110
39
|
|
|
111
|
-
##
|
|
40
|
+
## Templates de tarefa
|
|
112
41
|
|
|
113
|
-
|
|
42
|
+
`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
43
|
|
|
115
|
-
|
|
116
|
-
- Implantações de produção processando **até 10.000 chamadas de aplicação por mês calendário**
|
|
44
|
+
## Sem proxy
|
|
117
45
|
|
|
118
|
-
|
|
46
|
+
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
47
|
|
|
120
|
-
##
|
|
48
|
+
## Telemetria
|
|
121
49
|
|
|
122
|
-
|
|
50
|
+
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
51
|
|
|
124
|
-
##
|
|
52
|
+
## Aviso de patentes
|
|
125
53
|
|
|
126
|
-
|
|
127
|
-
- Contato: `invest@agentguard.run`
|
|
128
|
-
- SDK Python: [`agentguard-spend`](https://pypi.org/project/agentguard-spend/)
|
|
54
|
+
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"}
|