laohuang 0.3.2 → 0.4.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 +142 -16
- package/dist/agent.d.ts +166 -0
- package/dist/agent.js +858 -0
- package/dist/agent.js.map +1 -0
- package/dist/bash-runner.d.ts +79 -0
- package/dist/bash-runner.js +464 -0
- package/dist/bash-runner.js.map +1 -0
- package/dist/cancellation.d.ts +36 -0
- package/dist/cancellation.js +123 -0
- package/dist/cancellation.js.map +1 -0
- package/dist/cli.d.ts +117 -0
- package/dist/cli.js +1307 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +21 -0
- package/dist/client.js +17 -0
- package/dist/client.js.map +1 -0
- package/dist/commands.d.ts +123 -0
- package/dist/commands.js +660 -0
- package/dist/commands.js.map +1 -0
- package/dist/config.d.ts +51 -0
- package/dist/config.js +183 -0
- package/dist/config.js.map +1 -0
- package/dist/credentials.d.ts +12 -0
- package/dist/credentials.js +102 -0
- package/dist/credentials.js.map +1 -0
- package/dist/events.d.ts +288 -0
- package/dist/events.js +838 -0
- package/dist/events.js.map +1 -0
- package/dist/model-adapter.d.ts +138 -0
- package/dist/model-adapter.js +244 -0
- package/dist/model-adapter.js.map +1 -0
- package/dist/model-selection.d.ts +67 -0
- package/dist/model-selection.js +148 -0
- package/dist/model-selection.js.map +1 -0
- package/dist/model-stream.d.ts +128 -0
- package/dist/model-stream.js +582 -0
- package/dist/model-stream.js.map +1 -0
- package/dist/project-instructions.d.ts +99 -0
- package/dist/project-instructions.js +348 -0
- package/dist/project-instructions.js.map +1 -0
- package/dist/providers.d.ts +9 -0
- package/dist/providers.js +26 -0
- package/dist/providers.js.map +1 -0
- package/dist/routing.d.ts +170 -0
- package/dist/routing.js +669 -0
- package/dist/routing.js.map +1 -0
- package/dist/semantic-classifier.d.ts +66 -0
- package/dist/semantic-classifier.js +86 -0
- package/dist/semantic-classifier.js.map +1 -0
- package/dist/session.d.ts +162 -0
- package/dist/session.js +871 -0
- package/dist/session.js.map +1 -0
- package/dist/system-prompt.d.ts +16 -0
- package/dist/system-prompt.js +42 -0
- package/dist/system-prompt.js.map +1 -0
- package/dist/terminal/editor.d.ts +161 -0
- package/dist/terminal/editor.js +1060 -0
- package/dist/terminal/editor.js.map +1 -0
- package/dist/terminal/input.d.ts +61 -0
- package/dist/terminal/input.js +276 -0
- package/dist/terminal/input.js.map +1 -0
- package/dist/terminal/markdown.d.ts +20 -0
- package/dist/terminal/markdown.js +621 -0
- package/dist/terminal/markdown.js.map +1 -0
- package/dist/terminal/screen.d.ts +66 -0
- package/dist/terminal/screen.js +624 -0
- package/dist/terminal/screen.js.map +1 -0
- package/dist/terminal/theme.d.ts +23 -0
- package/dist/terminal/theme.js +101 -0
- package/dist/terminal/theme.js.map +1 -0
- package/dist/terminal/ui.d.ts +285 -0
- package/dist/terminal/ui.js +1815 -0
- package/dist/terminal/ui.js.map +1 -0
- package/dist/tools.d.ts +95 -0
- package/dist/tools.js +444 -0
- package/dist/tools.js.map +1 -0
- package/dist/ui-state.d.ts +51 -0
- package/dist/ui-state.js +194 -0
- package/dist/ui-state.js.map +1 -0
- package/dist/web.d.ts +56 -0
- package/dist/web.js +247 -0
- package/dist/web.js.map +1 -0
- package/package.json +24 -21
- package/bin/laohuang.js +0 -10
- package/lib/launcher.js +0 -133
- package/vendor/laohuangcode-0.3.2-py3-none-any.whl +0 -0
|
@@ -0,0 +1,582 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI-compatible Chat Completions stream assembly and validation.
|
|
3
|
+
*
|
|
4
|
+
* One streamed completion is buffered into a provisional {@link ModelAttempt};
|
|
5
|
+
* the attempt only produces a {@link StreamResult} (the unit the agent commits
|
|
6
|
+
* to history, atomically, per turn) after the whole stream validates. Late
|
|
7
|
+
* deltas for a superseded request are dropped via `isRequestActive`, and a
|
|
8
|
+
* cancelled attempt flushes its partial text for display but never validates,
|
|
9
|
+
* so the caller has nothing to commit.
|
|
10
|
+
*/
|
|
11
|
+
import { randomUUID } from "node:crypto";
|
|
12
|
+
/** Raised when a streamed model response is incomplete or invalid. */
|
|
13
|
+
export class ModelStreamError extends Error {
|
|
14
|
+
/** True when the stream had already delivered deltas before failing. */
|
|
15
|
+
hadDelta;
|
|
16
|
+
constructor(message, options = {}) {
|
|
17
|
+
super(message, options.cause === undefined ? undefined : { cause: options.cause });
|
|
18
|
+
this.name = "ModelStreamError";
|
|
19
|
+
this.hadDelta = options.hadDelta ?? false;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/** Raised when a model stream is cooperatively cancelled. */
|
|
23
|
+
export class ModelStreamCancelled extends ModelStreamError {
|
|
24
|
+
constructor(message, options = {}) {
|
|
25
|
+
super(message, options);
|
|
26
|
+
this.name = "ModelStreamCancelled";
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/** Raised when chunks arrive for a request which is no longer active. */
|
|
30
|
+
export class StaleModelRequest extends ModelStreamCancelled {
|
|
31
|
+
constructor(message, options = {}) {
|
|
32
|
+
super(message, options);
|
|
33
|
+
this.name = "StaleModelRequest";
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/** Chat Completions wire shape for one assistant tool call. */
|
|
37
|
+
export function toolCallToDict(toolCall) {
|
|
38
|
+
return {
|
|
39
|
+
id: toolCall.id,
|
|
40
|
+
type: toolCall.type,
|
|
41
|
+
function: {
|
|
42
|
+
name: toolCall.function.name,
|
|
43
|
+
arguments: toolCall.function.arguments,
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/** Assemble fragmented Chat Completions tool calls by their index. */
|
|
48
|
+
export class ToolCallAccumulator {
|
|
49
|
+
index;
|
|
50
|
+
idParts = [];
|
|
51
|
+
typeParts = [];
|
|
52
|
+
nameParts = [];
|
|
53
|
+
argumentParts = [];
|
|
54
|
+
constructor(index) {
|
|
55
|
+
this.index = index;
|
|
56
|
+
}
|
|
57
|
+
add(fragment) {
|
|
58
|
+
const callId = readField(fragment, "id");
|
|
59
|
+
const callType = readField(fragment, "type");
|
|
60
|
+
const functionField = readField(fragment, "function");
|
|
61
|
+
const name = readField(functionField, "name");
|
|
62
|
+
const argumentFragment = readField(functionField, "arguments");
|
|
63
|
+
if (callId) {
|
|
64
|
+
this.idParts.push(String(callId));
|
|
65
|
+
}
|
|
66
|
+
if (callType && this.typeParts.length === 0) {
|
|
67
|
+
this.typeParts.push(String(callType));
|
|
68
|
+
}
|
|
69
|
+
if (name) {
|
|
70
|
+
this.nameParts.push(String(name));
|
|
71
|
+
}
|
|
72
|
+
if (argumentFragment) {
|
|
73
|
+
this.argumentParts.push(String(argumentFragment));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
build() {
|
|
77
|
+
const callId = this.idParts.join("");
|
|
78
|
+
const callType = this.typeParts.join("") || "function";
|
|
79
|
+
const name = this.nameParts.join("");
|
|
80
|
+
const argumentText = this.argumentParts.join("");
|
|
81
|
+
if (!callId) {
|
|
82
|
+
throw new ModelStreamError(`Tool call at index ${this.index} has no id`);
|
|
83
|
+
}
|
|
84
|
+
if (callType !== "function") {
|
|
85
|
+
throw new ModelStreamError(`Unsupported tool call type at index ${this.index}: ${callType}`);
|
|
86
|
+
}
|
|
87
|
+
if (!name) {
|
|
88
|
+
throw new ModelStreamError(`Tool call at index ${this.index} has no function name`);
|
|
89
|
+
}
|
|
90
|
+
let decoded;
|
|
91
|
+
try {
|
|
92
|
+
decoded = JSON.parse(argumentText);
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
throw new ModelStreamError(`Invalid JSON arguments for tool ${name}: ${errorMessage(error)}`, { cause: error });
|
|
96
|
+
}
|
|
97
|
+
if (typeof decoded !== "object" || decoded === null || Array.isArray(decoded)) {
|
|
98
|
+
throw new ModelStreamError(`Arguments for tool ${name} must be a JSON object`);
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
id: callId,
|
|
102
|
+
type: callType,
|
|
103
|
+
function: { name, arguments: argumentText },
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/** A fully validated assistant turn, ready to commit to history. */
|
|
108
|
+
export class StreamResult {
|
|
109
|
+
requestId;
|
|
110
|
+
content;
|
|
111
|
+
reasoningContent;
|
|
112
|
+
toolCalls;
|
|
113
|
+
finishReason;
|
|
114
|
+
usage;
|
|
115
|
+
constructor(init) {
|
|
116
|
+
this.requestId = init.requestId;
|
|
117
|
+
this.content = init.content;
|
|
118
|
+
this.reasoningContent = init.reasoningContent;
|
|
119
|
+
this.toolCalls = init.toolCalls;
|
|
120
|
+
this.finishReason = init.finishReason;
|
|
121
|
+
this.usage = init.usage ?? null;
|
|
122
|
+
}
|
|
123
|
+
/** Assistant message in Chat Completions wire shape (nulls stripped). */
|
|
124
|
+
messageDict() {
|
|
125
|
+
const message = {
|
|
126
|
+
role: "assistant",
|
|
127
|
+
content: this.content,
|
|
128
|
+
};
|
|
129
|
+
if (this.reasoningContent) {
|
|
130
|
+
message["reasoning_content"] = this.reasoningContent;
|
|
131
|
+
}
|
|
132
|
+
if (this.toolCalls.length > 0) {
|
|
133
|
+
message["tool_calls"] = this.toolCalls.map(toolCallToDict);
|
|
134
|
+
}
|
|
135
|
+
for (const key of Object.keys(message)) {
|
|
136
|
+
if (message[key] === null || message[key] === undefined) {
|
|
137
|
+
delete message[key];
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return message;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/** A provisional response which can be atomically committed after validation. */
|
|
144
|
+
export class ModelAttempt {
|
|
145
|
+
requestId;
|
|
146
|
+
contentParts = [];
|
|
147
|
+
reasoningParts = [];
|
|
148
|
+
toolCalls = new Map();
|
|
149
|
+
finishReason = null;
|
|
150
|
+
usage = null;
|
|
151
|
+
receivedDelta = false;
|
|
152
|
+
state = "provisional";
|
|
153
|
+
constructor(requestId) {
|
|
154
|
+
this.requestId = requestId;
|
|
155
|
+
}
|
|
156
|
+
get content() {
|
|
157
|
+
return this.contentParts.join("");
|
|
158
|
+
}
|
|
159
|
+
get reasoningContent() {
|
|
160
|
+
return this.reasoningParts.join("");
|
|
161
|
+
}
|
|
162
|
+
addChoice(choice) {
|
|
163
|
+
if (this.state !== "provisional") {
|
|
164
|
+
throw new ModelStreamError("Cannot append to a finished model attempt");
|
|
165
|
+
}
|
|
166
|
+
const events = [];
|
|
167
|
+
const delta = readField(choice, "delta");
|
|
168
|
+
if (delta !== null && delta !== undefined) {
|
|
169
|
+
this.receivedDelta = true;
|
|
170
|
+
const content = readField(delta, "content");
|
|
171
|
+
if (content) {
|
|
172
|
+
const text = String(content);
|
|
173
|
+
this.contentParts.push(text);
|
|
174
|
+
events.push({ kind: "model_text_delta", payload: { text } });
|
|
175
|
+
}
|
|
176
|
+
const reasoning = readField(delta, "reasoning_content");
|
|
177
|
+
if (reasoning) {
|
|
178
|
+
const text = String(reasoning);
|
|
179
|
+
this.reasoningParts.push(text);
|
|
180
|
+
events.push({ kind: "model_reasoning_delta", payload: { text } });
|
|
181
|
+
}
|
|
182
|
+
const fragments = readField(delta, "tool_calls");
|
|
183
|
+
const fragmentList = Array.isArray(fragments) ? fragments : [];
|
|
184
|
+
fragmentList.forEach((fragment, fallbackIndex) => {
|
|
185
|
+
const rawIndex = readField(fragment, "index");
|
|
186
|
+
const index = rawIndex === null || rawIndex === undefined
|
|
187
|
+
? fallbackIndex
|
|
188
|
+
: Number(rawIndex);
|
|
189
|
+
let accumulator = this.toolCalls.get(index);
|
|
190
|
+
if (!accumulator) {
|
|
191
|
+
accumulator = new ToolCallAccumulator(index);
|
|
192
|
+
this.toolCalls.set(index, accumulator);
|
|
193
|
+
}
|
|
194
|
+
accumulator.add(fragment);
|
|
195
|
+
const functionField = readField(fragment, "function");
|
|
196
|
+
events.push({
|
|
197
|
+
kind: "model_tool_call_delta",
|
|
198
|
+
payload: {
|
|
199
|
+
index,
|
|
200
|
+
id: readField(fragment, "id") ?? null,
|
|
201
|
+
name: readField(functionField, "name") ?? null,
|
|
202
|
+
arguments: readField(functionField, "arguments") ?? null,
|
|
203
|
+
},
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
const finishReason = readField(choice, "finish_reason");
|
|
208
|
+
if (finishReason !== null && finishReason !== undefined) {
|
|
209
|
+
const normalized = String(finishReason);
|
|
210
|
+
if (this.finishReason !== null && this.finishReason !== normalized) {
|
|
211
|
+
throw new ModelStreamError("Model stream returned conflicting finish reasons");
|
|
212
|
+
}
|
|
213
|
+
this.finishReason = normalized;
|
|
214
|
+
}
|
|
215
|
+
return events;
|
|
216
|
+
}
|
|
217
|
+
validate() {
|
|
218
|
+
if (this.state !== "provisional") {
|
|
219
|
+
throw new ModelStreamError("Model attempt has already finished");
|
|
220
|
+
}
|
|
221
|
+
const finishReason = this.finishReason;
|
|
222
|
+
if (finishReason === "length" ||
|
|
223
|
+
finishReason === "content_filter" ||
|
|
224
|
+
finishReason === "insufficient_system_resource") {
|
|
225
|
+
this.state = "aborted";
|
|
226
|
+
throw new ModelStreamError(`Model response aborted with finish_reason=${finishReason}`);
|
|
227
|
+
}
|
|
228
|
+
if (finishReason !== "stop" && finishReason !== "tool_calls") {
|
|
229
|
+
this.state = "aborted";
|
|
230
|
+
if (finishReason === null) {
|
|
231
|
+
throw new ModelStreamError("Model stream ended without a finish reason");
|
|
232
|
+
}
|
|
233
|
+
throw new ModelStreamError(`Unsupported model finish reason: ${finishReason}`);
|
|
234
|
+
}
|
|
235
|
+
let calls;
|
|
236
|
+
try {
|
|
237
|
+
calls = [...this.toolCalls.entries()]
|
|
238
|
+
.sort(([left], [right]) => left - right)
|
|
239
|
+
.map(([, accumulator]) => accumulator.build());
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
if (error instanceof ModelStreamError) {
|
|
243
|
+
this.state = "aborted";
|
|
244
|
+
}
|
|
245
|
+
throw error;
|
|
246
|
+
}
|
|
247
|
+
const content = this.content || null;
|
|
248
|
+
const reasoning = this.reasoningContent || null;
|
|
249
|
+
if (finishReason === "tool_calls" && calls.length === 0) {
|
|
250
|
+
this.state = "aborted";
|
|
251
|
+
throw new ModelStreamError("Model finished with tool_calls but supplied no tool calls");
|
|
252
|
+
}
|
|
253
|
+
if (finishReason === "stop" && calls.length > 0) {
|
|
254
|
+
this.state = "aborted";
|
|
255
|
+
throw new ModelStreamError("Model supplied tool calls with finish_reason=stop");
|
|
256
|
+
}
|
|
257
|
+
if (calls.length === 0 && !content) {
|
|
258
|
+
this.state = "aborted";
|
|
259
|
+
throw new ModelStreamError("Model returned neither text nor tool calls");
|
|
260
|
+
}
|
|
261
|
+
this.state = "validated";
|
|
262
|
+
return new StreamResult({
|
|
263
|
+
requestId: this.requestId,
|
|
264
|
+
content,
|
|
265
|
+
reasoningContent: reasoning,
|
|
266
|
+
toolCalls: calls,
|
|
267
|
+
finishReason,
|
|
268
|
+
usage: this.usage,
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
abort() {
|
|
272
|
+
if (this.state === "provisional") {
|
|
273
|
+
this.state = "aborted";
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
/** Emit model text at most every 40ms or once 4KB is accumulated. */
|
|
278
|
+
class TextDeltaCoalescer {
|
|
279
|
+
callback;
|
|
280
|
+
intervalMs;
|
|
281
|
+
maxChars;
|
|
282
|
+
parts = [];
|
|
283
|
+
chars = 0;
|
|
284
|
+
requestId = "";
|
|
285
|
+
lastFlush = performance.now();
|
|
286
|
+
constructor(callback, options = {}) {
|
|
287
|
+
this.callback = callback;
|
|
288
|
+
this.intervalMs = options.intervalMs ?? 40;
|
|
289
|
+
this.maxChars = options.maxChars ?? 4096;
|
|
290
|
+
}
|
|
291
|
+
emit(kind, payload) {
|
|
292
|
+
if (this.callback === null) {
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
if (kind !== "model_text_delta") {
|
|
296
|
+
this.flush();
|
|
297
|
+
this.callback(kind, payload);
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
const text = payload["text"];
|
|
301
|
+
if (typeof text !== "string" || !text) {
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
this.requestId = String(payload["request_id"] ?? "");
|
|
305
|
+
this.parts.push(text);
|
|
306
|
+
this.chars += text.length;
|
|
307
|
+
if (this.chars >= this.maxChars ||
|
|
308
|
+
performance.now() - this.lastFlush >= this.intervalMs) {
|
|
309
|
+
this.flush();
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
flushIfDue() {
|
|
313
|
+
if (this.parts.length > 0 &&
|
|
314
|
+
performance.now() - this.lastFlush >= this.intervalMs) {
|
|
315
|
+
this.flush();
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
flush() {
|
|
319
|
+
if (this.callback === null || this.parts.length === 0) {
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
const text = this.parts.join("");
|
|
323
|
+
this.parts = [];
|
|
324
|
+
this.chars = 0;
|
|
325
|
+
this.lastFlush = performance.now();
|
|
326
|
+
for (let offset = 0; offset < text.length; offset += this.maxChars) {
|
|
327
|
+
this.callback("model_text_delta", {
|
|
328
|
+
request_id: this.requestId,
|
|
329
|
+
text: text.slice(offset, offset + this.maxChars),
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
/** Create and assemble one OpenAI-compatible streaming completion. */
|
|
335
|
+
export class ChatCompletionStreamer {
|
|
336
|
+
completions;
|
|
337
|
+
constructor(completions) {
|
|
338
|
+
this.completions = completions;
|
|
339
|
+
}
|
|
340
|
+
async complete(options) {
|
|
341
|
+
const requestId = options.requestId ?? randomUUID();
|
|
342
|
+
const cancelToken = options.cancelToken ?? null;
|
|
343
|
+
const isRequestActive = options.isRequestActive ?? null;
|
|
344
|
+
const onDelta = options.onDelta ?? null;
|
|
345
|
+
const maxPreDeltaRetries = options.maxPreDeltaRetries ?? 1;
|
|
346
|
+
const request = {
|
|
347
|
+
model: options.model,
|
|
348
|
+
messages: options.messages,
|
|
349
|
+
tools: options.tools,
|
|
350
|
+
stream: true,
|
|
351
|
+
stream_options: { include_usage: true },
|
|
352
|
+
};
|
|
353
|
+
if (options.toolChoice !== null && options.toolChoice !== undefined) {
|
|
354
|
+
request["tool_choice"] = options.toolChoice;
|
|
355
|
+
}
|
|
356
|
+
if (options.extraBody) {
|
|
357
|
+
Object.assign(request, options.extraBody);
|
|
358
|
+
}
|
|
359
|
+
let lastError = null;
|
|
360
|
+
for (let retry = 0; retry <= maxPreDeltaRetries; retry += 1) {
|
|
361
|
+
const attempt = new ModelAttempt(requestId);
|
|
362
|
+
const deltas = new TextDeltaCoalescer(onDelta);
|
|
363
|
+
let stream = null;
|
|
364
|
+
let unregisterCancel = () => { };
|
|
365
|
+
try {
|
|
366
|
+
ensureActive(cancelToken, isRequestActive, requestId);
|
|
367
|
+
stream = await this.completions.create(request);
|
|
368
|
+
if (options.onRequestOpened != null &&
|
|
369
|
+
options.onRequestOpened() === false) {
|
|
370
|
+
closeStream(stream);
|
|
371
|
+
throw new ModelStreamCancelled("cancelled before model request acknowledgement");
|
|
372
|
+
}
|
|
373
|
+
if (isNonStreamResponse(stream)) {
|
|
374
|
+
const result = ChatCompletionStreamer.fromNonStream(stream, requestId);
|
|
375
|
+
ensureActive(cancelToken, isRequestActive, requestId);
|
|
376
|
+
if (result.content) {
|
|
377
|
+
deltas.emit("model_text_delta", {
|
|
378
|
+
request_id: requestId,
|
|
379
|
+
text: result.content,
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
if (result.reasoningContent) {
|
|
383
|
+
deltas.emit("model_reasoning_delta", {
|
|
384
|
+
request_id: requestId,
|
|
385
|
+
text: result.reasoningContent,
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
deltas.flush();
|
|
389
|
+
onDelta?.("model_response_validating", { request_id: requestId });
|
|
390
|
+
return result;
|
|
391
|
+
}
|
|
392
|
+
if (!isIterable(stream)) {
|
|
393
|
+
throw new ModelStreamError("Model returned a non-iterable stream");
|
|
394
|
+
}
|
|
395
|
+
if (cancelToken !== null) {
|
|
396
|
+
unregisterCancel = cancelToken.register(() => {
|
|
397
|
+
closeStream(stream);
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
for await (const chunk of stream) {
|
|
401
|
+
ensureActive(cancelToken, isRequestActive, requestId);
|
|
402
|
+
const rawChoices = readField(chunk, "choices");
|
|
403
|
+
const choices = Array.isArray(rawChoices) ? rawChoices : [];
|
|
404
|
+
const usage = readField(chunk, "usage");
|
|
405
|
+
if (usage !== null && usage !== undefined) {
|
|
406
|
+
attempt.usage = dump(usage);
|
|
407
|
+
}
|
|
408
|
+
if (choices.length === 0) {
|
|
409
|
+
continue;
|
|
410
|
+
}
|
|
411
|
+
for (const choice of choices) {
|
|
412
|
+
for (const event of attempt.addChoice(choice)) {
|
|
413
|
+
deltas.emit(event.kind, {
|
|
414
|
+
request_id: requestId,
|
|
415
|
+
...event.payload,
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
deltas.flushIfDue();
|
|
420
|
+
}
|
|
421
|
+
ensureActive(cancelToken, isRequestActive, requestId);
|
|
422
|
+
deltas.flush();
|
|
423
|
+
onDelta?.("model_response_validating", { request_id: requestId });
|
|
424
|
+
return attempt.validate();
|
|
425
|
+
}
|
|
426
|
+
catch (error) {
|
|
427
|
+
deltas.flush();
|
|
428
|
+
attempt.abort();
|
|
429
|
+
closeStream(stream);
|
|
430
|
+
if (error instanceof ModelStreamCancelled) {
|
|
431
|
+
// Covers StaleModelRequest as well; never retried.
|
|
432
|
+
throw error;
|
|
433
|
+
}
|
|
434
|
+
if (cancelToken !== null && cancelToken.isCancelled()) {
|
|
435
|
+
throw new ModelStreamCancelled(cancelToken.reason || "cancelled", {
|
|
436
|
+
cause: error,
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
if (isRequestActive !== null && !isRequestActive(requestId)) {
|
|
440
|
+
throw new StaleModelRequest(`Stale model request: ${requestId}`, {
|
|
441
|
+
cause: error,
|
|
442
|
+
});
|
|
443
|
+
}
|
|
444
|
+
if (attempt.receivedDelta || retry >= maxPreDeltaRetries) {
|
|
445
|
+
if (error instanceof ModelStreamError) {
|
|
446
|
+
error.hadDelta = attempt.receivedDelta;
|
|
447
|
+
throw error;
|
|
448
|
+
}
|
|
449
|
+
throw new ModelStreamError(errorMessage(error), {
|
|
450
|
+
hadDelta: attempt.receivedDelta,
|
|
451
|
+
cause: error,
|
|
452
|
+
});
|
|
453
|
+
}
|
|
454
|
+
// Failure before the first delta: safe to retry transparently.
|
|
455
|
+
lastError = error;
|
|
456
|
+
}
|
|
457
|
+
finally {
|
|
458
|
+
unregisterCancel();
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
throw new ModelStreamError(errorMessage(lastError), { cause: lastError });
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* Compatibility path for fake clients and OpenAI-compatible endpoints
|
|
465
|
+
* which answer a streaming request with a plain completion object.
|
|
466
|
+
*/
|
|
467
|
+
static fromNonStream(response, requestId) {
|
|
468
|
+
const rawChoices = readField(response, "choices");
|
|
469
|
+
const choices = Array.isArray(rawChoices) ? rawChoices : [];
|
|
470
|
+
if (choices.length === 0) {
|
|
471
|
+
throw new ModelStreamError("Model returned no choices");
|
|
472
|
+
}
|
|
473
|
+
const choice = choices[0];
|
|
474
|
+
const message = readField(choice, "message");
|
|
475
|
+
if (message === null || message === undefined) {
|
|
476
|
+
throw new ModelStreamError("Model response has no message");
|
|
477
|
+
}
|
|
478
|
+
const rawToolCalls = readField(message, "tool_calls");
|
|
479
|
+
const toolCalls = Array.isArray(rawToolCalls) ? rawToolCalls : [];
|
|
480
|
+
const content = readField(message, "content") ?? null;
|
|
481
|
+
const reasoning = readField(message, "reasoning_content") ?? null;
|
|
482
|
+
let finishReason = readField(choice, "finish_reason");
|
|
483
|
+
if (finishReason === null || finishReason === undefined) {
|
|
484
|
+
finishReason = toolCalls.length > 0 ? "tool_calls" : "stop";
|
|
485
|
+
}
|
|
486
|
+
const attempt = new ModelAttempt(requestId);
|
|
487
|
+
if (content) {
|
|
488
|
+
attempt.contentParts.push(String(content));
|
|
489
|
+
}
|
|
490
|
+
if (reasoning) {
|
|
491
|
+
attempt.reasoningParts.push(String(reasoning));
|
|
492
|
+
}
|
|
493
|
+
toolCalls.forEach((call, index) => {
|
|
494
|
+
const accumulator = new ToolCallAccumulator(index);
|
|
495
|
+
accumulator.add(call);
|
|
496
|
+
attempt.toolCalls.set(index, accumulator);
|
|
497
|
+
});
|
|
498
|
+
attempt.finishReason = String(finishReason);
|
|
499
|
+
attempt.usage = dump(readField(response, "usage"));
|
|
500
|
+
return attempt.validate();
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
/** Read a property off SDK objects or plain fakes; null-safe. */
|
|
504
|
+
function readField(value, key) {
|
|
505
|
+
if (value === null || value === undefined) {
|
|
506
|
+
return undefined;
|
|
507
|
+
}
|
|
508
|
+
if (typeof value === "object" || typeof value === "function") {
|
|
509
|
+
return value[key];
|
|
510
|
+
}
|
|
511
|
+
return undefined;
|
|
512
|
+
}
|
|
513
|
+
/** Snapshot SDK usage objects into plain data. */
|
|
514
|
+
function dump(value) {
|
|
515
|
+
if (value === null || value === undefined) {
|
|
516
|
+
return null;
|
|
517
|
+
}
|
|
518
|
+
if (typeof value === "object") {
|
|
519
|
+
const modelDump = value["model_dump"];
|
|
520
|
+
if (typeof modelDump === "function") {
|
|
521
|
+
return modelDump.call(value);
|
|
522
|
+
}
|
|
523
|
+
if (!Array.isArray(value)) {
|
|
524
|
+
return { ...value };
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
return value;
|
|
528
|
+
}
|
|
529
|
+
function isNonStreamResponse(response) {
|
|
530
|
+
const choices = readField(response, "choices");
|
|
531
|
+
return (Array.isArray(choices) &&
|
|
532
|
+
choices.length > 0 &&
|
|
533
|
+
readField(choices[0], "message") != null);
|
|
534
|
+
}
|
|
535
|
+
function isIterable(value) {
|
|
536
|
+
if (value === null || value === undefined) {
|
|
537
|
+
return false;
|
|
538
|
+
}
|
|
539
|
+
const record = value;
|
|
540
|
+
return (typeof record[Symbol.asyncIterator] === "function" ||
|
|
541
|
+
typeof record[Symbol.iterator] === "function");
|
|
542
|
+
}
|
|
543
|
+
function ensureActive(cancelToken, isRequestActive, requestId) {
|
|
544
|
+
if (cancelToken !== null && cancelToken.isCancelled()) {
|
|
545
|
+
throw new ModelStreamCancelled(cancelToken.reason || "cancelled");
|
|
546
|
+
}
|
|
547
|
+
if (isRequestActive !== null && !isRequestActive(requestId)) {
|
|
548
|
+
throw new StaleModelRequest(`Stale model request: ${requestId}`);
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
/** Close a fake stream or abort an openai SDK stream; never throws. */
|
|
552
|
+
function closeStream(stream) {
|
|
553
|
+
if (stream === null || stream === undefined) {
|
|
554
|
+
return;
|
|
555
|
+
}
|
|
556
|
+
const close = readField(stream, "close");
|
|
557
|
+
if (typeof close === "function") {
|
|
558
|
+
try {
|
|
559
|
+
close.call(stream);
|
|
560
|
+
}
|
|
561
|
+
catch {
|
|
562
|
+
// Best-effort cleanup only.
|
|
563
|
+
}
|
|
564
|
+
return;
|
|
565
|
+
}
|
|
566
|
+
const controller = readField(stream, "controller");
|
|
567
|
+
if (controller instanceof AbortController) {
|
|
568
|
+
try {
|
|
569
|
+
controller.abort();
|
|
570
|
+
}
|
|
571
|
+
catch {
|
|
572
|
+
// Best-effort cleanup only.
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
function errorMessage(error) {
|
|
577
|
+
if (error instanceof Error) {
|
|
578
|
+
return error.message;
|
|
579
|
+
}
|
|
580
|
+
return String(error);
|
|
581
|
+
}
|
|
582
|
+
//# sourceMappingURL=model-stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-stream.js","sourceRoot":"","sources":["../src/model-stream.ts"],"names":[],"mappings":"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"}
|