agentenkit 0.1.6 → 0.2.1
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/README.md +44 -2
- package/dist/adapters/memory.d.ts +2 -2
- package/dist/adapters/memory.d.ts.map +1 -1
- package/dist/adapters/memory.js +3 -9
- package/dist/adapters/memory.js.map +1 -1
- package/dist/adapters/prisma.d.ts +61 -18
- package/dist/adapters/prisma.d.ts.map +1 -1
- package/dist/adapters/prisma.js +65 -16
- package/dist/adapters/prisma.js.map +1 -1
- package/dist/adapters/sqlite.d.ts +3 -2
- package/dist/adapters/sqlite.d.ts.map +1 -1
- package/dist/adapters/sqlite.js +82 -11
- package/dist/adapters/sqlite.js.map +1 -1
- package/dist/admin/default.d.ts +11 -4
- package/dist/admin/default.d.ts.map +1 -1
- package/dist/admin/default.js +11 -6
- package/dist/admin/default.js.map +1 -1
- package/dist/admin/migrations/postgres/0001-init.d.ts +10 -0
- package/dist/admin/migrations/postgres/0001-init.d.ts.map +1 -0
- package/dist/admin/migrations/postgres/0001-init.js +56 -0
- package/dist/admin/migrations/postgres/0001-init.js.map +1 -0
- package/dist/admin/migrations/postgres/index.d.ts +9 -0
- package/dist/admin/migrations/postgres/index.d.ts.map +1 -0
- package/dist/admin/migrations/postgres/index.js +17 -0
- package/dist/admin/migrations/postgres/index.js.map +1 -0
- package/dist/admin/migrations/runner.d.ts +81 -0
- package/dist/admin/migrations/runner.d.ts.map +1 -0
- package/dist/admin/migrations/runner.js +137 -0
- package/dist/admin/migrations/runner.js.map +1 -0
- package/dist/admin/migrations/sqlite/0001-init.d.ts +11 -0
- package/dist/admin/migrations/sqlite/0001-init.d.ts.map +1 -0
- package/dist/admin/migrations/sqlite/0001-init.js +44 -0
- package/dist/admin/migrations/sqlite/0001-init.js.map +1 -0
- package/dist/admin/migrations/sqlite/index.d.ts +7 -0
- package/dist/admin/migrations/sqlite/index.d.ts.map +1 -0
- package/dist/admin/migrations/sqlite/index.js +38 -0
- package/dist/admin/migrations/sqlite/index.js.map +1 -0
- package/dist/admin/postgres.d.ts +27 -4
- package/dist/admin/postgres.d.ts.map +1 -1
- package/dist/admin/postgres.js +41 -53
- package/dist/admin/postgres.js.map +1 -1
- package/dist/admin/sqlite.d.ts +18 -2
- package/dist/admin/sqlite.d.ts.map +1 -1
- package/dist/admin/sqlite.js +36 -53
- package/dist/admin/sqlite.js.map +1 -1
- package/dist/core/admin.d.ts +4 -0
- package/dist/core/admin.d.ts.map +1 -1
- package/dist/core/admin.js +9 -1
- package/dist/core/admin.js.map +1 -1
- package/dist/core/agent.d.ts +3 -0
- package/dist/core/agent.d.ts.map +1 -1
- package/dist/core/agent.js +4 -4
- package/dist/core/agent.js.map +1 -1
- package/dist/core/context.d.ts +5 -0
- package/dist/core/context.d.ts.map +1 -1
- package/dist/core/context.js +38 -9
- package/dist/core/context.js.map +1 -1
- package/dist/core/engine.d.ts +4 -1
- package/dist/core/engine.d.ts.map +1 -1
- package/dist/core/engine.js +81 -17
- package/dist/core/engine.js.map +1 -1
- package/dist/core/hitl.d.ts +56 -4
- package/dist/core/hitl.d.ts.map +1 -1
- package/dist/core/hitl.js +94 -20
- package/dist/core/hitl.js.map +1 -1
- package/dist/core/loop.d.ts +35 -0
- package/dist/core/loop.d.ts.map +1 -1
- package/dist/core/loop.js +125 -17
- package/dist/core/loop.js.map +1 -1
- package/dist/core/messages.d.ts +26 -0
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js +23 -0
- package/dist/core/messages.js.map +1 -1
- package/dist/core/reclaim.d.ts.map +1 -1
- package/dist/core/reclaim.js +4 -3
- package/dist/core/reclaim.js.map +1 -1
- package/dist/core/run.d.ts.map +1 -1
- package/dist/core/run.js +1 -0
- package/dist/core/run.js.map +1 -1
- package/dist/core/subagent.d.ts +5 -0
- package/dist/core/subagent.d.ts.map +1 -1
- package/dist/core/subagent.js +20 -8
- package/dist/core/subagent.js.map +1 -1
- package/dist/core/types.d.ts +145 -7
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +9 -0
- package/dist/core/types.js.map +1 -1
- package/dist/core/usage.d.ts +47 -2
- package/dist/core/usage.d.ts.map +1 -1
- package/dist/core/usage.js +130 -2
- package/dist/core/usage.js.map +1 -1
- package/dist/index.d.ts +8 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/ports/runtime.d.ts +69 -4
- package/dist/ports/runtime.d.ts.map +1 -1
- package/dist/ports/storage.d.ts +16 -4
- package/dist/ports/storage.d.ts.map +1 -1
- package/dist/pricing.d.ts +66 -0
- package/dist/pricing.d.ts.map +1 -0
- package/dist/pricing.js +98 -0
- package/dist/pricing.js.map +1 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +5 -2
- package/dist/runtime.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -36,7 +36,7 @@ const queue = new InlineQueue();
|
|
|
36
36
|
|
|
37
37
|
export const runtime = await setupAgentCore({
|
|
38
38
|
storage: new SqliteStorage(db), // ← later: PrismaStorage, or your own
|
|
39
|
-
admin:
|
|
39
|
+
admin: SqliteAdminStore.open(db), // ← later: PostgresAdminStore
|
|
40
40
|
bus: new MemoryBus(), // ← later: RedisBus
|
|
41
41
|
kv: new MemoryKv(), // ← later: RedisKv
|
|
42
42
|
queue, // ← later: QStashQueue
|
|
@@ -163,6 +163,41 @@ Implement any of them for your own stack — `core/` imports nothing else. The
|
|
|
163
163
|
[`Memory*` adapters](./src/adapters/memory.ts) are a complete implementation used by the
|
|
164
164
|
test suite and double as a template.
|
|
165
165
|
|
|
166
|
+
## Cost (§4)
|
|
167
|
+
|
|
168
|
+
Give the runtime a `pricer` and every usage row carries the money as well as the
|
|
169
|
+
tokens, so spend is read from the store the engine already fills:
|
|
170
|
+
|
|
171
|
+
```ts
|
|
172
|
+
import { pricing, setupAgentCore } from 'agentenkit';
|
|
173
|
+
|
|
174
|
+
const runtime = await setupAgentCore({
|
|
175
|
+
// ... ports ...
|
|
176
|
+
pricer: pricing.table({
|
|
177
|
+
// dollars per MILLION tokens, typed off the provider's pricing page
|
|
178
|
+
'gpt-4o': { inputPerMillion: 2.5, cacheReadPerMillion: 1.25, outputPerMillion: 10 },
|
|
179
|
+
}),
|
|
180
|
+
});
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
One row per model call: main run, nested run or compaction, streamed or not,
|
|
184
|
+
finished or cut short. Reading it back:
|
|
185
|
+
|
|
186
|
+
```ts
|
|
187
|
+
await runtime.getThreadUsage(threadId); // the thread header
|
|
188
|
+
await storage.usage.total(threadId, { runId }); // one run's bill
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Every total carries `costMicros`, `currency`, `unpriced` and `lines` — the same
|
|
192
|
+
spend grouped by agent and model, which is what a credit system charges for. A
|
|
193
|
+
spec's `onFinish` receives it ready-made as `info.usage`, and
|
|
194
|
+
`run({ costBudgetMicros })` caps a run by money the way `tokenBudget` caps it by
|
|
195
|
+
tokens.
|
|
196
|
+
|
|
197
|
+
`pricing` also ships `receipt`, for the figure a gateway already computed, and
|
|
198
|
+
`chain`, to try one then the other. See
|
|
199
|
+
[Cost and pricing](https://eadwincode.github.io/agentic-kit/cost-and-pricing).
|
|
200
|
+
|
|
166
201
|
## The admin store (§2.9) — not yours
|
|
167
202
|
|
|
168
203
|
Run records, step timings and a thread index are the **platform's** data, in the
|
|
@@ -172,9 +207,16 @@ platform's own tables. You do not implement `AdminStore`; you read it back:
|
|
|
172
207
|
await runtime.admin.overview(); // threads and runs by state, plus what's in flight
|
|
173
208
|
await runtime.admin.listRuns({ state: ['FAILED'], since });
|
|
174
209
|
await runtime.admin.stats({ since }); // p50/p95 duration and queue wait, tokens, failures
|
|
175
|
-
await runtime.admin.getRun(runId); // one run: steps, nested runs, timeline
|
|
210
|
+
await runtime.admin.getRun(runId); // one run: steps, nested runs, timeline, spend
|
|
176
211
|
```
|
|
177
212
|
|
|
213
|
+
Its schema migrates itself, from numbered migration files. `setupAgentCore`
|
|
214
|
+
opens the connection and returns; the schema is brought up to date behind it,
|
|
215
|
+
and every admin call waits for that before its first query. Several workers
|
|
216
|
+
starting at once queue on a Postgres advisory lock rather than racing. An
|
|
217
|
+
existing database needs nothing: migration `0001` is the schema as it stood
|
|
218
|
+
before the migrator. Your own `Storage` is never touched by any of this.
|
|
219
|
+
|
|
178
220
|
Configure nothing and it is SQLite on disk (`AGENTIC_KIT_ADMIN_DB` moves the file).
|
|
179
221
|
Set `AGENTIC_KIT_ADMIN_DATABASE_URL` and it is Postgres — point it at its own database
|
|
180
222
|
or the one you already have; the `agentic_` table prefix keeps them apart. `pg` is an
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AgentEvent, ExecutionState, MessageDTO, NewMessage, NewUsage, RunJob, ThreadDTO, UsageTotals } from '../core/types.js';
|
|
1
|
+
import type { AgentEvent, ExecutionState, MessageDTO, NewMessage, NewUsage, RunJob, ThreadDTO, UsageFilter, UsageTotals } from '../core/types.js';
|
|
2
2
|
import type { Storage } from '../ports/storage.js';
|
|
3
3
|
import type { EventBus } from '../ports/bus.js';
|
|
4
4
|
import type { EnqueueOptions, Queue } from '../ports/queue.js';
|
|
@@ -68,7 +68,7 @@ export declare class MemoryStorage implements Storage {
|
|
|
68
68
|
threadId: string;
|
|
69
69
|
})[];
|
|
70
70
|
record(t: string, u: NewUsage): Promise<void>;
|
|
71
|
-
total(t: string): Promise<UsageTotals>;
|
|
71
|
+
total(t: string, filter?: UsageFilter): Promise<UsageTotals>;
|
|
72
72
|
};
|
|
73
73
|
}
|
|
74
74
|
//# sourceMappingURL=memory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/adapters/memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/adapters/memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAElJ,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAKzC;;0CAE0C;AAC1C,qBAAa,QAAS,YAAW,EAAE;IACjC,OAAO,CAAC,CAAC,CAA+B;IAClC,GAAG,CAAC,GAAG,EAAE,MAAM;IAMf,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE;IAWxF,GAAG,CAAC,GAAG,EAAE,MAAM;IACf,IAAI,CAAC,GAAG,EAAE,MAAM;CAOvB;AAED,kFAAkF;AAClF,qBAAa,SAAU,YAAW,QAAQ;IACxC,OAAO,CAAC,IAAI,CAAmD;IAC/D,QAAQ,CAAC,SAAS,EAAE,UAAU,EAAE,CAAM;IAEhC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU;IAI3C,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI;IAMlE;8DAC0D;IAC1D,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;CAGtC;AAED;wFACwF;AACxF,qBAAa,WAAY,YAAW,KAAK;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAM;IAC9B,wEAAwE;IACxE,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,CAAM;IAC1C,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc;IAI1C,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;CAUtE;AAED,iFAAiF;AACjF,qBAAa,aAAc,YAAW,OAAO;IAC3C,OAAO;;eAEQ,MAAM;sBACC;YAAE,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE;;oBASpB,MAAM,SAAS,cAAc;oBAQ7B,MAAM;sBAOJ,MAAM,QAAQ,cAAc,MAAM,cAAc;MAMpE;IAEF,QAAQ;;kBAEU,MAAM,KAAK,UAAU;gBAUvB,MAAM,SAAS;YAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;SAAE;sBAKpC,MAAM,aAAa,MAAM;MAM7C;IAEF,MAAM;;kBAEY,MAAM,KAAK,UAAU;qBAKlB,MAAM,YAAY,MAAM;kBAI3B,MAAM,QAAQ,MAAM;sBAKhB,MAAM,QAAQ,MAAM;MAIxC;IAEF,KAAK;kBACa,CAAC,QAAQ,GAAG;YAAE,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC,EAAE;kBACnC,MAAM,KAAK,QAAQ;iBACpB,MAAM,WAAU,WAAW,GAAQ,OAAO,CAAC,WAAW,CAAC;MAOtE;CAIH"}
|
package/dist/adapters/memory.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { sumUsage } from '../core/usage.js';
|
|
1
2
|
const id = () => Math.random().toString(36).slice(2, 12);
|
|
2
3
|
/** In-memory Kv — tests and local prototyping. Expiry is enforced lazily on
|
|
3
4
|
* read; incr is synchronous internally, so concurrent callers can never
|
|
@@ -179,15 +180,8 @@ export class MemoryStorage {
|
|
|
179
180
|
usage = {
|
|
180
181
|
recorded: [],
|
|
181
182
|
async record(t, u) { this.recorded.push({ threadId: t, ...u }); },
|
|
182
|
-
async total(t) {
|
|
183
|
-
return this.recorded
|
|
184
|
-
.filter((u) => u.threadId === t)
|
|
185
|
-
.reduce((sum, u) => ({
|
|
186
|
-
inputTokens: sum.inputTokens + u.inputTokens,
|
|
187
|
-
cachedInputTokens: sum.cachedInputTokens + u.cachedInputTokens,
|
|
188
|
-
outputTokens: sum.outputTokens + u.outputTokens,
|
|
189
|
-
totalTokens: sum.totalTokens + u.totalTokens,
|
|
190
|
-
}), { inputTokens: 0, cachedInputTokens: 0, outputTokens: 0, totalTokens: 0 });
|
|
183
|
+
async total(t, filter = {}) {
|
|
184
|
+
return sumUsage(this.recorded.filter((u) => u.threadId === t && (!filter.runId || u.runId === filter.runId)));
|
|
191
185
|
},
|
|
192
186
|
};
|
|
193
187
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/adapters/memory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/adapters/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AgentEvent, ExecutionState, NewMessage, NewUsage, ThreadDTO, UsageTotals } from '../core/types.js';
|
|
1
|
+
import type { AgentEvent, ExecutionState, NewMessage, NewUsage, ThreadDTO, UsageFilter, UsageTotals } from '../core/types.js';
|
|
2
2
|
import type { Storage } from '../ports/storage.js';
|
|
3
3
|
/** Minimal structural type of the Prisma client surface we use. The real
|
|
4
4
|
* `PrismaClient` satisfies it — no SDK import needed in the package. */
|
|
@@ -119,25 +119,68 @@ export interface PrismaLike {
|
|
|
119
119
|
};
|
|
120
120
|
tokenUsage: {
|
|
121
121
|
create(a: {
|
|
122
|
-
data:
|
|
123
|
-
threadId: string;
|
|
124
|
-
};
|
|
122
|
+
data: TokenUsageRow;
|
|
125
123
|
}): Promise<unknown>;
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
124
|
+
/** One grouped read rather than every row: a long thread holds a usage row
|
|
125
|
+
* per model call (§4), and the bill only ever wants them by agent and
|
|
126
|
+
* model.
|
|
127
|
+
*
|
|
128
|
+
* Loosely typed on purpose. Prisma generates `groupBy` with a chain of
|
|
129
|
+
* conditional generics that no hand-written signature can mirror, so a
|
|
130
|
+
* precise one here would make the real PrismaClient fail to satisfy this
|
|
131
|
+
* interface. The RESULT is typed, which is the half the adapter reads. */
|
|
132
|
+
groupBy(a: any): Promise<UsageGroupRow[]>;
|
|
133
|
+
/** The two figures a groupBy cannot give: how many calls were estimated
|
|
134
|
+
* or unpriced (a conditional count), and which currency the priced
|
|
135
|
+
* rows are in. Loosely typed for the same reason as groupBy. */
|
|
136
|
+
count(a: any): Promise<number>;
|
|
137
|
+
findFirst(a: any): Promise<{
|
|
138
|
+
costCurrency: string | null;
|
|
139
|
+
} | null>;
|
|
139
140
|
};
|
|
140
141
|
}
|
|
142
|
+
/** The row this adapter writes. `cachedInputTokens` holds cache READS, keeping
|
|
143
|
+
* the column that was already there meaning what it always meant; cache
|
|
144
|
+
* writes are their own column beside it. A null `costMicros` is an unpriced
|
|
145
|
+
* call, which is not the same as one that cost nothing. */
|
|
146
|
+
export interface TokenUsageRow {
|
|
147
|
+
threadId: string;
|
|
148
|
+
runId: string | null;
|
|
149
|
+
agentId: string | null;
|
|
150
|
+
agentName: string | null;
|
|
151
|
+
kind: string;
|
|
152
|
+
step: number;
|
|
153
|
+
model: string | null;
|
|
154
|
+
modelId: string | null;
|
|
155
|
+
inputTokens: number;
|
|
156
|
+
cachedInputTokens: number;
|
|
157
|
+
cacheWriteInputTokens: number;
|
|
158
|
+
outputTokens: number;
|
|
159
|
+
reasoningTokens: number;
|
|
160
|
+
totalTokens: number;
|
|
161
|
+
outcome: string;
|
|
162
|
+
estimated: boolean;
|
|
163
|
+
/** Typed loosely on purpose: Prisma's JSON input is a recursive generated
|
|
164
|
+
* union (`InputJsonValue`) that no hand-written interface can mirror, so a
|
|
165
|
+
* precise type here makes the real PrismaClient fail to satisfy this. */
|
|
166
|
+
providerMetadata: any;
|
|
167
|
+
/** Millionths of `costCurrency`; null is an unpriced call. Declare the
|
|
168
|
+
* column as BigInt: a thread's summed spend outgrows a 4-byte Int. */
|
|
169
|
+
costMicros: number | null;
|
|
170
|
+
costCurrency: string | null;
|
|
171
|
+
costSource: string | null;
|
|
172
|
+
}
|
|
173
|
+
/** One group of the read above. */
|
|
174
|
+
export interface UsageGroupRow {
|
|
175
|
+
agentId: string | null;
|
|
176
|
+
agentName: string | null;
|
|
177
|
+
model: string | null;
|
|
178
|
+
modelId: string | null;
|
|
179
|
+
_count: number;
|
|
180
|
+
/** BigInt columns come back as `bigint`, so every figure is coerced before
|
|
181
|
+
* it is summed — mixing `bigint` and `number` arithmetic throws. */
|
|
182
|
+
_sum: Record<string, number | bigint | null>;
|
|
183
|
+
}
|
|
141
184
|
/** Reference Storage adapter over PostgreSQL/Prisma (schema in the README / spec §2.4). */
|
|
142
185
|
export declare class PrismaStorage implements Storage {
|
|
143
186
|
private readonly prisma;
|
|
@@ -169,7 +212,7 @@ export declare class PrismaStorage implements Storage {
|
|
|
169
212
|
listByType: (threadId: string, type: string) => Promise<AgentEvent[]>;
|
|
170
213
|
};
|
|
171
214
|
usage: {
|
|
172
|
-
total: (threadId: string) => Promise<UsageTotals>;
|
|
215
|
+
total: (threadId: string, filter?: UsageFilter) => Promise<UsageTotals>;
|
|
173
216
|
record: (threadId: string, usage: NewUsage) => Promise<void>;
|
|
174
217
|
};
|
|
175
218
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prisma.d.ts","sourceRoot":"","sources":["../../src/adapters/prisma.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"prisma.d.ts","sourceRoot":"","sources":["../../src/adapters/prisma.ts"],"names":[],"mappings":"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"}
|
package/dist/adapters/prisma.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { emptyTotals } from '../core/usage.js';
|
|
1
2
|
/** Reference Storage adapter over PostgreSQL/Prisma (schema in the README / spec §2.4). */
|
|
2
3
|
export class PrismaStorage {
|
|
3
4
|
prisma;
|
|
@@ -71,34 +72,82 @@ export class PrismaStorage {
|
|
|
71
72
|
listByType: (threadId, type) => this.prisma.agentEvent.findMany({ where: { threadId, type }, orderBy: { seq: 'asc' } }),
|
|
72
73
|
};
|
|
73
74
|
usage = {
|
|
74
|
-
total: async (threadId) => {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
where: { threadId },
|
|
75
|
+
total: async (threadId, filter = {}) => {
|
|
76
|
+
const groups = await this.prisma.tokenUsage.groupBy({
|
|
77
|
+
by: ['agentId', 'agentName', 'model', 'modelId'],
|
|
78
|
+
where: { threadId, ...(filter.runId ? { runId: filter.runId } : {}) },
|
|
79
79
|
_sum: {
|
|
80
|
-
inputTokens: true,
|
|
81
|
-
|
|
82
|
-
outputTokens: true,
|
|
83
|
-
totalTokens: true,
|
|
80
|
+
inputTokens: true, cachedInputTokens: true, cacheWriteInputTokens: true,
|
|
81
|
+
outputTokens: true, reasoningTokens: true, totalTokens: true, costMicros: true,
|
|
84
82
|
},
|
|
83
|
+
_count: true,
|
|
85
84
|
});
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
85
|
+
const where = { threadId, ...(filter.runId ? { runId: filter.runId } : {}) };
|
|
86
|
+
// The figures a grouped sum cannot carry: which calls were guesses,
|
|
87
|
+
// which were never priced, and what unit the money is in. Read
|
|
88
|
+
// alongside the groups rather than hardcoded, so a bill can tell
|
|
89
|
+
// "spent nothing" from "nobody priced this".
|
|
90
|
+
const [estimatedByGroup, unpriced, first] = await Promise.all([
|
|
91
|
+
this.prisma.tokenUsage.groupBy({
|
|
92
|
+
by: ['agentId', 'agentName', 'model', 'modelId'],
|
|
93
|
+
where: { ...where, estimated: true },
|
|
94
|
+
_count: true,
|
|
95
|
+
}),
|
|
96
|
+
this.prisma.tokenUsage.count({ where: { ...where, costMicros: null } }),
|
|
97
|
+
this.prisma.tokenUsage.findFirst({
|
|
98
|
+
where: { ...where, costCurrency: { not: null } },
|
|
99
|
+
orderBy: { createdAt: 'asc' },
|
|
100
|
+
select: { costCurrency: true },
|
|
101
|
+
}),
|
|
102
|
+
]);
|
|
103
|
+
const estimatedOf = new Map(estimatedByGroup.map((g) => [`${g.agentId}|${g.agentName}|${g.model}|${g.modelId}`, g._count]));
|
|
104
|
+
const out = emptyTotals();
|
|
105
|
+
out.unpriced = unpriced;
|
|
106
|
+
out.currency = first?.costCurrency ?? undefined;
|
|
107
|
+
for (const g of groups) {
|
|
108
|
+
const n = (k) => Number(g._sum[k] ?? 0);
|
|
109
|
+
out.inputTokens += n('inputTokens');
|
|
110
|
+
out.cachedInputTokens += n('cachedInputTokens');
|
|
111
|
+
out.outputTokens += n('outputTokens');
|
|
112
|
+
out.totalTokens += n('totalTokens');
|
|
113
|
+
out.costMicros += n('costMicros');
|
|
114
|
+
out.lines.push({
|
|
115
|
+
agentId: g.agentId, agentName: g.agentName, model: g.model, modelId: g.modelId,
|
|
116
|
+
inputTokens: n('inputTokens'),
|
|
117
|
+
cacheReadInputTokens: n('cachedInputTokens'),
|
|
118
|
+
cacheWriteInputTokens: n('cacheWriteInputTokens'),
|
|
119
|
+
outputTokens: n('outputTokens'),
|
|
120
|
+
reasoningTokens: n('reasoningTokens'),
|
|
121
|
+
calls: g._count,
|
|
122
|
+
estimated: estimatedOf.get(`${g.agentId}|${g.agentName}|${g.model}|${g.modelId}`) ?? 0,
|
|
123
|
+
costMicros: n('costMicros'),
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
return out;
|
|
92
127
|
},
|
|
93
128
|
record: async (threadId, usage) => {
|
|
94
129
|
await this.prisma.tokenUsage.create({
|
|
95
130
|
data: {
|
|
96
131
|
threadId,
|
|
132
|
+
runId: usage.runId ?? null,
|
|
97
133
|
agentId: usage.agentId ?? null,
|
|
134
|
+
agentName: usage.agentName ?? null,
|
|
135
|
+
kind: usage.kind,
|
|
136
|
+
step: usage.step,
|
|
137
|
+
model: usage.model ?? null,
|
|
138
|
+
modelId: usage.modelId ?? null,
|
|
98
139
|
inputTokens: usage.inputTokens,
|
|
99
|
-
cachedInputTokens: usage.
|
|
140
|
+
cachedInputTokens: usage.cacheReadInputTokens,
|
|
141
|
+
cacheWriteInputTokens: usage.cacheWriteInputTokens,
|
|
100
142
|
outputTokens: usage.outputTokens,
|
|
143
|
+
reasoningTokens: usage.reasoningTokens,
|
|
101
144
|
totalTokens: usage.totalTokens,
|
|
145
|
+
outcome: usage.outcome,
|
|
146
|
+
estimated: usage.estimated ?? false,
|
|
147
|
+
providerMetadata: usage.providerMetadata ?? null,
|
|
148
|
+
costMicros: usage.cost?.micros ?? null,
|
|
149
|
+
costCurrency: usage.cost?.currency ?? null,
|
|
150
|
+
costSource: usage.cost?.source ?? null,
|
|
102
151
|
},
|
|
103
152
|
});
|
|
104
153
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prisma.js","sourceRoot":"","sources":["../../src/adapters/prisma.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"prisma.js","sourceRoot":"","sources":["../../src/adapters/prisma.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AgentEvent, ExecutionState, MessageDTO, NewMessage, NewUsage, ThreadDTO, UsageTotals } from '../core/types.js';
|
|
1
|
+
import type { AgentEvent, ExecutionState, MessageDTO, NewMessage, NewUsage, ThreadDTO, UsageFilter, UsageTotals } from '../core/types.js';
|
|
2
2
|
import type { Storage } from '../ports/storage.js';
|
|
3
3
|
/** Minimal structural type over a synchronous SQLite handle — `bun:sqlite`'s
|
|
4
4
|
* `Database` satisfies it. Kept structural for the same reason every other
|
|
@@ -30,6 +30,7 @@ export declare function openSqlite(filename?: string): Promise<SqliteLike>;
|
|
|
30
30
|
export declare class SqliteStorage implements Storage {
|
|
31
31
|
private readonly db;
|
|
32
32
|
constructor(db: SqliteLike);
|
|
33
|
+
private addMissing;
|
|
33
34
|
private all;
|
|
34
35
|
private one;
|
|
35
36
|
private write;
|
|
@@ -61,7 +62,7 @@ export declare class SqliteStorage implements Storage {
|
|
|
61
62
|
};
|
|
62
63
|
usage: {
|
|
63
64
|
record: (threadId: string, u: NewUsage) => Promise<void>;
|
|
64
|
-
total: (threadId: string) => Promise<UsageTotals>;
|
|
65
|
+
total: (threadId: string, filter?: UsageFilter) => Promise<UsageTotals>;
|
|
65
66
|
};
|
|
66
67
|
}
|
|
67
68
|
//# sourceMappingURL=sqlite.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/adapters/sqlite.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/adapters/sqlite.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAClG,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD;;;;mBAImB;AACnB,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,CAAC;IAC1C,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,GAAG,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;IACrC,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACpC,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;CACpC;AAED;;;;;;;8EAO8E;AAC9E,wBAAsB,UAAU,CAAC,QAAQ,SAAuB,GAAG,OAAO,CAAC,UAAU,CAAC,CAmBrF;AA8DD;;+DAE+D;AAC/D,qBAAa,aAAc,YAAW,OAAO;IAC/B,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,UAAU;IA2B3C,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,GAAG;IAGX,OAAO,CAAC,GAAG;IAGX,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,QAAQ,CAGb;IACH,OAAO,CAAC,SAAS,CAGd;IACH,OAAO,CAAC,OAAO,CAGE;IACjB,OAAO;wBACiB,MAAM;wBAIN;YAAE,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE;;6BAab,MAAM,SAAS,cAAc;2BAI/B,MAAM;+BAQF,MAAM,QAAQ,cAAc,MAAM,cAAc;MAU7E;IAEF,QAAQ;2BACmB,MAAM,KAAK,UAAU;yBAiBvB,MAAM,SAAS;YAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;SAAE;+BAYpC,MAAM,aAAa,MAAM;MAStD;IAEF,MAAM;2BACqB,MAAM,KAAK,UAAU;8BAIlB,MAAM,YAAY,MAAM;2BAG3B,MAAM,QAAQ,MAAM;+BAMhB,MAAM,QAAQ,MAAM;MAGjD;IAEF,KAAK;2BACsB,MAAM,KAAK,QAAQ;0BAmBpB,MAAM,WAAU,WAAW,KAAQ,OAAO,CAAC,WAAW,CAAC;MAkC/E;CAIH"}
|
package/dist/adapters/sqlite.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { emptyTotals } from '../core/usage.js';
|
|
2
3
|
/** Open a SQLite handle with whichever driver the process has: `bun:sqlite`
|
|
3
4
|
* first, then `node:sqlite`. Preferring one and requiring it are different
|
|
4
5
|
* things — a Next.js server runs on Node even inside a Bun workspace, which
|
|
@@ -49,12 +50,27 @@ CREATE TABLE IF NOT EXISTS events (
|
|
|
49
50
|
);
|
|
50
51
|
CREATE INDEX IF NOT EXISTS events_thread_seq ON events(threadId, seq);
|
|
51
52
|
CREATE INDEX IF NOT EXISTS events_thread_type ON events(threadId, type, seq);
|
|
53
|
+
-- One row per MODEL CALL, not per run segment. cachedInputTokens holds cache
|
|
54
|
+
-- READS, so the column that was already there still means what it always
|
|
55
|
+
-- meant, and cache writes get their own column beside it. A NULL costMicros
|
|
56
|
+
-- is an unpriced call, which is not the same as one that cost nothing.
|
|
57
|
+
-- (Statements here are split on the semicolon, so never write one in a
|
|
58
|
+
-- comment.)
|
|
52
59
|
CREATE TABLE IF NOT EXISTS usage (
|
|
53
|
-
id TEXT PRIMARY KEY, threadId TEXT NOT NULL, agentId TEXT,
|
|
60
|
+
id TEXT PRIMARY KEY, threadId TEXT NOT NULL, runId TEXT, agentId TEXT, agentName TEXT,
|
|
61
|
+
kind TEXT NOT NULL DEFAULT 'step', step INTEGER NOT NULL DEFAULT 0,
|
|
62
|
+
model TEXT, modelId TEXT,
|
|
54
63
|
inputTokens INTEGER NOT NULL, cachedInputTokens INTEGER NOT NULL,
|
|
55
|
-
|
|
64
|
+
cacheWriteInputTokens INTEGER NOT NULL DEFAULT 0,
|
|
65
|
+
outputTokens INTEGER NOT NULL, reasoningTokens INTEGER NOT NULL DEFAULT 0,
|
|
66
|
+
totalTokens INTEGER NOT NULL,
|
|
67
|
+
outcome TEXT NOT NULL DEFAULT 'finished', estimated INTEGER NOT NULL DEFAULT 0,
|
|
68
|
+
providerMetadata TEXT,
|
|
69
|
+
costMicros INTEGER, costCurrency TEXT, costSource TEXT,
|
|
70
|
+
createdAt INTEGER NOT NULL
|
|
56
71
|
);
|
|
57
72
|
CREATE INDEX IF NOT EXISTS usage_thread ON usage(threadId);
|
|
73
|
+
CREATE INDEX IF NOT EXISTS usage_run ON usage(runId, createdAt);
|
|
58
74
|
CREATE TABLE IF NOT EXISTS runs (
|
|
59
75
|
id TEXT PRIMARY KEY, threadId TEXT NOT NULL, parentRunId TEXT,
|
|
60
76
|
depth INTEGER NOT NULL DEFAULT 0, agent TEXT NOT NULL, model TEXT NOT NULL,
|
|
@@ -81,6 +97,33 @@ export class SqliteStorage {
|
|
|
81
97
|
if (sql)
|
|
82
98
|
this.db.prepare(sql).run();
|
|
83
99
|
}
|
|
100
|
+
// CREATE TABLE IF NOT EXISTS leaves an existing table as it was, so a
|
|
101
|
+
// usage table from before cost moved onto it (§4) gets its new columns
|
|
102
|
+
// here. Idempotent: a column that exists is skipped.
|
|
103
|
+
this.addMissing('usage', {
|
|
104
|
+
runId: 'TEXT',
|
|
105
|
+
agentName: 'TEXT',
|
|
106
|
+
kind: "TEXT NOT NULL DEFAULT 'step'",
|
|
107
|
+
step: 'INTEGER NOT NULL DEFAULT 0',
|
|
108
|
+
model: 'TEXT',
|
|
109
|
+
modelId: 'TEXT',
|
|
110
|
+
cacheWriteInputTokens: 'INTEGER NOT NULL DEFAULT 0',
|
|
111
|
+
reasoningTokens: 'INTEGER NOT NULL DEFAULT 0',
|
|
112
|
+
outcome: "TEXT NOT NULL DEFAULT 'finished'",
|
|
113
|
+
estimated: 'INTEGER NOT NULL DEFAULT 0',
|
|
114
|
+
providerMetadata: 'TEXT',
|
|
115
|
+
costMicros: 'INTEGER',
|
|
116
|
+
costCurrency: 'TEXT',
|
|
117
|
+
costSource: 'TEXT',
|
|
118
|
+
});
|
|
119
|
+
this.db.prepare('CREATE INDEX IF NOT EXISTS usage_run ON usage(runId, createdAt)').run();
|
|
120
|
+
}
|
|
121
|
+
addMissing(table, cols) {
|
|
122
|
+
const have = new Set(this.db.prepare(`PRAGMA table_info(${table})`).all().map((c) => c.name));
|
|
123
|
+
for (const [col, type] of Object.entries(cols)) {
|
|
124
|
+
if (!have.has(col))
|
|
125
|
+
this.db.prepare(`ALTER TABLE ${table} ADD COLUMN ${col} ${type}`).run();
|
|
126
|
+
}
|
|
84
127
|
}
|
|
85
128
|
all(sql, ...p) {
|
|
86
129
|
return this.db.prepare(sql).all(...p);
|
|
@@ -183,16 +226,44 @@ export class SqliteStorage {
|
|
|
183
226
|
};
|
|
184
227
|
usage = {
|
|
185
228
|
record: async (threadId, u) => {
|
|
186
|
-
this.write(
|
|
229
|
+
this.write(`INSERT INTO usage (id,threadId,runId,agentId,agentName,kind,step,model,modelId,
|
|
230
|
+
inputTokens,cachedInputTokens,cacheWriteInputTokens,outputTokens,reasoningTokens,
|
|
231
|
+
totalTokens,outcome,estimated,providerMetadata,costMicros,costCurrency,costSource,createdAt)
|
|
232
|
+
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`, randomUUID(), threadId, u.runId ?? null, u.agentId ?? null, u.agentName ?? null, u.kind, u.step, u.model ?? null, u.modelId ?? null, u.inputTokens, u.cacheReadInputTokens, u.cacheWriteInputTokens, u.outputTokens, u.reasoningTokens, u.totalTokens, u.outcome, u.estimated ? 1 : 0, u.providerMetadata ? JSON.stringify(u.providerMetadata) : null, u.cost?.micros ?? null, u.cost?.currency ?? null, u.cost?.source ?? null, Date.now());
|
|
187
233
|
},
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
234
|
+
// One grouped read rather than every row: a long thread holds a usage row
|
|
235
|
+
// per model call (§4), and the bill only ever wants them by agent and
|
|
236
|
+
// model. Summing the groups gives the totals, so the two always agree.
|
|
237
|
+
total: async (threadId, filter = {}) => {
|
|
238
|
+
const rows = this.all(`SELECT COALESCE(agentId,'') AS agentId, COALESCE(agentName,'') AS agentName,
|
|
239
|
+
COALESCE(model,'') AS model, COALESCE(modelId,'') AS modelId,
|
|
240
|
+
COALESCE(SUM(inputTokens),0) AS i, COALESCE(SUM(cachedInputTokens),0) AS cr,
|
|
241
|
+
COALESCE(SUM(cacheWriteInputTokens),0) AS cw, COALESCE(SUM(outputTokens),0) AS o,
|
|
242
|
+
COALESCE(SUM(reasoningTokens),0) AS rt, COALESCE(SUM(totalTokens),0) AS t,
|
|
243
|
+
COUNT(*) AS calls, COALESCE(SUM(estimated),0) AS est,
|
|
244
|
+
COALESCE(SUM(costMicros),0) AS cost, MAX(costCurrency) AS currency,
|
|
245
|
+
COALESCE(SUM(CASE WHEN costMicros IS NULL THEN 1 ELSE 0 END),0) AS unpriced
|
|
246
|
+
FROM usage WHERE threadId = ?${filter.runId ? ' AND runId = ?' : ''}
|
|
247
|
+
GROUP BY agentId, agentName, model, modelId
|
|
248
|
+
ORDER BY MIN(createdAt)`, ...(filter.runId ? [threadId, filter.runId] : [threadId]));
|
|
249
|
+
const out = emptyTotals();
|
|
250
|
+
for (const r of rows) {
|
|
251
|
+
out.inputTokens += r.i;
|
|
252
|
+
out.cachedInputTokens += r.cr;
|
|
253
|
+
out.outputTokens += r.o;
|
|
254
|
+
out.totalTokens += r.t;
|
|
255
|
+
out.costMicros += r.cost;
|
|
256
|
+
out.unpriced += r.unpriced;
|
|
257
|
+
out.currency ??= r.currency ?? undefined;
|
|
258
|
+
out.lines.push({
|
|
259
|
+
agentId: r.agentId || null, agentName: r.agentName || null,
|
|
260
|
+
model: r.model || null, modelId: r.modelId || null,
|
|
261
|
+
inputTokens: r.i, cacheReadInputTokens: r.cr, cacheWriteInputTokens: r.cw,
|
|
262
|
+
outputTokens: r.o, reasoningTokens: r.rt,
|
|
263
|
+
calls: r.calls, estimated: r.est, costMicros: r.cost,
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
return out;
|
|
196
267
|
},
|
|
197
268
|
};
|
|
198
269
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/adapters/sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/adapters/sqlite.ts"],"names":[],"mappings":"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"}
|