@langchain/core 1.1.42 → 1.1.43-dev-1777615538778
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 +1 -1
- package/dist/callbacks/base.cjs +5 -0
- package/dist/callbacks/base.cjs.map +1 -1
- package/dist/callbacks/base.d.cts +20 -1
- package/dist/callbacks/base.d.cts.map +1 -1
- package/dist/callbacks/base.d.ts +20 -1
- package/dist/callbacks/base.d.ts.map +1 -1
- package/dist/callbacks/base.js +5 -1
- package/dist/callbacks/base.js.map +1 -1
- package/dist/callbacks/manager.cjs +10 -0
- package/dist/callbacks/manager.cjs.map +1 -1
- package/dist/callbacks/manager.d.cts +2 -0
- package/dist/callbacks/manager.d.cts.map +1 -1
- package/dist/callbacks/manager.d.ts +2 -0
- package/dist/callbacks/manager.d.ts.map +1 -1
- package/dist/callbacks/manager.js +10 -0
- package/dist/callbacks/manager.js.map +1 -1
- package/dist/language_models/base.cjs +1 -1
- package/dist/language_models/base.cjs.map +1 -1
- package/dist/language_models/base.js +1 -1
- package/dist/language_models/base.js.map +1 -1
- package/dist/language_models/chat_models.cjs +103 -1
- package/dist/language_models/chat_models.cjs.map +1 -1
- package/dist/language_models/chat_models.d.cts +55 -0
- package/dist/language_models/chat_models.d.cts.map +1 -1
- package/dist/language_models/chat_models.d.ts +55 -0
- package/dist/language_models/chat_models.d.ts.map +1 -1
- package/dist/language_models/chat_models.js +104 -2
- package/dist/language_models/chat_models.js.map +1 -1
- package/dist/language_models/compat.cjs +399 -0
- package/dist/language_models/compat.cjs.map +1 -0
- package/dist/language_models/compat.d.cts +20 -0
- package/dist/language_models/compat.d.cts.map +1 -0
- package/dist/language_models/compat.d.ts +20 -0
- package/dist/language_models/compat.d.ts.map +1 -0
- package/dist/language_models/compat.js +391 -0
- package/dist/language_models/compat.js.map +1 -0
- package/dist/language_models/event.cjs +12 -0
- package/dist/language_models/event.cjs.map +1 -0
- package/dist/language_models/event.d.cts +185 -0
- package/dist/language_models/event.d.cts.map +1 -0
- package/dist/language_models/event.d.ts +185 -0
- package/dist/language_models/event.d.ts.map +1 -0
- package/dist/language_models/event.js +7 -0
- package/dist/language_models/event.js.map +1 -0
- package/dist/language_models/stream.cjs +488 -0
- package/dist/language_models/stream.cjs.map +1 -0
- package/dist/language_models/stream.d.cts +106 -0
- package/dist/language_models/stream.d.cts.map +1 -0
- package/dist/language_models/stream.d.ts +106 -0
- package/dist/language_models/stream.d.ts.map +1 -0
- package/dist/language_models/stream.js +477 -0
- package/dist/language_models/stream.js.map +1 -0
- package/dist/load/import_map.cjs +6 -0
- package/dist/load/import_map.cjs.map +1 -1
- package/dist/load/import_map.js +8 -2
- package/dist/load/import_map.js.map +1 -1
- package/dist/load/map_keys.cjs +2 -2
- package/dist/messages/ai.cjs +11 -8
- package/dist/messages/ai.cjs.map +1 -1
- package/dist/messages/ai.d.cts.map +1 -1
- package/dist/messages/ai.d.ts.map +1 -1
- package/dist/messages/ai.js +11 -8
- package/dist/messages/ai.js.map +1 -1
- package/dist/messages/content/index.cjs.map +1 -1
- package/dist/messages/content/index.d.cts +5 -1
- package/dist/messages/content/index.d.cts.map +1 -1
- package/dist/messages/content/index.d.ts +5 -1
- package/dist/messages/content/index.d.ts.map +1 -1
- package/dist/messages/content/index.js.map +1 -1
- package/dist/messages/index.d.cts +2 -2
- package/dist/messages/index.d.ts +2 -2
- package/dist/output_parsers/openai_functions/json_output_functions_parsers.d.cts +1 -1
- package/dist/output_parsers/openai_functions/json_output_functions_parsers.d.ts +1 -1
- package/dist/prompts/template.cjs +1 -1
- package/dist/singletons/callbacks.cjs +1 -1
- package/dist/tracers/console.cjs +1 -1
- package/dist/types/type-utils.d.cts +2 -1
- package/dist/types/type-utils.d.cts.map +1 -1
- package/dist/types/type-utils.d.ts +2 -1
- package/dist/types/type-utils.d.ts.map +1 -1
- package/dist/utils/async_caller.cjs +3 -2
- package/dist/utils/async_caller.cjs.map +1 -1
- package/dist/utils/async_caller.js +2 -1
- package/dist/utils/async_caller.js.map +1 -1
- package/dist/utils/event_source_parse.cjs +5 -12
- package/dist/utils/event_source_parse.cjs.map +1 -1
- package/dist/utils/event_source_parse.js +5 -12
- package/dist/utils/event_source_parse.js.map +1 -1
- package/dist/utils/uuid/max.d.cts +1 -1
- package/dist/utils/uuid/max.d.ts +1 -1
- package/dist/utils/uuid/nil.d.cts +1 -1
- package/dist/utils/uuid/nil.d.ts +1 -1
- package/package.json +34 -1
- package/agents.cjs +0 -1
- package/agents.d.cts +0 -1
- package/agents.d.ts +0 -1
- package/agents.js +0 -1
- package/caches.cjs +0 -1
- package/caches.d.cts +0 -1
- package/caches.d.ts +0 -1
- package/caches.js +0 -1
- package/callbacks/base.cjs +0 -1
- package/callbacks/base.d.cts +0 -1
- package/callbacks/base.d.ts +0 -1
- package/callbacks/base.js +0 -1
- package/callbacks/dispatch/web.cjs +0 -1
- package/callbacks/dispatch/web.d.cts +0 -1
- package/callbacks/dispatch/web.d.ts +0 -1
- package/callbacks/dispatch/web.js +0 -1
- package/callbacks/dispatch.cjs +0 -1
- package/callbacks/dispatch.d.cts +0 -1
- package/callbacks/dispatch.d.ts +0 -1
- package/callbacks/dispatch.js +0 -1
- package/callbacks/manager.cjs +0 -1
- package/callbacks/manager.d.cts +0 -1
- package/callbacks/manager.d.ts +0 -1
- package/callbacks/manager.js +0 -1
- package/callbacks/promises.cjs +0 -1
- package/callbacks/promises.d.cts +0 -1
- package/callbacks/promises.d.ts +0 -1
- package/callbacks/promises.js +0 -1
- package/chat_history.cjs +0 -1
- package/chat_history.d.cts +0 -1
- package/chat_history.d.ts +0 -1
- package/chat_history.js +0 -1
- package/context.cjs +0 -1
- package/context.d.cts +0 -1
- package/context.d.ts +0 -1
- package/context.js +0 -1
- package/document_loaders/base.cjs +0 -1
- package/document_loaders/base.d.cts +0 -1
- package/document_loaders/base.d.ts +0 -1
- package/document_loaders/base.js +0 -1
- package/document_loaders/langsmith.cjs +0 -1
- package/document_loaders/langsmith.d.cts +0 -1
- package/document_loaders/langsmith.d.ts +0 -1
- package/document_loaders/langsmith.js +0 -1
- package/documents.cjs +0 -1
- package/documents.d.cts +0 -1
- package/documents.d.ts +0 -1
- package/documents.js +0 -1
- package/embeddings.cjs +0 -1
- package/embeddings.d.cts +0 -1
- package/embeddings.d.ts +0 -1
- package/embeddings.js +0 -1
- package/errors.cjs +0 -1
- package/errors.d.cts +0 -1
- package/errors.d.ts +0 -1
- package/errors.js +0 -1
- package/example_selectors.cjs +0 -1
- package/example_selectors.d.cts +0 -1
- package/example_selectors.d.ts +0 -1
- package/example_selectors.js +0 -1
- package/indexing.cjs +0 -1
- package/indexing.d.cts +0 -1
- package/indexing.d.ts +0 -1
- package/indexing.js +0 -1
- package/language_models/base.cjs +0 -1
- package/language_models/base.d.cts +0 -1
- package/language_models/base.d.ts +0 -1
- package/language_models/base.js +0 -1
- package/language_models/chat_models.cjs +0 -1
- package/language_models/chat_models.d.cts +0 -1
- package/language_models/chat_models.d.ts +0 -1
- package/language_models/chat_models.js +0 -1
- package/language_models/llms.cjs +0 -1
- package/language_models/llms.d.cts +0 -1
- package/language_models/llms.d.ts +0 -1
- package/language_models/llms.js +0 -1
- package/language_models/profile.cjs +0 -1
- package/language_models/profile.d.cts +0 -1
- package/language_models/profile.d.ts +0 -1
- package/language_models/profile.js +0 -1
- package/language_models/structured_output.cjs +0 -1
- package/language_models/structured_output.d.cts +0 -1
- package/language_models/structured_output.d.ts +0 -1
- package/language_models/structured_output.js +0 -1
- package/load/serializable.cjs +0 -1
- package/load/serializable.d.cts +0 -1
- package/load/serializable.d.ts +0 -1
- package/load/serializable.js +0 -1
- package/load.cjs +0 -1
- package/load.d.cts +0 -1
- package/load.d.ts +0 -1
- package/load.js +0 -1
- package/memory.cjs +0 -1
- package/memory.d.cts +0 -1
- package/memory.d.ts +0 -1
- package/memory.js +0 -1
- package/messages/tool.cjs +0 -1
- package/messages/tool.d.cts +0 -1
- package/messages/tool.d.ts +0 -1
- package/messages/tool.js +0 -1
- package/messages.cjs +0 -1
- package/messages.d.cts +0 -1
- package/messages.d.ts +0 -1
- package/messages.js +0 -1
- package/output_parsers/openai_functions.cjs +0 -1
- package/output_parsers/openai_functions.d.cts +0 -1
- package/output_parsers/openai_functions.d.ts +0 -1
- package/output_parsers/openai_functions.js +0 -1
- package/output_parsers/openai_tools.cjs +0 -1
- package/output_parsers/openai_tools.d.cts +0 -1
- package/output_parsers/openai_tools.d.ts +0 -1
- package/output_parsers/openai_tools.js +0 -1
- package/output_parsers.cjs +0 -1
- package/output_parsers.d.cts +0 -1
- package/output_parsers.d.ts +0 -1
- package/output_parsers.js +0 -1
- package/outputs.cjs +0 -1
- package/outputs.d.cts +0 -1
- package/outputs.d.ts +0 -1
- package/outputs.js +0 -1
- package/prompt_values.cjs +0 -1
- package/prompt_values.d.cts +0 -1
- package/prompt_values.d.ts +0 -1
- package/prompt_values.js +0 -1
- package/prompts.cjs +0 -1
- package/prompts.d.cts +0 -1
- package/prompts.d.ts +0 -1
- package/prompts.js +0 -1
- package/retrievers/document_compressors.cjs +0 -1
- package/retrievers/document_compressors.d.cts +0 -1
- package/retrievers/document_compressors.d.ts +0 -1
- package/retrievers/document_compressors.js +0 -1
- package/retrievers.cjs +0 -1
- package/retrievers.d.cts +0 -1
- package/retrievers.d.ts +0 -1
- package/retrievers.js +0 -1
- package/runnables/graph.cjs +0 -1
- package/runnables/graph.d.cts +0 -1
- package/runnables/graph.d.ts +0 -1
- package/runnables/graph.js +0 -1
- package/runnables.cjs +0 -1
- package/runnables.d.cts +0 -1
- package/runnables.d.ts +0 -1
- package/runnables.js +0 -1
- package/singletons.cjs +0 -1
- package/singletons.d.cts +0 -1
- package/singletons.d.ts +0 -1
- package/singletons.js +0 -1
- package/stores.cjs +0 -1
- package/stores.d.cts +0 -1
- package/stores.d.ts +0 -1
- package/stores.js +0 -1
- package/structured_query.cjs +0 -1
- package/structured_query.d.cts +0 -1
- package/structured_query.d.ts +0 -1
- package/structured_query.js +0 -1
- package/tools.cjs +0 -1
- package/tools.d.cts +0 -1
- package/tools.d.ts +0 -1
- package/tools.js +0 -1
- package/tracers/base.cjs +0 -1
- package/tracers/base.d.cts +0 -1
- package/tracers/base.d.ts +0 -1
- package/tracers/base.js +0 -1
- package/tracers/console.cjs +0 -1
- package/tracers/console.d.cts +0 -1
- package/tracers/console.d.ts +0 -1
- package/tracers/console.js +0 -1
- package/tracers/log_stream.cjs +0 -1
- package/tracers/log_stream.d.cts +0 -1
- package/tracers/log_stream.d.ts +0 -1
- package/tracers/log_stream.js +0 -1
- package/tracers/run_collector.cjs +0 -1
- package/tracers/run_collector.d.cts +0 -1
- package/tracers/run_collector.d.ts +0 -1
- package/tracers/run_collector.js +0 -1
- package/tracers/tracer_langchain.cjs +0 -1
- package/tracers/tracer_langchain.d.cts +0 -1
- package/tracers/tracer_langchain.d.ts +0 -1
- package/tracers/tracer_langchain.js +0 -1
- package/types/stream.cjs +0 -1
- package/types/stream.d.cts +0 -1
- package/types/stream.d.ts +0 -1
- package/types/stream.js +0 -1
- package/utils/async_caller.cjs +0 -1
- package/utils/async_caller.d.cts +0 -1
- package/utils/async_caller.d.ts +0 -1
- package/utils/async_caller.js +0 -1
- package/utils/chunk_array.cjs +0 -1
- package/utils/chunk_array.d.cts +0 -1
- package/utils/chunk_array.d.ts +0 -1
- package/utils/chunk_array.js +0 -1
- package/utils/context.cjs +0 -1
- package/utils/context.d.cts +0 -1
- package/utils/context.d.ts +0 -1
- package/utils/context.js +0 -1
- package/utils/env.cjs +0 -1
- package/utils/env.d.cts +0 -1
- package/utils/env.d.ts +0 -1
- package/utils/env.js +0 -1
- package/utils/event_source_parse.cjs +0 -1
- package/utils/event_source_parse.d.cts +0 -1
- package/utils/event_source_parse.d.ts +0 -1
- package/utils/event_source_parse.js +0 -1
- package/utils/format.cjs +0 -1
- package/utils/format.d.cts +0 -1
- package/utils/format.d.ts +0 -1
- package/utils/format.js +0 -1
- package/utils/function_calling.cjs +0 -1
- package/utils/function_calling.d.cts +0 -1
- package/utils/function_calling.d.ts +0 -1
- package/utils/function_calling.js +0 -1
- package/utils/hash.cjs +0 -1
- package/utils/hash.d.cts +0 -1
- package/utils/hash.d.ts +0 -1
- package/utils/hash.js +0 -1
- package/utils/json_patch.cjs +0 -1
- package/utils/json_patch.d.cts +0 -1
- package/utils/json_patch.d.ts +0 -1
- package/utils/json_patch.js +0 -1
- package/utils/json_schema.cjs +0 -1
- package/utils/json_schema.d.cts +0 -1
- package/utils/json_schema.d.ts +0 -1
- package/utils/json_schema.js +0 -1
- package/utils/math.cjs +0 -1
- package/utils/math.d.cts +0 -1
- package/utils/math.d.ts +0 -1
- package/utils/math.js +0 -1
- package/utils/ssrf.cjs +0 -1
- package/utils/ssrf.d.cts +0 -1
- package/utils/ssrf.d.ts +0 -1
- package/utils/ssrf.js +0 -1
- package/utils/standard_schema.cjs +0 -1
- package/utils/standard_schema.d.cts +0 -1
- package/utils/standard_schema.d.ts +0 -1
- package/utils/standard_schema.js +0 -1
- package/utils/stream.cjs +0 -1
- package/utils/stream.d.cts +0 -1
- package/utils/stream.d.ts +0 -1
- package/utils/stream.js +0 -1
- package/utils/testing.cjs +0 -1
- package/utils/testing.d.cts +0 -1
- package/utils/testing.d.ts +0 -1
- package/utils/testing.js +0 -1
- package/utils/tiktoken.cjs +0 -1
- package/utils/tiktoken.d.cts +0 -1
- package/utils/tiktoken.d.ts +0 -1
- package/utils/tiktoken.js +0 -1
- package/utils/types.cjs +0 -1
- package/utils/types.d.cts +0 -1
- package/utils/types.d.ts +0 -1
- package/utils/types.js +0 -1
- package/utils/uuid.cjs +0 -1
- package/utils/uuid.d.cts +0 -1
- package/utils/uuid.d.ts +0 -1
- package/utils/uuid.js +0 -1
- package/vectorstores.cjs +0 -1
- package/vectorstores.d.cts +0 -1
- package/vectorstores.d.ts +0 -1
- package/vectorstores.js +0 -1
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
|
|
3
|
+
const require_ai = require("../messages/ai.cjs");
|
|
4
|
+
//#region src/language_models/compat.ts
|
|
5
|
+
/**
|
|
6
|
+
* Compatibility bridge: converts legacy `_streamResponseChunks`
|
|
7
|
+
* (`ChatGenerationChunk` / `AIMessageChunk`) output to the new
|
|
8
|
+
* `ChatModelStreamEvent` protocol.
|
|
9
|
+
*
|
|
10
|
+
* @module
|
|
11
|
+
*/
|
|
12
|
+
var compat_exports = /* @__PURE__ */ require_runtime.__exportAll({
|
|
13
|
+
convertChunksToEvents: () => convertChunksToEvents,
|
|
14
|
+
finalizeContentBlock: () => finalizeContentBlock
|
|
15
|
+
});
|
|
16
|
+
const MIME_TYPE_BY_AUDIO_FORMAT = {
|
|
17
|
+
wav: "audio/wav",
|
|
18
|
+
mp3: "audio/mpeg",
|
|
19
|
+
flac: "audio/flac",
|
|
20
|
+
opus: "audio/opus",
|
|
21
|
+
aac: "audio/aac",
|
|
22
|
+
pcm16: "audio/pcm"
|
|
23
|
+
};
|
|
24
|
+
const MIME_TYPE_BY_IMAGE_FORMAT = {
|
|
25
|
+
png: "image/png",
|
|
26
|
+
jpeg: "image/jpeg",
|
|
27
|
+
jpg: "image/jpeg",
|
|
28
|
+
webp: "image/webp",
|
|
29
|
+
gif: "image/gif"
|
|
30
|
+
};
|
|
31
|
+
function nextBlockIndex(activeBlocks) {
|
|
32
|
+
let next = 0;
|
|
33
|
+
for (const index of activeBlocks.keys()) if (index >= next) next = index + 1;
|
|
34
|
+
return next;
|
|
35
|
+
}
|
|
36
|
+
function getAdditionalKwargs(message) {
|
|
37
|
+
const additional = message.additional_kwargs;
|
|
38
|
+
return additional != null && typeof additional === "object" ? additional : {};
|
|
39
|
+
}
|
|
40
|
+
function extractImageBlocksFromToolOutputs(message) {
|
|
41
|
+
const toolOutputs = getAdditionalKwargs(message).tool_outputs;
|
|
42
|
+
if (!Array.isArray(toolOutputs)) return [];
|
|
43
|
+
const blocks = [];
|
|
44
|
+
for (const entry of toolOutputs) {
|
|
45
|
+
if (entry == null || typeof entry !== "object") continue;
|
|
46
|
+
const record = entry;
|
|
47
|
+
if (record.type !== "image_generation_call") continue;
|
|
48
|
+
const data = typeof record.result === "string" ? record.result : void 0;
|
|
49
|
+
const url = typeof record.url === "string" ? record.url : void 0;
|
|
50
|
+
if (data == null && url == null) continue;
|
|
51
|
+
const outputFormat = typeof record.output_format === "string" ? record.output_format.toLowerCase() : void 0;
|
|
52
|
+
const mimeType = (outputFormat != null ? MIME_TYPE_BY_IMAGE_FORMAT[outputFormat] : void 0) ?? "image/png";
|
|
53
|
+
blocks.push({
|
|
54
|
+
type: "image",
|
|
55
|
+
...typeof record.id === "string" ? { id: record.id } : {},
|
|
56
|
+
...url != null ? { url } : {},
|
|
57
|
+
...data != null ? { data } : {},
|
|
58
|
+
mimeType
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
return blocks;
|
|
62
|
+
}
|
|
63
|
+
function getAudioPayload(message) {
|
|
64
|
+
const audio = getAdditionalKwargs(message).audio;
|
|
65
|
+
if (audio == null || typeof audio !== "object") return void 0;
|
|
66
|
+
const record = audio;
|
|
67
|
+
const data = typeof record.data === "string" ? record.data : void 0;
|
|
68
|
+
const url = typeof record.url === "string" ? record.url : void 0;
|
|
69
|
+
const transcript = typeof record.transcript === "string" ? record.transcript : void 0;
|
|
70
|
+
if (data == null && url == null && transcript == null) return void 0;
|
|
71
|
+
const explicitMimeType = typeof record.mime_type === "string" ? record.mime_type : typeof record.mimeType === "string" ? record.mimeType : void 0;
|
|
72
|
+
const format = typeof record.format === "string" ? record.format.toLowerCase() : void 0;
|
|
73
|
+
const mimeType = explicitMimeType ?? (format != null ? MIME_TYPE_BY_AUDIO_FORMAT[format] : void 0) ?? (data != null ? "audio/wav" : "audio/pcm");
|
|
74
|
+
return {
|
|
75
|
+
...typeof record.id === "string" ? { id: record.id } : {},
|
|
76
|
+
...data != null ? { data } : {},
|
|
77
|
+
...url != null ? { url } : {},
|
|
78
|
+
...transcript != null ? { transcript } : {},
|
|
79
|
+
mimeType
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Convert an async iterable of legacy `ChatGenerationChunk`s into
|
|
84
|
+
* `ChatModelStreamEvent`s with typed deltas.
|
|
85
|
+
*/
|
|
86
|
+
async function* convertChunksToEvents(chunks, options) {
|
|
87
|
+
const activeBlocks = /* @__PURE__ */ new Map();
|
|
88
|
+
let messageStarted = false;
|
|
89
|
+
let lastUsage;
|
|
90
|
+
let audioStream;
|
|
91
|
+
const emittedImageKeys = /* @__PURE__ */ new Set();
|
|
92
|
+
for await (const chunk of chunks) {
|
|
93
|
+
options?.signal?.throwIfAborted();
|
|
94
|
+
const msg = chunk.message;
|
|
95
|
+
let usageHandledInStart = false;
|
|
96
|
+
if (!messageStarted) {
|
|
97
|
+
messageStarted = true;
|
|
98
|
+
const startEvent = {
|
|
99
|
+
event: "message-start",
|
|
100
|
+
id: msg.id ?? void 0
|
|
101
|
+
};
|
|
102
|
+
if (require_ai.isAIMessageChunk(msg) && msg.usage_metadata) {
|
|
103
|
+
startEvent.usage = msg.usage_metadata;
|
|
104
|
+
lastUsage = { ...msg.usage_metadata };
|
|
105
|
+
usageHandledInStart = true;
|
|
106
|
+
}
|
|
107
|
+
yield startEvent;
|
|
108
|
+
}
|
|
109
|
+
const content = msg.content;
|
|
110
|
+
if (typeof content === "string") {
|
|
111
|
+
if (content !== "") {
|
|
112
|
+
const blockIndex = 0;
|
|
113
|
+
if (!activeBlocks.has(blockIndex)) {
|
|
114
|
+
const initial = {
|
|
115
|
+
type: "text",
|
|
116
|
+
text: ""
|
|
117
|
+
};
|
|
118
|
+
activeBlocks.set(blockIndex, {
|
|
119
|
+
type: "text",
|
|
120
|
+
accumulated: initial
|
|
121
|
+
});
|
|
122
|
+
yield {
|
|
123
|
+
event: "content-block-start",
|
|
124
|
+
index: blockIndex,
|
|
125
|
+
content: initial
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
const block = activeBlocks.get(blockIndex);
|
|
129
|
+
block.accumulated = {
|
|
130
|
+
...block.accumulated,
|
|
131
|
+
text: (block.accumulated.text ?? "") + content
|
|
132
|
+
};
|
|
133
|
+
yield {
|
|
134
|
+
event: "content-block-delta",
|
|
135
|
+
index: blockIndex,
|
|
136
|
+
delta: {
|
|
137
|
+
type: "text-delta",
|
|
138
|
+
text: content
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
} else if (Array.isArray(content)) for (const part of content) {
|
|
143
|
+
const blockIndex = typeof part.index === "number" ? part.index : activeBlocks.size;
|
|
144
|
+
if (!activeBlocks.has(blockIndex)) {
|
|
145
|
+
activeBlocks.set(blockIndex, {
|
|
146
|
+
type: part.type,
|
|
147
|
+
accumulated: { ...part }
|
|
148
|
+
});
|
|
149
|
+
yield {
|
|
150
|
+
event: "content-block-start",
|
|
151
|
+
index: blockIndex,
|
|
152
|
+
content: { ...part }
|
|
153
|
+
};
|
|
154
|
+
} else {
|
|
155
|
+
const block = activeBlocks.get(blockIndex);
|
|
156
|
+
const delta = contentBlockToDelta(part);
|
|
157
|
+
block.accumulated = applyDeltaToBlock(block.accumulated, delta);
|
|
158
|
+
yield {
|
|
159
|
+
event: "content-block-delta",
|
|
160
|
+
index: blockIndex,
|
|
161
|
+
delta
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
if (require_ai.isAIMessageChunk(msg) && msg.tool_call_chunks && msg.tool_call_chunks.length > 0) for (const toolChunk of msg.tool_call_chunks) {
|
|
166
|
+
const blockIndex = typeof toolChunk.index === "number" ? toolChunk.index : activeBlocks.size;
|
|
167
|
+
if (!activeBlocks.has(blockIndex)) {
|
|
168
|
+
const initial = {
|
|
169
|
+
type: "tool_call_chunk",
|
|
170
|
+
id: toolChunk.id,
|
|
171
|
+
name: toolChunk.name,
|
|
172
|
+
args: "",
|
|
173
|
+
index: blockIndex
|
|
174
|
+
};
|
|
175
|
+
activeBlocks.set(blockIndex, {
|
|
176
|
+
type: "tool_call_chunk",
|
|
177
|
+
accumulated: initial
|
|
178
|
+
});
|
|
179
|
+
yield {
|
|
180
|
+
event: "content-block-start",
|
|
181
|
+
index: blockIndex,
|
|
182
|
+
content: initial
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
const acc = activeBlocks.get(blockIndex).accumulated;
|
|
186
|
+
if (toolChunk.id != null) acc.id = toolChunk.id;
|
|
187
|
+
if (toolChunk.name != null) acc.name = toolChunk.name;
|
|
188
|
+
acc.args = (acc.args ?? "") + (toolChunk.args ?? "");
|
|
189
|
+
yield {
|
|
190
|
+
event: "content-block-delta",
|
|
191
|
+
index: blockIndex,
|
|
192
|
+
delta: {
|
|
193
|
+
type: "block-delta",
|
|
194
|
+
fields: {
|
|
195
|
+
type: "tool_call_chunk",
|
|
196
|
+
..."id" in acc && acc.id != null ? { id: acc.id } : {},
|
|
197
|
+
..."name" in acc && acc.name != null ? { name: acc.name } : {},
|
|
198
|
+
args: acc.args
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
const audioPayload = getAudioPayload(msg);
|
|
204
|
+
if (audioPayload != null) {
|
|
205
|
+
if (audioStream == null) {
|
|
206
|
+
const index = nextBlockIndex(activeBlocks);
|
|
207
|
+
audioStream = {
|
|
208
|
+
index,
|
|
209
|
+
id: audioPayload.id,
|
|
210
|
+
mimeType: audioPayload.mimeType,
|
|
211
|
+
transcript: ""
|
|
212
|
+
};
|
|
213
|
+
const initial = {
|
|
214
|
+
type: "audio",
|
|
215
|
+
...audioPayload.id != null ? { id: audioPayload.id } : {},
|
|
216
|
+
...audioPayload.url != null ? { url: audioPayload.url } : {},
|
|
217
|
+
data: "",
|
|
218
|
+
mimeType: audioPayload.mimeType
|
|
219
|
+
};
|
|
220
|
+
activeBlocks.set(index, {
|
|
221
|
+
type: "audio",
|
|
222
|
+
accumulated: initial
|
|
223
|
+
});
|
|
224
|
+
yield {
|
|
225
|
+
event: "content-block-start",
|
|
226
|
+
index,
|
|
227
|
+
content: initial
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
const activeAudio = activeBlocks.get(audioStream.index);
|
|
231
|
+
if (activeAudio != null) {
|
|
232
|
+
const accumulated = activeAudio.accumulated;
|
|
233
|
+
if (audioPayload.id != null && audioStream.id == null) {
|
|
234
|
+
audioStream.id = audioPayload.id;
|
|
235
|
+
accumulated.id = audioPayload.id;
|
|
236
|
+
}
|
|
237
|
+
if (audioPayload.transcript != null) {
|
|
238
|
+
audioStream.transcript += audioPayload.transcript;
|
|
239
|
+
accumulated.transcript = audioStream.transcript;
|
|
240
|
+
yield {
|
|
241
|
+
event: "content-block-delta",
|
|
242
|
+
index: audioStream.index,
|
|
243
|
+
delta: {
|
|
244
|
+
type: "block-delta",
|
|
245
|
+
fields: {
|
|
246
|
+
type: "audio",
|
|
247
|
+
transcript: audioStream.transcript
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
if (audioPayload.data != null && audioPayload.data.length > 0) {
|
|
253
|
+
accumulated.data = (accumulated.data ?? "") + audioPayload.data;
|
|
254
|
+
yield {
|
|
255
|
+
event: "content-block-delta",
|
|
256
|
+
index: audioStream.index,
|
|
257
|
+
delta: {
|
|
258
|
+
type: "data-delta",
|
|
259
|
+
data: audioPayload.data,
|
|
260
|
+
encoding: "base64"
|
|
261
|
+
}
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
for (const imageBlock of extractImageBlocksFromToolOutputs(msg)) {
|
|
267
|
+
const imageRecord = imageBlock;
|
|
268
|
+
const imageKey = imageRecord.id ?? imageRecord.url ?? (imageRecord.data != null ? `${imageRecord.data.length}:${imageRecord.data.slice(0, 32)}` : void 0);
|
|
269
|
+
if (imageKey != null && emittedImageKeys.has(imageKey)) continue;
|
|
270
|
+
if (imageKey != null) emittedImageKeys.add(imageKey);
|
|
271
|
+
const index = nextBlockIndex(activeBlocks);
|
|
272
|
+
activeBlocks.set(index, {
|
|
273
|
+
type: "image",
|
|
274
|
+
accumulated: imageBlock
|
|
275
|
+
});
|
|
276
|
+
yield {
|
|
277
|
+
event: "content-block-start",
|
|
278
|
+
index,
|
|
279
|
+
content: imageBlock
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
if (!usageHandledInStart && require_ai.isAIMessageChunk(msg) && msg.usage_metadata) {
|
|
283
|
+
const chunkUsage = msg.usage_metadata;
|
|
284
|
+
if (!lastUsage) lastUsage = { ...chunkUsage };
|
|
285
|
+
else lastUsage = {
|
|
286
|
+
input_tokens: lastUsage.input_tokens + chunkUsage.input_tokens,
|
|
287
|
+
output_tokens: lastUsage.output_tokens + chunkUsage.output_tokens,
|
|
288
|
+
total_tokens: lastUsage.total_tokens + chunkUsage.total_tokens
|
|
289
|
+
};
|
|
290
|
+
yield {
|
|
291
|
+
event: "usage",
|
|
292
|
+
usage: { ...lastUsage }
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
for (const [index, block] of activeBlocks) yield {
|
|
297
|
+
event: "content-block-finish",
|
|
298
|
+
index,
|
|
299
|
+
content: finalizeContentBlock(block.accumulated)
|
|
300
|
+
};
|
|
301
|
+
yield {
|
|
302
|
+
event: "message-finish",
|
|
303
|
+
reason: "stop",
|
|
304
|
+
...lastUsage ? { usage: lastUsage } : {}
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Apply a typed delta to an accumulated content block.
|
|
309
|
+
* @internal
|
|
310
|
+
*/
|
|
311
|
+
function applyDeltaToBlock(block, delta) {
|
|
312
|
+
switch (delta.type) {
|
|
313
|
+
case "text-delta": return {
|
|
314
|
+
...block,
|
|
315
|
+
text: (block.text ?? "") + delta.text
|
|
316
|
+
};
|
|
317
|
+
case "reasoning-delta":
|
|
318
|
+
if (block.type === "thinking") return {
|
|
319
|
+
...block,
|
|
320
|
+
thinking: (block.thinking ?? "") + delta.reasoning
|
|
321
|
+
};
|
|
322
|
+
return {
|
|
323
|
+
...block,
|
|
324
|
+
reasoning: (block.reasoning ?? "") + delta.reasoning
|
|
325
|
+
};
|
|
326
|
+
case "data-delta": return {
|
|
327
|
+
...block,
|
|
328
|
+
data: (block.data ?? "") + delta.data
|
|
329
|
+
};
|
|
330
|
+
case "block-delta": return {
|
|
331
|
+
...block,
|
|
332
|
+
...delta.fields
|
|
333
|
+
};
|
|
334
|
+
default: throw new Error(`Unknown delta type: ${JSON.stringify(delta)}`);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
function contentBlockToDelta(block) {
|
|
338
|
+
if (block.type === "text") return {
|
|
339
|
+
type: "text-delta",
|
|
340
|
+
text: block.text
|
|
341
|
+
};
|
|
342
|
+
if (block.type === "reasoning") return {
|
|
343
|
+
type: "reasoning-delta",
|
|
344
|
+
reasoning: block.reasoning
|
|
345
|
+
};
|
|
346
|
+
if (block.type === "thinking" && typeof block.thinking === "string") return {
|
|
347
|
+
type: "reasoning-delta",
|
|
348
|
+
reasoning: block.thinking
|
|
349
|
+
};
|
|
350
|
+
if (typeof block.data === "string") return {
|
|
351
|
+
type: "data-delta",
|
|
352
|
+
data: block.data,
|
|
353
|
+
encoding: "base64"
|
|
354
|
+
};
|
|
355
|
+
if (typeof block.type === "string") return {
|
|
356
|
+
type: "block-delta",
|
|
357
|
+
fields: { ...block }
|
|
358
|
+
};
|
|
359
|
+
throw new Error(`Unsupported content block delta: ${JSON.stringify(block)}`);
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Finalize a content block for the finish event.
|
|
363
|
+
* For tool calls, parse the accumulated JSON args string.
|
|
364
|
+
*/
|
|
365
|
+
function finalizeContentBlock(block) {
|
|
366
|
+
if (block.type === "tool_call_chunk") {
|
|
367
|
+
const chunk = block;
|
|
368
|
+
let parsedArgs;
|
|
369
|
+
try {
|
|
370
|
+
parsedArgs = JSON.parse(chunk.args ?? "{}");
|
|
371
|
+
} catch {
|
|
372
|
+
return {
|
|
373
|
+
type: "invalid_tool_call",
|
|
374
|
+
id: chunk.id,
|
|
375
|
+
name: chunk.name,
|
|
376
|
+
args: chunk.args,
|
|
377
|
+
error: "Failed to parse tool call arguments as JSON"
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
return {
|
|
381
|
+
type: "tool_call",
|
|
382
|
+
id: chunk.id,
|
|
383
|
+
name: chunk.name,
|
|
384
|
+
args: parsedArgs
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
return block;
|
|
388
|
+
}
|
|
389
|
+
//#endregion
|
|
390
|
+
Object.defineProperty(exports, "compat_exports", {
|
|
391
|
+
enumerable: true,
|
|
392
|
+
get: function() {
|
|
393
|
+
return compat_exports;
|
|
394
|
+
}
|
|
395
|
+
});
|
|
396
|
+
exports.convertChunksToEvents = convertChunksToEvents;
|
|
397
|
+
exports.finalizeContentBlock = finalizeContentBlock;
|
|
398
|
+
|
|
399
|
+
//# sourceMappingURL=compat.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compat.cjs","names":["isAIMessageChunk"],"sources":["../../src/language_models/compat.ts"],"sourcesContent":["/**\n * Compatibility bridge: converts legacy `_streamResponseChunks`\n * (`ChatGenerationChunk` / `AIMessageChunk`) output to the new\n * `ChatModelStreamEvent` protocol.\n *\n * @module\n */\n\nimport { isAIMessageChunk } from \"../messages/ai.js\";\nimport type { ContentBlock } from \"../messages/content/index.js\";\nimport type { ChatGenerationChunk } from \"../outputs.js\";\nimport type { ChatModelStreamEvent, ContentBlockDelta } from \"./event.js\";\n\nconst MIME_TYPE_BY_AUDIO_FORMAT: Record<string, string> = {\n wav: \"audio/wav\",\n mp3: \"audio/mpeg\",\n flac: \"audio/flac\",\n opus: \"audio/opus\",\n aac: \"audio/aac\",\n pcm16: \"audio/pcm\",\n};\n\nconst MIME_TYPE_BY_IMAGE_FORMAT: Record<string, string> = {\n png: \"image/png\",\n jpeg: \"image/jpeg\",\n jpg: \"image/jpeg\",\n webp: \"image/webp\",\n gif: \"image/gif\",\n};\n\ntype AudioStreamState = {\n index: number;\n id?: string;\n mimeType: string;\n transcript: string;\n};\n\nfunction nextBlockIndex(activeBlocks: Map<number, unknown>): number {\n let next = 0;\n for (const index of activeBlocks.keys()) {\n if (index >= next) next = index + 1;\n }\n return next;\n}\n\nfunction getAdditionalKwargs(message: unknown): Record<string, unknown> {\n const additional = (message as { additional_kwargs?: unknown })\n .additional_kwargs;\n return additional != null && typeof additional === \"object\"\n ? (additional as Record<string, unknown>)\n : {};\n}\n\nfunction extractImageBlocksFromToolOutputs(message: unknown): ContentBlock[] {\n const toolOutputs = getAdditionalKwargs(message).tool_outputs;\n if (!Array.isArray(toolOutputs)) return [];\n\n const blocks: ContentBlock[] = [];\n for (const entry of toolOutputs) {\n if (entry == null || typeof entry !== \"object\") continue;\n const record = entry as Record<string, unknown>;\n if (record.type !== \"image_generation_call\") continue;\n\n const data = typeof record.result === \"string\" ? record.result : undefined;\n const url = typeof record.url === \"string\" ? record.url : undefined;\n if (data == null && url == null) continue;\n\n const outputFormat =\n typeof record.output_format === \"string\"\n ? record.output_format.toLowerCase()\n : undefined;\n const mimeType =\n (outputFormat != null\n ? MIME_TYPE_BY_IMAGE_FORMAT[outputFormat]\n : undefined) ?? \"image/png\";\n\n blocks.push({\n type: \"image\",\n ...(typeof record.id === \"string\" ? { id: record.id } : {}),\n ...(url != null ? { url } : {}),\n ...(data != null ? { data } : {}),\n mimeType,\n } as ContentBlock);\n }\n return blocks;\n}\n\nfunction getAudioPayload(message: unknown):\n | {\n id?: string;\n data?: string;\n url?: string;\n transcript?: string;\n mimeType: string;\n }\n | undefined {\n const audio = getAdditionalKwargs(message).audio;\n if (audio == null || typeof audio !== \"object\") return undefined;\n const record = audio as Record<string, unknown>;\n\n const data = typeof record.data === \"string\" ? record.data : undefined;\n const url = typeof record.url === \"string\" ? record.url : undefined;\n const transcript =\n typeof record.transcript === \"string\" ? record.transcript : undefined;\n if (data == null && url == null && transcript == null) return undefined;\n\n const explicitMimeType =\n typeof record.mime_type === \"string\"\n ? record.mime_type\n : typeof record.mimeType === \"string\"\n ? record.mimeType\n : undefined;\n const format =\n typeof record.format === \"string\" ? record.format.toLowerCase() : undefined;\n const mimeType =\n explicitMimeType ??\n (format != null ? MIME_TYPE_BY_AUDIO_FORMAT[format] : undefined) ??\n (data != null ? \"audio/wav\" : \"audio/pcm\");\n\n return {\n ...(typeof record.id === \"string\" ? { id: record.id } : {}),\n ...(data != null ? { data } : {}),\n ...(url != null ? { url } : {}),\n ...(transcript != null ? { transcript } : {}),\n mimeType,\n };\n}\n\n/**\n * Convert an async iterable of legacy `ChatGenerationChunk`s into\n * `ChatModelStreamEvent`s with typed deltas.\n */\nexport async function* convertChunksToEvents(\n chunks: AsyncIterable<ChatGenerationChunk>,\n options?: { signal?: AbortSignal }\n): AsyncGenerator<ChatModelStreamEvent> {\n const activeBlocks = new Map<\n number,\n { type: string; accumulated: ContentBlock }\n >();\n let messageStarted = false;\n let lastUsage:\n | { input_tokens: number; output_tokens: number; total_tokens: number }\n | undefined;\n let audioStream: AudioStreamState | undefined;\n const emittedImageKeys = new Set<string>();\n\n for await (const chunk of chunks) {\n options?.signal?.throwIfAborted();\n\n const msg = chunk.message;\n\n // Message start\n let usageHandledInStart = false;\n if (!messageStarted) {\n messageStarted = true;\n const startEvent: ChatModelStreamEvent = {\n event: \"message-start\" as const,\n id: msg.id ?? undefined,\n };\n if (isAIMessageChunk(msg) && msg.usage_metadata) {\n (startEvent as { usage?: unknown }).usage = msg.usage_metadata;\n lastUsage = { ...msg.usage_metadata };\n usageHandledInStart = true;\n }\n yield startEvent;\n }\n\n // Process content\n const content = msg.content;\n if (typeof content === \"string\") {\n if (content !== \"\") {\n const blockIndex = 0;\n if (!activeBlocks.has(blockIndex)) {\n const initial: ContentBlock.Text = { type: \"text\", text: \"\" };\n activeBlocks.set(blockIndex, {\n type: \"text\",\n accumulated: initial,\n });\n yield {\n event: \"content-block-start\" as const,\n index: blockIndex,\n content: initial,\n };\n }\n const block = activeBlocks.get(blockIndex)!;\n block.accumulated = {\n ...block.accumulated,\n text: ((block.accumulated as { text?: string }).text ?? \"\") + content,\n };\n yield {\n event: \"content-block-delta\" as const,\n index: blockIndex,\n delta: { type: \"text-delta\" as const, text: content },\n };\n }\n } else if (Array.isArray(content)) {\n for (const part of content) {\n const blockIndex =\n typeof part.index === \"number\" ? part.index : activeBlocks.size;\n\n if (!activeBlocks.has(blockIndex)) {\n activeBlocks.set(blockIndex, {\n type: part.type,\n accumulated: { ...part },\n });\n yield {\n event: \"content-block-start\" as const,\n index: blockIndex,\n content: { ...part },\n };\n } else {\n const block = activeBlocks.get(blockIndex)!;\n const delta = contentBlockToDelta(part);\n block.accumulated = applyDeltaToBlock(block.accumulated, delta);\n yield {\n event: \"content-block-delta\" as const,\n index: blockIndex,\n delta,\n };\n }\n }\n }\n\n // Tool call chunks\n if (\n isAIMessageChunk(msg) &&\n msg.tool_call_chunks &&\n msg.tool_call_chunks.length > 0\n ) {\n for (const toolChunk of msg.tool_call_chunks) {\n const blockIndex =\n typeof toolChunk.index === \"number\"\n ? toolChunk.index\n : activeBlocks.size;\n\n if (!activeBlocks.has(blockIndex)) {\n const initial: ContentBlock = {\n type: \"tool_call_chunk\" as const,\n id: toolChunk.id,\n name: toolChunk.name,\n args: \"\",\n index: blockIndex,\n };\n activeBlocks.set(blockIndex, {\n type: \"tool_call_chunk\",\n accumulated: initial,\n });\n yield {\n event: \"content-block-start\" as const,\n index: blockIndex,\n content: initial,\n };\n }\n\n // Accumulate tool call args internally, emit incremental content chunks.\n const block = activeBlocks.get(blockIndex)!;\n const acc = block.accumulated as {\n args?: string;\n id?: string;\n name?: string;\n };\n if (toolChunk.id != null) acc.id = toolChunk.id;\n if (toolChunk.name != null) acc.name = toolChunk.name;\n acc.args = (acc.args ?? \"\") + (toolChunk.args ?? \"\");\n yield {\n event: \"content-block-delta\" as const,\n index: blockIndex,\n delta: {\n type: \"block-delta\" as const,\n fields: {\n type: \"tool_call_chunk\",\n ...(\"id\" in acc && acc.id != null ? { id: acc.id } : {}),\n ...(\"name\" in acc && acc.name != null ? { name: acc.name } : {}),\n args: acc.args,\n },\n },\n };\n }\n }\n\n const audioPayload = getAudioPayload(msg);\n if (audioPayload != null) {\n if (audioStream == null) {\n const index = nextBlockIndex(activeBlocks);\n audioStream = {\n index,\n id: audioPayload.id,\n mimeType: audioPayload.mimeType,\n transcript: \"\",\n };\n const initial = {\n type: \"audio\",\n ...(audioPayload.id != null ? { id: audioPayload.id } : {}),\n ...(audioPayload.url != null ? { url: audioPayload.url } : {}),\n data: \"\",\n mimeType: audioPayload.mimeType,\n } as ContentBlock;\n activeBlocks.set(index, {\n type: \"audio\",\n accumulated: initial,\n });\n yield {\n event: \"content-block-start\" as const,\n index,\n content: initial,\n };\n }\n\n const activeAudio = activeBlocks.get(audioStream.index);\n if (activeAudio != null) {\n const accumulated = activeAudio.accumulated as ContentBlock & {\n data?: string;\n transcript?: string;\n };\n if (audioPayload.id != null && audioStream.id == null) {\n audioStream.id = audioPayload.id;\n (accumulated as { id?: string }).id = audioPayload.id;\n }\n if (audioPayload.transcript != null) {\n audioStream.transcript += audioPayload.transcript;\n accumulated.transcript = audioStream.transcript;\n yield {\n event: \"content-block-delta\" as const,\n index: audioStream.index,\n delta: {\n type: \"block-delta\" as const,\n fields: {\n type: \"audio\",\n transcript: audioStream.transcript,\n },\n },\n };\n }\n if (audioPayload.data != null && audioPayload.data.length > 0) {\n accumulated.data = (accumulated.data ?? \"\") + audioPayload.data;\n yield {\n event: \"content-block-delta\" as const,\n index: audioStream.index,\n delta: {\n type: \"data-delta\" as const,\n data: audioPayload.data,\n encoding: \"base64\" as const,\n },\n };\n }\n }\n }\n\n for (const imageBlock of extractImageBlocksFromToolOutputs(msg)) {\n const imageRecord = imageBlock as ContentBlock & {\n id?: string;\n url?: string;\n data?: string;\n };\n const imageKey =\n imageRecord.id ??\n imageRecord.url ??\n (imageRecord.data != null\n ? `${imageRecord.data.length}:${imageRecord.data.slice(0, 32)}`\n : undefined);\n if (imageKey != null && emittedImageKeys.has(imageKey)) continue;\n if (imageKey != null) emittedImageKeys.add(imageKey);\n\n const index = nextBlockIndex(activeBlocks);\n activeBlocks.set(index, {\n type: \"image\",\n accumulated: imageBlock,\n });\n yield {\n event: \"content-block-start\" as const,\n index,\n content: imageBlock,\n };\n }\n\n // Usage\n if (!usageHandledInStart && isAIMessageChunk(msg) && msg.usage_metadata) {\n const chunkUsage = msg.usage_metadata;\n if (!lastUsage) {\n lastUsage = { ...chunkUsage };\n } else {\n lastUsage = {\n input_tokens: lastUsage.input_tokens + chunkUsage.input_tokens,\n output_tokens: lastUsage.output_tokens + chunkUsage.output_tokens,\n total_tokens: lastUsage.total_tokens + chunkUsage.total_tokens,\n };\n }\n yield { event: \"usage\" as const, usage: { ...lastUsage } };\n }\n }\n\n // Finish all blocks\n for (const [index, block] of activeBlocks) {\n const finalized = finalizeContentBlock(block.accumulated);\n yield {\n event: \"content-block-finish\" as const,\n index,\n content: finalized,\n };\n }\n\n yield {\n event: \"message-finish\" as const,\n reason: \"stop\" as const,\n ...(lastUsage ? { usage: lastUsage } : {}),\n };\n}\n\n/**\n * Apply a typed delta to an accumulated content block.\n * @internal\n */\nfunction applyDeltaToBlock(\n block: ContentBlock,\n delta: ContentBlockDelta\n): ContentBlock {\n switch (delta.type) {\n case \"text-delta\":\n return {\n ...block,\n text: ((block as { text?: string }).text ?? \"\") + delta.text,\n } as ContentBlock;\n case \"reasoning-delta\":\n if ((block as { type?: string }).type === \"thinking\") {\n return {\n ...block,\n thinking:\n ((block as { thinking?: string }).thinking ?? \"\") + delta.reasoning,\n } as unknown as ContentBlock;\n }\n return {\n ...block,\n reasoning:\n ((block as { reasoning?: string }).reasoning ?? \"\") + delta.reasoning,\n } as ContentBlock;\n case \"data-delta\":\n return {\n ...block,\n data: ((block as { data?: string }).data ?? \"\") + delta.data,\n } as ContentBlock;\n case \"block-delta\":\n return { ...block, ...delta.fields } as ContentBlock;\n default:\n throw new Error(`Unknown delta type: ${JSON.stringify(delta)}`);\n }\n}\n\nfunction contentBlockToDelta(block: ContentBlock): ContentBlockDelta {\n if (block.type === \"text\") {\n return { type: \"text-delta\", text: (block as ContentBlock.Text).text };\n }\n if (block.type === \"reasoning\") {\n return {\n type: \"reasoning-delta\",\n reasoning: (block as ContentBlock.Reasoning).reasoning,\n };\n }\n if (\n (block as { type?: string }).type === \"thinking\" &&\n typeof (block as { thinking?: unknown }).thinking === \"string\"\n ) {\n return {\n type: \"reasoning-delta\",\n reasoning: (block as unknown as { thinking: string }).thinking,\n };\n }\n if (typeof (block as { data?: unknown }).data === \"string\") {\n return {\n type: \"data-delta\",\n data: (block as unknown as { data: string }).data,\n encoding: \"base64\",\n };\n }\n if (typeof (block as { type?: unknown }).type === \"string\") {\n return {\n type: \"block-delta\",\n fields: {\n ...(block as unknown as { type: string } & Record<string, unknown>),\n },\n };\n }\n\n throw new Error(`Unsupported content block delta: ${JSON.stringify(block)}`);\n}\n\n/**\n * Finalize a content block for the finish event.\n * For tool calls, parse the accumulated JSON args string.\n */\nexport function finalizeContentBlock(block: ContentBlock): ContentBlock {\n if (block.type === \"tool_call_chunk\") {\n const chunk = block as ContentBlock.Tools.ToolCallChunk;\n let parsedArgs: unknown;\n try {\n parsedArgs = JSON.parse(chunk.args ?? \"{}\");\n } catch {\n return {\n type: \"invalid_tool_call\" as const,\n id: chunk.id,\n name: chunk.name,\n args: chunk.args,\n error: \"Failed to parse tool call arguments as JSON\",\n } as ContentBlock.Tools.InvalidToolCall;\n }\n return {\n type: \"tool_call\" as const,\n id: chunk.id,\n name: chunk.name!,\n args: parsedArgs,\n } as ContentBlock.Tools.ToolCall;\n }\n\n return block;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ContentBlock } from "../messages/content/index.cjs";
|
|
2
|
+
import { ChatGenerationChunk } from "../outputs.cjs";
|
|
3
|
+
import { ChatModelStreamEvent } from "./event.cjs";
|
|
4
|
+
|
|
5
|
+
//#region src/language_models/compat.d.ts
|
|
6
|
+
/**
|
|
7
|
+
* Convert an async iterable of legacy `ChatGenerationChunk`s into
|
|
8
|
+
* `ChatModelStreamEvent`s with typed deltas.
|
|
9
|
+
*/
|
|
10
|
+
declare function convertChunksToEvents(chunks: AsyncIterable<ChatGenerationChunk>, options?: {
|
|
11
|
+
signal?: AbortSignal;
|
|
12
|
+
}): AsyncGenerator<ChatModelStreamEvent>;
|
|
13
|
+
/**
|
|
14
|
+
* Finalize a content block for the finish event.
|
|
15
|
+
* For tool calls, parse the accumulated JSON args string.
|
|
16
|
+
*/
|
|
17
|
+
declare function finalizeContentBlock(block: ContentBlock): ContentBlock;
|
|
18
|
+
//#endregion
|
|
19
|
+
export { convertChunksToEvents, finalizeContentBlock };
|
|
20
|
+
//# sourceMappingURL=compat.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compat.d.cts","names":[],"sources":["../../src/language_models/compat.ts"],"mappings":";;;;;;;;;iBAoIuB,qBAAA,CACrB,MAAA,EAAQ,aAAA,CAAc,mBAAA,GACtB,OAAA;EAAY,MAAA,GAAS,WAAA;AAAA,IACpB,cAAA,CAAe,oBAAA;;;;;iBAmWF,oBAAA,CAAqB,KAAA,EAAO,YAAA,GAAe,YAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ContentBlock } from "../messages/content/index.js";
|
|
2
|
+
import { ChatGenerationChunk } from "../outputs.js";
|
|
3
|
+
import { ChatModelStreamEvent } from "./event.js";
|
|
4
|
+
|
|
5
|
+
//#region src/language_models/compat.d.ts
|
|
6
|
+
/**
|
|
7
|
+
* Convert an async iterable of legacy `ChatGenerationChunk`s into
|
|
8
|
+
* `ChatModelStreamEvent`s with typed deltas.
|
|
9
|
+
*/
|
|
10
|
+
declare function convertChunksToEvents(chunks: AsyncIterable<ChatGenerationChunk>, options?: {
|
|
11
|
+
signal?: AbortSignal;
|
|
12
|
+
}): AsyncGenerator<ChatModelStreamEvent>;
|
|
13
|
+
/**
|
|
14
|
+
* Finalize a content block for the finish event.
|
|
15
|
+
* For tool calls, parse the accumulated JSON args string.
|
|
16
|
+
*/
|
|
17
|
+
declare function finalizeContentBlock(block: ContentBlock): ContentBlock;
|
|
18
|
+
//#endregion
|
|
19
|
+
export { convertChunksToEvents, finalizeContentBlock };
|
|
20
|
+
//# sourceMappingURL=compat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compat.d.ts","names":[],"sources":["../../src/language_models/compat.ts"],"mappings":";;;;;;;;;iBAoIuB,qBAAA,CACrB,MAAA,EAAQ,aAAA,CAAc,mBAAA,GACtB,OAAA;EAAY,MAAA,GAAS,WAAA;AAAA,IACpB,cAAA,CAAe,oBAAA;;;;;iBAmWF,oBAAA,CAAqB,KAAA,EAAO,YAAA,GAAe,YAAA"}
|