typebulb 0.51.3 → 0.52.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 +4 -4
- package/SKILL.md +6 -6
- package/dist/agents/claude/client.js +201 -200
- package/dist/agents/claude/styles.css +34 -10
- package/dist/agents/codex/client.js +203 -202
- package/dist/agents/codex/styles.css +34 -10
- package/dist/agents/pi/client.js +217 -216
- package/dist/agents/pi/styles.css +34 -10
- 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 +254 -229
- package/dist/render.js +4 -3
- package/dist/servers.js +103 -102
- package/package.json +1 -1
|
@@ -326,13 +326,13 @@ body {
|
|
|
326
326
|
.shimmer-text { animation: none !important; background: none !important; -webkit-text-fill-color: currentColor; }
|
|
327
327
|
}
|
|
328
328
|
|
|
329
|
-
/*
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
.
|
|
329
|
+
/* THE WORKING STATE for a word pill — the token chip mid-turn, the summarize pill mid-call. Only
|
|
330
|
+
the shimmer's knobs live here; the sweep itself is the shared .shimmer above, composed by
|
|
331
|
+
`busyPill()` (ui.ts) so a new busy pill can't land at its own speed or its own base colour. The
|
|
332
|
+
sweep blends with --panel, not transparent like the launch buttons': a word pill sits over message
|
|
333
|
+
text and must keep covering it. shimmer-slow because these can sit lit for minutes (the JSONL
|
|
334
|
+
flushes in batches, so the token chip rides a whole buffering window). */
|
|
335
|
+
.pill-busy { border-color: var(--accent); --shimmer-base: var(--panel); --shimmer-mix: 25%; }
|
|
336
336
|
|
|
337
337
|
/* ── The composer (TB-Agent-Composer.md): the prompt panel under the transcript. In flow (not
|
|
338
338
|
overlaid like the statusbar) — it owns real height and must never cover content. ── */
|
|
@@ -1870,8 +1870,21 @@ html[data-theme="dark"] .masthead-logo.dark { display: block; }
|
|
|
1870
1870
|
(#draftThinkingPre). Durable rows stay uncapped: finished thinking IS reading material. */
|
|
1871
1871
|
.draft .thinking pre { max-height: 220px; overflow-y: auto; }
|
|
1872
1872
|
|
|
1873
|
-
/*
|
|
1874
|
-
|
|
1873
|
+
/* The bubble's pill row (summarize, then copy), revealed on bubble-hover. The row does the corner
|
|
1874
|
+
anchoring so the pills inside can sit side by side — each .overlay-pill anchors itself to its
|
|
1875
|
+
container's bottom-right otherwise, and the second would land on the first. Same shape as the
|
|
1876
|
+
inline bulb's .bulb-controls. The reveal is scoped to a DIRECT child row, so an inline bulb's own
|
|
1877
|
+
controls keep their own (bulb-hover) reveal instead of firing on the whole bubble. */
|
|
1878
|
+
.bubble-controls {
|
|
1879
|
+
position: absolute;
|
|
1880
|
+
bottom: .5rem;
|
|
1881
|
+
right: 0; /* flush with the content column's right edge (prose / statusbar pills) */
|
|
1882
|
+
display: flex;
|
|
1883
|
+
gap: .4rem;
|
|
1884
|
+
}
|
|
1885
|
+
.bubble-controls .overlay-pill { position: static; }
|
|
1886
|
+
.bubble:hover > .bubble-controls .overlay-pill,
|
|
1887
|
+
.bubble-controls .overlay-pill:focus-visible { opacity: 1; }
|
|
1875
1888
|
/* "copied" flash: eases into accent on click (CopyButton is a Component, so its
|
|
1876
1889
|
node persists across re-renders and the transition actually runs). The color
|
|
1877
1890
|
transition lives only on .done, not the base pill, so hover stays instant — the
|
|
@@ -1884,4 +1897,15 @@ html[data-theme="dark"] .masthead-logo.dark { display: block; }
|
|
|
1884
1897
|
}
|
|
1885
1898
|
/* Assistant bubbles carry no padding, so the shared .5rem bottom would float the
|
|
1886
1899
|
pill above the last line — pin it to the text's bottom edge. */
|
|
1887
|
-
.bubble.assistant .
|
|
1900
|
+
.bubble.assistant > .bubble-controls { bottom: 0; }
|
|
1901
|
+
|
|
1902
|
+
/* The summarize action, riding the PROMPT bubble beside its copy pill (summarizeButton.ts): above
|
|
1903
|
+
the prose, so the flip resizes only what's below it, and over text the reader already knows rather
|
|
1904
|
+
than the reply they came to read. min-width fits its two labels — near-identical in length by
|
|
1905
|
+
design, so the pill never changes width; the working state doesn't enter into it, since the label
|
|
1906
|
+
holds still and .pill-busy shimmers it. Three states outlive the pointer — working, showing,
|
|
1907
|
+
failed — so each holds the pill visible. */
|
|
1908
|
+
.summarize { min-width: 7.6rem; }
|
|
1909
|
+
.summarize.on, .summarize.err, .summarize.pill-busy { opacity: 1; }
|
|
1910
|
+
.summarize.on { color: var(--accent); border-color: var(--accent); }
|
|
1911
|
+
.summarize.err { color: var(--err); border-color: var(--err); }
|
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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"}
|
|
@@ -20,6 +20,9 @@ export type OllamaRequestPayload = {
|
|
|
20
20
|
model: string;
|
|
21
21
|
messages: ChatMessageDto[];
|
|
22
22
|
stream: boolean;
|
|
23
|
+
stream_options?: {
|
|
24
|
+
include_usage: boolean;
|
|
25
|
+
};
|
|
23
26
|
};
|
|
24
27
|
export declare class OllamaProvider extends ChatCompletionsProvider {
|
|
25
28
|
protected readonly providerName = "Ollama";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../../ai/src/providers/ollama.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AAE9D,+CAA+C;AAC/C,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,cAAc,EAAE,CAAA;IAC1B,MAAM,EAAE,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../../ai/src/providers/ollama.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AAE9D,+CAA+C;AAC/C,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,cAAc,EAAE,CAAA;IAC1B,MAAM,EAAE,OAAO,CAAA;IACf,cAAc,CAAC,EAAE;QAAE,aAAa,EAAE,OAAO,CAAA;KAAE,CAAA;CAC5C,CAAA;AAED,qBAAa,cAAe,SAAQ,uBAAuB;IACzD,SAAS,CAAC,QAAQ,CAAC,YAAY,YAAW;IAQ1C,QAAQ,CAAC,cAAc,4BAA2B;IAClD,QAAQ,CAAC,IAAI,uBAAsB;IAMnC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAcpD,YAAY,CACV,QAAQ,EAAE,cAAc,EAAE,EAC1B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,OAAO,GACd,oBAAoB;CAKxB"}
|
|
@@ -28,8 +28,12 @@ export class OllamaProvider extends ChatCompletionsProvider {
|
|
|
28
28
|
// Web search and the reasoning-effort knob have no equivalent on the OpenAI-compat endpoint,
|
|
29
29
|
// so the payload stays minimal. Ollama-specific options (num_ctx, think, …) are intentionally
|
|
30
30
|
// out of scope for tb.ai — use a server.ts export for those (runtime-specs/TB-Server-Streaming.md).
|
|
31
|
+
// `stream_options.include_usage` is standard Chat Completions (Ollama, vLLM and LM Studio all
|
|
32
|
+
// honor it); an endpoint that ignores it simply reports no usage.
|
|
31
33
|
buildPayload(messages, model, _opts, stream) {
|
|
32
|
-
return
|
|
34
|
+
return stream
|
|
35
|
+
? { model, messages, stream, stream_options: { include_usage: true } }
|
|
36
|
+
: { model, messages, stream };
|
|
33
37
|
}
|
|
34
38
|
}
|
|
35
39
|
//# sourceMappingURL=ollama.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../../ai/src/providers/ollama.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../../ai/src/providers/ollama.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AAU9D,MAAM,OAAO,cAAe,SAAQ,uBAAuB;IAA3D;;QACqB,iBAAY,GAAG,QAAQ,CAAA;QAC1C,gGAAgG;QAChG,gGAAgG;QAChG,iGAAiG;QACjG,gGAAgG;QAChG,4GAA4G;QAC5G,kGAAkG;QAClG,6DAA6D;QACpD,mBAAc,GAAG,wBAAwB,CAAA;QACzC,SAAI,GAAG,mBAAmB,CAAA;IA8BrC,CAAC;IA5BC,oEAAoE;IAEpE,gGAAgG;IAChG,2FAA2F;IAC3F,YAAY,CAAC,MAAc;QACzB,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;YAClC,QAAQ,EAAE,kBAAkB;SAC7B,CAAA;QACD,IAAI,MAAM;YAAE,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,MAAM,EAAE,CAAA;QACzD,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,6FAA6F;IAC7F,8FAA8F;IAC9F,oGAAoG;IACpG,8FAA8F;IAC9F,kEAAkE;IAClE,YAAY,CACV,QAA0B,EAC1B,KAAa,EACb,KAAsB,EACtB,MAAe;QAEf,OAAO,MAAM;YACX,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE;YACtE,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;IACjC,CAAC;CACF"}
|
|
@@ -37,10 +37,21 @@ export interface OpenAIResponseReasoningItem {
|
|
|
37
37
|
summary: Array<OpenAIResponseReasoningSummary>;
|
|
38
38
|
}
|
|
39
39
|
export type OpenAIResponseOutputItem = OpenAIResponseOutputMessage | OpenAIResponseReasoningItem;
|
|
40
|
+
export interface OpenAIUsageDto {
|
|
41
|
+
input_tokens?: number;
|
|
42
|
+
output_tokens?: number;
|
|
43
|
+
input_tokens_details?: {
|
|
44
|
+
cached_tokens?: number;
|
|
45
|
+
};
|
|
46
|
+
output_tokens_details?: {
|
|
47
|
+
reasoning_tokens?: number;
|
|
48
|
+
};
|
|
49
|
+
}
|
|
40
50
|
export interface OpenAIResponsesApiResponseDto extends ProviderResponseDto {
|
|
41
51
|
object: 'response';
|
|
42
52
|
output_text: string;
|
|
43
53
|
output: Array<OpenAIResponseOutputItem>;
|
|
54
|
+
usage?: OpenAIUsageDto;
|
|
44
55
|
}
|
|
45
56
|
interface OpenAIResponseEventBase {
|
|
46
57
|
sequence_number: number;
|
|
@@ -89,6 +100,7 @@ export declare class OpenAIProvider extends AIProvider {
|
|
|
89
100
|
buildPayload(messages: ChatMessageDto[], model: string, opts: ChatRequestOpts, stream: boolean): OpenAIResponsesApiRequestDto;
|
|
90
101
|
parseNonStreamingResponse(json: ProviderResponseDto): ChatResponseDto;
|
|
91
102
|
protected parseProviderStreamChunk(json: ProviderStreamEventDto): ChatStreamPieceDto | null;
|
|
103
|
+
private mapUsage;
|
|
92
104
|
private convertMessagesToInput;
|
|
93
105
|
private isResponsesApiEvent;
|
|
94
106
|
private isResponsesApiResponse;
|