@agentguard-run/spend 0.1.8 → 0.1.10
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/dist/adapters/postgres-store.d.ts +47 -0
- package/dist/adapters/postgres-store.d.ts.map +1 -0
- package/dist/adapters/postgres-store.js +122 -0
- package/dist/adapters/postgres-store.js.map +1 -0
- package/dist/adapters/redis-store.d.ts +53 -0
- package/dist/adapters/redis-store.d.ts.map +1 -0
- package/dist/adapters/redis-store.js +112 -0
- package/dist/adapters/redis-store.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -3
- package/dist/index.js.map +1 -1
- package/dist/integrations/langchain-callback.d.ts +42 -0
- package/dist/integrations/langchain-callback.d.ts.map +1 -0
- package/dist/integrations/langchain-callback.js +118 -0
- package/dist/integrations/langchain-callback.js.map +1 -0
- package/dist/spend-guard.d.ts +1 -1
- package/dist/spend-guard.d.ts.map +1 -1
- package/dist/spend-guard.js +3 -2
- package/dist/spend-guard.js.map +1 -1
- package/dist/store-memory.d.ts +7 -0
- package/dist/store-memory.d.ts.map +1 -1
- package/dist/store-memory.js +4 -3
- package/dist/store-memory.js.map +1 -1
- package/package.json +28 -6
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Postgres-backed SpendStore + DecisionLogStore.
|
|
3
|
+
*
|
|
4
|
+
* Install: `npm install @agentguard-run/spend pg`
|
|
5
|
+
*
|
|
6
|
+
* UPSERT semantics for window spend. Append-only decision log table
|
|
7
|
+
* with UNIQUE(signer_fingerprint, sequence) for crash-safe chain ordering.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* import { Pool } from 'pg';
|
|
11
|
+
* import {
|
|
12
|
+
* PostgresSpendStore, PostgresDecisionLogStore, ensureSchema,
|
|
13
|
+
* } from '@agentguard-run/spend/dist/adapters/postgres-store';
|
|
14
|
+
*
|
|
15
|
+
* const pool = new Pool({ connectionString: process.env.DATABASE_URL });
|
|
16
|
+
* await ensureSchema(pool);
|
|
17
|
+
* const config = {
|
|
18
|
+
* policy,
|
|
19
|
+
* spendStore: new PostgresSpendStore(pool),
|
|
20
|
+
* logStore: new PostgresDecisionLogStore(pool),
|
|
21
|
+
* signingKeys: { privateKey, publicKey },
|
|
22
|
+
* };
|
|
23
|
+
*/
|
|
24
|
+
import type { SignedDecisionLogEntry, SpendStore, DecisionLogStore, SpendWindow } from '../types';
|
|
25
|
+
type PoolLike = {
|
|
26
|
+
query(text: string, params?: any[]): Promise<{
|
|
27
|
+
rows: any[];
|
|
28
|
+
rowCount: number | null;
|
|
29
|
+
}>;
|
|
30
|
+
};
|
|
31
|
+
/** Create the required tables/indexes if they don't exist. Idempotent. */
|
|
32
|
+
export declare function ensureSchema(pool: PoolLike): Promise<void>;
|
|
33
|
+
export declare class PostgresSpendStore implements SpendStore {
|
|
34
|
+
private pool;
|
|
35
|
+
constructor(pool: PoolLike);
|
|
36
|
+
getWindowSpend(scopeKey: string, window: SpendWindow): Promise<number>;
|
|
37
|
+
incrementWindowSpend(scopeKey: string, window: SpendWindow, cents: number): Promise<number>;
|
|
38
|
+
}
|
|
39
|
+
export declare class PostgresDecisionLogStore implements DecisionLogStore {
|
|
40
|
+
private pool;
|
|
41
|
+
constructor(pool: PoolLike);
|
|
42
|
+
append(entry: SignedDecisionLogEntry): Promise<void>;
|
|
43
|
+
getLatest(): Promise<SignedDecisionLogEntry | null>;
|
|
44
|
+
read(fromSequence: number, limit: number): Promise<SignedDecisionLogEntry[]>;
|
|
45
|
+
}
|
|
46
|
+
export {};
|
|
47
|
+
//# sourceMappingURL=postgres-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres-store.d.ts","sourceRoot":"","sources":["../../src/adapters/postgres-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAKH,OAAO,KAAK,EAAE,sBAAsB,EAAE,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAElG,KAAK,QAAQ,GAAG;IACd,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;CACxF,CAAC;AA6BF,0EAA0E;AAC1E,wBAAsB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhE;AAED,qBAAa,kBAAmB,YAAW,UAAU;IACvC,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE,QAAQ;IAC5B,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAQtE,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAYlG;AAED,qBAAa,wBAAyB,YAAW,gBAAgB;IACnD,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE,QAAQ;IAC5B,MAAM,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAepD,SAAS,IAAI,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC;IAQnD,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC;CAQnF"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Postgres-backed SpendStore + DecisionLogStore.
|
|
4
|
+
*
|
|
5
|
+
* Install: `npm install @agentguard-run/spend pg`
|
|
6
|
+
*
|
|
7
|
+
* UPSERT semantics for window spend. Append-only decision log table
|
|
8
|
+
* with UNIQUE(signer_fingerprint, sequence) for crash-safe chain ordering.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* import { Pool } from 'pg';
|
|
12
|
+
* import {
|
|
13
|
+
* PostgresSpendStore, PostgresDecisionLogStore, ensureSchema,
|
|
14
|
+
* } from '@agentguard-run/spend/dist/adapters/postgres-store';
|
|
15
|
+
*
|
|
16
|
+
* const pool = new Pool({ connectionString: process.env.DATABASE_URL });
|
|
17
|
+
* await ensureSchema(pool);
|
|
18
|
+
* const config = {
|
|
19
|
+
* policy,
|
|
20
|
+
* spendStore: new PostgresSpendStore(pool),
|
|
21
|
+
* logStore: new PostgresDecisionLogStore(pool),
|
|
22
|
+
* signingKeys: { privateKey, publicKey },
|
|
23
|
+
* };
|
|
24
|
+
*/
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.PostgresDecisionLogStore = exports.PostgresSpendStore = void 0;
|
|
27
|
+
exports.ensureSchema = ensureSchema;
|
|
28
|
+
const store_memory_1 = require("../store-memory");
|
|
29
|
+
function _nowMs() { return Date.now(); }
|
|
30
|
+
const SPEND_SCHEMA = `
|
|
31
|
+
CREATE TABLE IF NOT EXISTS agentguard_spend (
|
|
32
|
+
scope_key TEXT NOT NULL,
|
|
33
|
+
window TEXT NOT NULL,
|
|
34
|
+
window_start_ms BIGINT NOT NULL,
|
|
35
|
+
cents BIGINT NOT NULL DEFAULT 0,
|
|
36
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
37
|
+
PRIMARY KEY (scope_key, window, window_start_ms)
|
|
38
|
+
);
|
|
39
|
+
CREATE INDEX IF NOT EXISTS agentguard_spend_updated_idx ON agentguard_spend(updated_at);
|
|
40
|
+
`;
|
|
41
|
+
const LOG_SCHEMA = `
|
|
42
|
+
CREATE TABLE IF NOT EXISTS agentguard_decision_log (
|
|
43
|
+
id BIGSERIAL PRIMARY KEY,
|
|
44
|
+
sequence BIGINT NOT NULL,
|
|
45
|
+
signer_fingerprint TEXT NOT NULL,
|
|
46
|
+
entry_hash TEXT NOT NULL,
|
|
47
|
+
previous_hash TEXT NOT NULL,
|
|
48
|
+
signature TEXT NOT NULL,
|
|
49
|
+
decision_json JSONB NOT NULL,
|
|
50
|
+
appended_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
51
|
+
UNIQUE (signer_fingerprint, sequence)
|
|
52
|
+
);
|
|
53
|
+
CREATE INDEX IF NOT EXISTS agentguard_log_signer_idx ON agentguard_decision_log(signer_fingerprint, sequence DESC);
|
|
54
|
+
`;
|
|
55
|
+
/** Create the required tables/indexes if they don't exist. Idempotent. */
|
|
56
|
+
async function ensureSchema(pool) {
|
|
57
|
+
await pool.query(SPEND_SCHEMA);
|
|
58
|
+
await pool.query(LOG_SCHEMA);
|
|
59
|
+
}
|
|
60
|
+
class PostgresSpendStore {
|
|
61
|
+
pool;
|
|
62
|
+
constructor(pool) {
|
|
63
|
+
this.pool = pool;
|
|
64
|
+
}
|
|
65
|
+
async getWindowSpend(scopeKey, window) {
|
|
66
|
+
const startMs = (0, store_memory_1.windowStart)(window, _nowMs());
|
|
67
|
+
const r = await this.pool.query('SELECT cents FROM agentguard_spend WHERE scope_key=$1 AND window=$2 AND window_start_ms=$3', [scopeKey, window, startMs]);
|
|
68
|
+
return r.rows[0] ? Number(r.rows[0].cents) : 0;
|
|
69
|
+
}
|
|
70
|
+
async incrementWindowSpend(scopeKey, window, cents) {
|
|
71
|
+
const startMs = (0, store_memory_1.windowStart)(window, _nowMs());
|
|
72
|
+
const r = await this.pool.query(`INSERT INTO agentguard_spend (scope_key, window, window_start_ms, cents)
|
|
73
|
+
VALUES ($1, $2, $3, $4)
|
|
74
|
+
ON CONFLICT (scope_key, window, window_start_ms)
|
|
75
|
+
DO UPDATE SET cents = agentguard_spend.cents + EXCLUDED.cents, updated_at = NOW()
|
|
76
|
+
RETURNING cents`, [scopeKey, window, startMs, cents]);
|
|
77
|
+
return Number(r.rows[0].cents);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
exports.PostgresSpendStore = PostgresSpendStore;
|
|
81
|
+
class PostgresDecisionLogStore {
|
|
82
|
+
pool;
|
|
83
|
+
constructor(pool) {
|
|
84
|
+
this.pool = pool;
|
|
85
|
+
}
|
|
86
|
+
async append(entry) {
|
|
87
|
+
await this.pool.query(`INSERT INTO agentguard_decision_log
|
|
88
|
+
(sequence, signer_fingerprint, entry_hash, previous_hash, signature, decision_json)
|
|
89
|
+
VALUES ($1, $2, $3, $4, $5, $6::jsonb)`, [
|
|
90
|
+
entry.sequence,
|
|
91
|
+
entry.signerFingerprint,
|
|
92
|
+
entry.entryHash,
|
|
93
|
+
entry.previousHash,
|
|
94
|
+
entry.signature,
|
|
95
|
+
JSON.stringify(entry.decision),
|
|
96
|
+
]);
|
|
97
|
+
}
|
|
98
|
+
async getLatest() {
|
|
99
|
+
const r = await this.pool.query(`SELECT sequence, signer_fingerprint, entry_hash, previous_hash, signature, decision_json
|
|
100
|
+
FROM agentguard_decision_log ORDER BY id DESC LIMIT 1`);
|
|
101
|
+
if (!r.rows[0])
|
|
102
|
+
return null;
|
|
103
|
+
return rowToEntry(r.rows[0]);
|
|
104
|
+
}
|
|
105
|
+
async read(fromSequence, limit) {
|
|
106
|
+
const r = await this.pool.query(`SELECT sequence, signer_fingerprint, entry_hash, previous_hash, signature, decision_json
|
|
107
|
+
FROM agentguard_decision_log WHERE sequence >= $1 ORDER BY sequence ASC LIMIT $2`, [fromSequence, limit]);
|
|
108
|
+
return r.rows.map(rowToEntry);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
exports.PostgresDecisionLogStore = PostgresDecisionLogStore;
|
|
112
|
+
function rowToEntry(row) {
|
|
113
|
+
return {
|
|
114
|
+
sequence: Number(row.sequence),
|
|
115
|
+
signerFingerprint: row.signer_fingerprint,
|
|
116
|
+
entryHash: row.entry_hash,
|
|
117
|
+
previousHash: row.previous_hash,
|
|
118
|
+
signature: row.signature,
|
|
119
|
+
decision: row.decision_json,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=postgres-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres-store.js","sourceRoot":"","sources":["../../src/adapters/postgres-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Redis-backed SpendStore + DecisionLogStore.
|
|
3
|
+
*
|
|
4
|
+
* Install: `npm install @agentguard-run/spend ioredis`
|
|
5
|
+
*
|
|
6
|
+
* Multi-process spend tracking via INCR semantics. Decision log stored
|
|
7
|
+
* on a Redis Stream for crash-safe ordered append.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* import Redis from 'ioredis';
|
|
11
|
+
* import { RedisSpendStore, RedisDecisionLogStore } from '@agentguard-run/spend/dist/adapters/redis-store';
|
|
12
|
+
*
|
|
13
|
+
* const redis = new Redis('redis://localhost:6379');
|
|
14
|
+
* const config = {
|
|
15
|
+
* policy,
|
|
16
|
+
* spendStore: new RedisSpendStore(redis, { keyPrefix: 'agentguard' }),
|
|
17
|
+
* logStore: new RedisDecisionLogStore(redis, { streamKey: 'agentguard:log' }),
|
|
18
|
+
* signingKeys: { privateKey, publicKey },
|
|
19
|
+
* };
|
|
20
|
+
*/
|
|
21
|
+
import type { SignedDecisionLogEntry, SpendStore, DecisionLogStore, SpendWindow } from '../types';
|
|
22
|
+
type RedisLike = {
|
|
23
|
+
get(key: string): Promise<string | null>;
|
|
24
|
+
incrby(key: string, increment: number): Promise<number>;
|
|
25
|
+
expire(key: string, seconds: number): Promise<number>;
|
|
26
|
+
xadd(key: string, ...args: any[]): Promise<string | null>;
|
|
27
|
+
xrevrange(key: string, end: string, start: string, ...args: any[]): Promise<any>;
|
|
28
|
+
xrange(key: string, start: string, end: string, ...args: any[]): Promise<any>;
|
|
29
|
+
};
|
|
30
|
+
export interface RedisSpendStoreOptions {
|
|
31
|
+
keyPrefix?: string;
|
|
32
|
+
}
|
|
33
|
+
export declare class RedisSpendStore implements SpendStore {
|
|
34
|
+
private redis;
|
|
35
|
+
private prefix;
|
|
36
|
+
constructor(redis: RedisLike, opts?: RedisSpendStoreOptions);
|
|
37
|
+
private key;
|
|
38
|
+
getWindowSpend(scopeKey: string, window: SpendWindow): Promise<number>;
|
|
39
|
+
incrementWindowSpend(scopeKey: string, window: SpendWindow, cents: number): Promise<number>;
|
|
40
|
+
}
|
|
41
|
+
export interface RedisDecisionLogStoreOptions {
|
|
42
|
+
streamKey?: string;
|
|
43
|
+
}
|
|
44
|
+
export declare class RedisDecisionLogStore implements DecisionLogStore {
|
|
45
|
+
private redis;
|
|
46
|
+
private stream;
|
|
47
|
+
constructor(redis: RedisLike, opts?: RedisDecisionLogStoreOptions);
|
|
48
|
+
append(entry: SignedDecisionLogEntry): Promise<void>;
|
|
49
|
+
getLatest(): Promise<SignedDecisionLogEntry | null>;
|
|
50
|
+
read(fromSequence: number, limit: number): Promise<SignedDecisionLogEntry[]>;
|
|
51
|
+
}
|
|
52
|
+
export {};
|
|
53
|
+
//# sourceMappingURL=redis-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-store.d.ts","sourceRoot":"","sources":["../../src/adapters/redis-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAKH,OAAO,KAAK,EAAE,sBAAsB,EAAE,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAIlG,KAAK,SAAS,GAAG;IACf,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACxD,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1D,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACjF,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;CAC/E,CAAC;AAUF,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,eAAgB,YAAW,UAAU;IAEpC,OAAO,CAAC,KAAK;IADzB,OAAO,CAAC,MAAM,CAAS;gBACH,KAAK,EAAE,SAAS,EAAE,IAAI,GAAE,sBAA2B;IAGvE,OAAO,CAAC,GAAG;IAIL,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAItE,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAMlG;AAED,MAAM,WAAW,4BAA4B;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,qBAAsB,YAAW,gBAAgB;IAEhD,OAAO,CAAC,KAAK;IADzB,OAAO,CAAC,MAAM,CAAS;gBACH,KAAK,EAAE,SAAS,EAAE,IAAI,GAAE,4BAAiC;IAGvE,MAAM,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpD,SAAS,IAAI,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC;IAcnD,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC;CAsBnF"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Redis-backed SpendStore + DecisionLogStore.
|
|
4
|
+
*
|
|
5
|
+
* Install: `npm install @agentguard-run/spend ioredis`
|
|
6
|
+
*
|
|
7
|
+
* Multi-process spend tracking via INCR semantics. Decision log stored
|
|
8
|
+
* on a Redis Stream for crash-safe ordered append.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* import Redis from 'ioredis';
|
|
12
|
+
* import { RedisSpendStore, RedisDecisionLogStore } from '@agentguard-run/spend/dist/adapters/redis-store';
|
|
13
|
+
*
|
|
14
|
+
* const redis = new Redis('redis://localhost:6379');
|
|
15
|
+
* const config = {
|
|
16
|
+
* policy,
|
|
17
|
+
* spendStore: new RedisSpendStore(redis, { keyPrefix: 'agentguard' }),
|
|
18
|
+
* logStore: new RedisDecisionLogStore(redis, { streamKey: 'agentguard:log' }),
|
|
19
|
+
* signingKeys: { privateKey, publicKey },
|
|
20
|
+
* };
|
|
21
|
+
*/
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.RedisDecisionLogStore = exports.RedisSpendStore = void 0;
|
|
24
|
+
const store_memory_1 = require("../store-memory");
|
|
25
|
+
function _nowMs() { return Date.now(); }
|
|
26
|
+
const WINDOW_EXPIRY_S = {
|
|
27
|
+
per_call: 60,
|
|
28
|
+
per_minute: 120,
|
|
29
|
+
per_hour: 7200,
|
|
30
|
+
per_day: 172800,
|
|
31
|
+
per_month: 5356800,
|
|
32
|
+
};
|
|
33
|
+
class RedisSpendStore {
|
|
34
|
+
redis;
|
|
35
|
+
prefix;
|
|
36
|
+
constructor(redis, opts = {}) {
|
|
37
|
+
this.redis = redis;
|
|
38
|
+
this.prefix = opts.keyPrefix ?? 'agentguard';
|
|
39
|
+
}
|
|
40
|
+
key(scopeKey, window) {
|
|
41
|
+
const startMs = (0, store_memory_1.windowStart)(window, _nowMs());
|
|
42
|
+
return `${this.prefix}:spend:${scopeKey}:${window}:${startMs}`;
|
|
43
|
+
}
|
|
44
|
+
async getWindowSpend(scopeKey, window) {
|
|
45
|
+
const v = await this.redis.get(this.key(scopeKey, window));
|
|
46
|
+
return v ? parseInt(v, 10) : 0;
|
|
47
|
+
}
|
|
48
|
+
async incrementWindowSpend(scopeKey, window, cents) {
|
|
49
|
+
const k = this.key(scopeKey, window);
|
|
50
|
+
const newVal = await this.redis.incrby(k, cents);
|
|
51
|
+
await this.redis.expire(k, WINDOW_EXPIRY_S[window] ?? 86400);
|
|
52
|
+
return newVal;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
exports.RedisSpendStore = RedisSpendStore;
|
|
56
|
+
class RedisDecisionLogStore {
|
|
57
|
+
redis;
|
|
58
|
+
stream;
|
|
59
|
+
constructor(redis, opts = {}) {
|
|
60
|
+
this.redis = redis;
|
|
61
|
+
this.stream = opts.streamKey ?? 'agentguard:log';
|
|
62
|
+
}
|
|
63
|
+
async append(entry) {
|
|
64
|
+
const payload = JSON.stringify(entry);
|
|
65
|
+
await this.redis.xadd(this.stream, '*', 'd', payload);
|
|
66
|
+
}
|
|
67
|
+
async getLatest() {
|
|
68
|
+
try {
|
|
69
|
+
const entries = await this.redis.xrevrange(this.stream, '+', '-', 'COUNT', 1);
|
|
70
|
+
if (!entries || entries.length === 0)
|
|
71
|
+
return null;
|
|
72
|
+
// ioredis returns [[id, [field1, val1, field2, val2, ...]], ...]
|
|
73
|
+
const [, fields] = entries[0];
|
|
74
|
+
const dIdx = fields.indexOf('d');
|
|
75
|
+
if (dIdx < 0)
|
|
76
|
+
return null;
|
|
77
|
+
const raw = fields[dIdx + 1];
|
|
78
|
+
return JSON.parse(raw);
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async read(fromSequence, limit) {
|
|
85
|
+
try {
|
|
86
|
+
const entries = await this.redis.xrange(this.stream, '-', '+', 'COUNT', limit * 2);
|
|
87
|
+
const out = [];
|
|
88
|
+
for (const [, fields] of entries) {
|
|
89
|
+
const dIdx = fields.indexOf('d');
|
|
90
|
+
if (dIdx < 0)
|
|
91
|
+
continue;
|
|
92
|
+
try {
|
|
93
|
+
const parsed = JSON.parse(fields[dIdx + 1]);
|
|
94
|
+
if (parsed.sequence >= fromSequence) {
|
|
95
|
+
out.push(parsed);
|
|
96
|
+
if (out.length >= limit)
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// skip malformed
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return out;
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return [];
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
exports.RedisDecisionLogStore = RedisDecisionLogStore;
|
|
112
|
+
//# sourceMappingURL=redis-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-store.js","sourceRoot":"","sources":["../../src/adapters/redis-store.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -12,7 +12,7 @@ export { canonicalJson, sha256Hex, computeEntryHash, computeSignerFingerprint, s
|
|
|
12
12
|
export { InMemorySpendStore } from './store-memory';
|
|
13
13
|
export { SpendGuard, withSpendGuard, AgentGuardBlockedError, type SpendGuardConfig, type OpenAIBindingOptions, } from './spend-guard';
|
|
14
14
|
export { DEFAULT_LOCALE, SUPPORTED_LOCALES, TRANSLATIONS, type SupportedLocale, resolveLocale, t, formatBlockedTrace, type BlockedTraceArgs, } from './i18n';
|
|
15
|
-
export declare const AGENTGUARD_SPEND_VERSION = "0.1.
|
|
15
|
+
export declare const AGENTGUARD_SPEND_VERSION = "0.1.10";
|
|
16
16
|
/** Patent marking. 35 U.S.C. § 287 constructive notice. */
|
|
17
17
|
export declare const PATENT_NOTICE: string;
|
|
18
18
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,YAAY,EACV,WAAW,EACX,WAAW,EACX,QAAQ,EACR,eAAe,EACf,cAAc,EACd,QAAQ,EACR,UAAU,EACV,WAAW,EACX,WAAW,EACX,aAAa,EACb,sBAAsB,EACtB,UAAU,EACV,gBAAgB,GACjB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,KAAK,SAAS,GACf,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzD,OAAO,EACL,aAAa,EACb,SAAS,EACT,gBAAgB,EAChB,wBAAwB,EACxB,YAAY,EACZ,WAAW,EACX,WAAW,EACX,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAGpD,OAAO,EACL,UAAU,EACV,cAAc,EACd,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,GAC1B,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,KAAK,eAAe,EACpB,aAAa,EACb,CAAC,EACD,kBAAkB,EAClB,KAAK,gBAAgB,GACtB,MAAM,QAAQ,CAAC;AAEhB,eAAO,MAAM,wBAAwB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,YAAY,EACV,WAAW,EACX,WAAW,EACX,QAAQ,EACR,eAAe,EACf,cAAc,EACd,QAAQ,EACR,UAAU,EACV,WAAW,EACX,WAAW,EACX,aAAa,EACb,sBAAsB,EACtB,UAAU,EACV,gBAAgB,GACjB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,KAAK,SAAS,GACf,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzD,OAAO,EACL,aAAa,EACb,SAAS,EACT,gBAAgB,EAChB,wBAAwB,EACxB,YAAY,EACZ,WAAW,EACX,WAAW,EACX,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAGpD,OAAO,EACL,UAAU,EACV,cAAc,EACd,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,GAC1B,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,KAAK,eAAe,EACpB,aAAa,EACb,CAAC,EACD,kBAAkB,EAClB,KAAK,gBAAgB,GACtB,MAAM,QAAQ,CAAC;AAEhB,eAAO,MAAM,wBAAwB,WAAW,CAAC;AAEjD,2DAA2D;AAC3D,eAAO,MAAM,aAAa,QAG8B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -46,10 +46,9 @@ Object.defineProperty(exports, "TRANSLATIONS", { enumerable: true, get: function
|
|
|
46
46
|
Object.defineProperty(exports, "resolveLocale", { enumerable: true, get: function () { return i18n_1.resolveLocale; } });
|
|
47
47
|
Object.defineProperty(exports, "t", { enumerable: true, get: function () { return i18n_1.t; } });
|
|
48
48
|
Object.defineProperty(exports, "formatBlockedTrace", { enumerable: true, get: function () { return i18n_1.formatBlockedTrace; } });
|
|
49
|
-
exports.AGENTGUARD_SPEND_VERSION = '0.1.
|
|
49
|
+
exports.AGENTGUARD_SPEND_VERSION = '0.1.10';
|
|
50
50
|
/** Patent marking. 35 U.S.C. § 287 constructive notice. */
|
|
51
51
|
exports.PATENT_NOTICE = 'Protected by U.S. patent-pending technology ' +
|
|
52
52
|
'(App. Nos. 63/983,615; 63/983,621; 63/983,843; 63/984,626; ' +
|
|
53
|
-
'
|
|
54
|
-
'Additional patents pending.';
|
|
53
|
+
'64/071,781; 64/071,789). Additional patents pending.';
|
|
55
54
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAmBH,aAAa;AACb,2CAOsB;AANpB,0GAAA,YAAY,OAAA;AACZ,6GAAA,eAAe,OAAA;AACf,gHAAA,kBAAkB,OAAA;AAClB,8GAAA,gBAAgB,OAAA;AAChB,2GAAA,aAAa,OAAA;AAIf,gBAAgB;AAChB,mCAAyD;AAAhD,wGAAA,cAAc,OAAA;AAAE,uGAAA,aAAa,OAAA;AAEtC,eAAe;AACf,+CAUwB;AATtB,6GAAA,aAAa,OAAA;AACb,yGAAA,SAAS,OAAA;AACT,gHAAA,gBAAgB,OAAA;AAChB,wHAAA,wBAAwB,OAAA;AACxB,4GAAA,YAAY,OAAA;AACZ,2GAAA,WAAW,OAAA;AACX,2GAAA,WAAW,OAAA;AACX,qHAAA,qBAAqB,OAAA;AACrB,wHAAA,wBAAwB,OAAA;AAG1B,wBAAwB;AACxB,+CAAoD;AAA3C,kHAAA,kBAAkB,OAAA;AAE3B,eAAe;AACf,6CAMuB;AALrB,yGAAA,UAAU,OAAA;AACV,6GAAA,cAAc,OAAA;AACd,qHAAA,sBAAsB,OAAA;AAKxB,sCAAsC;AACtC,+BASgB;AARd,sGAAA,cAAc,OAAA;AACd,yGAAA,iBAAiB,OAAA;AACjB,oGAAA,YAAY,OAAA;AAEZ,qGAAA,aAAa,OAAA;AACb,yFAAA,CAAC,OAAA;AACD,0GAAA,kBAAkB,OAAA;AAIP,QAAA,wBAAwB,GAAG,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAmBH,aAAa;AACb,2CAOsB;AANpB,0GAAA,YAAY,OAAA;AACZ,6GAAA,eAAe,OAAA;AACf,gHAAA,kBAAkB,OAAA;AAClB,8GAAA,gBAAgB,OAAA;AAChB,2GAAA,aAAa,OAAA;AAIf,gBAAgB;AAChB,mCAAyD;AAAhD,wGAAA,cAAc,OAAA;AAAE,uGAAA,aAAa,OAAA;AAEtC,eAAe;AACf,+CAUwB;AATtB,6GAAA,aAAa,OAAA;AACb,yGAAA,SAAS,OAAA;AACT,gHAAA,gBAAgB,OAAA;AAChB,wHAAA,wBAAwB,OAAA;AACxB,4GAAA,YAAY,OAAA;AACZ,2GAAA,WAAW,OAAA;AACX,2GAAA,WAAW,OAAA;AACX,qHAAA,qBAAqB,OAAA;AACrB,wHAAA,wBAAwB,OAAA;AAG1B,wBAAwB;AACxB,+CAAoD;AAA3C,kHAAA,kBAAkB,OAAA;AAE3B,eAAe;AACf,6CAMuB;AALrB,yGAAA,UAAU,OAAA;AACV,6GAAA,cAAc,OAAA;AACd,qHAAA,sBAAsB,OAAA;AAKxB,sCAAsC;AACtC,+BASgB;AARd,sGAAA,cAAc,OAAA;AACd,yGAAA,iBAAiB,OAAA;AACjB,oGAAA,YAAY,OAAA;AAEZ,qGAAA,aAAa,OAAA;AACb,yFAAA,CAAC,OAAA;AACD,0GAAA,kBAAkB,OAAA;AAIP,QAAA,wBAAwB,GAAG,QAAQ,CAAC;AAEjD,2DAA2D;AAC9C,QAAA,aAAa,GACxB,8CAA8C;IAC9C,6DAA6D;IAC7D,sDAAsD,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LangChain.js callback handler that fires AgentGuard spend checks before
|
|
3
|
+
* every LLM call.
|
|
4
|
+
*
|
|
5
|
+
* Install: `npm install @agentguard-run/spend @langchain/core`
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* import { ChatOpenAI } from '@langchain/openai';
|
|
9
|
+
* import { AgentGuardSpendCallbackHandler } from '@agentguard-run/spend/dist/integrations/langchain-callback';
|
|
10
|
+
*
|
|
11
|
+
* const handler = new AgentGuardSpendCallbackHandler({
|
|
12
|
+
* dailyCapDollars: 20,
|
|
13
|
+
* agentId: 'my-langchain-agent',
|
|
14
|
+
* });
|
|
15
|
+
* const llm = new ChatOpenAI({ callbacks: [handler] });
|
|
16
|
+
* await llm.invoke('hello'); // throws AgentGuardBlockedError if cap exceeded
|
|
17
|
+
*/
|
|
18
|
+
export interface AgentGuardSpendCallbackHandlerOptions {
|
|
19
|
+
dailyCapDollars: number;
|
|
20
|
+
agentId?: string;
|
|
21
|
+
tenantId?: string;
|
|
22
|
+
softCapDollars?: number;
|
|
23
|
+
downgradeTo?: string;
|
|
24
|
+
perMinuteCapDollars?: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* LangChain.js BaseCallbackHandler-compatible class. We declare it without
|
|
28
|
+
* extending the real BaseCallbackHandler (which would require a peer-dep
|
|
29
|
+
* import at module load), and let LangChain duck-type it via the standard
|
|
30
|
+
* callback method names.
|
|
31
|
+
*/
|
|
32
|
+
export declare class AgentGuardSpendCallbackHandler {
|
|
33
|
+
name: string;
|
|
34
|
+
private policy;
|
|
35
|
+
private scope;
|
|
36
|
+
private spendStore;
|
|
37
|
+
constructor(opts: AgentGuardSpendCallbackHandlerOptions);
|
|
38
|
+
handleChatModelStart(llm: any, messages: any[][], _runId: string, _parentRunId: string | undefined, extraParams?: Record<string, any>): Promise<void>;
|
|
39
|
+
handleLLMStart(_llm: any, prompts: string[], _runId: string, _parentRunId: string | undefined, extraParams?: Record<string, any>): Promise<void>;
|
|
40
|
+
private preflight;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=langchain-callback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"langchain-callback.d.ts","sourceRoot":"","sources":["../../src/integrations/langchain-callback.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAcH,MAAM,WAAW,qCAAqC;IACpD,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAMD;;;;;GAKG;AACH,qBAAa,8BAA8B;IACzC,IAAI,SAAsB;IAC1B,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,UAAU,CAAqB;gBAE3B,IAAI,EAAE,qCAAqC;IA2CjD,oBAAoB,CACxB,GAAG,EAAE,GAAG,EACR,QAAQ,EAAE,GAAG,EAAE,EAAE,EACjB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAChC,OAAO,CAAC,IAAI,CAAC;IAaV,cAAc,CAClB,IAAI,EAAE,GAAG,EACT,OAAO,EAAE,MAAM,EAAE,EACjB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAChC,OAAO,CAAC,IAAI,CAAC;YAWF,SAAS;CAiBxB"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* LangChain.js callback handler that fires AgentGuard spend checks before
|
|
4
|
+
* every LLM call.
|
|
5
|
+
*
|
|
6
|
+
* Install: `npm install @agentguard-run/spend @langchain/core`
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* import { ChatOpenAI } from '@langchain/openai';
|
|
10
|
+
* import { AgentGuardSpendCallbackHandler } from '@agentguard-run/spend/dist/integrations/langchain-callback';
|
|
11
|
+
*
|
|
12
|
+
* const handler = new AgentGuardSpendCallbackHandler({
|
|
13
|
+
* dailyCapDollars: 20,
|
|
14
|
+
* agentId: 'my-langchain-agent',
|
|
15
|
+
* });
|
|
16
|
+
* const llm = new ChatOpenAI({ callbacks: [handler] });
|
|
17
|
+
* await llm.invoke('hello'); // throws AgentGuardBlockedError if cap exceeded
|
|
18
|
+
*/
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.AgentGuardSpendCallbackHandler = void 0;
|
|
21
|
+
const policy_1 = require("../policy");
|
|
22
|
+
const store_memory_1 = require("../store-memory");
|
|
23
|
+
const cost_table_1 = require("../cost-table");
|
|
24
|
+
const spend_guard_1 = require("../spend-guard");
|
|
25
|
+
function dollarsToCents(amount) {
|
|
26
|
+
return Math.round(amount * 100);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* LangChain.js BaseCallbackHandler-compatible class. We declare it without
|
|
30
|
+
* extending the real BaseCallbackHandler (which would require a peer-dep
|
|
31
|
+
* import at module load), and let LangChain duck-type it via the standard
|
|
32
|
+
* callback method names.
|
|
33
|
+
*/
|
|
34
|
+
class AgentGuardSpendCallbackHandler {
|
|
35
|
+
name = 'agentguard_spend';
|
|
36
|
+
policy;
|
|
37
|
+
scope;
|
|
38
|
+
spendStore;
|
|
39
|
+
constructor(opts) {
|
|
40
|
+
const tenant = opts.tenantId ?? 'langchain-default';
|
|
41
|
+
const agent = opts.agentId ?? 'langchain-agent';
|
|
42
|
+
const caps = [];
|
|
43
|
+
if (opts.softCapDollars !== undefined && opts.downgradeTo !== undefined) {
|
|
44
|
+
caps.push({
|
|
45
|
+
amountCents: dollarsToCents(opts.softCapDollars),
|
|
46
|
+
window: 'per_day',
|
|
47
|
+
action: 'downgrade',
|
|
48
|
+
downgradeTo: opts.downgradeTo,
|
|
49
|
+
reason: `Soft daily cap, routing to ${opts.downgradeTo}`,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
caps.push({
|
|
53
|
+
amountCents: dollarsToCents(opts.dailyCapDollars),
|
|
54
|
+
window: 'per_day',
|
|
55
|
+
action: 'block',
|
|
56
|
+
reason: `Hard daily ceiling ($${opts.dailyCapDollars.toFixed(2)}/day)`,
|
|
57
|
+
});
|
|
58
|
+
if (opts.perMinuteCapDollars !== undefined) {
|
|
59
|
+
caps.push({
|
|
60
|
+
amountCents: dollarsToCents(opts.perMinuteCapDollars),
|
|
61
|
+
window: 'per_minute',
|
|
62
|
+
action: 'block',
|
|
63
|
+
reason: `Per-minute burst guard ($${opts.perMinuteCapDollars.toFixed(2)}/min)`,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
this.policy = {
|
|
67
|
+
id: `langchain-${tenant}-v1`,
|
|
68
|
+
name: `LangChain policy (${tenant})`,
|
|
69
|
+
scope: { tenantId: tenant },
|
|
70
|
+
caps,
|
|
71
|
+
mode: 'enforce',
|
|
72
|
+
version: 1,
|
|
73
|
+
effectiveFrom: new Date().toISOString(),
|
|
74
|
+
};
|
|
75
|
+
this.scope = { tenantId: tenant, agentId: agent };
|
|
76
|
+
this.spendStore = new store_memory_1.InMemorySpendStore();
|
|
77
|
+
}
|
|
78
|
+
// LangChain callback method
|
|
79
|
+
async handleChatModelStart(llm, messages, _runId, _parentRunId, extraParams) {
|
|
80
|
+
const model = (extraParams?.invocation_params?.model
|
|
81
|
+
|| extraParams?.invocation_params?.model_name
|
|
82
|
+
|| llm?.id?.[llm.id.length - 1]
|
|
83
|
+
|| 'unknown');
|
|
84
|
+
const inputChars = JSON.stringify(messages).length;
|
|
85
|
+
await this.preflight({
|
|
86
|
+
model,
|
|
87
|
+
inputTokens: Math.max(1, Math.floor(inputChars / 4)),
|
|
88
|
+
outputTokens: extraParams?.invocation_params?.max_tokens || 1024,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
async handleLLMStart(_llm, prompts, _runId, _parentRunId, extraParams) {
|
|
92
|
+
const model = (extraParams?.invocation_params?.model
|
|
93
|
+
|| extraParams?.invocation_params?.model_name
|
|
94
|
+
|| 'unknown');
|
|
95
|
+
await this.preflight({
|
|
96
|
+
model,
|
|
97
|
+
inputTokens: Math.max(1, Math.floor(prompts.join('').length / 4)),
|
|
98
|
+
outputTokens: extraParams?.invocation_params?.max_tokens || 1024,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
async preflight(args) {
|
|
102
|
+
const provider = (0, cost_table_1.inferProvider)(args.model);
|
|
103
|
+
const call = {
|
|
104
|
+
provider,
|
|
105
|
+
model: args.model,
|
|
106
|
+
inputTokens: args.inputTokens,
|
|
107
|
+
outputTokens: args.outputTokens,
|
|
108
|
+
scope: this.scope,
|
|
109
|
+
};
|
|
110
|
+
const decision = await (0, policy_1.evaluatePolicy)(this.policy, call, this.spendStore);
|
|
111
|
+
if (decision.action === 'block') {
|
|
112
|
+
// Optionally sign + persist before throwing. Skipped here for latency.
|
|
113
|
+
throw new spend_guard_1.AgentGuardBlockedError(decision, this.scope);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
exports.AgentGuardSpendCallbackHandler = AgentGuardSpendCallbackHandler;
|
|
118
|
+
//# sourceMappingURL=langchain-callback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"langchain-callback.js","sourceRoot":"","sources":["../../src/integrations/langchain-callback.ts"],"names":[],"mappings":"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"}
|
package/dist/spend-guard.d.ts
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
*
|
|
13
13
|
* Patent notice: Protected by U.S. patent-pending technology
|
|
14
14
|
* (App. Nos. 63/983,615; 63/983,621; 63/983,843; 63/984,626;
|
|
15
|
-
*
|
|
15
|
+
* 64/071,781; 64/071,789).
|
|
16
16
|
*/
|
|
17
17
|
import type { SpendPolicy, CallContext, SpendDecision, SpendStore, DecisionLogStore, SignedDecisionLogEntry, CapabilityTier, SpendScope } from './types';
|
|
18
18
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spend-guard.d.ts","sourceRoot":"","sources":["../src/spend-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,sBAAsB,EAEtB,cAAc,EACd,UAAU,EACX,MAAM,SAAS,CAAC;AAWjB;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,gDAAgD;IAChD,MAAM,EAAE,WAAW,CAAC;IACpB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,+EAA+E;IAC/E,WAAW,CAAC,EAAE;QACZ,kCAAkC;QAClC,UAAU,EAAE,UAAU,CAAC;QACvB,iCAAiC;QACjC,SAAS,EAAE,UAAU,CAAC;KACvB,CAAC;IACF,4EAA4E;IAC5E,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,sBAAsB,GAAG,IAAI,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtG,yEAAyE;IACzE,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC1C;;2DAEuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,YAAY,CAAyB;gBAEjC,MAAM,EAAE,gBAAgB;IAMpC;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ9B;;;OAGG;IACG,MAAM,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC;QACvC,QAAQ,EAAE,aAAa,CAAC;QACxB,MAAM,EAAE,sBAAsB,GAAG,IAAI,CAAC;KACvC,CAAC;IAwBF,2EAA2E;IAC3E,OAAO,CAAC,qBAAqB;IAI7B,mEAAmE;IACnE,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAKpC,uDAAuD;IACvD,aAAa,IAAI,UAAU;IAI3B,qDAAqD;IACrD,WAAW,IAAI,gBAAgB;CAGhC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,oBAAoB;IACnC,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,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;gBACJ,QAAQ,EAAE,aAAa,EAAE,KAAK,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,MAAM;CAwBzE;AAED;;;;GAIG;AAEH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,GAAG,EACX,IAAI,EAAE,oBAAoB,GAEzB,GAAG,
|
|
1
|
+
{"version":3,"file":"spend-guard.d.ts","sourceRoot":"","sources":["../src/spend-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,sBAAsB,EAEtB,cAAc,EACd,UAAU,EACX,MAAM,SAAS,CAAC;AAWjB;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,gDAAgD;IAChD,MAAM,EAAE,WAAW,CAAC;IACpB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,+EAA+E;IAC/E,WAAW,CAAC,EAAE;QACZ,kCAAkC;QAClC,UAAU,EAAE,UAAU,CAAC;QACvB,iCAAiC;QACjC,SAAS,EAAE,UAAU,CAAC;KACvB,CAAC;IACF,4EAA4E;IAC5E,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,sBAAsB,GAAG,IAAI,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtG,yEAAyE;IACzE,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC1C;;2DAEuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,YAAY,CAAyB;gBAEjC,MAAM,EAAE,gBAAgB;IAMpC;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ9B;;;OAGG;IACG,MAAM,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC;QACvC,QAAQ,EAAE,aAAa,CAAC;QACxB,MAAM,EAAE,sBAAsB,GAAG,IAAI,CAAC;KACvC,CAAC;IAwBF,2EAA2E;IAC3E,OAAO,CAAC,qBAAqB;IAI7B,mEAAmE;IACnE,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAKpC,uDAAuD;IACvD,aAAa,IAAI,UAAU;IAI3B,qDAAqD;IACrD,WAAW,IAAI,gBAAgB;CAGhC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,oBAAoB;IACnC,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,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;gBACJ,QAAQ,EAAE,aAAa,EAAE,KAAK,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,MAAM;CAwBzE;AAED;;;;GAIG;AAEH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,GAAG,EACX,IAAI,EAAE,oBAAoB,GAEzB,GAAG,CA+CL"}
|
package/dist/spend-guard.js
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
*
|
|
14
14
|
* Patent notice: Protected by U.S. patent-pending technology
|
|
15
15
|
* (App. Nos. 63/983,615; 63/983,621; 63/983,843; 63/984,626;
|
|
16
|
-
*
|
|
16
|
+
* 64/071,781; 64/071,789).
|
|
17
17
|
*/
|
|
18
18
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
19
|
exports.AgentGuardBlockedError = exports.SpendGuard = void 0;
|
|
@@ -129,7 +129,8 @@ function withSpendGuard(client, opts) {
|
|
|
129
129
|
const originalCreate = client?.chat?.completions?.create?.bind(client.chat.completions);
|
|
130
130
|
if (!originalCreate) {
|
|
131
131
|
throw new Error('withSpendGuard: expected an OpenAI client with chat.completions.create. ' +
|
|
132
|
-
'For Anthropic or Bedrock, use
|
|
132
|
+
'For Anthropic or AWS Bedrock, use the Python SDK (agentguard-spend) which has dedicated bindings. ' +
|
|
133
|
+
'Native Node bindings for Anthropic + Bedrock are on the roadmap.');
|
|
133
134
|
}
|
|
134
135
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
135
136
|
client.chat.completions.create = async (params) => {
|
package/dist/spend-guard.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spend-guard.js","sourceRoot":"","sources":["../src/spend-guard.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;AAkMH,
|
|
1
|
+
{"version":3,"file":"spend-guard.js","sourceRoot":"","sources":["../src/spend-guard.ts"],"names":[],"mappings":"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"}
|
package/dist/store-memory.d.ts
CHANGED
|
@@ -12,6 +12,13 @@
|
|
|
12
12
|
* and an additional application filed May 2026).
|
|
13
13
|
*/
|
|
14
14
|
import type { SpendStore, SpendWindow } from './types';
|
|
15
|
+
export declare const WINDOW_DURATION_MS: Record<SpendWindow, number>;
|
|
16
|
+
/**
|
|
17
|
+
* Returns the millisecond timestamp at which a window of the given duration
|
|
18
|
+
* containing `nowMs` started. For fixed-grid windows we align to UTC epoch
|
|
19
|
+
* (so all processes agree on window boundaries without coordination).
|
|
20
|
+
*/
|
|
21
|
+
export declare function windowStart(window: SpendWindow, nowMs: number): number;
|
|
15
22
|
/**
|
|
16
23
|
* In-memory spend store. Thread-safe in single-process Node (we rely on the
|
|
17
24
|
* event loop's atomic execution between awaits; this store does no I/O).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store-memory.d.ts","sourceRoot":"","sources":["../src/store-memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"store-memory.d.ts","sourceRoot":"","sources":["../src/store-memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AASvD,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAM1D,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAItE;AAED;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,UAAU;IACnD,OAAO,CAAC,KAAK,CAAkC;IAE/C,OAAO,CAAC,GAAG;IAIX,OAAO,CAAC,WAAW;IAYb,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAKtE,oBAAoB,CACxB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,CAAC;IAMlB,oCAAoC;IACpC,KAAK,IAAI,IAAI;CAGd"}
|
package/dist/store-memory.js
CHANGED
|
@@ -13,8 +13,9 @@
|
|
|
13
13
|
* and an additional application filed May 2026).
|
|
14
14
|
*/
|
|
15
15
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
-
exports.InMemorySpendStore = void 0;
|
|
17
|
-
|
|
16
|
+
exports.InMemorySpendStore = exports.WINDOW_DURATION_MS = void 0;
|
|
17
|
+
exports.windowStart = windowStart;
|
|
18
|
+
exports.WINDOW_DURATION_MS = {
|
|
18
19
|
per_call: 0, // per_call windows reset on every read
|
|
19
20
|
per_minute: 60_000,
|
|
20
21
|
per_hour: 3_600_000,
|
|
@@ -27,7 +28,7 @@ const WINDOW_DURATION_MS = {
|
|
|
27
28
|
* (so all processes agree on window boundaries without coordination).
|
|
28
29
|
*/
|
|
29
30
|
function windowStart(window, nowMs) {
|
|
30
|
-
const dur = WINDOW_DURATION_MS[window];
|
|
31
|
+
const dur = exports.WINDOW_DURATION_MS[window];
|
|
31
32
|
if (dur === 0)
|
|
32
33
|
return nowMs; // per_call is trivial
|
|
33
34
|
return Math.floor(nowMs / dur) * dur;
|
package/dist/store-memory.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store-memory.js","sourceRoot":"","sources":["../src/store-memory.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;
|
|
1
|
+
{"version":3,"file":"store-memory.js","sourceRoot":"","sources":["../src/store-memory.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;AAwBH,kCAIC;AAjBY,QAAA,kBAAkB,GAAgC;IAC7D,QAAQ,EAAE,CAAC,EAAE,uCAAuC;IACpD,UAAU,EAAE,MAAM;IAClB,QAAQ,EAAE,SAAS;IACnB,OAAO,EAAE,UAAU;IACnB,SAAS,EAAE,EAAE,GAAG,UAAU,EAAE,sEAAsE;CACnG,CAAC;AAEF;;;;GAIG;AACH,SAAgB,WAAW,CAAC,MAAmB,EAAE,KAAa;IAC5D,MAAM,GAAG,GAAG,0BAAkB,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,GAAG,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,CAAC,sBAAsB;IACnD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AACvC,CAAC;AAED;;;GAGG;AACH,MAAa,kBAAkB;IACrB,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAC;IAEvC,GAAG,CAAC,QAAgB,EAAE,MAAmB;QAC/C,OAAO,GAAG,QAAQ,KAAK,MAAM,EAAE,CAAC;IAClC,CAAC;IAEO,WAAW,CAAC,QAAgB,EAAE,MAAmB,EAAE,KAAa;QACtE,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACrC,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,aAAa,KAAK,aAAa,EAAE,CAAC;YAC1D,MAAM,KAAK,GAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC;YACtE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YACzB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,QAAgB,EAAE,MAAmB;QACxD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC7D,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,oBAAoB,CACxB,QAAgB,EAChB,MAAmB,EACnB,KAAa;QAEb,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC7D,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC;QACrB,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;IAED,oCAAoC;IACpC,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF;AAtCD,gDAsCC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentguard-run/spend",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.10",
|
|
4
4
|
"description": "Local-runtime spend caps and capability-gated model routing for AI agents. Prompts, API keys, and signing keys stay inside the customer runtime. Zero data plane involvement.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -72,12 +72,34 @@
|
|
|
72
72
|
"peerDependencies": {
|
|
73
73
|
"openai": ">=5.0.0",
|
|
74
74
|
"@anthropic-ai/sdk": ">=0.30.0",
|
|
75
|
-
"@aws-sdk/client-bedrock-runtime": ">=3.600.0"
|
|
75
|
+
"@aws-sdk/client-bedrock-runtime": ">=3.600.0",
|
|
76
|
+
"ioredis": ">=5.0.0",
|
|
77
|
+
"pg": ">=8.10.0",
|
|
78
|
+
"@aws-sdk/client-kms": ">=3.600.0",
|
|
79
|
+
"@langchain/core": ">=0.3.0"
|
|
76
80
|
},
|
|
77
81
|
"peerDependenciesMeta": {
|
|
78
|
-
"openai": {
|
|
79
|
-
|
|
80
|
-
|
|
82
|
+
"openai": {
|
|
83
|
+
"optional": true
|
|
84
|
+
},
|
|
85
|
+
"@anthropic-ai/sdk": {
|
|
86
|
+
"optional": true
|
|
87
|
+
},
|
|
88
|
+
"@aws-sdk/client-bedrock-runtime": {
|
|
89
|
+
"optional": true
|
|
90
|
+
},
|
|
91
|
+
"ioredis": {
|
|
92
|
+
"optional": true
|
|
93
|
+
},
|
|
94
|
+
"pg": {
|
|
95
|
+
"optional": true
|
|
96
|
+
},
|
|
97
|
+
"@aws-sdk/client-kms": {
|
|
98
|
+
"optional": true
|
|
99
|
+
},
|
|
100
|
+
"@langchain/core": {
|
|
101
|
+
"optional": true
|
|
102
|
+
}
|
|
81
103
|
},
|
|
82
104
|
"devDependencies": {
|
|
83
105
|
"@types/node": "^20.0.0",
|
|
@@ -89,4 +111,4 @@
|
|
|
89
111
|
"publishConfig": {
|
|
90
112
|
"access": "public"
|
|
91
113
|
}
|
|
92
|
-
}
|
|
114
|
+
}
|