@salimassili/ai-costguard 2.1.4 → 2.2.2
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 +16 -9
- package/README.md +114 -40
- package/dist/core/CostGuard.d.ts +1 -1
- package/dist/core/CostGuard.d.ts.map +1 -1
- package/dist/core/GuardCore.d.ts +3 -0
- package/dist/core/GuardCore.d.ts.map +1 -1
- package/dist/core/GuardCore.js +161 -6
- package/dist/core/GuardCore.js.map +1 -1
- package/dist/core/GuardFree.d.ts +1 -1
- package/dist/core/GuardFree.d.ts.map +1 -1
- package/dist/core/GuardFree.js +1 -1
- package/dist/core/GuardFree.js.map +1 -1
- package/dist/core/GuardPro.d.ts +20 -7
- package/dist/core/GuardPro.d.ts.map +1 -1
- package/dist/core/GuardPro.js +157 -28
- package/dist/core/GuardPro.js.map +1 -1
- package/dist/core/alerts.d.ts +6 -0
- package/dist/core/alerts.d.ts.map +1 -0
- package/dist/core/alerts.js +52 -0
- package/dist/core/alerts.js.map +1 -0
- package/dist/core/types.d.ts +63 -2
- package/dist/core/types.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/pricing/index.d.ts.map +1 -1
- package/dist/pricing/index.js +38 -10
- package/dist/pricing/index.js.map +1 -1
- package/docs/DASHBOARD.md +5 -3
- package/docs/INTEGRATIONS.md +45 -9
- package/examples/integrations/slack-alerts.mjs +59 -0
- package/examples/integrations/webhook-alerts.mjs +58 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pricing/index.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B,eAAe,CAAC;AAGzD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,gBAAgB,EAAE,MAAM,CAAC;IACzB,yCAAyC;IACzC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,yEAAyE;IACzE,WAAW,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,sDAAsD;IACtD,OAAO,EAAE,YAAY,CAAC;IACtB,+DAA+D;IAC/D,mBAAmB,EAAE,MAAM,CAAC;IAC5B,uDAAuD;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,sFAAsF;IACtF,KAAK,EAAE,OAAO,CAAC;CAChB;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pricing/index.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B,eAAe,CAAC;AAGzD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,gBAAgB,EAAE,MAAM,CAAC;IACzB,yCAAyC;IACzC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,yEAAyE;IACzE,WAAW,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,sDAAsD;IACtD,OAAO,EAAE,YAAY,CAAC;IACtB,+DAA+D;IAC/D,mBAAmB,EAAE,MAAM,CAAC;IAC5B,uDAAuD;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,sFAAsF;IACtF,KAAK,EAAE,OAAO,CAAC;CAChB;AAsID;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,SAAS,YAAY,EAAO,GAAG,YAAY,GAAG,SAAS,CAuB3G;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,GAAG,IAAI,CAMtE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,SAAS,YAAY,EAAO,GAAG,WAAW,GAAG,SAAS,CAU9G;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,YAAY,EAAE,CAe5C"}
|
package/dist/pricing/index.js
CHANGED
|
@@ -11,28 +11,28 @@ const BUILTIN_PRICING = [
|
|
|
11
11
|
model: 'gpt-5.5',
|
|
12
12
|
inputPer1kTokens: 0.005,
|
|
13
13
|
outputPer1kTokens: 0.03,
|
|
14
|
-
lastUpdated: '2026-
|
|
14
|
+
lastUpdated: '2026-07-03',
|
|
15
15
|
source: 'https://developers.openai.com/api/docs/pricing',
|
|
16
16
|
},
|
|
17
17
|
{
|
|
18
18
|
model: 'gpt-5.4',
|
|
19
19
|
inputPer1kTokens: 0.0025,
|
|
20
20
|
outputPer1kTokens: 0.015,
|
|
21
|
-
lastUpdated: '2026-
|
|
21
|
+
lastUpdated: '2026-07-03',
|
|
22
22
|
source: 'https://developers.openai.com/api/docs/pricing',
|
|
23
23
|
},
|
|
24
24
|
{
|
|
25
25
|
model: 'gpt-5.4-mini',
|
|
26
26
|
inputPer1kTokens: 0.00075,
|
|
27
27
|
outputPer1kTokens: 0.0045,
|
|
28
|
-
lastUpdated: '2026-
|
|
28
|
+
lastUpdated: '2026-07-03',
|
|
29
29
|
source: 'https://developers.openai.com/api/docs/pricing',
|
|
30
30
|
},
|
|
31
31
|
{
|
|
32
32
|
model: 'gpt-5.4-nano',
|
|
33
33
|
inputPer1kTokens: 0.0002,
|
|
34
34
|
outputPer1kTokens: 0.00125,
|
|
35
|
-
lastUpdated: '2026-
|
|
35
|
+
lastUpdated: '2026-07-03',
|
|
36
36
|
source: 'https://developers.openai.com/api/docs/pricing',
|
|
37
37
|
},
|
|
38
38
|
{
|
|
@@ -63,26 +63,54 @@ const BUILTIN_PRICING = [
|
|
|
63
63
|
lastUpdated: '2026-05-21',
|
|
64
64
|
source: 'https://openai.com/pricing',
|
|
65
65
|
},
|
|
66
|
+
{
|
|
67
|
+
model: 'claude-fable-5',
|
|
68
|
+
inputPer1kTokens: 0.01,
|
|
69
|
+
outputPer1kTokens: 0.05,
|
|
70
|
+
lastUpdated: '2026-07-03',
|
|
71
|
+
source: 'https://platform.claude.com/docs/en/about-claude/models/overview',
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
model: 'claude-opus-4-8',
|
|
75
|
+
inputPer1kTokens: 0.005,
|
|
76
|
+
outputPer1kTokens: 0.025,
|
|
77
|
+
lastUpdated: '2026-07-03',
|
|
78
|
+
source: 'https://platform.claude.com/docs/en/about-claude/models/overview',
|
|
79
|
+
},
|
|
66
80
|
{
|
|
67
81
|
model: 'claude-opus-4.8',
|
|
68
82
|
inputPer1kTokens: 0.005,
|
|
69
83
|
outputPer1kTokens: 0.025,
|
|
70
|
-
lastUpdated: '2026-
|
|
71
|
-
source: 'https://claude.com/
|
|
84
|
+
lastUpdated: '2026-07-03',
|
|
85
|
+
source: 'https://platform.claude.com/docs/en/about-claude/pricing',
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
model: 'claude-sonnet-5',
|
|
89
|
+
inputPer1kTokens: 0.002,
|
|
90
|
+
outputPer1kTokens: 0.01,
|
|
91
|
+
lastUpdated: '2026-07-03',
|
|
92
|
+
source: 'https://platform.claude.com/docs/en/about-claude/models/overview',
|
|
72
93
|
},
|
|
73
94
|
{
|
|
74
95
|
model: 'claude-sonnet-4.6',
|
|
75
96
|
inputPer1kTokens: 0.003,
|
|
76
97
|
outputPer1kTokens: 0.015,
|
|
77
|
-
lastUpdated: '2026-
|
|
78
|
-
source: 'https://claude.com/
|
|
98
|
+
lastUpdated: '2026-07-03',
|
|
99
|
+
source: 'https://platform.claude.com/docs/en/about-claude/pricing',
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
model: 'claude-haiku-4-5',
|
|
103
|
+
inputPer1kTokens: 0.001,
|
|
104
|
+
outputPer1kTokens: 0.005,
|
|
105
|
+
lastUpdated: '2026-07-03',
|
|
106
|
+
source: 'https://platform.claude.com/docs/en/about-claude/models/overview',
|
|
79
107
|
},
|
|
80
108
|
{
|
|
81
109
|
model: 'claude-haiku-4.5',
|
|
82
110
|
inputPer1kTokens: 0.001,
|
|
83
111
|
outputPer1kTokens: 0.005,
|
|
84
|
-
lastUpdated: '2026-
|
|
85
|
-
source: 'https://claude.com/
|
|
112
|
+
lastUpdated: '2026-07-03',
|
|
113
|
+
source: 'https://platform.claude.com/docs/en/about-claude/pricing',
|
|
86
114
|
},
|
|
87
115
|
{
|
|
88
116
|
model: 'claude-3-opus',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pricing/index.ts"],"names":[],"mappings":"AAAA,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAE9B;;;;;GAKG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,YAAY,CAAC;AAiCzD,MAAM,eAAe,GAA4B;IAC/C;QACE,KAAK,EAAE,SAAS;QAChB,gBAAgB,EAAE,KAAK;QACvB,iBAAiB,EAAE,IAAI;QACvB,WAAW,EAAE,YAAY;QACzB,MAAM,EAAE,gDAAgD;KACzD;IACD;QACE,KAAK,EAAE,SAAS;QAChB,gBAAgB,EAAE,MAAM;QACxB,iBAAiB,EAAE,KAAK;QACxB,WAAW,EAAE,YAAY;QACzB,MAAM,EAAE,gDAAgD;KACzD;IACD;QACE,KAAK,EAAE,cAAc;QACrB,gBAAgB,EAAE,OAAO;QACzB,iBAAiB,EAAE,MAAM;QACzB,WAAW,EAAE,YAAY;QACzB,MAAM,EAAE,gDAAgD;KACzD;IACD;QACE,KAAK,EAAE,cAAc;QACrB,gBAAgB,EAAE,MAAM;QACxB,iBAAiB,EAAE,OAAO;QAC1B,WAAW,EAAE,YAAY;QACzB,MAAM,EAAE,gDAAgD;KACzD;IACD;QACE,KAAK,EAAE,OAAO;QACd,gBAAgB,EAAE,IAAI;QACtB,iBAAiB,EAAE,IAAI;QACvB,WAAW,EAAE,YAAY;QACzB,MAAM,EAAE,4BAA4B;KACrC;IACD;QACE,KAAK,EAAE,QAAQ;QACf,gBAAgB,EAAE,KAAK;QACvB,iBAAiB,EAAE,KAAK;QACxB,WAAW,EAAE,YAAY;QACzB,MAAM,EAAE,4BAA4B;KACrC;IACD;QACE,KAAK,EAAE,aAAa;QACpB,gBAAgB,EAAE,OAAO;QACzB,iBAAiB,EAAE,MAAM;QACzB,WAAW,EAAE,YAAY;QACzB,MAAM,EAAE,4BAA4B;KACrC;IACD;QACE,KAAK,EAAE,eAAe;QACtB,gBAAgB,EAAE,MAAM;QACxB,iBAAiB,EAAE,MAAM;QACzB,WAAW,EAAE,YAAY;QACzB,MAAM,EAAE,4BAA4B;KACrC;IACD;QACE,KAAK,EAAE,iBAAiB;QACxB,gBAAgB,EAAE,KAAK;QACvB,iBAAiB,EAAE,KAAK;QACxB,WAAW,EAAE,YAAY;QACzB,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pricing/index.ts"],"names":[],"mappings":"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"}
|
package/docs/DASHBOARD.md
CHANGED
|
@@ -39,8 +39,8 @@ npx ai-costguard dashboard --events .ai-costguard/events.jsonl --budget 5
|
|
|
39
39
|
- Requests blocked
|
|
40
40
|
- Estimated spend
|
|
41
41
|
- Estimated savings
|
|
42
|
-
- Attempted spend
|
|
43
|
-
- Actual spend when provider usage is available
|
|
42
|
+
- Attempted spend
|
|
43
|
+
- Actual spend when provider usage is available
|
|
44
44
|
- Loop detections
|
|
45
45
|
- Retry detections
|
|
46
46
|
- Recent guard events
|
|
@@ -58,4 +58,6 @@ ai-costguard dashboard --events .ai-costguard/events.jsonl --budget 5 --once --j
|
|
|
58
58
|
|
|
59
59
|
`eventLogPrompt` defaults to `none`, so prompt text is not written to disk. Set `eventLogPrompt: 'preview'` only for local debugging where prompt previews are acceptable.
|
|
60
60
|
|
|
61
|
-
The dashboard is a local development view, not a billing ledger. Use provider billing exports for financial reconciliation.
|
|
61
|
+
The dashboard is a local development view, not a billing ledger. Use provider billing exports for financial reconciliation.
|
|
62
|
+
|
|
63
|
+
Actual spend comes from `usage` events written after successful provider responses expose recognizable `usage` fields.
|
package/docs/INTEGRATIONS.md
CHANGED
|
@@ -10,10 +10,12 @@ node examples/integrations/openai-agent-loop.mjs
|
|
|
10
10
|
node examples/integrations/anthropic-workflow-budget.mjs
|
|
11
11
|
node examples/integrations/vercel-ai-chatbot.mjs
|
|
12
12
|
node examples/integrations/langchain-retry-storm.mjs
|
|
13
|
-
node examples/integrations/mastra-agent.mjs
|
|
14
|
-
node examples/integrations/crewai-budget-gate.mjs
|
|
15
|
-
node examples/integrations/
|
|
16
|
-
|
|
13
|
+
node examples/integrations/mastra-agent.mjs
|
|
14
|
+
node examples/integrations/crewai-budget-gate.mjs
|
|
15
|
+
node examples/integrations/webhook-alerts.mjs
|
|
16
|
+
node examples/integrations/slack-alerts.mjs
|
|
17
|
+
node examples/integrations/ci-budget-check.mjs
|
|
18
|
+
```
|
|
17
19
|
|
|
18
20
|
## OpenAI SDK
|
|
19
21
|
|
|
@@ -140,11 +142,45 @@ CrewAI is Python-native, so this TypeScript package cannot instrument internal P
|
|
|
140
142
|
- Wrap a Node launcher or API boundary with `guardFunction()` before it starts the Python workflow.
|
|
141
143
|
- Use provider-side billing alerts for final reconciliation.
|
|
142
144
|
|
|
143
|
-
Runnable mock: `examples/integrations/crewai-budget-gate.mjs`
|
|
144
|
-
|
|
145
|
-
##
|
|
146
|
-
|
|
147
|
-
|
|
145
|
+
Runnable mock: `examples/integrations/crewai-budget-gate.mjs`
|
|
146
|
+
|
|
147
|
+
## Local Webhook And Slack Alerts
|
|
148
|
+
|
|
149
|
+
Alerts are local-first and optional. AI CostGuard only sends to a webhook URL you provide, and alert failures never change guard decisions.
|
|
150
|
+
|
|
151
|
+
```ts
|
|
152
|
+
import { guard } from '@salimassili/ai-costguard';
|
|
153
|
+
|
|
154
|
+
const openai = guard(client, {
|
|
155
|
+
budget: { maxUsd: 5, thresholdPercent: 0.8 },
|
|
156
|
+
projectId: 'agent-api',
|
|
157
|
+
runId: 'run-1',
|
|
158
|
+
alerts: {
|
|
159
|
+
webhookUrl: process.env.COSTGUARD_WEBHOOK_URL,
|
|
160
|
+
events: ['blocked', 'threshold'],
|
|
161
|
+
timeoutMs: 1500,
|
|
162
|
+
},
|
|
163
|
+
});
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
For Slack incoming webhooks, use `format: 'slack'` or `slack: true`:
|
|
167
|
+
|
|
168
|
+
```ts
|
|
169
|
+
const openai = guard(client, {
|
|
170
|
+
budget: { maxUsd: 5 },
|
|
171
|
+
alerts: {
|
|
172
|
+
webhookUrl: process.env.COSTGUARD_SLACK_WEBHOOK,
|
|
173
|
+
events: ['blocked'],
|
|
174
|
+
format: 'slack',
|
|
175
|
+
},
|
|
176
|
+
});
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
Runnable mocks: `examples/integrations/webhook-alerts.mjs` and `examples/integrations/slack-alerts.mjs`
|
|
180
|
+
|
|
181
|
+
## CI Budget Check
|
|
182
|
+
|
|
183
|
+
Use the CLI to fail a pipeline before a planned agent run can exceed budget.
|
|
148
184
|
|
|
149
185
|
```bash
|
|
150
186
|
ai-costguard check --budget 0.25 --model gpt-4o-mini --input-tokens 800 --tokens 1200 --max-steps 20
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { guard, GuardError, registerTokenizer } from '@salimassili/ai-costguard';
|
|
2
|
+
|
|
3
|
+
const webhookUrl = process.env.COSTGUARD_SLACK_WEBHOOK;
|
|
4
|
+
let providerCalls = 0;
|
|
5
|
+
|
|
6
|
+
registerTokenizer('gpt-4o-mini', (text) => Math.ceil(text.length / 4));
|
|
7
|
+
|
|
8
|
+
const mockedOpenAI = {
|
|
9
|
+
chat: {
|
|
10
|
+
completions: {
|
|
11
|
+
create: async () => {
|
|
12
|
+
providerCalls += 1;
|
|
13
|
+
return { ok: true };
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const openai = guard(mockedOpenAI, {
|
|
20
|
+
budget: { maxUsd: 0.0001 },
|
|
21
|
+
projectId: 'slack-alert-demo',
|
|
22
|
+
runId: 'local-run-1',
|
|
23
|
+
alerts: {
|
|
24
|
+
webhookUrl,
|
|
25
|
+
events: ['blocked'],
|
|
26
|
+
format: 'slack',
|
|
27
|
+
timeoutMs: 1000,
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
try {
|
|
32
|
+
await openai.chat.completions.create({
|
|
33
|
+
model: 'gpt-4o-mini',
|
|
34
|
+
messages: [{ role: 'user', content: 'Reserve a long output for an expensive agent step.' }],
|
|
35
|
+
max_tokens: 800,
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
throw new Error('Expected AI CostGuard to block the mocked provider call.');
|
|
39
|
+
} catch (error) {
|
|
40
|
+
if (!(error instanceof GuardError)) throw error;
|
|
41
|
+
|
|
42
|
+
console.log(
|
|
43
|
+
JSON.stringify(
|
|
44
|
+
{
|
|
45
|
+
demo: 'slack-alerts',
|
|
46
|
+
slackAlert: webhookUrl ? 'enabled from COSTGUARD_SLACK_WEBHOOK' : 'off by default',
|
|
47
|
+
blocked: true,
|
|
48
|
+
reason: error.code,
|
|
49
|
+
providerCalls,
|
|
50
|
+
},
|
|
51
|
+
null,
|
|
52
|
+
2
|
|
53
|
+
)
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (providerCalls !== 0) {
|
|
58
|
+
throw new Error(`Provider executed ${providerCalls} time(s); expected 0.`);
|
|
59
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { guard, GuardError, registerTokenizer } from '@salimassili/ai-costguard';
|
|
2
|
+
|
|
3
|
+
const webhookUrl = process.env.COSTGUARD_WEBHOOK_URL;
|
|
4
|
+
let providerCalls = 0;
|
|
5
|
+
|
|
6
|
+
registerTokenizer('gpt-4o-mini', (text) => Math.ceil(text.length / 4));
|
|
7
|
+
|
|
8
|
+
const mockedOpenAI = {
|
|
9
|
+
chat: {
|
|
10
|
+
completions: {
|
|
11
|
+
create: async () => {
|
|
12
|
+
providerCalls += 1;
|
|
13
|
+
return { ok: true };
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const openai = guard(mockedOpenAI, {
|
|
20
|
+
budget: { maxUsd: 0.0001 },
|
|
21
|
+
projectId: 'webhook-alert-demo',
|
|
22
|
+
runId: 'local-run-1',
|
|
23
|
+
alerts: {
|
|
24
|
+
webhookUrl,
|
|
25
|
+
events: ['blocked'],
|
|
26
|
+
timeoutMs: 1000,
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
try {
|
|
31
|
+
await openai.chat.completions.create({
|
|
32
|
+
model: 'gpt-4o-mini',
|
|
33
|
+
messages: [{ role: 'user', content: 'Reserve a long output for an expensive agent step.' }],
|
|
34
|
+
max_tokens: 800,
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
throw new Error('Expected AI CostGuard to block the mocked provider call.');
|
|
38
|
+
} catch (error) {
|
|
39
|
+
if (!(error instanceof GuardError)) throw error;
|
|
40
|
+
|
|
41
|
+
console.log(
|
|
42
|
+
JSON.stringify(
|
|
43
|
+
{
|
|
44
|
+
demo: 'webhook-alerts',
|
|
45
|
+
alert: webhookUrl ? 'enabled from COSTGUARD_WEBHOOK_URL' : 'off by default',
|
|
46
|
+
blocked: true,
|
|
47
|
+
reason: error.code,
|
|
48
|
+
providerCalls,
|
|
49
|
+
},
|
|
50
|
+
null,
|
|
51
|
+
2
|
|
52
|
+
)
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (providerCalls !== 0) {
|
|
57
|
+
throw new Error(`Provider executed ${providerCalls} time(s); expected 0.`);
|
|
58
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@salimassili/ai-costguard",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.2",
|
|
4
4
|
"description": "Local-first runtime safety layer for AI agents that blocks runaway costs, loops, retries, and budget overruns before API calls execute.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|