@langchain/core 1.1.39 → 1.2.0-dev-1775763803878
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/dist/callbacks/base.d.cts.map +1 -1
- package/dist/callbacks/base.d.ts.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 +60 -0
- 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 +60 -0
- package/dist/language_models/chat_models.js.map +1 -1
- package/dist/language_models/compat.cjs +235 -0
- package/dist/language_models/compat.cjs.map +1 -0
- package/dist/language_models/compat.d.cts +34 -0
- package/dist/language_models/compat.d.cts.map +1 -0
- package/dist/language_models/compat.d.ts +34 -0
- package/dist/language_models/compat.d.ts.map +1 -0
- package/dist/language_models/compat.js +226 -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 +193 -0
- package/dist/language_models/event.d.cts.map +1 -0
- package/dist/language_models/event.d.ts +193 -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 +376 -0
- package/dist/language_models/stream.cjs.map +1 -0
- package/dist/language_models/stream.d.cts +129 -0
- package/dist/language_models/stream.d.cts.map +1 -0
- package/dist/language_models/stream.d.ts +129 -0
- package/dist/language_models/stream.d.ts.map +1 -0
- package/dist/language_models/stream.js +365 -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/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/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/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/vectorstores.cjs +0 -1
- package/vectorstores.d.cts +0 -1
- package/vectorstores.d.ts +0 -1
- package/vectorstores.js +0 -1
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { __exportAll } from "../_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { AIMessageChunk } from "../messages/ai.js";
|
|
3
|
+
//#region src/language_models/compat.ts
|
|
4
|
+
/**
|
|
5
|
+
* Compatibility bridge: converts legacy `_streamResponseChunks`
|
|
6
|
+
* (`ChatGenerationChunk` / `AIMessageChunk`) output to the new
|
|
7
|
+
* `ChatModelStreamEvent` protocol.
|
|
8
|
+
*
|
|
9
|
+
* This module is used by `BaseChatModel._streamChatModelEvents` as
|
|
10
|
+
* the default implementation when a provider has not yet implemented
|
|
11
|
+
* native event streaming.
|
|
12
|
+
*
|
|
13
|
+
* @module
|
|
14
|
+
*/
|
|
15
|
+
var compat_exports = /* @__PURE__ */ __exportAll({
|
|
16
|
+
accumulateContentBlock: () => accumulateContentBlock,
|
|
17
|
+
convertChunksToEvents: () => convertChunksToEvents,
|
|
18
|
+
finalizeContentBlock: () => finalizeContentBlock
|
|
19
|
+
});
|
|
20
|
+
/**
|
|
21
|
+
* Convert an async iterable of legacy `ChatGenerationChunk`s into
|
|
22
|
+
* `ChatModelStreamEvent`s.
|
|
23
|
+
*
|
|
24
|
+
* Tracks content blocks by index, synthesizes start/delta/finish events,
|
|
25
|
+
* and emits usage updates. Handles both string content and array content
|
|
26
|
+
* blocks, as well as tool call chunks.
|
|
27
|
+
*
|
|
28
|
+
* @param chunks - The legacy chunk stream from `_streamResponseChunks`.
|
|
29
|
+
* @param options - Optional signal for abort handling.
|
|
30
|
+
* @returns An async generator of {@link ChatModelStreamEvent}.
|
|
31
|
+
*/
|
|
32
|
+
async function* convertChunksToEvents(chunks, options) {
|
|
33
|
+
const activeBlocks = /* @__PURE__ */ new Map();
|
|
34
|
+
let messageStarted = false;
|
|
35
|
+
let lastUsage;
|
|
36
|
+
for await (const chunk of chunks) {
|
|
37
|
+
options?.signal?.throwIfAborted();
|
|
38
|
+
const msg = chunk.message;
|
|
39
|
+
let usageHandledInStart = false;
|
|
40
|
+
if (!messageStarted) {
|
|
41
|
+
messageStarted = true;
|
|
42
|
+
const startEvent = {
|
|
43
|
+
type: "message-start",
|
|
44
|
+
id: msg.id ?? void 0
|
|
45
|
+
};
|
|
46
|
+
if (AIMessageChunk.isInstance(msg) && msg.usage_metadata) {
|
|
47
|
+
startEvent.usage = msg.usage_metadata;
|
|
48
|
+
lastUsage = { ...msg.usage_metadata };
|
|
49
|
+
usageHandledInStart = true;
|
|
50
|
+
}
|
|
51
|
+
yield startEvent;
|
|
52
|
+
}
|
|
53
|
+
const content = msg.content;
|
|
54
|
+
if (typeof content === "string") {
|
|
55
|
+
if (content !== "") {
|
|
56
|
+
const blockIndex = 0;
|
|
57
|
+
if (!activeBlocks.has(blockIndex)) {
|
|
58
|
+
const initial = {
|
|
59
|
+
type: "text",
|
|
60
|
+
text: ""
|
|
61
|
+
};
|
|
62
|
+
activeBlocks.set(blockIndex, {
|
|
63
|
+
started: true,
|
|
64
|
+
accumulated: initial
|
|
65
|
+
});
|
|
66
|
+
yield {
|
|
67
|
+
type: "content-block-start",
|
|
68
|
+
index: blockIndex,
|
|
69
|
+
content: initial
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
const block = activeBlocks.get(blockIndex);
|
|
73
|
+
const accumulated = {
|
|
74
|
+
type: "text",
|
|
75
|
+
text: block.accumulated.text + content
|
|
76
|
+
};
|
|
77
|
+
block.accumulated = accumulated;
|
|
78
|
+
yield {
|
|
79
|
+
type: "content-block-delta",
|
|
80
|
+
index: blockIndex,
|
|
81
|
+
content: accumulated
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
} else if (Array.isArray(content)) for (const part of content) {
|
|
85
|
+
const blockIndex = typeof part.index === "number" ? part.index : activeBlocks.size;
|
|
86
|
+
if (!activeBlocks.has(blockIndex)) {
|
|
87
|
+
activeBlocks.set(blockIndex, {
|
|
88
|
+
started: true,
|
|
89
|
+
accumulated: { ...part }
|
|
90
|
+
});
|
|
91
|
+
yield {
|
|
92
|
+
type: "content-block-start",
|
|
93
|
+
index: blockIndex,
|
|
94
|
+
content: { ...part }
|
|
95
|
+
};
|
|
96
|
+
} else {
|
|
97
|
+
const block = activeBlocks.get(blockIndex);
|
|
98
|
+
const accumulated = accumulateContentBlock(block.accumulated, part);
|
|
99
|
+
block.accumulated = accumulated;
|
|
100
|
+
yield {
|
|
101
|
+
type: "content-block-delta",
|
|
102
|
+
index: blockIndex,
|
|
103
|
+
content: accumulated
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (AIMessageChunk.isInstance(msg) && msg.tool_call_chunks && msg.tool_call_chunks.length > 0) for (const toolChunk of msg.tool_call_chunks) {
|
|
108
|
+
const blockIndex = typeof toolChunk.index === "number" ? toolChunk.index : activeBlocks.size;
|
|
109
|
+
const delta = {
|
|
110
|
+
type: "tool_call_chunk",
|
|
111
|
+
id: toolChunk.id,
|
|
112
|
+
name: toolChunk.name,
|
|
113
|
+
args: toolChunk.args,
|
|
114
|
+
index: blockIndex
|
|
115
|
+
};
|
|
116
|
+
if (!activeBlocks.has(blockIndex)) {
|
|
117
|
+
activeBlocks.set(blockIndex, {
|
|
118
|
+
started: true,
|
|
119
|
+
accumulated: { ...delta }
|
|
120
|
+
});
|
|
121
|
+
yield {
|
|
122
|
+
type: "content-block-start",
|
|
123
|
+
index: blockIndex,
|
|
124
|
+
content: { ...delta }
|
|
125
|
+
};
|
|
126
|
+
} else {
|
|
127
|
+
const block = activeBlocks.get(blockIndex);
|
|
128
|
+
const accumulated = accumulateContentBlock(block.accumulated, delta);
|
|
129
|
+
block.accumulated = accumulated;
|
|
130
|
+
yield {
|
|
131
|
+
type: "content-block-delta",
|
|
132
|
+
index: blockIndex,
|
|
133
|
+
content: accumulated
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (!usageHandledInStart && AIMessageChunk.isInstance(msg) && msg.usage_metadata) {
|
|
138
|
+
const chunkUsage = msg.usage_metadata;
|
|
139
|
+
if (!lastUsage) lastUsage = { ...chunkUsage };
|
|
140
|
+
else lastUsage = {
|
|
141
|
+
input_tokens: lastUsage.input_tokens + chunkUsage.input_tokens,
|
|
142
|
+
output_tokens: lastUsage.output_tokens + chunkUsage.output_tokens,
|
|
143
|
+
total_tokens: lastUsage.total_tokens + chunkUsage.total_tokens
|
|
144
|
+
};
|
|
145
|
+
yield {
|
|
146
|
+
type: "usage",
|
|
147
|
+
usage: { ...lastUsage }
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
for (const [index, block] of activeBlocks) yield {
|
|
152
|
+
type: "content-block-finish",
|
|
153
|
+
index,
|
|
154
|
+
content: finalizeContentBlock(block.accumulated)
|
|
155
|
+
};
|
|
156
|
+
yield {
|
|
157
|
+
type: "message-finish",
|
|
158
|
+
reason: "stop",
|
|
159
|
+
...lastUsage ? { usage: lastUsage } : {}
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Accumulate a content block delta into the running snapshot.
|
|
164
|
+
*/
|
|
165
|
+
function accumulateContentBlock(accumulated, delta) {
|
|
166
|
+
if (accumulated.type === "text" && delta.type === "text") return {
|
|
167
|
+
...accumulated,
|
|
168
|
+
type: "text",
|
|
169
|
+
text: accumulated.text + (delta.text ?? "")
|
|
170
|
+
};
|
|
171
|
+
if (accumulated.type === "reasoning" && delta.type === "reasoning") return {
|
|
172
|
+
...accumulated,
|
|
173
|
+
type: "reasoning",
|
|
174
|
+
reasoning: accumulated.reasoning + (delta.reasoning ?? "")
|
|
175
|
+
};
|
|
176
|
+
if ((accumulated.type === "tool_call_chunk" || accumulated.type === "tool_call") && (delta.type === "tool_call_chunk" || delta.type === "tool_call")) {
|
|
177
|
+
const accTC = accumulated;
|
|
178
|
+
const deltaTC = delta;
|
|
179
|
+
return {
|
|
180
|
+
...accumulated,
|
|
181
|
+
type: "tool_call_chunk",
|
|
182
|
+
id: accTC.id ?? deltaTC.id,
|
|
183
|
+
name: accTC.name ?? deltaTC.name,
|
|
184
|
+
args: (accTC.args ?? "") + (deltaTC.args ?? ""),
|
|
185
|
+
index: accTC.index ?? deltaTC.index
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
return {
|
|
189
|
+
...accumulated,
|
|
190
|
+
...delta
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Finalize a content block for the finish event.
|
|
195
|
+
*
|
|
196
|
+
* For tool calls, attempts to parse the accumulated args JSON string
|
|
197
|
+
* into an object, upgrading from `tool_call_chunk` to `tool_call`.
|
|
198
|
+
*/
|
|
199
|
+
function finalizeContentBlock(block) {
|
|
200
|
+
if (block.type === "tool_call_chunk") {
|
|
201
|
+
const chunk = block;
|
|
202
|
+
let parsedArgs;
|
|
203
|
+
try {
|
|
204
|
+
parsedArgs = JSON.parse(chunk.args ?? "{}");
|
|
205
|
+
} catch {
|
|
206
|
+
return {
|
|
207
|
+
type: "invalid_tool_call",
|
|
208
|
+
id: chunk.id,
|
|
209
|
+
name: chunk.name,
|
|
210
|
+
args: chunk.args,
|
|
211
|
+
error: "Failed to parse tool call arguments as JSON"
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
return {
|
|
215
|
+
type: "tool_call",
|
|
216
|
+
id: chunk.id,
|
|
217
|
+
name: chunk.name,
|
|
218
|
+
args: parsedArgs
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
return block;
|
|
222
|
+
}
|
|
223
|
+
//#endregion
|
|
224
|
+
export { accumulateContentBlock, compat_exports, convertChunksToEvents, finalizeContentBlock };
|
|
225
|
+
|
|
226
|
+
//# sourceMappingURL=compat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compat.js","names":[],"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 * This module is used by `BaseChatModel._streamChatModelEvents` as\n * the default implementation when a provider has not yet implemented\n * native event streaming.\n *\n * @module\n */\n\nimport { AIMessageChunk } from \"../messages/ai.js\";\nimport type { ContentBlock } from \"../messages/content/index.js\";\nimport type { ChatGenerationChunk } from \"../outputs.js\";\nimport type { ChatModelStreamEvent } from \"./event.js\";\n\n/**\n * Convert an async iterable of legacy `ChatGenerationChunk`s into\n * `ChatModelStreamEvent`s.\n *\n * Tracks content blocks by index, synthesizes start/delta/finish events,\n * and emits usage updates. Handles both string content and array content\n * blocks, as well as tool call chunks.\n *\n * @param chunks - The legacy chunk stream from `_streamResponseChunks`.\n * @param options - Optional signal for abort handling.\n * @returns An async generator of {@link ChatModelStreamEvent}.\n */\nexport async function* convertChunksToEvents(\n chunks: AsyncIterable<ChatGenerationChunk>,\n options?: { signal?: AbortSignal }\n): AsyncGenerator<ChatModelStreamEvent> {\n // Track active content blocks for the bridge\n const activeBlocks = new Map<\n number,\n { started: boolean; accumulated: ContentBlock }\n >();\n let messageStarted = false;\n let lastUsage:\n | { input_tokens: number; output_tokens: number; total_tokens: number }\n | undefined;\n\n for await (const chunk of chunks) {\n options?.signal?.throwIfAborted();\n\n const msg = chunk.message;\n\n // Emit message-start on the first chunk\n let usageHandledInStart = false;\n if (!messageStarted) {\n messageStarted = true;\n const startEvent: ChatModelStreamEvent = {\n type: \"message-start\" as const,\n id: msg.id ?? undefined,\n };\n // If first chunk has usage (e.g., Anthropic input tokens)\n if (AIMessageChunk.isInstance(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 from the chunk\n const content = msg.content;\n if (typeof content === \"string\") {\n if (content !== \"\") {\n // Simple string content → single text block at index 0\n const blockIndex = 0;\n\n if (!activeBlocks.has(blockIndex)) {\n const initial: ContentBlock.Text = { type: \"text\", text: \"\" };\n activeBlocks.set(blockIndex, {\n started: true,\n accumulated: initial,\n });\n yield {\n type: \"content-block-start\" as const,\n index: blockIndex,\n content: initial,\n };\n }\n\n const block = activeBlocks.get(blockIndex)!;\n const prevText = (block.accumulated as ContentBlock.Text).text;\n const accumulated: ContentBlock.Text = {\n type: \"text\",\n text: prevText + content,\n };\n block.accumulated = accumulated;\n\n yield {\n type: \"content-block-delta\" as const,\n index: blockIndex,\n content: accumulated,\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 started: true,\n accumulated: { ...part },\n });\n yield {\n type: \"content-block-start\" as const,\n index: blockIndex,\n content: { ...part },\n };\n } else {\n // Accumulate into existing block\n const block = activeBlocks.get(blockIndex)!;\n const accumulated = accumulateContentBlock(block.accumulated, part);\n block.accumulated = accumulated;\n\n yield {\n type: \"content-block-delta\" as const,\n index: blockIndex,\n content: accumulated,\n };\n }\n }\n }\n\n // Handle tool call chunks from the legacy path\n if (\n AIMessageChunk.isInstance(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 const delta: ContentBlock = {\n type: \"tool_call_chunk\" as const,\n id: toolChunk.id,\n name: toolChunk.name,\n args: toolChunk.args,\n index: blockIndex,\n };\n\n if (!activeBlocks.has(blockIndex)) {\n activeBlocks.set(blockIndex, {\n started: true,\n accumulated: { ...delta },\n });\n yield {\n type: \"content-block-start\" as const,\n index: blockIndex,\n content: { ...delta },\n };\n } else {\n const block = activeBlocks.get(blockIndex)!;\n const accumulated = accumulateContentBlock(block.accumulated, delta);\n block.accumulated = accumulated;\n\n yield {\n type: \"content-block-delta\" as const,\n index: blockIndex,\n content: accumulated,\n };\n }\n }\n }\n\n // Accumulate usage (legacy chunks use additive usage, not snapshots)\n if (\n !usageHandledInStart &&\n AIMessageChunk.isInstance(msg) &&\n msg.usage_metadata\n ) {\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 { type: \"usage\" as const, usage: { ...lastUsage } };\n }\n }\n\n // Emit content-block-finish for all active blocks\n for (const [index, block] of activeBlocks) {\n const finalized = finalizeContentBlock(block.accumulated);\n yield {\n type: \"content-block-finish\" as const,\n index,\n content: finalized,\n };\n }\n\n // Emit message-finish\n yield {\n type: \"message-finish\" as const,\n reason: \"stop\" as const,\n ...(lastUsage ? { usage: lastUsage } : {}),\n };\n}\n\n/**\n * Accumulate a content block delta into the running snapshot.\n */\nexport function accumulateContentBlock(\n accumulated: ContentBlock,\n delta: ContentBlock\n): ContentBlock {\n if (accumulated.type === \"text\" && delta.type === \"text\") {\n return {\n ...accumulated,\n type: \"text\" as const,\n text:\n (accumulated as ContentBlock.Text).text +\n ((delta as ContentBlock.Text).text ?? \"\"),\n } as ContentBlock.Text;\n }\n\n if (accumulated.type === \"reasoning\" && delta.type === \"reasoning\") {\n return {\n ...accumulated,\n type: \"reasoning\" as const,\n reasoning:\n (accumulated as ContentBlock.Reasoning).reasoning +\n ((delta as ContentBlock.Reasoning).reasoning ?? \"\"),\n } as ContentBlock.Reasoning;\n }\n\n if (\n (accumulated.type === \"tool_call_chunk\" ||\n accumulated.type === \"tool_call\") &&\n (delta.type === \"tool_call_chunk\" || delta.type === \"tool_call\")\n ) {\n const accTC = accumulated as ContentBlock.Tools.ToolCallChunk;\n const deltaTC = delta as ContentBlock.Tools.ToolCallChunk;\n return {\n ...accumulated,\n type: \"tool_call_chunk\" as const,\n id: accTC.id ?? deltaTC.id,\n name: accTC.name ?? deltaTC.name,\n args: (accTC.args ?? \"\") + (deltaTC.args ?? \"\"),\n index: accTC.index ?? deltaTC.index,\n } as ContentBlock.Tools.ToolCallChunk;\n }\n\n // For block types we don't know how to merge, just spread the delta over\n return { ...accumulated, ...delta };\n}\n\n/**\n * Finalize a content block for the finish event.\n *\n * For tool calls, attempts to parse the accumulated args JSON string\n * into an object, upgrading from `tool_call_chunk` to `tool_call`.\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 // If JSON parsing fails, return as invalid tool call\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,12 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
//#region src/language_models/event.ts
|
|
3
|
+
var event_exports = /* @__PURE__ */ require("../_virtual/_rolldown/runtime.cjs").__exportAll({});
|
|
4
|
+
//#endregion
|
|
5
|
+
Object.defineProperty(exports, "event_exports", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return event_exports;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
//# sourceMappingURL=event.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.cjs","names":[],"sources":["../../src/language_models/event.ts"],"sourcesContent":["/**\n * Chat model streaming event protocol.\n *\n * Defines a content-block-centric event model for streaming chat model responses.\n * Events carry LangChain {@link ContentBlock} types directly as accumulated\n * snapshots.\n *\n * ## Design Principles\n *\n * 1. **Content blocks are the universal carrier.** Events carry {@link ContentBlock}\n * instances directly — the block's `type` field is the discriminant. New content\n * block types automatically work without protocol changes.\n *\n * 2. **Lifecycle completeness.** Every streamable entity has explicit start and finish\n * events. Consumers never need to infer boundaries from absence of events.\n *\n * 3. **Accumulated snapshots.** Each {@link ContentBlockDeltaEvent} carries the\n * accumulated state of the content block so far. Aggregation logic lives in the\n * provider adapter, not the consumer. Consumers who need incremental deltas\n * track previous state and diff.\n *\n * 4. **Interleaving allowed.** Content blocks may interleave (e.g., parallel tool calls).\n * The only invariant: a block's start precedes its deltas, and its deltas precede\n * its finish. No ordering constraint between different blocks.\n *\n * 5. **Provider passthrough.** Native provider events that don't map to standard types\n * are forwarded as {@link ProviderEvent} rather than silently dropped.\n *\n * ## Lifecycle Contract\n *\n * ```\n * MessageStart\n * -> ContentBlockStart(index=0, ...)\n * -> ContentBlockStart(index=1, ...) // can start before 0 finishes\n * -> ContentBlockDelta(index=0, ...)\n * -> ContentBlockDelta(index=1, ...) // interleaved\n * -> ContentBlockFinish(index=0, ...) // blocks finish independently\n * -> ContentBlockDelta(index=1, ...)\n * -> ContentBlockFinish(index=1, ...)\n * -> UsageUpdate(...) // may appear at any point\n * -> MessageFinish(reason, usage?)\n * ```\n *\n * @module\n */\n\nimport type {\n ContentBlock,\n PartialContentBlock,\n} from \"../messages/content/index.js\";\nimport type { UsageMetadata } from \"../messages/metadata.js\";\n\n/**\n * Emitted once at the start of a model response.\n */\nexport interface MessageStartEvent {\n type: \"message-start\";\n /** Optional message ID assigned by the provider. */\n id?: string;\n /**\n * Initial usage snapshot, if the provider reports input token counts\n * before content begins streaming (e.g., Anthropic's `message_start`).\n */\n usage?: UsageMetadata;\n}\n\n/**\n * Finish reason for a model response.\n *\n * - `\"stop\"`: Natural end of generation.\n * - `\"length\"`: Hit max token limit.\n * - `\"tool_use\"`: Model is requesting tool execution.\n * - `\"content_filter\"`: Content was filtered by safety systems.\n */\nexport type FinishReason = \"stop\" | \"length\" | \"tool_use\" | \"content_filter\";\n\n/**\n * Emitted once when the model response is complete.\n */\nexport interface MessageFinishEvent {\n type: \"message-finish\";\n /** Why the model stopped generating. */\n reason: FinishReason;\n /** Final usage snapshot. */\n usage?: UsageMetadata;\n /** Provider-specific response metadata (model name, response ID, headers, etc.). */\n responseMetadata?: Record<string, unknown>;\n}\n\n/**\n * Emitted when a new content block begins streaming.\n *\n * @example\n * ```ts\n * // Text block starting\n * { type: \"content-block-start\", index: 0,\n * content: { type: \"text\", text: \"\" } }\n *\n * // Tool call starting\n * { type: \"content-block-start\", index: 1,\n * content: { type: \"tool_call\", id: \"call_1\", name: \"search\", args: \"\" } }\n *\n * // Reasoning starting\n * { type: \"content-block-start\", index: 2,\n * content: { type: \"reasoning\", reasoning: \"\" } }\n * ```\n */\nexport interface ContentBlockStartEvent {\n type: \"content-block-start\";\n /** Positional index of this block within the message. */\n index: number;\n /** Initial state of the content block. */\n content: ContentBlock;\n}\n\n/**\n * Emitted for each incremental update within a content block.\n *\n * Carries the **accumulated state** of the content block so far.\n * The content is deeply partial — not all fields may be populated during\n * streaming (e.g., a tool call may have `name` but `args` is still being\n * streamed as a partial JSON string).\n *\n * Consumers who need incremental deltas (e.g., new tokens only) should\n * track the previous state and diff against the new accumulated state.\n *\n * Aggregation into `AIMessage` is trivial:\n * `message.content[event.index] = event.content`\n *\n * @example\n * ```ts\n * // First text delta — accumulated so far\n * { type: \"content-block-delta\", index: 0,\n * content: { type: \"text\", text: \"Hello\" } }\n *\n * // Second text delta — accumulated so far\n * { type: \"content-block-delta\", index: 0,\n * content: { type: \"text\", text: \"Hello world\" } }\n *\n * // Tool call args — accumulated so far\n * { type: \"content-block-delta\", index: 1,\n * content: { type: \"tool_call\", id: \"call_1\", name: \"search\", args: '{\"q\":\"wea' } }\n * ```\n */\nexport interface ContentBlockDeltaEvent {\n type: \"content-block-delta\";\n /** Positional index of the block being updated. */\n index: number;\n /** Accumulated state of the content block after this update. Deeply partial. */\n content: PartialContentBlock;\n}\n\n/**\n * Emitted when a content block is complete.\n *\n * The `content` carries the **finalized** block. For tool calls, this means\n * args have been parsed from a JSON string into an object.\n *\n * @example\n * ```ts\n * // Finalized text block\n * { type: \"content-block-finish\", index: 0,\n * content: { type: \"text\", text: \"The weather is sunny.\" } }\n *\n * // Finalized tool call (args parsed)\n * { type: \"content-block-finish\", index: 1,\n * content: { type: \"tool_call\", id: \"call_1\", name: \"search\",\n * args: { q: \"weather\" } } }\n * ```\n */\nexport interface ContentBlockFinishEvent {\n type: \"content-block-finish\";\n /** Positional index of the completed block. */\n index: number;\n /** Finalized content block. */\n content: ContentBlock;\n}\n\n/**\n * Emitted whenever the provider reports updated usage information.\n *\n * May appear at any point during streaming. Each event carries a\n * **running snapshot** of usage (not an additive delta), so consumers\n * can simply take the latest value.\n *\n * @example\n * ```ts\n * // After message_start (Anthropic: input tokens known)\n * { type: \"usage\", usage: { input_tokens: 1234, output_tokens: 0, total_tokens: 1234 } }\n *\n * // After streaming completes\n * { type: \"usage\", usage: { input_tokens: 1234, output_tokens: 567, total_tokens: 1801 } }\n * ```\n */\nexport interface UsageUpdateEvent {\n type: \"usage\";\n /** Current usage snapshot. */\n usage: UsageMetadata;\n}\n\n/**\n * Passthrough for native provider events that don't map to standard types.\n *\n * Provider adapters map recognized events to standard {@link ChatModelStreamEvent}\n * types and forward everything else as `ProviderEvent`. This ensures no information\n * is silently dropped.\n *\n * @example\n * ```ts\n * // OpenAI server-side web search in progress\n * { type: \"provider\", provider: \"openai\",\n * name: \"response.web_search_call.searching\",\n * payload: { item_id: \"ws_123\", output_index: 0 } }\n *\n * // Anthropic context management signal\n * { type: \"provider\", provider: \"anthropic\",\n * name: \"context_management\",\n * payload: { ... } }\n * ```\n */\nexport interface ProviderEvent {\n type: \"provider\";\n /** Provider identifier (e.g., `\"openai\"`, `\"anthropic\"`, `\"google\"`). */\n provider: string;\n /** Raw event type name from the provider SDK. */\n name: string;\n /** Raw event payload from the provider SDK. */\n payload: unknown;\n}\n\n/**\n * Emitted on unrecoverable stream errors.\n */\nexport interface StreamErrorEvent {\n type: \"error\";\n /** Human-readable error message. */\n message: string;\n /** Optional error code for programmatic handling. */\n code?: string;\n}\n\n/**\n * Union of all chat model stream event types.\n *\n * This is the type yielded by `ChatModelStream[Symbol.asyncIterator]()`.\n */\nexport type ChatModelStreamEvent =\n | MessageStartEvent\n | MessageFinishEvent\n | ContentBlockStartEvent\n | ContentBlockDeltaEvent\n | ContentBlockFinishEvent\n | UsageUpdateEvent\n | ProviderEvent\n | StreamErrorEvent;\n"],"mappings":""}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { ContentBlock, PartialContentBlock } from "../messages/content/index.cjs";
|
|
2
|
+
import { UsageMetadata } from "../messages/metadata.cjs";
|
|
3
|
+
|
|
4
|
+
//#region src/language_models/event.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* Emitted once at the start of a model response.
|
|
7
|
+
*/
|
|
8
|
+
interface MessageStartEvent {
|
|
9
|
+
type: "message-start";
|
|
10
|
+
/** Optional message ID assigned by the provider. */
|
|
11
|
+
id?: string;
|
|
12
|
+
/**
|
|
13
|
+
* Initial usage snapshot, if the provider reports input token counts
|
|
14
|
+
* before content begins streaming (e.g., Anthropic's `message_start`).
|
|
15
|
+
*/
|
|
16
|
+
usage?: UsageMetadata;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Finish reason for a model response.
|
|
20
|
+
*
|
|
21
|
+
* - `"stop"`: Natural end of generation.
|
|
22
|
+
* - `"length"`: Hit max token limit.
|
|
23
|
+
* - `"tool_use"`: Model is requesting tool execution.
|
|
24
|
+
* - `"content_filter"`: Content was filtered by safety systems.
|
|
25
|
+
*/
|
|
26
|
+
type FinishReason = "stop" | "length" | "tool_use" | "content_filter";
|
|
27
|
+
/**
|
|
28
|
+
* Emitted once when the model response is complete.
|
|
29
|
+
*/
|
|
30
|
+
interface MessageFinishEvent {
|
|
31
|
+
type: "message-finish";
|
|
32
|
+
/** Why the model stopped generating. */
|
|
33
|
+
reason: FinishReason;
|
|
34
|
+
/** Final usage snapshot. */
|
|
35
|
+
usage?: UsageMetadata;
|
|
36
|
+
/** Provider-specific response metadata (model name, response ID, headers, etc.). */
|
|
37
|
+
responseMetadata?: Record<string, unknown>;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Emitted when a new content block begins streaming.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```ts
|
|
44
|
+
* // Text block starting
|
|
45
|
+
* { type: "content-block-start", index: 0,
|
|
46
|
+
* content: { type: "text", text: "" } }
|
|
47
|
+
*
|
|
48
|
+
* // Tool call starting
|
|
49
|
+
* { type: "content-block-start", index: 1,
|
|
50
|
+
* content: { type: "tool_call", id: "call_1", name: "search", args: "" } }
|
|
51
|
+
*
|
|
52
|
+
* // Reasoning starting
|
|
53
|
+
* { type: "content-block-start", index: 2,
|
|
54
|
+
* content: { type: "reasoning", reasoning: "" } }
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
interface ContentBlockStartEvent {
|
|
58
|
+
type: "content-block-start";
|
|
59
|
+
/** Positional index of this block within the message. */
|
|
60
|
+
index: number;
|
|
61
|
+
/** Initial state of the content block. */
|
|
62
|
+
content: ContentBlock;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Emitted for each incremental update within a content block.
|
|
66
|
+
*
|
|
67
|
+
* Carries the **accumulated state** of the content block so far.
|
|
68
|
+
* The content is deeply partial — not all fields may be populated during
|
|
69
|
+
* streaming (e.g., a tool call may have `name` but `args` is still being
|
|
70
|
+
* streamed as a partial JSON string).
|
|
71
|
+
*
|
|
72
|
+
* Consumers who need incremental deltas (e.g., new tokens only) should
|
|
73
|
+
* track the previous state and diff against the new accumulated state.
|
|
74
|
+
*
|
|
75
|
+
* Aggregation into `AIMessage` is trivial:
|
|
76
|
+
* `message.content[event.index] = event.content`
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* ```ts
|
|
80
|
+
* // First text delta — accumulated so far
|
|
81
|
+
* { type: "content-block-delta", index: 0,
|
|
82
|
+
* content: { type: "text", text: "Hello" } }
|
|
83
|
+
*
|
|
84
|
+
* // Second text delta — accumulated so far
|
|
85
|
+
* { type: "content-block-delta", index: 0,
|
|
86
|
+
* content: { type: "text", text: "Hello world" } }
|
|
87
|
+
*
|
|
88
|
+
* // Tool call args — accumulated so far
|
|
89
|
+
* { type: "content-block-delta", index: 1,
|
|
90
|
+
* content: { type: "tool_call", id: "call_1", name: "search", args: '{"q":"wea' } }
|
|
91
|
+
* ```
|
|
92
|
+
*/
|
|
93
|
+
interface ContentBlockDeltaEvent {
|
|
94
|
+
type: "content-block-delta";
|
|
95
|
+
/** Positional index of the block being updated. */
|
|
96
|
+
index: number;
|
|
97
|
+
/** Accumulated state of the content block after this update. Deeply partial. */
|
|
98
|
+
content: PartialContentBlock;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Emitted when a content block is complete.
|
|
102
|
+
*
|
|
103
|
+
* The `content` carries the **finalized** block. For tool calls, this means
|
|
104
|
+
* args have been parsed from a JSON string into an object.
|
|
105
|
+
*
|
|
106
|
+
* @example
|
|
107
|
+
* ```ts
|
|
108
|
+
* // Finalized text block
|
|
109
|
+
* { type: "content-block-finish", index: 0,
|
|
110
|
+
* content: { type: "text", text: "The weather is sunny." } }
|
|
111
|
+
*
|
|
112
|
+
* // Finalized tool call (args parsed)
|
|
113
|
+
* { type: "content-block-finish", index: 1,
|
|
114
|
+
* content: { type: "tool_call", id: "call_1", name: "search",
|
|
115
|
+
* args: { q: "weather" } } }
|
|
116
|
+
* ```
|
|
117
|
+
*/
|
|
118
|
+
interface ContentBlockFinishEvent {
|
|
119
|
+
type: "content-block-finish";
|
|
120
|
+
/** Positional index of the completed block. */
|
|
121
|
+
index: number;
|
|
122
|
+
/** Finalized content block. */
|
|
123
|
+
content: ContentBlock;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Emitted whenever the provider reports updated usage information.
|
|
127
|
+
*
|
|
128
|
+
* May appear at any point during streaming. Each event carries a
|
|
129
|
+
* **running snapshot** of usage (not an additive delta), so consumers
|
|
130
|
+
* can simply take the latest value.
|
|
131
|
+
*
|
|
132
|
+
* @example
|
|
133
|
+
* ```ts
|
|
134
|
+
* // After message_start (Anthropic: input tokens known)
|
|
135
|
+
* { type: "usage", usage: { input_tokens: 1234, output_tokens: 0, total_tokens: 1234 } }
|
|
136
|
+
*
|
|
137
|
+
* // After streaming completes
|
|
138
|
+
* { type: "usage", usage: { input_tokens: 1234, output_tokens: 567, total_tokens: 1801 } }
|
|
139
|
+
* ```
|
|
140
|
+
*/
|
|
141
|
+
interface UsageUpdateEvent {
|
|
142
|
+
type: "usage";
|
|
143
|
+
/** Current usage snapshot. */
|
|
144
|
+
usage: UsageMetadata;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Passthrough for native provider events that don't map to standard types.
|
|
148
|
+
*
|
|
149
|
+
* Provider adapters map recognized events to standard {@link ChatModelStreamEvent}
|
|
150
|
+
* types and forward everything else as `ProviderEvent`. This ensures no information
|
|
151
|
+
* is silently dropped.
|
|
152
|
+
*
|
|
153
|
+
* @example
|
|
154
|
+
* ```ts
|
|
155
|
+
* // OpenAI server-side web search in progress
|
|
156
|
+
* { type: "provider", provider: "openai",
|
|
157
|
+
* name: "response.web_search_call.searching",
|
|
158
|
+
* payload: { item_id: "ws_123", output_index: 0 } }
|
|
159
|
+
*
|
|
160
|
+
* // Anthropic context management signal
|
|
161
|
+
* { type: "provider", provider: "anthropic",
|
|
162
|
+
* name: "context_management",
|
|
163
|
+
* payload: { ... } }
|
|
164
|
+
* ```
|
|
165
|
+
*/
|
|
166
|
+
interface ProviderEvent {
|
|
167
|
+
type: "provider";
|
|
168
|
+
/** Provider identifier (e.g., `"openai"`, `"anthropic"`, `"google"`). */
|
|
169
|
+
provider: string;
|
|
170
|
+
/** Raw event type name from the provider SDK. */
|
|
171
|
+
name: string;
|
|
172
|
+
/** Raw event payload from the provider SDK. */
|
|
173
|
+
payload: unknown;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Emitted on unrecoverable stream errors.
|
|
177
|
+
*/
|
|
178
|
+
interface StreamErrorEvent {
|
|
179
|
+
type: "error";
|
|
180
|
+
/** Human-readable error message. */
|
|
181
|
+
message: string;
|
|
182
|
+
/** Optional error code for programmatic handling. */
|
|
183
|
+
code?: string;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Union of all chat model stream event types.
|
|
187
|
+
*
|
|
188
|
+
* This is the type yielded by `ChatModelStream[Symbol.asyncIterator]()`.
|
|
189
|
+
*/
|
|
190
|
+
type ChatModelStreamEvent = MessageStartEvent | MessageFinishEvent | ContentBlockStartEvent | ContentBlockDeltaEvent | ContentBlockFinishEvent | UsageUpdateEvent | ProviderEvent | StreamErrorEvent;
|
|
191
|
+
//#endregion
|
|
192
|
+
export { ChatModelStreamEvent, ContentBlockDeltaEvent, ContentBlockFinishEvent, ContentBlockStartEvent, FinishReason, MessageFinishEvent, MessageStartEvent, ProviderEvent, StreamErrorEvent, UsageUpdateEvent };
|
|
193
|
+
//# sourceMappingURL=event.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.d.cts","names":[],"sources":["../../src/language_models/event.ts"],"mappings":";;;;;;;UAuDiB,iBAAA;EACf,IAAA;EA6FA;EA3FA,EAAA;EA2F4B;;AAqB9B;;EA3GE,KAAA,GAAQ,aAAA;AAAA;;;;;;;AAmIV;;KAxHY,YAAA;;;;UAKK,kBAAA;EACf,IAAA;EAqHoB;EAnHpB,MAAA,EAAQ,YAAA;EA0IoB;EAxI5B,KAAA,GAAQ,aAAA;EAwIoB;EAtI5B,gBAAA,GAAmB,MAAA;AAAA;;;;;AAmJrB;;;;;;;;;AAaA;;;;;UA3IiB,sBAAA;EACf,IAAA;EA+IE;EA7IF,KAAA;EA+IE;EA7IF,OAAA,EAAS,YAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAgCM,sBAAA;EACf,IAAA;;EAEA,KAAA;;EAEA,OAAA,EAAS,mBAAA;AAAA;;;;;;;;;;;;;;;;;;;UAqBM,uBAAA;EACf,IAAA;;EAEA,KAAA;;EAEA,OAAA,EAAS,YAAA;AAAA;;;;;;;;;;;;;;;;;UAmBM,gBAAA;EACf,IAAA;;EAEA,KAAA,EAAO,aAAA;AAAA;;;;;;;;;;;;;;;;;;;;;UAuBQ,aAAA;EACf,IAAA;;EAEA,QAAA;;EAEA,IAAA;;EAEA,OAAA;AAAA;;;;UAMe,gBAAA;EACf,IAAA;;EAEA,OAAA;;EAEA,IAAA;AAAA;;;;;;KAQU,oBAAA,GACR,iBAAA,GACA,kBAAA,GACA,sBAAA,GACA,sBAAA,GACA,uBAAA,GACA,gBAAA,GACA,aAAA,GACA,gBAAA"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { ContentBlock, PartialContentBlock } from "../messages/content/index.js";
|
|
2
|
+
import { UsageMetadata } from "../messages/metadata.js";
|
|
3
|
+
|
|
4
|
+
//#region src/language_models/event.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* Emitted once at the start of a model response.
|
|
7
|
+
*/
|
|
8
|
+
interface MessageStartEvent {
|
|
9
|
+
type: "message-start";
|
|
10
|
+
/** Optional message ID assigned by the provider. */
|
|
11
|
+
id?: string;
|
|
12
|
+
/**
|
|
13
|
+
* Initial usage snapshot, if the provider reports input token counts
|
|
14
|
+
* before content begins streaming (e.g., Anthropic's `message_start`).
|
|
15
|
+
*/
|
|
16
|
+
usage?: UsageMetadata;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Finish reason for a model response.
|
|
20
|
+
*
|
|
21
|
+
* - `"stop"`: Natural end of generation.
|
|
22
|
+
* - `"length"`: Hit max token limit.
|
|
23
|
+
* - `"tool_use"`: Model is requesting tool execution.
|
|
24
|
+
* - `"content_filter"`: Content was filtered by safety systems.
|
|
25
|
+
*/
|
|
26
|
+
type FinishReason = "stop" | "length" | "tool_use" | "content_filter";
|
|
27
|
+
/**
|
|
28
|
+
* Emitted once when the model response is complete.
|
|
29
|
+
*/
|
|
30
|
+
interface MessageFinishEvent {
|
|
31
|
+
type: "message-finish";
|
|
32
|
+
/** Why the model stopped generating. */
|
|
33
|
+
reason: FinishReason;
|
|
34
|
+
/** Final usage snapshot. */
|
|
35
|
+
usage?: UsageMetadata;
|
|
36
|
+
/** Provider-specific response metadata (model name, response ID, headers, etc.). */
|
|
37
|
+
responseMetadata?: Record<string, unknown>;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Emitted when a new content block begins streaming.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```ts
|
|
44
|
+
* // Text block starting
|
|
45
|
+
* { type: "content-block-start", index: 0,
|
|
46
|
+
* content: { type: "text", text: "" } }
|
|
47
|
+
*
|
|
48
|
+
* // Tool call starting
|
|
49
|
+
* { type: "content-block-start", index: 1,
|
|
50
|
+
* content: { type: "tool_call", id: "call_1", name: "search", args: "" } }
|
|
51
|
+
*
|
|
52
|
+
* // Reasoning starting
|
|
53
|
+
* { type: "content-block-start", index: 2,
|
|
54
|
+
* content: { type: "reasoning", reasoning: "" } }
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
interface ContentBlockStartEvent {
|
|
58
|
+
type: "content-block-start";
|
|
59
|
+
/** Positional index of this block within the message. */
|
|
60
|
+
index: number;
|
|
61
|
+
/** Initial state of the content block. */
|
|
62
|
+
content: ContentBlock;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Emitted for each incremental update within a content block.
|
|
66
|
+
*
|
|
67
|
+
* Carries the **accumulated state** of the content block so far.
|
|
68
|
+
* The content is deeply partial — not all fields may be populated during
|
|
69
|
+
* streaming (e.g., a tool call may have `name` but `args` is still being
|
|
70
|
+
* streamed as a partial JSON string).
|
|
71
|
+
*
|
|
72
|
+
* Consumers who need incremental deltas (e.g., new tokens only) should
|
|
73
|
+
* track the previous state and diff against the new accumulated state.
|
|
74
|
+
*
|
|
75
|
+
* Aggregation into `AIMessage` is trivial:
|
|
76
|
+
* `message.content[event.index] = event.content`
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* ```ts
|
|
80
|
+
* // First text delta — accumulated so far
|
|
81
|
+
* { type: "content-block-delta", index: 0,
|
|
82
|
+
* content: { type: "text", text: "Hello" } }
|
|
83
|
+
*
|
|
84
|
+
* // Second text delta — accumulated so far
|
|
85
|
+
* { type: "content-block-delta", index: 0,
|
|
86
|
+
* content: { type: "text", text: "Hello world" } }
|
|
87
|
+
*
|
|
88
|
+
* // Tool call args — accumulated so far
|
|
89
|
+
* { type: "content-block-delta", index: 1,
|
|
90
|
+
* content: { type: "tool_call", id: "call_1", name: "search", args: '{"q":"wea' } }
|
|
91
|
+
* ```
|
|
92
|
+
*/
|
|
93
|
+
interface ContentBlockDeltaEvent {
|
|
94
|
+
type: "content-block-delta";
|
|
95
|
+
/** Positional index of the block being updated. */
|
|
96
|
+
index: number;
|
|
97
|
+
/** Accumulated state of the content block after this update. Deeply partial. */
|
|
98
|
+
content: PartialContentBlock;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Emitted when a content block is complete.
|
|
102
|
+
*
|
|
103
|
+
* The `content` carries the **finalized** block. For tool calls, this means
|
|
104
|
+
* args have been parsed from a JSON string into an object.
|
|
105
|
+
*
|
|
106
|
+
* @example
|
|
107
|
+
* ```ts
|
|
108
|
+
* // Finalized text block
|
|
109
|
+
* { type: "content-block-finish", index: 0,
|
|
110
|
+
* content: { type: "text", text: "The weather is sunny." } }
|
|
111
|
+
*
|
|
112
|
+
* // Finalized tool call (args parsed)
|
|
113
|
+
* { type: "content-block-finish", index: 1,
|
|
114
|
+
* content: { type: "tool_call", id: "call_1", name: "search",
|
|
115
|
+
* args: { q: "weather" } } }
|
|
116
|
+
* ```
|
|
117
|
+
*/
|
|
118
|
+
interface ContentBlockFinishEvent {
|
|
119
|
+
type: "content-block-finish";
|
|
120
|
+
/** Positional index of the completed block. */
|
|
121
|
+
index: number;
|
|
122
|
+
/** Finalized content block. */
|
|
123
|
+
content: ContentBlock;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Emitted whenever the provider reports updated usage information.
|
|
127
|
+
*
|
|
128
|
+
* May appear at any point during streaming. Each event carries a
|
|
129
|
+
* **running snapshot** of usage (not an additive delta), so consumers
|
|
130
|
+
* can simply take the latest value.
|
|
131
|
+
*
|
|
132
|
+
* @example
|
|
133
|
+
* ```ts
|
|
134
|
+
* // After message_start (Anthropic: input tokens known)
|
|
135
|
+
* { type: "usage", usage: { input_tokens: 1234, output_tokens: 0, total_tokens: 1234 } }
|
|
136
|
+
*
|
|
137
|
+
* // After streaming completes
|
|
138
|
+
* { type: "usage", usage: { input_tokens: 1234, output_tokens: 567, total_tokens: 1801 } }
|
|
139
|
+
* ```
|
|
140
|
+
*/
|
|
141
|
+
interface UsageUpdateEvent {
|
|
142
|
+
type: "usage";
|
|
143
|
+
/** Current usage snapshot. */
|
|
144
|
+
usage: UsageMetadata;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Passthrough for native provider events that don't map to standard types.
|
|
148
|
+
*
|
|
149
|
+
* Provider adapters map recognized events to standard {@link ChatModelStreamEvent}
|
|
150
|
+
* types and forward everything else as `ProviderEvent`. This ensures no information
|
|
151
|
+
* is silently dropped.
|
|
152
|
+
*
|
|
153
|
+
* @example
|
|
154
|
+
* ```ts
|
|
155
|
+
* // OpenAI server-side web search in progress
|
|
156
|
+
* { type: "provider", provider: "openai",
|
|
157
|
+
* name: "response.web_search_call.searching",
|
|
158
|
+
* payload: { item_id: "ws_123", output_index: 0 } }
|
|
159
|
+
*
|
|
160
|
+
* // Anthropic context management signal
|
|
161
|
+
* { type: "provider", provider: "anthropic",
|
|
162
|
+
* name: "context_management",
|
|
163
|
+
* payload: { ... } }
|
|
164
|
+
* ```
|
|
165
|
+
*/
|
|
166
|
+
interface ProviderEvent {
|
|
167
|
+
type: "provider";
|
|
168
|
+
/** Provider identifier (e.g., `"openai"`, `"anthropic"`, `"google"`). */
|
|
169
|
+
provider: string;
|
|
170
|
+
/** Raw event type name from the provider SDK. */
|
|
171
|
+
name: string;
|
|
172
|
+
/** Raw event payload from the provider SDK. */
|
|
173
|
+
payload: unknown;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Emitted on unrecoverable stream errors.
|
|
177
|
+
*/
|
|
178
|
+
interface StreamErrorEvent {
|
|
179
|
+
type: "error";
|
|
180
|
+
/** Human-readable error message. */
|
|
181
|
+
message: string;
|
|
182
|
+
/** Optional error code for programmatic handling. */
|
|
183
|
+
code?: string;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Union of all chat model stream event types.
|
|
187
|
+
*
|
|
188
|
+
* This is the type yielded by `ChatModelStream[Symbol.asyncIterator]()`.
|
|
189
|
+
*/
|
|
190
|
+
type ChatModelStreamEvent = MessageStartEvent | MessageFinishEvent | ContentBlockStartEvent | ContentBlockDeltaEvent | ContentBlockFinishEvent | UsageUpdateEvent | ProviderEvent | StreamErrorEvent;
|
|
191
|
+
//#endregion
|
|
192
|
+
export { ChatModelStreamEvent, ContentBlockDeltaEvent, ContentBlockFinishEvent, ContentBlockStartEvent, FinishReason, MessageFinishEvent, MessageStartEvent, ProviderEvent, StreamErrorEvent, UsageUpdateEvent };
|
|
193
|
+
//# sourceMappingURL=event.d.ts.map
|