@llumiverse/core 1.2.0 → 1.4.0-dev.20260629.090753Z
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/lib/CompletionStream.d.ts +48 -0
- package/lib/CompletionStream.d.ts.map +1 -0
- package/lib/{esm/CompletionStream.js → CompletionStream.js} +142 -67
- package/lib/CompletionStream.js.map +1 -0
- package/lib/{types/Driver.d.ts → Driver.d.ts} +38 -5
- package/lib/Driver.d.ts.map +1 -0
- package/lib/{esm/Driver.js → Driver.js} +152 -107
- package/lib/Driver.js.map +1 -0
- package/lib/{types/async.d.ts → async.d.ts} +3 -3
- package/lib/async.d.ts.map +1 -0
- package/lib/{esm/async.js → async.js} +4 -4
- package/lib/async.js.map +1 -0
- package/lib/{types/conversation-utils.d.ts → conversation-utils.d.ts} +9 -0
- package/lib/conversation-utils.d.ts.map +1 -0
- package/lib/{esm/conversation-utils.js → conversation-utils.js} +78 -15
- package/lib/conversation-utils.js.map +1 -0
- package/lib/embeddings.d.ts +58 -0
- package/lib/embeddings.d.ts.map +1 -0
- package/lib/embeddings.js +131 -0
- package/lib/embeddings.js.map +1 -0
- package/lib/formatters/commons.d.ts +3 -0
- package/lib/formatters/commons.d.ts.map +1 -0
- package/lib/formatters/commons.js +4 -0
- package/lib/formatters/commons.js.map +1 -0
- package/lib/{types/formatters → formatters}/generic.d.ts +2 -2
- package/lib/formatters/generic.d.ts.map +1 -0
- package/lib/{esm/formatters → formatters}/generic.js +8 -8
- package/lib/formatters/generic.js.map +1 -0
- package/lib/formatters/index.d.ts +4 -0
- package/lib/formatters/index.d.ts.map +1 -0
- package/lib/formatters/index.js +4 -0
- package/lib/formatters/index.js.map +1 -0
- package/lib/{types/formatters → formatters}/nova.d.ts +4 -4
- package/lib/formatters/nova.d.ts.map +1 -0
- package/lib/{esm/formatters → formatters}/nova.js +19 -17
- package/lib/formatters/nova.js.map +1 -0
- package/lib/http-agent.d.ts +53 -0
- package/lib/http-agent.d.ts.map +1 -0
- package/lib/http-agent.js +141 -0
- package/lib/http-agent.js.map +1 -0
- package/lib/index.d.ts +8 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +7 -0
- package/lib/index.js.map +1 -0
- package/lib/{types/json.d.ts → json.d.ts} +1 -1
- package/lib/json.d.ts.map +1 -0
- package/lib/{esm/json.js → json.js} +4 -3
- package/lib/json.js.map +1 -0
- package/lib/logger.d.ts +3 -0
- package/lib/logger.d.ts.map +1 -0
- package/lib/logger.js +42 -0
- package/lib/logger.js.map +1 -0
- package/lib/resolver.d.ts +2 -0
- package/lib/resolver.d.ts.map +1 -0
- package/lib/{esm/resolver.js → resolver.js} +7 -4
- package/lib/resolver.js.map +1 -0
- package/lib/stream.d.ts.map +1 -0
- package/lib/stream.js.map +1 -0
- package/lib/{types/validation.d.ts → validation.d.ts} +1 -1
- package/lib/validation.d.ts.map +1 -0
- package/lib/validation.js +100 -0
- package/lib/validation.js.map +1 -0
- package/package.json +29 -38
- package/src/CompletionStream.ts +208 -115
- package/src/Driver.error.test.ts +101 -72
- package/src/Driver.ts +208 -152
- package/src/async.ts +30 -30
- package/src/conversation-utils.ts +92 -16
- package/src/embeddings.ts +157 -0
- package/src/formatters/commons.ts +2 -2
- package/src/formatters/generic.ts +20 -17
- package/src/formatters/index.ts +3 -3
- package/src/formatters/nova.ts +53 -51
- package/src/http-agent.test.ts +281 -0
- package/src/http-agent.ts +177 -0
- package/src/index.ts +7 -5
- package/src/json.ts +6 -5
- package/src/logger.ts +42 -0
- package/src/resolver.ts +12 -9
- package/src/stream.ts +4 -5
- package/src/validation.ts +42 -29
- package/lib/cjs/CompletionStream.js +0 -293
- package/lib/cjs/CompletionStream.js.map +0 -1
- package/lib/cjs/Driver.js +0 -300
- package/lib/cjs/Driver.js.map +0 -1
- package/lib/cjs/async.js +0 -131
- package/lib/cjs/async.js.map +0 -1
- package/lib/cjs/conversation-utils.js +0 -579
- package/lib/cjs/conversation-utils.js.map +0 -1
- package/lib/cjs/formatters/commons.js +0 -7
- package/lib/cjs/formatters/commons.js.map +0 -1
- package/lib/cjs/formatters/generic.js +0 -59
- package/lib/cjs/formatters/generic.js.map +0 -1
- package/lib/cjs/formatters/index.js +0 -20
- package/lib/cjs/formatters/index.js.map +0 -1
- package/lib/cjs/formatters/nova.js +0 -99
- package/lib/cjs/formatters/nova.js.map +0 -1
- package/lib/cjs/index.js +0 -22
- package/lib/cjs/index.js.map +0 -1
- package/lib/cjs/json.js +0 -29
- package/lib/cjs/json.js.map +0 -1
- package/lib/cjs/package.json +0 -3
- package/lib/cjs/resolver.js +0 -45
- package/lib/cjs/resolver.js.map +0 -1
- package/lib/cjs/stream.js +0 -30
- package/lib/cjs/stream.js.map +0 -1
- package/lib/cjs/validation.js +0 -96
- package/lib/cjs/validation.js.map +0 -1
- package/lib/esm/CompletionStream.js.map +0 -1
- package/lib/esm/Driver.js.map +0 -1
- package/lib/esm/async.js.map +0 -1
- package/lib/esm/conversation-utils.js.map +0 -1
- package/lib/esm/formatters/commons.js +0 -4
- package/lib/esm/formatters/commons.js.map +0 -1
- package/lib/esm/formatters/generic.js.map +0 -1
- package/lib/esm/formatters/index.js +0 -4
- package/lib/esm/formatters/index.js.map +0 -1
- package/lib/esm/formatters/nova.js.map +0 -1
- package/lib/esm/index.js +0 -6
- package/lib/esm/index.js.map +0 -1
- package/lib/esm/json.js.map +0 -1
- package/lib/esm/resolver.js.map +0 -1
- package/lib/esm/stream.js.map +0 -1
- package/lib/esm/validation.js +0 -88
- package/lib/esm/validation.js.map +0 -1
- package/lib/types/CompletionStream.d.ts +0 -20
- package/lib/types/CompletionStream.d.ts.map +0 -1
- package/lib/types/Driver.d.ts.map +0 -1
- package/lib/types/async.d.ts.map +0 -1
- package/lib/types/conversation-utils.d.ts.map +0 -1
- package/lib/types/formatters/commons.d.ts +0 -3
- package/lib/types/formatters/commons.d.ts.map +0 -1
- package/lib/types/formatters/generic.d.ts.map +0 -1
- package/lib/types/formatters/index.d.ts +0 -4
- package/lib/types/formatters/index.d.ts.map +0 -1
- package/lib/types/formatters/nova.d.ts.map +0 -1
- package/lib/types/index.d.ts +0 -6
- package/lib/types/index.d.ts.map +0 -1
- package/lib/types/json.d.ts.map +0 -1
- package/lib/types/resolver.d.ts +0 -2
- package/lib/types/resolver.d.ts.map +0 -1
- package/lib/types/stream.d.ts.map +0 -1
- package/lib/types/validation.d.ts.map +0 -1
- /package/lib/{types/stream.d.ts → stream.d.ts} +0 -0
- /package/lib/{esm/stream.js → stream.js} +0 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { type CompletionStream, type DriverOptions, type ExecutionOptions, type ExecutionResponse, type ToolUse } from '@llumiverse/common';
|
|
2
|
+
import type { AbstractDriver } from './Driver.js';
|
|
3
|
+
type StreamingToolUse = ToolUse<unknown> & {
|
|
4
|
+
_actual_id?: string;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Merge a single streamed `tool_use` fragment into the accumulator map keyed by tool id.
|
|
8
|
+
*
|
|
9
|
+
* Providers stream a tool call across several chunks. Different fields arrive in
|
|
10
|
+
* different chunks and must be reassembled:
|
|
11
|
+
* - `tool_input` arrives as string pieces (concatenated) or partial objects (merged).
|
|
12
|
+
* - `tool_name` and the provider's real id (`_actual_id`) may only appear in a later chunk.
|
|
13
|
+
* - `thought_signature` (Gemini 2.5+/3.x thinking models) is an opaque base64 byte string
|
|
14
|
+
* that must be passed back verbatim with the assistant turn on the next request.
|
|
15
|
+
*
|
|
16
|
+
* Before this helper existed, the inline accumulator merged `tool_input`/`tool_name`/`_actual_id`
|
|
17
|
+
* but silently dropped `thought_signature` for any chunk after the first for a given tool id.
|
|
18
|
+
* When a provider delivers the signature in pieces (large high-effort signatures are split
|
|
19
|
+
* across chunks) or only on a later chunk, the accumulated signature was left truncated or
|
|
20
|
+
* absent — producing an invalid base64 byte value that the provider rejects with a
|
|
21
|
+
* "Base64 decoding failed" (TYPE_BYTES) error when the assistant turn is threaded back.
|
|
22
|
+
*
|
|
23
|
+
* The signature is therefore reassembled by concatenating fragments in arrival order, exactly
|
|
24
|
+
* like `tool_input` string pieces. When the whole signature arrives in a single chunk there is
|
|
25
|
+
* only one fragment, so concatenation is a no-op and the value round-trips byte-identically.
|
|
26
|
+
*
|
|
27
|
+
* Exported for unit testing the round-trip in isolation (no network / no full driver).
|
|
28
|
+
*/
|
|
29
|
+
export declare function accumulateToolUseChunk(accumulatedToolUse: Map<string, StreamingToolUse>, tool: StreamingToolUse): void;
|
|
30
|
+
export declare class DefaultCompletionStream<PromptT = unknown> implements CompletionStream<PromptT> {
|
|
31
|
+
driver: AbstractDriver<DriverOptions, PromptT>;
|
|
32
|
+
prompt: PromptT;
|
|
33
|
+
options: ExecutionOptions;
|
|
34
|
+
chunks: number;
|
|
35
|
+
completion: ExecutionResponse<PromptT> | undefined;
|
|
36
|
+
constructor(driver: AbstractDriver<DriverOptions, PromptT>, prompt: PromptT, options: ExecutionOptions);
|
|
37
|
+
[Symbol.asyncIterator](): AsyncGenerator<string, void, unknown>;
|
|
38
|
+
}
|
|
39
|
+
export declare class FallbackCompletionStream<PromptT = unknown> implements CompletionStream<PromptT> {
|
|
40
|
+
driver: AbstractDriver<DriverOptions, PromptT>;
|
|
41
|
+
prompt: PromptT;
|
|
42
|
+
options: ExecutionOptions;
|
|
43
|
+
completion: ExecutionResponse<PromptT> | undefined;
|
|
44
|
+
constructor(driver: AbstractDriver<DriverOptions, PromptT>, prompt: PromptT, options: ExecutionOptions);
|
|
45
|
+
[Symbol.asyncIterator](): AsyncGenerator<string, void, unknown>;
|
|
46
|
+
}
|
|
47
|
+
export {};
|
|
48
|
+
//# sourceMappingURL=CompletionStream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CompletionStream.d.ts","sourceRoot":"","sources":["../src/CompletionStream.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EAGtB,KAAK,OAAO,EACf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,KAAK,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,sBAAsB,CAClC,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,EACjD,IAAI,EAAE,gBAAgB,GACvB,IAAI,CAqCN;AAED,qBAAa,uBAAuB,CAAC,OAAO,GAAG,OAAO,CAAE,YAAW,gBAAgB,CAAC,OAAO,CAAC;IAK7E,MAAM,EAAE,cAAc,CAAC,aAAa,EAAE,OAAO,CAAC;IAC9C,MAAM,EAAE,OAAO;IACf,OAAO,EAAE,gBAAgB;IANpC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,iBAAiB,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC;gBAGxC,MAAM,EAAE,cAAc,CAAC,aAAa,EAAE,OAAO,CAAC,EAC9C,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,gBAAgB;IAK7B,CAAC,MAAM,CAAC,aAAa,CAAC;CA2PhC;AAED,qBAAa,wBAAwB,CAAC,OAAO,GAAG,OAAO,CAAE,YAAW,gBAAgB,CAAC,OAAO,CAAC;IAI9E,MAAM,EAAE,cAAc,CAAC,aAAa,EAAE,OAAO,CAAC;IAC9C,MAAM,EAAE,OAAO;IACf,OAAO,EAAE,gBAAgB;IALpC,UAAU,EAAE,iBAAiB,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC;gBAGxC,MAAM,EAAE,cAAc,CAAC,aAAa,EAAE,OAAO,CAAC,EAC9C,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,gBAAgB;IAG7B,CAAC,MAAM,CAAC,aAAa,CAAC;CA0ChC"}
|
|
@@ -1,4 +1,67 @@
|
|
|
1
|
-
import { LlumiverseError } from
|
|
1
|
+
import { LlumiverseError, } from '@llumiverse/common';
|
|
2
|
+
/**
|
|
3
|
+
* Merge a single streamed `tool_use` fragment into the accumulator map keyed by tool id.
|
|
4
|
+
*
|
|
5
|
+
* Providers stream a tool call across several chunks. Different fields arrive in
|
|
6
|
+
* different chunks and must be reassembled:
|
|
7
|
+
* - `tool_input` arrives as string pieces (concatenated) or partial objects (merged).
|
|
8
|
+
* - `tool_name` and the provider's real id (`_actual_id`) may only appear in a later chunk.
|
|
9
|
+
* - `thought_signature` (Gemini 2.5+/3.x thinking models) is an opaque base64 byte string
|
|
10
|
+
* that must be passed back verbatim with the assistant turn on the next request.
|
|
11
|
+
*
|
|
12
|
+
* Before this helper existed, the inline accumulator merged `tool_input`/`tool_name`/`_actual_id`
|
|
13
|
+
* but silently dropped `thought_signature` for any chunk after the first for a given tool id.
|
|
14
|
+
* When a provider delivers the signature in pieces (large high-effort signatures are split
|
|
15
|
+
* across chunks) or only on a later chunk, the accumulated signature was left truncated or
|
|
16
|
+
* absent — producing an invalid base64 byte value that the provider rejects with a
|
|
17
|
+
* "Base64 decoding failed" (TYPE_BYTES) error when the assistant turn is threaded back.
|
|
18
|
+
*
|
|
19
|
+
* The signature is therefore reassembled by concatenating fragments in arrival order, exactly
|
|
20
|
+
* like `tool_input` string pieces. When the whole signature arrives in a single chunk there is
|
|
21
|
+
* only one fragment, so concatenation is a no-op and the value round-trips byte-identically.
|
|
22
|
+
*
|
|
23
|
+
* Exported for unit testing the round-trip in isolation (no network / no full driver).
|
|
24
|
+
*/
|
|
25
|
+
export function accumulateToolUseChunk(accumulatedToolUse, tool) {
|
|
26
|
+
const existing = accumulatedToolUse.get(tool.id);
|
|
27
|
+
if (!existing) {
|
|
28
|
+
// New tool call
|
|
29
|
+
accumulatedToolUse.set(tool.id, { ...tool });
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
// Merge tool input (for streaming where arguments come as string pieces)
|
|
33
|
+
if (tool.tool_input !== null && tool.tool_input !== undefined) {
|
|
34
|
+
const existingInput = existing.tool_input;
|
|
35
|
+
const newInput = tool.tool_input;
|
|
36
|
+
if (typeof existingInput === 'string' && typeof newInput === 'string') {
|
|
37
|
+
// Concatenate string arguments
|
|
38
|
+
existing.tool_input = (existingInput + newInput);
|
|
39
|
+
}
|
|
40
|
+
else if (existingInput && typeof existingInput === 'object' && newInput && typeof newInput === 'object') {
|
|
41
|
+
// Merge objects
|
|
42
|
+
existing.tool_input = {
|
|
43
|
+
...existingInput,
|
|
44
|
+
...newInput,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
existing.tool_input = tool.tool_input;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Update tool name if provided (might come in later chunk)
|
|
52
|
+
if (tool.tool_name) {
|
|
53
|
+
existing.tool_name = tool.tool_name;
|
|
54
|
+
}
|
|
55
|
+
// Reassemble the thought signature: concatenate fragments in arrival order so a
|
|
56
|
+
// signature split across chunks is restored byte-for-byte instead of being truncated.
|
|
57
|
+
if (tool.thought_signature) {
|
|
58
|
+
existing.thought_signature = (existing.thought_signature ?? '') + tool.thought_signature;
|
|
59
|
+
}
|
|
60
|
+
// Update actual ID if provided (OpenAI sends id only in first chunk)
|
|
61
|
+
if (tool._actual_id) {
|
|
62
|
+
existing._actual_id = tool._actual_id;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
2
65
|
export class DefaultCompletionStream {
|
|
3
66
|
driver;
|
|
4
67
|
prompt;
|
|
@@ -19,22 +82,34 @@ export class DefaultCompletionStream {
|
|
|
19
82
|
const accumulatedToolUse = new Map(); // Accumulate tool_use by id
|
|
20
83
|
this.driver.logger.debug(`[${this.driver.provider}] Streaming Execution of ${this.options.model} with prompt`);
|
|
21
84
|
const start = Date.now();
|
|
22
|
-
let finish_reason
|
|
85
|
+
let finish_reason;
|
|
23
86
|
let promptTokens = 0;
|
|
24
|
-
let resultTokens
|
|
25
|
-
let promptCachedTokens
|
|
26
|
-
let promptCacheWriteTokens
|
|
27
|
-
let promptNewTokens
|
|
87
|
+
let resultTokens;
|
|
88
|
+
let promptCachedTokens;
|
|
89
|
+
let promptCacheWriteTokens;
|
|
90
|
+
let promptNewTokens;
|
|
91
|
+
const httpScope = this.driver.createExecutionHttpAgentScope(this.options);
|
|
92
|
+
let sourceIterator;
|
|
93
|
+
let streamCompleted = false;
|
|
28
94
|
try {
|
|
29
|
-
const stream = await this.driver.requestTextCompletionStream(this.prompt, this.options);
|
|
30
|
-
|
|
95
|
+
const stream = await httpScope.run(() => this.driver.requestTextCompletionStream(this.prompt, this.options));
|
|
96
|
+
const iterator = stream[Symbol.asyncIterator]();
|
|
97
|
+
sourceIterator = iterator;
|
|
98
|
+
while (true) {
|
|
99
|
+
const next = await httpScope.run(() => iterator.next());
|
|
100
|
+
if (next.done) {
|
|
101
|
+
streamCompleted = true;
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
const chunk = next.value;
|
|
31
105
|
if (chunk) {
|
|
32
106
|
if (typeof chunk === 'string') {
|
|
33
107
|
this.chunks++;
|
|
34
108
|
yield chunk;
|
|
35
109
|
}
|
|
36
110
|
else {
|
|
37
|
-
if (chunk.finish_reason) {
|
|
111
|
+
if (chunk.finish_reason) {
|
|
112
|
+
//Do not replace non-null values with null values
|
|
38
113
|
finish_reason = chunk.finish_reason; //Used to skip empty finish_reason chunks coming after "stop" or "length"
|
|
39
114
|
}
|
|
40
115
|
if (chunk.token_usage) {
|
|
@@ -54,37 +129,7 @@ export class DefaultCompletionStream {
|
|
|
54
129
|
// Note: During streaming, tool_input comes as string chunks that need concatenation
|
|
55
130
|
if (chunk.tool_use && chunk.tool_use.length > 0) {
|
|
56
131
|
for (const tool of chunk.tool_use) {
|
|
57
|
-
|
|
58
|
-
if (existing) {
|
|
59
|
-
// Merge tool input (for streaming where arguments come as string pieces)
|
|
60
|
-
if (tool.tool_input !== null && tool.tool_input !== undefined) {
|
|
61
|
-
const existingInput = existing.tool_input;
|
|
62
|
-
const newInput = tool.tool_input;
|
|
63
|
-
if (typeof existingInput === 'string' && typeof newInput === 'string') {
|
|
64
|
-
// Concatenate string arguments
|
|
65
|
-
existing.tool_input = existingInput + newInput;
|
|
66
|
-
}
|
|
67
|
-
else if (existingInput && typeof existingInput === 'object' && newInput && typeof newInput === 'object') {
|
|
68
|
-
// Merge objects
|
|
69
|
-
existing.tool_input = { ...existingInput, ...newInput };
|
|
70
|
-
}
|
|
71
|
-
else {
|
|
72
|
-
existing.tool_input = tool.tool_input;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
// Update tool name if provided (might come in later chunk)
|
|
76
|
-
if (tool.tool_name) {
|
|
77
|
-
existing.tool_name = tool.tool_name;
|
|
78
|
-
}
|
|
79
|
-
// Update actual ID if provided (OpenAI sends id only in first chunk)
|
|
80
|
-
if (tool._actual_id) {
|
|
81
|
-
existing._actual_id = tool._actual_id;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
else {
|
|
85
|
-
// New tool call
|
|
86
|
-
accumulatedToolUse.set(tool.id, { ...tool });
|
|
87
|
-
}
|
|
132
|
+
accumulateToolUseChunk(accumulatedToolUse, tool);
|
|
88
133
|
}
|
|
89
134
|
}
|
|
90
135
|
if (Array.isArray(chunk.result) && chunk.result.length > 0) {
|
|
@@ -104,15 +149,21 @@ export class DefaultCompletionStream {
|
|
|
104
149
|
try {
|
|
105
150
|
const lastParsed = lastResult.value;
|
|
106
151
|
const currentParsed = result.value;
|
|
107
|
-
if (lastParsed !== null &&
|
|
108
|
-
|
|
152
|
+
if (lastParsed !== null &&
|
|
153
|
+
typeof lastParsed === 'object' &&
|
|
154
|
+
currentParsed !== null &&
|
|
155
|
+
typeof currentParsed === 'object') {
|
|
109
156
|
const combined = { ...lastParsed, ...currentParsed };
|
|
110
157
|
lastResult.value = combined;
|
|
111
158
|
}
|
|
112
159
|
else {
|
|
113
160
|
// If not objects, convert to string and concatenate
|
|
114
|
-
const lastStr = typeof lastParsed === 'string'
|
|
115
|
-
|
|
161
|
+
const lastStr = typeof lastParsed === 'string'
|
|
162
|
+
? lastParsed
|
|
163
|
+
: JSON.stringify(lastParsed);
|
|
164
|
+
const currentStr = typeof currentParsed === 'string'
|
|
165
|
+
? currentParsed
|
|
166
|
+
: JSON.stringify(currentParsed);
|
|
116
167
|
lastResult.value = lastStr + currentStr;
|
|
117
168
|
}
|
|
118
169
|
}
|
|
@@ -129,20 +180,26 @@ export class DefaultCompletionStream {
|
|
|
129
180
|
}
|
|
130
181
|
// Convert CompletionResult[] to string for streaming
|
|
131
182
|
// Only yield if we have results to show
|
|
132
|
-
const resultText = chunk.result
|
|
183
|
+
const resultText = chunk.result
|
|
184
|
+
.map((r) => {
|
|
133
185
|
switch (r.type) {
|
|
134
186
|
case 'text':
|
|
135
187
|
return r.value;
|
|
136
188
|
case 'json':
|
|
137
189
|
return JSON.stringify(r.value);
|
|
138
|
-
case 'image':
|
|
139
|
-
|
|
140
|
-
|
|
190
|
+
case 'image': {
|
|
191
|
+
const truncatedValue = typeof r.value === 'string'
|
|
192
|
+
? r.value.slice(0, 10)
|
|
193
|
+
: String(r.value).slice(0, 10);
|
|
141
194
|
return `\n[Image: ${truncatedValue}...]\n`;
|
|
142
|
-
|
|
143
|
-
|
|
195
|
+
}
|
|
196
|
+
default: {
|
|
197
|
+
const _exhaustive = r;
|
|
198
|
+
return String(_exhaustive);
|
|
199
|
+
}
|
|
144
200
|
}
|
|
145
|
-
})
|
|
201
|
+
})
|
|
202
|
+
.join('');
|
|
146
203
|
if (resultText) {
|
|
147
204
|
this.chunks++;
|
|
148
205
|
yield resultText;
|
|
@@ -163,16 +220,30 @@ export class DefaultCompletionStream {
|
|
|
163
220
|
operation: 'stream',
|
|
164
221
|
});
|
|
165
222
|
}
|
|
223
|
+
finally {
|
|
224
|
+
if (!streamCompleted && sourceIterator?.return) {
|
|
225
|
+
const returnIterator = sourceIterator.return.bind(sourceIterator);
|
|
226
|
+
try {
|
|
227
|
+
await httpScope.run(() => returnIterator());
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
/* stream cleanup best-effort */
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
await httpScope.close();
|
|
234
|
+
}
|
|
166
235
|
// Return undefined only if we never received any token data from the provider.
|
|
167
236
|
// Use !== undefined (not truthiness) because resultTokens === 0 is valid (e.g. empty output with stop).
|
|
168
|
-
const tokens = resultTokens !== undefined
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
237
|
+
const tokens = resultTokens !== undefined
|
|
238
|
+
? {
|
|
239
|
+
prompt: promptTokens,
|
|
240
|
+
result: resultTokens,
|
|
241
|
+
total: resultTokens + promptTokens,
|
|
242
|
+
...(promptCachedTokens != null && { prompt_cached: promptCachedTokens }),
|
|
243
|
+
...(promptCacheWriteTokens != null && { prompt_cache_write: promptCacheWriteTokens }),
|
|
244
|
+
...(promptNewTokens != null && { prompt_new: promptNewTokens }),
|
|
245
|
+
}
|
|
246
|
+
: undefined;
|
|
176
247
|
// Convert accumulated tool_use Map to array
|
|
177
248
|
let toolUseArray = accumulatedToolUse.size > 0 ? Array.from(accumulatedToolUse.values()) : undefined;
|
|
178
249
|
// Finalize tool calls: restore actual IDs and parse JSON arguments
|
|
@@ -200,7 +271,7 @@ export class DefaultCompletionStream {
|
|
|
200
271
|
// If finish_reason is "length" (max_tokens hit), drop truncated tool calls entirely —
|
|
201
272
|
// they were cut off mid-generation and would produce invalid results.
|
|
202
273
|
if (finish_reason === 'length' && truncatedToolIds.size > 0) {
|
|
203
|
-
toolUseArray = toolUseArray.filter(t => !truncatedToolIds.has(t.id));
|
|
274
|
+
toolUseArray = toolUseArray.filter((t) => !truncatedToolIds.has(t.id));
|
|
204
275
|
if (toolUseArray.length === 0) {
|
|
205
276
|
toolUseArray = undefined;
|
|
206
277
|
}
|
|
@@ -208,7 +279,7 @@ export class DefaultCompletionStream {
|
|
|
208
279
|
}
|
|
209
280
|
this.completion = {
|
|
210
281
|
result: accumulatedResults, // Return the accumulated CompletionResult[] instead of text
|
|
211
|
-
prompt: this.prompt,
|
|
282
|
+
prompt: this.driver.formatDebugPrompt(this.prompt),
|
|
212
283
|
execution_time: Date.now() - start,
|
|
213
284
|
token_usage: tokens,
|
|
214
285
|
finish_reason: finish_reason,
|
|
@@ -255,20 +326,24 @@ export class FallbackCompletionStream {
|
|
|
255
326
|
try {
|
|
256
327
|
const completion = await this.driver._execute(this.prompt, this.options);
|
|
257
328
|
// For fallback streaming, yield the text content but keep the original completion
|
|
258
|
-
const content = completion.result
|
|
329
|
+
const content = completion.result
|
|
330
|
+
.map((r) => {
|
|
259
331
|
switch (r.type) {
|
|
260
332
|
case 'text':
|
|
261
333
|
return r.value;
|
|
262
334
|
case 'json':
|
|
263
335
|
return JSON.stringify(r.value);
|
|
264
|
-
case 'image':
|
|
265
|
-
// Show truncated image placeholder for streaming
|
|
336
|
+
case 'image': {
|
|
266
337
|
const truncatedValue = typeof r.value === 'string' ? r.value.slice(0, 10) : String(r.value).slice(0, 10);
|
|
267
338
|
return `[Image: ${truncatedValue}...]`;
|
|
268
|
-
|
|
269
|
-
|
|
339
|
+
}
|
|
340
|
+
default: {
|
|
341
|
+
const _exhaustive = r;
|
|
342
|
+
return String(_exhaustive);
|
|
343
|
+
}
|
|
270
344
|
}
|
|
271
|
-
})
|
|
345
|
+
})
|
|
346
|
+
.join('');
|
|
272
347
|
yield content;
|
|
273
348
|
this.completion = completion; // Return the original completion with untouched CompletionResult[]
|
|
274
349
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CompletionStream.js","sourceRoot":"","sources":["../src/CompletionStream.ts"],"names":[],"mappings":"AAAA,OAAO,EAQH,eAAe,GAElB,MAAM,oBAAoB,CAAC;AAK5B;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,sBAAsB,CAClC,kBAAiD,EACjD,IAAsB;IAEtB,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACZ,gBAAgB;QAChB,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;QAC7C,OAAO;IACX,CAAC;IACD,yEAAyE;IACzE,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QAC5D,MAAM,aAAa,GAAG,QAAQ,CAAC,UAAqB,CAAC;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAqB,CAAC;QAC5C,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACpE,+BAA+B;YAC/B,QAAQ,CAAC,UAAU,GAAG,CAAC,aAAa,GAAG,QAAQ,CAA+B,CAAC;QACnF,CAAC;aAAM,IAAI,aAAa,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACxG,gBAAgB;YAChB,QAAQ,CAAC,UAAU,GAAG;gBAClB,GAAI,aAAyC;gBAC7C,GAAI,QAAoC;aACb,CAAC;QACpC,CAAC;aAAM,CAAC;YACJ,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QAC1C,CAAC;IACL,CAAC;IACD,2DAA2D;IAC3D,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IACxC,CAAC;IACD,gFAAgF;IAChF,sFAAsF;IACtF,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,QAAQ,CAAC,iBAAiB,GAAG,CAAC,QAAQ,CAAC,iBAAiB,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC;IAC7F,CAAC;IACD,qEAAqE;IACrE,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;IAC1C,CAAC;AACL,CAAC;AAED,MAAM,OAAO,uBAAuB;IAKrB;IACA;IACA;IANX,MAAM,CAAS,CAAC,0DAA0D;IAC1E,UAAU,CAAyC;IAEnD,YACW,MAA8C,EAC9C,MAAe,EACf,OAAyB;QAFzB,WAAM,GAAN,MAAM,CAAwC;QAC9C,WAAM,GAAN,MAAM,CAAS;QACf,YAAO,GAAP,OAAO,CAAkB;QAEhC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;QACzB,cAAc;QACd,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAChB,MAAM,kBAAkB,GAAuB,EAAE,CAAC,CAAC,4CAA4C;QAC/F,MAAM,kBAAkB,GAAkC,IAAI,GAAG,EAAE,CAAC,CAAC,4BAA4B;QAEjG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,4BAA4B,IAAI,CAAC,OAAO,CAAC,KAAK,cAAc,CAAC,CAAC;QAE/G,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,IAAI,aAAiC,CAAC;QACtC,IAAI,YAAY,GAAW,CAAC,CAAC;QAC7B,IAAI,YAAgC,CAAC;QACrC,IAAI,kBAAsC,CAAC;QAC3C,IAAI,sBAA0C,CAAC;QAC/C,IAAI,eAAmC,CAAC;QACxC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,6BAA6B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1E,IAAI,cAAgE,CAAC;QACrE,IAAI,eAAe,GAAG,KAAK,CAAC;QAE5B,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,CACpC,IAAI,CAAC,MAAM,CAAC,2BAA2B,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CACrE,CAAC;YACF,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;YAChD,cAAc,GAAG,QAAQ,CAAC;YAC1B,OAAO,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;gBACxD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBACZ,eAAe,GAAG,IAAI,CAAC;oBACvB,MAAM;gBACV,CAAC;gBACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;gBACzB,IAAI,KAAK,EAAE,CAAC;oBACR,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;wBAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;wBACd,MAAM,KAAK,CAAC;oBAChB,CAAC;yBAAM,CAAC;wBACJ,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;4BACtB,iDAAiD;4BACjD,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,yEAAyE;wBAClH,CAAC;wBACD,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;4BACpB,gDAAgD;4BAChD,qCAAqC;4BACrC,8EAA8E;4BAC9E,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,WAAW,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;4BACrE,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;4BAC1E,IAAI,KAAK,CAAC,WAAW,CAAC,aAAa,IAAI,IAAI;gCACvC,kBAAkB,GAAG,KAAK,CAAC,WAAW,CAAC,aAAa,CAAC;4BACzD,IAAI,KAAK,CAAC,WAAW,CAAC,kBAAkB,IAAI,IAAI;gCAC5C,sBAAsB,GAAG,KAAK,CAAC,WAAW,CAAC,kBAAkB,CAAC;4BAClE,IAAI,KAAK,CAAC,WAAW,CAAC,UAAU,IAAI,IAAI;gCAAE,eAAe,GAAG,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC;wBAC7F,CAAC;wBACD,kCAAkC;wBAClC,oFAAoF;wBACpF,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BAC9C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gCAChC,sBAAsB,CAAC,kBAAkB,EAAE,IAAwB,CAAC,CAAC;4BACzE,CAAC;wBACL,CAAC;wBACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BACzD,oEAAoE;4BACpE,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gCAChC,2DAA2D;gCAC3D,MAAM,UAAU,GAAG,kBAAkB,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gCAErE,IACI,UAAU;oCACV,CAAC,CAAC,UAAU,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC;wCACnD,CAAC,UAAU,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,EAC7D,CAAC;oCACC,2CAA2C;oCAC3C,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;wCACzB,UAAU,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC;oCACrC,CAAC;yCAAM,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;wCAChC,gDAAgD;wCAChD,IAAI,CAAC;4CACD,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC;4CACpC,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC;4CACnC,IACI,UAAU,KAAK,IAAI;gDACnB,OAAO,UAAU,KAAK,QAAQ;gDAC9B,aAAa,KAAK,IAAI;gDACtB,OAAO,aAAa,KAAK,QAAQ,EACnC,CAAC;gDACC,MAAM,QAAQ,GAAG,EAAE,GAAG,UAAU,EAAE,GAAG,aAAa,EAAE,CAAC;gDACrD,UAAU,CAAC,KAAK,GAAG,QAAQ,CAAC;4CAChC,CAAC;iDAAM,CAAC;gDACJ,oDAAoD;gDACpD,MAAM,OAAO,GACT,OAAO,UAAU,KAAK,QAAQ;oDAC1B,CAAC,CAAC,UAAU;oDACZ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;gDACrC,MAAM,UAAU,GACZ,OAAO,aAAa,KAAK,QAAQ;oDAC7B,CAAC,CAAC,aAAa;oDACf,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;gDACxC,UAAU,CAAC,KAAK,GAAG,OAAO,GAAG,UAAU,CAAC;4CAC5C,CAAC;wCACL,CAAC;wCAAC,MAAM,CAAC;4CACL,6DAA6D;4CAC7D,UAAU,CAAC,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;wCACvE,CAAC;oCACL,CAAC;gCACL,CAAC;qCAAM,CAAC;oCACJ,oBAAoB;oCACpB,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gCACpC,CAAC;4BACL,CAAC;4BAED,qDAAqD;4BACrD,wCAAwC;4BACxC,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM;iCAC1B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gCACP,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;oCACb,KAAK,MAAM;wCACP,OAAO,CAAC,CAAC,KAAK,CAAC;oCACnB,KAAK,MAAM;wCACP,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;oCACnC,KAAK,OAAO,CAAC,CAAC,CAAC;wCACX,MAAM,cAAc,GAChB,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ;4CACvB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;4CACtB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wCACvC,OAAO,aAAa,cAAc,QAAQ,CAAC;oCAC/C,CAAC;oCACD,OAAO,CAAC,CAAC,CAAC;wCACN,MAAM,WAAW,GAAU,CAAC,CAAC;wCAC7B,OAAO,MAAM,CAAC,WAAW,CAAC,CAAC;oCAC/B,CAAC;gCACL,CAAC;4BACL,CAAC,CAAC;iCACD,IAAI,CAAC,EAAE,CAAC,CAAC;4BAEd,IAAI,UAAU,EAAE,CAAC;gCACb,IAAI,CAAC,MAAM,EAAE,CAAC;gCACd,MAAM,UAAU,CAAC;4BACrB,CAAC;wBACL,CAAC;oBACL,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACtB,0CAA0C;YAC1C,IAAI,eAAe,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3C,MAAM,KAAK,CAAC;YAChB,CAAC;YACD,MAAM,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,KAAK,EAAE;gBAC3C,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAC9B,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;gBACzB,SAAS,EAAE,QAAQ;aACtB,CAAC,CAAC;QACP,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,eAAe,IAAI,cAAc,EAAE,MAAM,EAAE,CAAC;gBAC7C,MAAM,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAClE,IAAI,CAAC;oBACD,MAAM,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC,CAAC;gBAChD,CAAC;gBAAC,MAAM,CAAC;oBACL,gCAAgC;gBACpC,CAAC;YACL,CAAC;YACD,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;QAC5B,CAAC;QAED,+EAA+E;QAC/E,wGAAwG;QACxG,MAAM,MAAM,GACR,YAAY,KAAK,SAAS;YACtB,CAAC,CAAC;gBACI,MAAM,EAAE,YAAY;gBACpB,MAAM,EAAE,YAAY;gBACpB,KAAK,EAAE,YAAY,GAAG,YAAY;gBAClC,GAAG,CAAC,kBAAkB,IAAI,IAAI,IAAI,EAAE,aAAa,EAAE,kBAAkB,EAAE,CAAC;gBACxE,GAAG,CAAC,sBAAsB,IAAI,IAAI,IAAI,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,CAAC;gBACrF,GAAG,CAAC,eAAe,IAAI,IAAI,IAAI,EAAE,UAAU,EAAE,eAAe,EAAE,CAAC;aAClE;YACH,CAAC,CAAC,SAAS,CAAC;QAEpB,4CAA4C;QAC5C,IAAI,YAAY,GAAG,kBAAkB,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAErG,mEAAmE;QACnE,IAAI,YAAY,EAAE,CAAC;YACf,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;YAC3C,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;gBAC9B,4EAA4E;gBAC5E,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;oBAClB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;oBAC1B,OAAO,IAAI,CAAC,UAAU,CAAC;gBAC3B,CAAC;gBACD,0FAA0F;gBAC1F,IAAI,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;oBACtC,IAAI,CAAC;wBACD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBAClD,CAAC;oBAAC,MAAM,CAAC;wBACL,qEAAqE;wBACrE,qFAAqF;wBACrF,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;wBACrB,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBAClC,CAAC;gBACL,CAAC;YACL,CAAC;YAED,sFAAsF;YACtF,sEAAsE;YACtE,IAAI,aAAa,KAAK,QAAQ,IAAI,gBAAgB,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBAC1D,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACvE,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC5B,YAAY,GAAG,SAAS,CAAC;gBAC7B,CAAC;YACL,CAAC;QACL,CAAC;QAED,IAAI,CAAC,UAAU,GAAG;YACd,MAAM,EAAE,kBAAkB,EAAE,4DAA4D;YACxF,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC;YAClD,cAAc,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;YAClC,WAAW,EAAE,MAAM;YACnB,aAAa,EAAE,aAAa;YAC5B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,YAAY;SACzB,CAAC;QAEF,oDAAoD;QACpD,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,0BAA0B,CACvD,IAAI,CAAC,MAAM,EACX,kBAAkB,EAClB,YAAY,EACZ,IAAI,CAAC,OAAO,CACf,CAAC;QACF,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC,UAAU,CAAC,YAAY,GAAG,YAAY,CAAC;QAChD,CAAC;QAED,IAAI,CAAC;YACD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBAClB,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9D,CAAC;QACL,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACtB,0CAA0C;YAC1C,IAAI,eAAe,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3C,MAAM,KAAK,CAAC;YAChB,CAAC;YACD,MAAM,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,KAAK,EAAE;gBAC3C,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAC9B,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;gBACzB,SAAS,EAAE,QAAQ;aACtB,CAAC,CAAC;QACP,CAAC;IACL,CAAC;CACJ;AAED,MAAM,OAAO,wBAAwB;IAItB;IACA;IACA;IALX,UAAU,CAAyC;IAEnD,YACW,MAA8C,EAC9C,MAAe,EACf,OAAyB;QAFzB,WAAM,GAAN,MAAM,CAAwC;QAC9C,WAAM,GAAN,MAAM,CAAS;QACf,YAAO,GAAP,OAAO,CAAkB;IACjC,CAAC;IAEJ,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;QACzB,cAAc;QACd,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CACpB,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,kEAAkE,CAC7F,CAAC;QACF,IAAI,CAAC;YACD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACzE,kFAAkF;YAClF,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM;iBAC5B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACP,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;oBACb,KAAK,MAAM;wBACP,OAAO,CAAC,CAAC,KAAK,CAAC;oBACnB,KAAK,MAAM;wBACP,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;oBACnC,KAAK,OAAO,CAAC,CAAC,CAAC;wBACX,MAAM,cAAc,GAChB,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBACtF,OAAO,WAAW,cAAc,MAAM,CAAC;oBAC3C,CAAC;oBACD,OAAO,CAAC,CAAC,CAAC;wBACN,MAAM,WAAW,GAAU,CAAC,CAAC;wBAC7B,OAAO,MAAM,CAAC,WAAW,CAAC,CAAC;oBAC/B,CAAC;gBACL,CAAC;YACL,CAAC,CAAC;iBACD,IAAI,CAAC,EAAE,CAAC,CAAC;YACd,MAAM,OAAO,CAAC;YACd,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,CAAC,mEAAmE;QACrG,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACtB,0CAA0C;YAC1C,IAAI,eAAe,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3C,MAAM,KAAK,CAAC;YAChB,CAAC;YACD,MAAM,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,KAAK,EAAE;gBAC3C,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAC9B,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;gBACzB,SAAS,EAAE,QAAQ;aACtB,CAAC,CAAC;QACP,CAAC;IACL,CAAC;CACJ"}
|
|
@@ -3,8 +3,10 @@
|
|
|
3
3
|
* Base abstract class is then implemented by each environment
|
|
4
4
|
* (eg: OpenAI, HuggingFace, etc.)
|
|
5
5
|
*/
|
|
6
|
-
import { AIModel, Completion, CompletionChunkObject, CompletionStream, DataSource, DriverOptions, EmbeddingsOptions, EmbeddingsResult, ExecutionOptions, ExecutionResponse, LlumiverseErrorContext, Logger, ModelSearchPayload, PromptOptions, PromptSegment, Providers, TrainingJob, TrainingOptions, TrainingPromptOptions
|
|
7
|
-
|
|
6
|
+
import { type AIModel, type Completion, type CompletionChunkObject, type CompletionStream, type DataSource, type DriverOptions, type EmbeddingsOptions, type EmbeddingsResult, type ExecutionOptions, type ExecutionResponse, LlumiverseError, type LlumiverseErrorContext, type Logger, type ModelSearchPayload, type PromptOptions, type PromptSegment, type Providers, type TrainingJob, type TrainingOptions, type TrainingPromptOptions } from '@llumiverse/common';
|
|
7
|
+
import type { Agent } from 'undici';
|
|
8
|
+
import { type DriverHttpAgentScope } from './http-agent.js';
|
|
9
|
+
export { createLogger } from './logger.js';
|
|
8
10
|
export interface Driver<PromptT = unknown> {
|
|
9
11
|
/**
|
|
10
12
|
*
|
|
@@ -22,6 +24,13 @@ export interface Driver<PromptT = unknown> {
|
|
|
22
24
|
listModels(params?: ModelSearchPayload): Promise<AIModel[]>;
|
|
23
25
|
listTrainableModels(): Promise<AIModel[]>;
|
|
24
26
|
validateConnection(): Promise<boolean>;
|
|
27
|
+
/**
|
|
28
|
+
* Generate embeddings for one or more inputs.
|
|
29
|
+
* Inputs may be text, image, video, or audio depending on the model and
|
|
30
|
+
* provider. Returns one result item per input, each with one or more
|
|
31
|
+
* output vectors (single-vector for text/image, multi-vector for
|
|
32
|
+
* segmented video/audio or joint-multimodal models).
|
|
33
|
+
*/
|
|
25
34
|
generateEmbeddings(options: EmbeddingsOptions): Promise<EmbeddingsResult>;
|
|
26
35
|
/**
|
|
27
36
|
* Optional cleanup method called when the driver is evicted from the cache.
|
|
@@ -36,7 +45,28 @@ export declare abstract class AbstractDriver<OptionsT extends DriverOptions = Dr
|
|
|
36
45
|
options: OptionsT;
|
|
37
46
|
logger: Logger;
|
|
38
47
|
abstract provider: Providers | string;
|
|
48
|
+
private _httpAgent?;
|
|
49
|
+
private _driverFetch?;
|
|
39
50
|
constructor(opts: OptionsT);
|
|
51
|
+
/**
|
|
52
|
+
* Lazily-created undici `Agent` driven by `options.httpTimeout`.
|
|
53
|
+
* Pools sockets for the lifetime of the driver. Subclasses can
|
|
54
|
+
* either pass this directly to an SDK that accepts a `dispatcher`
|
|
55
|
+
* option (rare), or — much more commonly — use {@link getDriverFetch}
|
|
56
|
+
* to get a fetch implementation backed by it.
|
|
57
|
+
*
|
|
58
|
+
* Released via {@link destroy}.
|
|
59
|
+
*/
|
|
60
|
+
protected getHttpAgent(): Agent;
|
|
61
|
+
/**
|
|
62
|
+
* Fetch-compatible function backed by the driver's HTTP agent.
|
|
63
|
+
* Pass to any SDK that accepts a custom `fetch` option (OpenAI,
|
|
64
|
+
* Anthropic, `@google/genai`, Bedrock via Smithy, …) or use as a
|
|
65
|
+
* drop-in replacement for the global `fetch` in drivers that make
|
|
66
|
+
* raw HTTP calls.
|
|
67
|
+
*/
|
|
68
|
+
protected getDriverFetch(): typeof fetch;
|
|
69
|
+
createExecutionHttpAgentScope(options: Pick<ExecutionOptions, 'httpTimeout'>): DriverHttpAgentScope;
|
|
40
70
|
createTrainingPrompt(options: TrainingPromptOptions): Promise<string>;
|
|
41
71
|
startTraining(_dataset: DataSource, _options: TrainingOptions): Promise<TrainingJob>;
|
|
42
72
|
cancelTraining(_jobId: string): Promise<TrainingJob>;
|
|
@@ -44,6 +74,7 @@ export declare abstract class AbstractDriver<OptionsT extends DriverOptions = Dr
|
|
|
44
74
|
validateResult(result: Completion, options: ExecutionOptions): void;
|
|
45
75
|
execute(segments: PromptSegment[], options: ExecutionOptions): Promise<ExecutionResponse<PromptT>>;
|
|
46
76
|
_execute(prompt: PromptT, options: ExecutionOptions): Promise<ExecutionResponse<PromptT>>;
|
|
77
|
+
formatDebugPrompt(prompt: PromptT): PromptT;
|
|
47
78
|
protected isImageModel(_model: string): boolean;
|
|
48
79
|
stream(segments: PromptSegment[], options: ExecutionOptions): Promise<CompletionStream<PromptT>>;
|
|
49
80
|
/**
|
|
@@ -89,8 +120,8 @@ export declare abstract class AbstractDriver<OptionsT extends DriverOptions = Dr
|
|
|
89
120
|
* - Status 429, 408: retryable (rate limit, timeout)
|
|
90
121
|
* - Status 529: retryable (overloaded)
|
|
91
122
|
* - Status 5xx: retryable (server errors)
|
|
92
|
-
* -
|
|
93
|
-
* -
|
|
123
|
+
* - High-confidence transient messages containing "rate limit", "timeout", etc.: retryable
|
|
124
|
+
* - Status 4xx (except above and transient provider quirks): not retryable (client errors)
|
|
94
125
|
*
|
|
95
126
|
* @param error - The error to format
|
|
96
127
|
* @param context - Context about where the error occurred
|
|
@@ -114,7 +145,9 @@ export declare abstract class AbstractDriver<OptionsT extends DriverOptions = Dr
|
|
|
114
145
|
abstract generateEmbeddings(options: EmbeddingsOptions): Promise<EmbeddingsResult>;
|
|
115
146
|
/**
|
|
116
147
|
* Cleanup method called when the driver is evicted from the cache.
|
|
117
|
-
*
|
|
148
|
+
* Releases the lazily-created HTTP agent socket pool. Override this
|
|
149
|
+
* in driver implementations that need to release additional resources
|
|
150
|
+
* — MUST call `super.destroy()` to avoid leaking sockets.
|
|
118
151
|
*/
|
|
119
152
|
destroy(): void;
|
|
120
153
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Driver.d.ts","sourceRoot":"","sources":["../src/Driver.ts"],"names":[],"mappings":"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"}
|