typebulb 0.51.3 → 0.52.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -4
- package/SKILL.md +6 -6
- package/dist/agents/claude/client.js +4 -3
- package/dist/agents/codex/client.js +4 -3
- package/dist/agents/pi/client.js +4 -3
- package/dist/ai/index.d.ts +1 -1
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +1 -1
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/protocol.d.ts +24 -0
- package/dist/ai/protocol.d.ts.map +1 -1
- package/dist/ai/protocol.js +15 -0
- package/dist/ai/protocol.js.map +1 -1
- package/dist/ai/providers/anthropic.d.ts +4 -0
- package/dist/ai/providers/anthropic.d.ts.map +1 -1
- package/dist/ai/providers/anthropic.js +32 -1
- package/dist/ai/providers/anthropic.js.map +1 -1
- package/dist/ai/providers/chatCompletions.d.ts +13 -0
- package/dist/ai/providers/chatCompletions.d.ts.map +1 -1
- package/dist/ai/providers/chatCompletions.js +19 -11
- package/dist/ai/providers/chatCompletions.js.map +1 -1
- package/dist/ai/providers/gemini.d.ts +10 -0
- package/dist/ai/providers/gemini.d.ts.map +1 -1
- package/dist/ai/providers/gemini.js +21 -2
- package/dist/ai/providers/gemini.js.map +1 -1
- package/dist/ai/providers/ollama.d.ts +3 -0
- package/dist/ai/providers/ollama.d.ts.map +1 -1
- package/dist/ai/providers/ollama.js +5 -1
- package/dist/ai/providers/ollama.js.map +1 -1
- package/dist/ai/providers/openAI.d.ts +12 -0
- package/dist/ai/providers/openAI.d.ts.map +1 -1
- package/dist/ai/providers/openAI.js +18 -1
- package/dist/ai/providers/openAI.js.map +1 -1
- package/dist/ai/providers/openRouter.d.ts +3 -0
- package/dist/ai/providers/openRouter.d.ts.map +1 -1
- package/dist/ai/providers/openRouter.js +5 -0
- package/dist/ai/providers/openRouter.js.map +1 -1
- package/dist/ai/sseParser.d.ts +13 -1
- package/dist/ai/sseParser.d.ts.map +1 -1
- package/dist/ai/sseParser.js +26 -5
- package/dist/ai/sseParser.js.map +1 -1
- package/dist/dts/tbTypings.d.ts.map +1 -1
- package/dist/dts/tbTypings.js +15 -4
- package/dist/dts/tbTypings.js.map +1 -1
- package/dist/index.js +241 -229
- package/dist/render.js +4 -3
- package/dist/servers.js +103 -102
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -420,10 +420,10 @@ Run `typebulb models` to list the models available for the providers specified.
|
|
|
420
420
|
Trusted bulbs can call AI providers **from their own code** at runtime, billed to your API keys.
|
|
421
421
|
|
|
422
422
|
```ts
|
|
423
|
-
tb.ai({ messages, system?, effort?, provider?, model?, webSearch? }) // → Promise<{ text }>
|
|
423
|
+
tb.ai({ messages, system?, effort?, provider?, model?, webSearch? }) // → Promise<{ text, usage? }>
|
|
424
424
|
```
|
|
425
425
|
|
|
426
|
-
Name the provider and model explicitly — `tb.ai({ provider: "openai", model: "gpt-5.6-luna", … })` — or rely on the defaults you set in `.env`. `webSearch` defaults **off**; pass `webSearch: true` to give the model a web-search tool (searches bill to your key).
|
|
426
|
+
Name the provider and model explicitly — `tb.ai({ provider: "openai", model: "gpt-5.6-luna", … })` — or rely on the defaults you set in `.env`. `webSearch` defaults **off**; pass `webSearch: true` to give the model a web-search tool (searches bill to your key). `usage` is the provider-reported token counts — `{ input, output, reasoning?, cacheRead? }`, reasoning included in `output` — absent when the provider reports none; use it to meter calls instead of estimating from text length.
|
|
427
427
|
|
|
428
428
|
### Reasoning effort
|
|
429
429
|
|
|
@@ -446,7 +446,7 @@ const { text } = await tb.ai({
|
|
|
446
446
|
|
|
447
447
|
### Streaming
|
|
448
448
|
|
|
449
|
-
`tb.ai.stream({ … })` is the streaming counterpart of `tb.ai()` — an async iterable of `{ kind: "text" | "reasoning", text }` deltas. `tb.ai()` (await the full text) is unchanged; reach for `.stream` only when a response is long enough to be worth showing as it arrives.
|
|
449
|
+
`tb.ai.stream({ … })` is the streaming counterpart of `tb.ai()` — an async iterable of `{ kind: "text" | "reasoning", text }` deltas, closed by one `{ kind: "usage", usage }` chunk with the call's token counts. `tb.ai()` (await the full text) is unchanged; reach for `.stream` only when a response is long enough to be worth showing as it arrives.
|
|
450
450
|
|
|
451
451
|
```ts
|
|
452
452
|
let answer = "";
|
|
@@ -455,7 +455,7 @@ for await (const c of tb.ai.stream({ messages })) {
|
|
|
455
455
|
}
|
|
456
456
|
```
|
|
457
457
|
|
|
458
|
-
Breaking the loop stops the stream; same options as `tb.ai()`. **`kind: "reasoning"` chunks require `effort: 1-4` and a thinking-capable model**.
|
|
458
|
+
Breaking the loop stops the stream; same options as `tb.ai()`. **`kind: "reasoning"` chunks require `effort: 1-4` and a thinking-capable model**. Match `kind` positively as above — a bare `else` that assumes "not reasoning means text" misreads the usage chunk.
|
|
459
459
|
|
|
460
460
|
### AI access
|
|
461
461
|
|
package/SKILL.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: typebulb
|
|
3
3
|
description: "Author and run Typebulb bulbs — single-file markdown apps (TypeScript/TSX) that run locally via `npx typebulb` (full power: filesystem, database, `server.ts`, `tb.ai`) or render live inline in your coding agent's session through Typebulb's agent mirror (sandboxed, client-only). A bulb can be a visual widget (chart, simulation, diagram, calculator, UI), a full-stack tool with a Node backend, or an AI app that calls models at runtime. Covers the bulb format, the `tb.*` API, trust, and the local run/inline workflow. Use when the user wants a bulb, a quick local tool (visual, backend-backed, or AI-powered), or something visual rendered inline in the conversation."
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.52.0
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
> Generated from typebulb v0.
|
|
7
|
+
> Generated from typebulb v0.52.0. `npx typebulb agent` prints the running version alongside the path to its packaged SKILL.md: if that version is newer than this one, replace this file with that one.
|
|
8
8
|
|
|
9
9
|
# typebulb
|
|
10
10
|
|
|
@@ -428,10 +428,10 @@ Run `typebulb models` to list the models available for the providers specified.
|
|
|
428
428
|
Trusted bulbs can call AI providers **from their own code** at runtime, billed to your API keys.
|
|
429
429
|
|
|
430
430
|
```ts
|
|
431
|
-
tb.ai({ messages, system?, effort?, provider?, model?, webSearch? }) // → Promise<{ text }>
|
|
431
|
+
tb.ai({ messages, system?, effort?, provider?, model?, webSearch? }) // → Promise<{ text, usage? }>
|
|
432
432
|
```
|
|
433
433
|
|
|
434
|
-
Name the provider and model explicitly — `tb.ai({ provider: "openai", model: "gpt-5.6-luna", … })` — or rely on the defaults you set in `.env`. `webSearch` defaults **off**; pass `webSearch: true` to give the model a web-search tool (searches bill to your key).
|
|
434
|
+
Name the provider and model explicitly — `tb.ai({ provider: "openai", model: "gpt-5.6-luna", … })` — or rely on the defaults you set in `.env`. `webSearch` defaults **off**; pass `webSearch: true` to give the model a web-search tool (searches bill to your key). `usage` is the provider-reported token counts — `{ input, output, reasoning?, cacheRead? }`, reasoning included in `output` — absent when the provider reports none; use it to meter calls instead of estimating from text length.
|
|
435
435
|
|
|
436
436
|
### Reasoning effort
|
|
437
437
|
|
|
@@ -454,7 +454,7 @@ const { text } = await tb.ai({
|
|
|
454
454
|
|
|
455
455
|
### Streaming
|
|
456
456
|
|
|
457
|
-
`tb.ai.stream({ … })` is the streaming counterpart of `tb.ai()` — an async iterable of `{ kind: "text" | "reasoning", text }` deltas. `tb.ai()` (await the full text) is unchanged; reach for `.stream` only when a response is long enough to be worth showing as it arrives.
|
|
457
|
+
`tb.ai.stream({ … })` is the streaming counterpart of `tb.ai()` — an async iterable of `{ kind: "text" | "reasoning", text }` deltas, closed by one `{ kind: "usage", usage }` chunk with the call's token counts. `tb.ai()` (await the full text) is unchanged; reach for `.stream` only when a response is long enough to be worth showing as it arrives.
|
|
458
458
|
|
|
459
459
|
```ts
|
|
460
460
|
let answer = "";
|
|
@@ -463,7 +463,7 @@ for await (const c of tb.ai.stream({ messages })) {
|
|
|
463
463
|
}
|
|
464
464
|
```
|
|
465
465
|
|
|
466
|
-
Breaking the loop stops the stream; same options as `tb.ai()`. **`kind: "reasoning"` chunks require `effort: 1-4` and a thinking-capable model**.
|
|
466
|
+
Breaking the loop stops the stream; same options as `tb.ai()`. **`kind: "reasoning"` chunks require `effort: 1-4` and a thinking-capable model**. Match `kind` positively as above — a bare `else` that assumes "not reasoning means text" misreads the usage chunk.
|
|
467
467
|
|
|
468
468
|
### AI access
|
|
469
469
|
|
|
@@ -1113,15 +1113,16 @@ const something = require('module-name') // NOT SUPPORTED!
|
|
|
1113
1113
|
err.retryable = !!data.retryable;
|
|
1114
1114
|
return err;
|
|
1115
1115
|
};
|
|
1116
|
-
// tb.ai(): non-streaming, resolves with the full { text } (unchanged 90% path).
|
|
1116
|
+
// tb.ai(): non-streaming, resolves with the full { text, usage? } (unchanged 90% path).
|
|
1117
1117
|
const aiCall = async (opts) => {
|
|
1118
1118
|
const resp = await aiFetch('tb.ai()', opts, undefined);
|
|
1119
1119
|
const data = await resp.json();
|
|
1120
1120
|
if (!resp.ok) throw aiError(data);
|
|
1121
1121
|
return data;
|
|
1122
1122
|
};
|
|
1123
|
-
// tb.ai.stream(): async iterable of AiChunk ({ kind:'text'|'reasoning', text }
|
|
1124
|
-
//
|
|
1123
|
+
// tb.ai.stream(): async iterable of AiChunk ({ kind:'text'|'reasoning', text } deltas, then one
|
|
1124
|
+
// final { kind:'usage', usage } when the provider reported counts). Same idiom as a streaming
|
|
1125
|
+
// tb.server.<gen>(). Break the loop (or abort the signal) to cancel.
|
|
1125
1126
|
const aiStream = (opts = {}) => (async function* () {
|
|
1126
1127
|
const resp = await aiFetch('tb.ai.stream()', opts, true);
|
|
1127
1128
|
if (!resp.ok && !isStreamResp(resp)) throw aiError(await resp.json().catch(() => ({})));
|
|
@@ -1113,15 +1113,16 @@ const something = require('module-name') // NOT SUPPORTED!
|
|
|
1113
1113
|
err.retryable = !!data.retryable;
|
|
1114
1114
|
return err;
|
|
1115
1115
|
};
|
|
1116
|
-
// tb.ai(): non-streaming, resolves with the full { text } (unchanged 90% path).
|
|
1116
|
+
// tb.ai(): non-streaming, resolves with the full { text, usage? } (unchanged 90% path).
|
|
1117
1117
|
const aiCall = async (opts) => {
|
|
1118
1118
|
const resp = await aiFetch('tb.ai()', opts, undefined);
|
|
1119
1119
|
const data = await resp.json();
|
|
1120
1120
|
if (!resp.ok) throw aiError(data);
|
|
1121
1121
|
return data;
|
|
1122
1122
|
};
|
|
1123
|
-
// tb.ai.stream(): async iterable of AiChunk ({ kind:'text'|'reasoning', text }
|
|
1124
|
-
//
|
|
1123
|
+
// tb.ai.stream(): async iterable of AiChunk ({ kind:'text'|'reasoning', text } deltas, then one
|
|
1124
|
+
// final { kind:'usage', usage } when the provider reported counts). Same idiom as a streaming
|
|
1125
|
+
// tb.server.<gen>(). Break the loop (or abort the signal) to cancel.
|
|
1125
1126
|
const aiStream = (opts = {}) => (async function* () {
|
|
1126
1127
|
const resp = await aiFetch('tb.ai.stream()', opts, true);
|
|
1127
1128
|
if (!resp.ok && !isStreamResp(resp)) throw aiError(await resp.json().catch(() => ({})));
|
package/dist/agents/pi/client.js
CHANGED
|
@@ -1113,15 +1113,16 @@ const something = require('module-name') // NOT SUPPORTED!
|
|
|
1113
1113
|
err.retryable = !!data.retryable;
|
|
1114
1114
|
return err;
|
|
1115
1115
|
};
|
|
1116
|
-
// tb.ai(): non-streaming, resolves with the full { text } (unchanged 90% path).
|
|
1116
|
+
// tb.ai(): non-streaming, resolves with the full { text, usage? } (unchanged 90% path).
|
|
1117
1117
|
const aiCall = async (opts) => {
|
|
1118
1118
|
const resp = await aiFetch('tb.ai()', opts, undefined);
|
|
1119
1119
|
const data = await resp.json();
|
|
1120
1120
|
if (!resp.ok) throw aiError(data);
|
|
1121
1121
|
return data;
|
|
1122
1122
|
};
|
|
1123
|
-
// tb.ai.stream(): async iterable of AiChunk ({ kind:'text'|'reasoning', text }
|
|
1124
|
-
//
|
|
1123
|
+
// tb.ai.stream(): async iterable of AiChunk ({ kind:'text'|'reasoning', text } deltas, then one
|
|
1124
|
+
// final { kind:'usage', usage } when the provider reported counts). Same idiom as a streaming
|
|
1125
|
+
// tb.server.<gen>(). Break the loop (or abort the signal) to cancel.
|
|
1125
1126
|
const aiStream = (opts = {}) => (async function* () {
|
|
1126
1127
|
const resp = await aiFetch('tb.ai.stream()', opts, true);
|
|
1127
1128
|
if (!resp.ok && !isStreamResp(resp)) throw aiError(await resp.json().catch(() => ({})));
|
package/dist/ai/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export * from './protocol.js';
|
|
2
2
|
export { AIProvider, ProviderStreamError, type ChatRequestOpts } from './aiProvider.js';
|
|
3
3
|
export { getProvider, sendAIRequest, normalizeUpstreamError, type ResolvedAIProvider, type SendAIRequestOpts } from './aiProviders.js';
|
|
4
|
-
export { parseSseBlock, consumeSseStream, consumeSseStreamGen, consumeStreamText, streamAiChunks } from './sseParser.js';
|
|
4
|
+
export { parseSseBlock, consumeSseStream, consumeSseStreamGen, consumeStreamText, consumeStreamResult, streamAiChunks } from './sseParser.js';
|
|
5
5
|
export { buildInferencePrompt, sanitizeJsonOutput, encodeToHash, decodeFromHash, hashContainsTb, type InferenceScriptContent, type SanitizeResult, type InferenceResult } from './inference.js';
|
|
6
6
|
export * from './providers/chatCompletions.js';
|
|
7
7
|
export * from './providers/anthropic.js';
|
package/dist/ai/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../ai/src/index.ts"],"names":[],"mappings":"AACA,cAAc,eAAe,CAAA;AAE7B,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACvF,OAAO,EACL,WAAW,EACX,aAAa,EACb,sBAAsB,EACtB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACvB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../ai/src/index.ts"],"names":[],"mappings":"AACA,cAAc,eAAe,CAAA;AAE7B,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACvF,OAAO,EACL,WAAW,EACX,aAAa,EACb,sBAAsB,EACtB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACvB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAG7I,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,cAAc,EACd,KAAK,sBAAsB,EAC3B,KAAK,cAAc,EACnB,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAA;AAGvB,cAAc,gCAAgC,CAAA;AAC9C,cAAc,0BAA0B,CAAA;AACxC,cAAc,uBAAuB,CAAA;AACrC,cAAc,uBAAuB,CAAA;AACrC,cAAc,2BAA2B,CAAA;AACzC,cAAc,uBAAuB,CAAA"}
|
package/dist/ai/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
export * from './protocol.js';
|
|
3
3
|
export { AIProvider, ProviderStreamError } from './aiProvider.js';
|
|
4
4
|
export { getProvider, sendAIRequest, normalizeUpstreamError } from './aiProviders.js';
|
|
5
|
-
export { parseSseBlock, consumeSseStream, consumeSseStreamGen, consumeStreamText, streamAiChunks } from './sseParser.js';
|
|
5
|
+
export { parseSseBlock, consumeSseStream, consumeSseStreamGen, consumeStreamText, consumeStreamResult, streamAiChunks } from './sseParser.js';
|
|
6
6
|
// Inference layer shared with typebulb.com: prompt template, JSON sanitizer, #tb= result encoding.
|
|
7
7
|
export { buildInferencePrompt, sanitizeJsonOutput, encodeToHash, decodeFromHash, hashContainsTb } from './inference.js';
|
|
8
8
|
// Per-provider wire DTOs + provider implementations.
|
package/dist/ai/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../ai/src/index.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,cAAc,eAAe,CAAA;AAE7B,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAwB,MAAM,iBAAiB,CAAA;AACvF,OAAO,EACL,WAAW,EACX,aAAa,EACb,sBAAsB,EAGvB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../ai/src/index.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,cAAc,eAAe,CAAA;AAE7B,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAwB,MAAM,iBAAiB,CAAA;AACvF,OAAO,EACL,WAAW,EACX,aAAa,EACb,sBAAsB,EAGvB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAE7I,mGAAmG;AACnG,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,cAAc,EAIf,MAAM,gBAAgB,CAAA;AAEvB,qDAAqD;AACrD,cAAc,gCAAgC,CAAA;AAC9C,cAAc,0BAA0B,CAAA;AACxC,cAAc,uBAAuB,CAAA;AACrC,cAAc,uBAAuB,CAAA;AACrC,cAAc,2BAA2B,CAAA;AACzC,cAAc,uBAAuB,CAAA"}
|
package/dist/ai/protocol.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ export interface ChatResponseDto {
|
|
|
8
8
|
reasoning?: string;
|
|
9
9
|
status?: 'complete' | 'interrupted' | 'failed' | 'cancelled';
|
|
10
10
|
error?: string;
|
|
11
|
+
usage?: AiUsage;
|
|
11
12
|
}
|
|
12
13
|
export interface UpstreamErrorDto {
|
|
13
14
|
message: string;
|
|
@@ -17,6 +18,10 @@ export interface UpstreamErrorDto {
|
|
|
17
18
|
export interface ChatStreamPieceDto {
|
|
18
19
|
text?: string;
|
|
19
20
|
reasoning?: string;
|
|
21
|
+
/** Partial by design: providers deliver usage across events (Anthropic: input at message_start,
|
|
22
|
+
* output at message_delta), so each piece carries what its event knew. `streamAiChunks` merges
|
|
23
|
+
* field-wise (later wins — counts are cumulative) into the one final `usage` chunk. */
|
|
24
|
+
usage?: Partial<AiUsage>;
|
|
20
25
|
}
|
|
21
26
|
/** A provider's raw JSON response body. Each AIProvider narrows it to its own DTO — the interfaces that extend this (see providers/*). */
|
|
22
27
|
export interface ProviderResponseDto {
|
|
@@ -62,6 +67,22 @@ export declare const asEffort: (v: number | undefined | null) => EffortLevel | u
|
|
|
62
67
|
* dropped — for persisted settings, where the nearest level beats falling back to a provider default.
|
|
63
68
|
* The upper bound must track the dial's top if a level is ever added. */
|
|
64
69
|
export declare const clampEffort: (v: number) => EffortLevel;
|
|
70
|
+
/** Provider-reported token counts for one call (TB-AI.md invariant 20). Normalized: `input` is
|
|
71
|
+
* the full prompt (cache reads included), `output` is total billed output (reasoning included),
|
|
72
|
+
* `reasoning`/`cacheRead` are the itemized subsets where the provider splits them (Anthropic
|
|
73
|
+
* doesn't split reasoning). Absent entirely when the provider reported nothing. */
|
|
74
|
+
export interface AiUsage {
|
|
75
|
+
input: number;
|
|
76
|
+
output: number;
|
|
77
|
+
reasoning?: number;
|
|
78
|
+
cacheRead?: number;
|
|
79
|
+
}
|
|
80
|
+
/** Fold one wire-piece usage fragment into an accumulation. Field-wise, later wins — providers
|
|
81
|
+
* report cumulative counts, so the last sighting of each field is the total. */
|
|
82
|
+
export declare const mergeUsage: (acc: Partial<AiUsage> | undefined, piece: Partial<AiUsage>) => Partial<AiUsage>;
|
|
83
|
+
/** Settle a partial usage accumulation into the public shape — or nothing, when no event ever
|
|
84
|
+
* reported a count (the whole-object absence bulbs test for). Missing halves settle to 0. */
|
|
85
|
+
export declare const finalizeUsage: (u: Partial<AiUsage> | undefined) => AiUsage | undefined;
|
|
65
86
|
/** A streamed delta from `tb.ai.stream()`. Discriminated union — exactly one kind per chunk, so
|
|
66
87
|
* `switch (chunk.kind)` is exhaustive and no `{}`/both-fields state is representable. The public
|
|
67
88
|
* shape; the internal wire piece (`ChatStreamPieceDto { text?, reasoning? }`) stays loose. */
|
|
@@ -71,6 +92,9 @@ export type AiChunk = {
|
|
|
71
92
|
} | {
|
|
72
93
|
kind: 'reasoning';
|
|
73
94
|
text: string;
|
|
95
|
+
} | {
|
|
96
|
+
kind: 'usage';
|
|
97
|
+
usage: AiUsage;
|
|
74
98
|
};
|
|
75
99
|
/** What backs `tb.ai` for the current user: their own keys (`own`), the quota-limited courtesy
|
|
76
100
|
* model (`courtesy`), or nothing at all (`none` — the CLI without keys, an embedded bulb). Which
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../ai/src/protocol.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAA;AAEtD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,UAAU,GAAG,aAAa,GAAG,QAAQ,GAAG,WAAW,CAAA;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../ai/src/protocol.ts"],"names":[],"mappings":"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"}
|
package/dist/ai/protocol.js
CHANGED
|
@@ -6,4 +6,19 @@ export const asEffort = (v) => v != null && v >= 0 && v <= 4 ? v : undefined;
|
|
|
6
6
|
* dropped — for persisted settings, where the nearest level beats falling back to a provider default.
|
|
7
7
|
* The upper bound must track the dial's top if a level is ever added. */
|
|
8
8
|
export const clampEffort = (v) => Math.max(0, Math.min(v, 4));
|
|
9
|
+
/** Fold one wire-piece usage fragment into an accumulation. Field-wise, later wins — providers
|
|
10
|
+
* report cumulative counts, so the last sighting of each field is the total. */
|
|
11
|
+
export const mergeUsage = (acc, piece) => {
|
|
12
|
+
const out = { ...acc };
|
|
13
|
+
for (const k of ['input', 'output', 'reasoning', 'cacheRead']) {
|
|
14
|
+
if (piece[k] !== undefined)
|
|
15
|
+
out[k] = piece[k];
|
|
16
|
+
}
|
|
17
|
+
return out;
|
|
18
|
+
};
|
|
19
|
+
/** Settle a partial usage accumulation into the public shape — or nothing, when no event ever
|
|
20
|
+
* reported a count (the whole-object absence bulbs test for). Missing halves settle to 0. */
|
|
21
|
+
export const finalizeUsage = (u) => u === undefined || (u.input === undefined && u.output === undefined)
|
|
22
|
+
? undefined
|
|
23
|
+
: { input: u.input ?? 0, output: u.output ?? 0, reasoning: u.reasoning, cacheRead: u.cacheRead };
|
|
9
24
|
//# sourceMappingURL=protocol.js.map
|
package/dist/ai/protocol.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../ai/src/protocol.ts"],"names":[],"mappings":"AAAA,wEAAwE;
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../ai/src/protocol.ts"],"names":[],"mappings":"AAAA,wEAAwE;AA4ExE;sGACsG;AACtG,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAA4B,EAA2B,EAAE,CAChF,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAgB,CAAC,CAAC,CAAC,SAAS,CAAA;AAE9D;;0EAE0E;AAC1E,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAS,EAAe,EAAE,CACpD,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAgB,CAAA;AAa5C;iFACiF;AACjF,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,GAAiC,EACjC,KAAuB,EACL,EAAE;IACpB,MAAM,GAAG,GAAqB,EAAE,GAAG,GAAG,EAAE,CAAA;IACxC,KAAK,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAU,EAAE,CAAC;QACvE,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IAC/C,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AAED;8FAC8F;AAC9F,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAA+B,EAAuB,EAAE,CACpF,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC;IAClE,CAAC,CAAC,SAAS;IACX,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAA"}
|
|
@@ -113,6 +113,10 @@ export declare class AnthropicProvider extends AIProvider {
|
|
|
113
113
|
buildPayload(messages: ChatMessageDto[], model: string, opts: ChatRequestOpts, stream: boolean): AnthropicRequestPayload;
|
|
114
114
|
parseNonStreamingResponse(json: ProviderResponseDto): ChatResponseDto;
|
|
115
115
|
protected parseProviderStreamChunk(json: ProviderStreamEventDto): ChatStreamPieceDto | null;
|
|
116
|
+
/** Anthropic itemizes uncached input, cache reads and cache writes as disjoint counts; `input`
|
|
117
|
+
* is normalized to their sum (the full prompt, matching the other providers' inclusive count).
|
|
118
|
+
* Thinking tokens are folded into `output_tokens` unitemized, so `reasoning` stays absent. */
|
|
119
|
+
private mapUsage;
|
|
116
120
|
/**
|
|
117
121
|
* Cache breakpoints on the final two messages. The last extends conversations whose tail is the
|
|
118
122
|
* new user turn (tb.ai bulbs, chat/raw modes); the second-to-last covers code-mode chat payloads,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../ai/src/providers/anthropic.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EACV,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,mBAAmB,EACnB,sBAAsB,
|
|
1
|
+
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../ai/src/providers/anthropic.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { finalizeUsage } from '../protocol.js';
|
|
1
2
|
import { AIProvider } from '../aiProvider.js';
|
|
2
3
|
export class AnthropicProvider extends AIProvider {
|
|
3
4
|
constructor() {
|
|
@@ -90,7 +91,7 @@ export class AnthropicProvider extends AIProvider {
|
|
|
90
91
|
.filter((block) => block.type === 'thinking')
|
|
91
92
|
.map(block => block.thinking)
|
|
92
93
|
.join('\n\n');
|
|
93
|
-
return { text, reasoning: reasoning || undefined };
|
|
94
|
+
return { text, reasoning: reasoning || undefined, usage: finalizeUsage(this.mapUsage(json.usage)) };
|
|
94
95
|
}
|
|
95
96
|
parseProviderStreamChunk(json) {
|
|
96
97
|
if (!this.isAnthropicEvent(json))
|
|
@@ -104,11 +105,41 @@ export class AnthropicProvider extends AIProvider {
|
|
|
104
105
|
return { reasoning: json.delta.thinking || '' };
|
|
105
106
|
}
|
|
106
107
|
return null;
|
|
108
|
+
// Usage is split across the stream: message_start carries the input-side counts, each
|
|
109
|
+
// message_delta the cumulative output count. Emitted as partial pieces; the stream adapter
|
|
110
|
+
// merges them (later wins) into one final usage chunk.
|
|
111
|
+
case 'message_start': {
|
|
112
|
+
const usage = this.mapUsage(json.message?.usage);
|
|
113
|
+
return usage ? { usage } : null;
|
|
114
|
+
}
|
|
115
|
+
case 'message_delta': {
|
|
116
|
+
const usage = this.mapUsage(json.usage);
|
|
117
|
+
return usage ? { usage } : null;
|
|
118
|
+
}
|
|
107
119
|
default:
|
|
108
120
|
return null;
|
|
109
121
|
}
|
|
110
122
|
}
|
|
111
123
|
// ── Private helpers ──────────────────────────────────────────────
|
|
124
|
+
/** Anthropic itemizes uncached input, cache reads and cache writes as disjoint counts; `input`
|
|
125
|
+
* is normalized to their sum (the full prompt, matching the other providers' inclusive count).
|
|
126
|
+
* Thinking tokens are folded into `output_tokens` unitemized, so `reasoning` stays absent. */
|
|
127
|
+
mapUsage(u) {
|
|
128
|
+
if (typeof u !== 'object' || u === null)
|
|
129
|
+
return undefined;
|
|
130
|
+
const r = u;
|
|
131
|
+
const n = (v) => (typeof v === 'number' ? v : undefined);
|
|
132
|
+
const uncached = n(r.input_tokens);
|
|
133
|
+
const cacheRead = n(r.cache_read_input_tokens);
|
|
134
|
+
const cacheWrite = n(r.cache_creation_input_tokens);
|
|
135
|
+
const output = n(r.output_tokens);
|
|
136
|
+
const input = uncached !== undefined || cacheRead !== undefined || cacheWrite !== undefined
|
|
137
|
+
? (uncached ?? 0) + (cacheRead ?? 0) + (cacheWrite ?? 0)
|
|
138
|
+
: undefined;
|
|
139
|
+
if (input === undefined && output === undefined)
|
|
140
|
+
return undefined;
|
|
141
|
+
return { input, output, cacheRead };
|
|
142
|
+
}
|
|
112
143
|
/**
|
|
113
144
|
* Cache breakpoints on the final two messages. The last extends conversations whose tail is the
|
|
114
145
|
* new user turn (tb.ai bulbs, chat/raw modes); the second-to-last covers code-mode chat payloads,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../../ai/src/providers/anthropic.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../../ai/src/providers/anthropic.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,16 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import type { ChatStreamPieceDto, ChatResponseDto, ProviderResponseDto, ProviderStreamEventDto } from '../protocol.js';
|
|
7
7
|
import { AIProvider } from '../aiProvider.js';
|
|
8
|
+
export interface ChatCompletionsUsageDto {
|
|
9
|
+
prompt_tokens?: number;
|
|
10
|
+
completion_tokens?: number;
|
|
11
|
+
prompt_tokens_details?: {
|
|
12
|
+
cached_tokens?: number;
|
|
13
|
+
};
|
|
14
|
+
completion_tokens_details?: {
|
|
15
|
+
reasoning_tokens?: number;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
8
18
|
export interface ChatCompletionsMessageDto {
|
|
9
19
|
content: string;
|
|
10
20
|
reasoning?: string;
|
|
@@ -17,6 +27,7 @@ export interface ChatCompletionsChoiceDto {
|
|
|
17
27
|
export interface ChatCompletionsResponseDto extends ProviderResponseDto {
|
|
18
28
|
choices: ChatCompletionsChoiceDto[];
|
|
19
29
|
reasoning?: string;
|
|
30
|
+
usage?: ChatCompletionsUsageDto;
|
|
20
31
|
}
|
|
21
32
|
export interface ChatCompletionsDeltaDto {
|
|
22
33
|
content?: string;
|
|
@@ -29,10 +40,12 @@ export interface ChatCompletionsStreamChoiceDto {
|
|
|
29
40
|
}
|
|
30
41
|
export interface ChatCompletionsStreamEventDto extends ProviderStreamEventDto {
|
|
31
42
|
choices: ChatCompletionsStreamChoiceDto[];
|
|
43
|
+
usage?: ChatCompletionsUsageDto;
|
|
32
44
|
}
|
|
33
45
|
export declare abstract class ChatCompletionsProvider extends AIProvider {
|
|
34
46
|
parseNonStreamingResponse(json: ProviderResponseDto): ChatResponseDto;
|
|
35
47
|
protected parseProviderStreamChunk(json: ProviderStreamEventDto): ChatStreamPieceDto | null;
|
|
36
48
|
private hasChoices;
|
|
49
|
+
private mapUsage;
|
|
37
50
|
}
|
|
38
51
|
//# sourceMappingURL=chatCompletions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chatCompletions.d.ts","sourceRoot":"","sources":["../../../ai/src/providers/chatCompletions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EACV,kBAAkB,EAClB,eAAe,EACf,mBAAmB,EACnB,sBAAsB,
|
|
1
|
+
{"version":3,"file":"chatCompletions.d.ts","sourceRoot":"","sources":["../../../ai/src/providers/chatCompletions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EACV,kBAAkB,EAClB,eAAe,EACf,mBAAmB,EACnB,sBAAsB,EAEvB,MAAM,gBAAgB,CAAA;AAEvB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAO7C,MAAM,WAAW,uBAAuB;IACtC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,qBAAqB,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAClD,yBAAyB,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAC1D;AAGD,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,CAAA;IAEf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,CAAC,EAAE,yBAAyB,CAAA;IACnC,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,0BAA2B,SAAQ,mBAAmB;IACrE,OAAO,EAAE,wBAAwB,EAAE,CAAA;IACnC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,uBAAuB,CAAA;CAChC;AAGD,MAAM,WAAW,uBAAuB;IACtC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,8BAA8B;IAC7C,KAAK,CAAC,EAAE,uBAAuB,CAAA;IAC/B,OAAO,CAAC,EAAE,uBAAuB,CAAA;CAClC;AAED,MAAM,WAAW,6BAA8B,SAAQ,sBAAsB;IAC3E,OAAO,EAAE,8BAA8B,EAAE,CAAA;IACzC,KAAK,CAAC,EAAE,uBAAuB,CAAA;CAChC;AAID,8BAAsB,uBAAwB,SAAQ,UAAU;IAC9D,yBAAyB,CAAC,IAAI,EAAE,mBAAmB,GAAG,eAAe;IAWrE,SAAS,CAAC,wBAAwB,CAAC,IAAI,EAAE,sBAAsB,GAAG,kBAAkB,GAAG,IAAI;IAc3F,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,QAAQ;CASjB"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { finalizeUsage } from '../protocol.js';
|
|
1
2
|
import { AIProvider } from '../aiProvider.js';
|
|
2
3
|
// ── Shared parsing ───────────────────────────────────────────────────
|
|
3
4
|
export class ChatCompletionsProvider extends AIProvider {
|
|
@@ -9,26 +10,33 @@ export class ChatCompletionsProvider extends AIProvider {
|
|
|
9
10
|
const msg = choice?.message;
|
|
10
11
|
const text = msg?.content ?? choice?.text ?? '';
|
|
11
12
|
const reasoning = msg?.reasoning ?? msg?.reasoning_content ?? resp.reasoning;
|
|
12
|
-
return { text, reasoning };
|
|
13
|
+
return { text, reasoning, usage: this.mapUsage(resp.usage) };
|
|
13
14
|
}
|
|
14
15
|
parseProviderStreamChunk(json) {
|
|
15
16
|
if (!this.hasChoices(json))
|
|
16
17
|
return null;
|
|
17
|
-
const
|
|
18
|
-
|
|
18
|
+
const event = json;
|
|
19
|
+
const usage = this.mapUsage(event.usage);
|
|
20
|
+
const delta = event.choices[0]?.delta || event.choices[0]?.message;
|
|
21
|
+
const text = delta?.content || undefined;
|
|
22
|
+
const reasoning = delta?.reasoning || delta?.reasoning_content || undefined;
|
|
23
|
+
if (!text && !reasoning && !usage)
|
|
19
24
|
return null;
|
|
20
|
-
|
|
21
|
-
if (!delta)
|
|
22
|
-
return null;
|
|
23
|
-
const text = delta.content || undefined;
|
|
24
|
-
const reasoning = delta.reasoning || delta.reasoning_content || undefined;
|
|
25
|
-
if (!text && !reasoning)
|
|
26
|
-
return null;
|
|
27
|
-
return { text, reasoning };
|
|
25
|
+
return { text, reasoning, usage };
|
|
28
26
|
}
|
|
29
27
|
hasChoices(json) {
|
|
30
28
|
return typeof json === 'object' && json !== null
|
|
31
29
|
&& 'choices' in json && Array.isArray(json.choices);
|
|
32
30
|
}
|
|
31
|
+
mapUsage(u) {
|
|
32
|
+
if (!u)
|
|
33
|
+
return undefined;
|
|
34
|
+
return finalizeUsage({
|
|
35
|
+
input: u.prompt_tokens,
|
|
36
|
+
output: u.completion_tokens,
|
|
37
|
+
reasoning: u.completion_tokens_details?.reasoning_tokens,
|
|
38
|
+
cacheRead: u.prompt_tokens_details?.cached_tokens,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
33
41
|
}
|
|
34
42
|
//# sourceMappingURL=chatCompletions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chatCompletions.js","sourceRoot":"","sources":["../../../ai/src/providers/chatCompletions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"chatCompletions.js","sourceRoot":"","sources":["../../../ai/src/providers/chatCompletions.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAkD7C,wEAAwE;AAExE,MAAM,OAAgB,uBAAwB,SAAQ,UAAU;IAC9D,yBAAyB,CAAC,IAAyB;QACjD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAA;QAE/C,MAAM,IAAI,GAAG,IAAkC,CAAA;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;QAC9B,MAAM,GAAG,GAAG,MAAM,EAAE,OAAO,CAAA;QAC3B,MAAM,IAAI,GAAG,GAAG,EAAE,OAAO,IAAI,MAAM,EAAE,IAAI,IAAI,EAAE,CAAA;QAC/C,MAAM,SAAS,GAAG,GAAG,EAAE,SAAS,IAAI,GAAG,EAAE,iBAAiB,IAAI,IAAI,CAAC,SAAS,CAAA;QAC5E,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAA;IAC9D,CAAC;IAES,wBAAwB,CAAC,IAA4B;QAC7D,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAA;QAEvC,MAAM,KAAK,GAAG,IAAqC,CAAA;QACnD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACxC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAA;QAClE,MAAM,IAAI,GAAG,KAAK,EAAE,OAAO,IAAI,SAAS,CAAA;QACxC,MAAM,SAAS,GAAG,KAAK,EAAE,SAAS,IAAI,KAAK,EAAE,iBAAiB,IAAI,SAAS,CAAA;QAE3E,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAA;QAE9C,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAA;IACnC,CAAC;IAEO,UAAU,CAAC,IAAa;QAC9B,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;eAC3C,SAAS,IAAI,IAAI,IAAI,KAAK,CAAC,OAAO,CAAE,IAA8B,CAAC,OAAO,CAAC,CAAA;IAClF,CAAC;IAEO,QAAQ,CAAC,CAAsC;QACrD,IAAI,CAAC,CAAC;YAAE,OAAO,SAAS,CAAA;QACxB,OAAO,aAAa,CAAC;YACnB,KAAK,EAAE,CAAC,CAAC,aAAa;YACtB,MAAM,EAAE,CAAC,CAAC,iBAAiB;YAC3B,SAAS,EAAE,CAAC,CAAC,yBAAyB,EAAE,gBAAgB;YACxD,SAAS,EAAE,CAAC,CAAC,qBAAqB,EAAE,aAAa;SAClD,CAAC,CAAA;IACJ,CAAC;CACF"}
|
|
@@ -44,9 +44,16 @@ export interface GeminiCandidate {
|
|
|
44
44
|
export interface GeminiPromptFeedback {
|
|
45
45
|
blockReason?: string;
|
|
46
46
|
}
|
|
47
|
+
export interface GeminiUsageMetadata {
|
|
48
|
+
promptTokenCount?: number;
|
|
49
|
+
candidatesTokenCount?: number;
|
|
50
|
+
thoughtsTokenCount?: number;
|
|
51
|
+
cachedContentTokenCount?: number;
|
|
52
|
+
}
|
|
47
53
|
export interface GeminiResponseDto extends ProviderResponseDto {
|
|
48
54
|
candidates?: GeminiCandidate[];
|
|
49
55
|
promptFeedback?: GeminiPromptFeedback;
|
|
56
|
+
usageMetadata?: GeminiUsageMetadata;
|
|
50
57
|
}
|
|
51
58
|
export type GeminiSseEventDto = GeminiResponseDto;
|
|
52
59
|
/** Request payload for native Gemini API */
|
|
@@ -67,6 +74,9 @@ export declare class GeminiProvider extends AIProvider {
|
|
|
67
74
|
parseError(errorText: string, status: number): UpstreamErrorDto;
|
|
68
75
|
parseNonStreamingResponse(json: ProviderResponseDto): ChatResponseDto;
|
|
69
76
|
protected parseProviderStreamChunk(json: ProviderStreamEventDto): ChatStreamPieceDto | null;
|
|
77
|
+
/** `output` is normalized to total billed output — Gemini itemizes answer and thought tokens as
|
|
78
|
+
* disjoint counts, where the other providers report an inclusive total with subsets. */
|
|
79
|
+
private mapUsage;
|
|
70
80
|
/** Major.minor from a versioned model name (`gemini-3.5-flash` → 3.5); null for aliases. */
|
|
71
81
|
private geminiVersion;
|
|
72
82
|
/** Dial → level, clamped to the family's supported enum: `minimal` is 3.5+; earlier 3.x floors at
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../ai/src/providers/gemini.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAEhB,kBAAkB,EAClB,eAAe,EACf,mBAAmB,EACnB,sBAAsB,
|
|
1
|
+
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../ai/src/providers/gemini.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { finalizeUsage } from '../protocol.js';
|
|
1
2
|
import { AIProvider, ProviderStreamError } from '../aiProvider.js';
|
|
2
3
|
export class GeminiProvider extends AIProvider {
|
|
3
4
|
constructor() {
|
|
@@ -102,16 +103,34 @@ export class GeminiProvider extends AIProvider {
|
|
|
102
103
|
else if (finishReason === 'SAFETY' || finishReason === 'RECITATION') {
|
|
103
104
|
status = 'failed';
|
|
104
105
|
}
|
|
105
|
-
return { text, status };
|
|
106
|
+
return { text, status, usage: this.mapUsage(json.usageMetadata) };
|
|
106
107
|
}
|
|
107
108
|
parseProviderStreamChunk(json) {
|
|
108
109
|
this.checkGeminiError(json);
|
|
109
110
|
if (!this.isGeminiResponse(json))
|
|
110
111
|
return null;
|
|
111
112
|
const piece = this.extractParts(json);
|
|
112
|
-
|
|
113
|
+
// Counts are cumulative per chunk, so passing every sighting through is safe — the stream
|
|
114
|
+
// adapter's later-wins merge lands on the final (complete) one.
|
|
115
|
+
const usage = this.mapUsage(json.usageMetadata);
|
|
116
|
+
if (usage)
|
|
117
|
+
piece.usage = usage;
|
|
118
|
+
return (piece.text || piece.reasoning || piece.usage) ? piece : null;
|
|
113
119
|
}
|
|
114
120
|
// ── Private helpers ──────────────────────────────────────────────
|
|
121
|
+
/** `output` is normalized to total billed output — Gemini itemizes answer and thought tokens as
|
|
122
|
+
* disjoint counts, where the other providers report an inclusive total with subsets. */
|
|
123
|
+
mapUsage(u) {
|
|
124
|
+
if (!u)
|
|
125
|
+
return undefined;
|
|
126
|
+
const hasOutput = u.candidatesTokenCount !== undefined || u.thoughtsTokenCount !== undefined;
|
|
127
|
+
return finalizeUsage({
|
|
128
|
+
input: u.promptTokenCount,
|
|
129
|
+
output: hasOutput ? (u.candidatesTokenCount ?? 0) + (u.thoughtsTokenCount ?? 0) : undefined,
|
|
130
|
+
reasoning: u.thoughtsTokenCount,
|
|
131
|
+
cacheRead: u.cachedContentTokenCount,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
115
134
|
/** Major.minor from a versioned model name (`gemini-3.5-flash` → 3.5); null for aliases. */
|
|
116
135
|
geminiVersion(model) {
|
|
117
136
|
const m = model.match(/^gemini-(\d+(?:\.\d+)?)/);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../ai/src/providers/gemini.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../ai/src/providers/gemini.ts"],"names":[],"mappings":"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"}
|