@langchain/openai 1.4.7 → 1.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/azure/embeddings.cjs.map +1 -1
- package/dist/azure/embeddings.js.map +1 -1
- package/dist/chat_models/base.cjs +1 -1
- package/dist/chat_models/base.cjs.map +1 -1
- package/dist/chat_models/base.js +1 -1
- package/dist/chat_models/base.js.map +1 -1
- package/dist/chat_models/completions.cjs +33 -0
- package/dist/chat_models/completions.cjs.map +1 -1
- package/dist/chat_models/completions.d.cts +8 -0
- package/dist/chat_models/completions.d.cts.map +1 -1
- package/dist/chat_models/completions.d.ts +8 -0
- package/dist/chat_models/completions.d.ts.map +1 -1
- package/dist/chat_models/completions.js +32 -0
- package/dist/chat_models/completions.js.map +1 -1
- package/dist/chat_models/index.cjs +7 -0
- package/dist/chat_models/index.cjs.map +1 -1
- package/dist/chat_models/index.d.cts +2 -0
- package/dist/chat_models/index.d.cts.map +1 -1
- package/dist/chat_models/index.d.ts +2 -0
- package/dist/chat_models/index.d.ts.map +1 -1
- package/dist/chat_models/index.js +7 -0
- package/dist/chat_models/index.js.map +1 -1
- package/dist/chat_models/responses.cjs +40 -9
- package/dist/chat_models/responses.cjs.map +1 -1
- package/dist/chat_models/responses.d.cts +4 -0
- package/dist/chat_models/responses.d.cts.map +1 -1
- package/dist/chat_models/responses.d.ts +4 -0
- package/dist/chat_models/responses.d.ts.map +1 -1
- package/dist/chat_models/responses.js +40 -9
- package/dist/chat_models/responses.js.map +1 -1
- package/dist/converters/completions.cjs.map +1 -1
- package/dist/converters/completions.js.map +1 -1
- package/dist/converters/responses.cjs.map +1 -1
- package/dist/converters/responses.js.map +1 -1
- package/dist/embeddings.cjs.map +1 -1
- package/dist/embeddings.js.map +1 -1
- package/dist/index.cjs +10 -0
- package/dist/index.d.cts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +3 -1
- package/dist/llms.cjs +1 -1
- package/dist/llms.cjs.map +1 -1
- package/dist/llms.js +1 -1
- package/dist/llms.js.map +1 -1
- package/dist/utils/client.cjs.map +1 -1
- package/dist/utils/client.js.map +1 -1
- package/dist/utils/prompts.cjs.map +1 -1
- package/dist/utils/prompts.js.map +1 -1
- package/dist/utils/responses_stream_events.cjs +270 -0
- package/dist/utils/responses_stream_events.cjs.map +1 -0
- package/dist/utils/responses_stream_events.d.cts +13 -0
- package/dist/utils/responses_stream_events.d.cts.map +1 -0
- package/dist/utils/responses_stream_events.d.ts +13 -0
- package/dist/utils/responses_stream_events.d.ts.map +1 -0
- package/dist/utils/responses_stream_events.js +270 -0
- package/dist/utils/responses_stream_events.js.map +1 -0
- package/dist/utils/stream_events.cjs +1 -0
- package/dist/utils/stream_events.d.cts +2 -0
- package/dist/utils/stream_events.d.ts +2 -0
- package/dist/utils/stream_events.js +2 -0
- package/package.json +8 -8
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { OpenAI } from "openai";
|
|
2
|
+
import { ChatModelStreamEvent } from "@langchain/core/language_models/event";
|
|
3
|
+
|
|
4
|
+
//#region src/utils/responses_stream_events.d.ts
|
|
5
|
+
interface ConvertOpenAIResponsesStreamOptions {
|
|
6
|
+
streamUsage?: boolean;
|
|
7
|
+
provider?: string;
|
|
8
|
+
}
|
|
9
|
+
type RawEvent = OpenAI.Responses.ResponseStreamEvent;
|
|
10
|
+
declare function convertOpenAIResponsesStream(source: AsyncIterable<RawEvent>, options?: ConvertOpenAIResponsesStreamOptions): AsyncGenerator<ChatModelStreamEvent>;
|
|
11
|
+
//#endregion
|
|
12
|
+
export { ConvertOpenAIResponsesStreamOptions, convertOpenAIResponsesStream };
|
|
13
|
+
//# sourceMappingURL=responses_stream_events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responses_stream_events.d.ts","names":[],"sources":["../../src/utils/responses_stream_events.ts"],"mappings":";;;;UAeiB,mCAAA;EACf,WAAA;EACA,QAAA;AAAA;AAAA,KAGG,QAAA,GAAW,MAAA,CAAa,SAAA,CAAU,mBAAA;AAAA,iBAMhB,4BAAA,CACrB,MAAA,EAAQ,aAAA,CAAc,QAAA,GACtB,OAAA,GAAS,mCAAA,GACR,cAAA,CAAe,oBAAA"}
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import { convertResponsesUsageToUsageMetadata } from "../converters/responses.js";
|
|
2
|
+
import { finalizeContentBlock } from "@langchain/core/language_models/compat";
|
|
3
|
+
//#region src/utils/responses_stream_events.ts
|
|
4
|
+
async function* convertOpenAIResponsesStream(source, options = {}) {
|
|
5
|
+
const shouldStreamUsage = options.streamUsage ?? true;
|
|
6
|
+
const provider = options.provider ?? "openai";
|
|
7
|
+
const blockAccumulators = /* @__PURE__ */ new Map();
|
|
8
|
+
const blockKeyToIndex = /* @__PURE__ */ new Map();
|
|
9
|
+
let nextBlockIndex = 0;
|
|
10
|
+
let messageStarted = false;
|
|
11
|
+
let messageId;
|
|
12
|
+
let usageSnapshot;
|
|
13
|
+
let finishReason;
|
|
14
|
+
let responseMetadata;
|
|
15
|
+
const finalizedBlockIndices = /* @__PURE__ */ new Set();
|
|
16
|
+
const getOrCreateBlockIndex = (key, initial) => {
|
|
17
|
+
const existing = blockKeyToIndex.get(key);
|
|
18
|
+
if (existing !== void 0) return {
|
|
19
|
+
index: existing,
|
|
20
|
+
isNew: false
|
|
21
|
+
};
|
|
22
|
+
const index = nextBlockIndex++;
|
|
23
|
+
blockKeyToIndex.set(key, index);
|
|
24
|
+
blockAccumulators.set(index, { ...initial });
|
|
25
|
+
return {
|
|
26
|
+
index,
|
|
27
|
+
isNew: true
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
const ensureMessageStart = function* () {
|
|
31
|
+
if (!messageStarted) {
|
|
32
|
+
messageStarted = true;
|
|
33
|
+
yield {
|
|
34
|
+
event: "message-start",
|
|
35
|
+
id: messageId
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
const finalizeBlock = function* (index) {
|
|
40
|
+
if (finalizedBlockIndices.has(index)) return;
|
|
41
|
+
const acc = blockAccumulators.get(index);
|
|
42
|
+
if (!acc) return;
|
|
43
|
+
finalizedBlockIndices.add(index);
|
|
44
|
+
yield {
|
|
45
|
+
event: "content-block-finish",
|
|
46
|
+
index,
|
|
47
|
+
content: finalizeContentBlock(acc)
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
for await (const event of source) {
|
|
51
|
+
if (event.type === "response.created") {
|
|
52
|
+
messageId = event.response.id;
|
|
53
|
+
yield* ensureMessageStart();
|
|
54
|
+
yield {
|
|
55
|
+
event: "provider",
|
|
56
|
+
provider,
|
|
57
|
+
name: "response.created",
|
|
58
|
+
payload: {
|
|
59
|
+
model: event.response.model,
|
|
60
|
+
id: event.response.id
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (event.type === "response.output_text.delta") {
|
|
66
|
+
yield* ensureMessageStart();
|
|
67
|
+
const { index, isNew } = getOrCreateBlockIndex(`text:${event.output_index}:${event.content_index}`, {
|
|
68
|
+
type: "text",
|
|
69
|
+
text: ""
|
|
70
|
+
});
|
|
71
|
+
if (isNew) yield {
|
|
72
|
+
event: "content-block-start",
|
|
73
|
+
index,
|
|
74
|
+
content: {
|
|
75
|
+
type: "text",
|
|
76
|
+
text: ""
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
const acc = blockAccumulators.get(index);
|
|
80
|
+
acc.text = (acc.text ?? "") + event.delta;
|
|
81
|
+
yield {
|
|
82
|
+
event: "content-block-delta",
|
|
83
|
+
index,
|
|
84
|
+
delta: {
|
|
85
|
+
type: "text-delta",
|
|
86
|
+
text: event.delta
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
if (event.type === "response.reasoning_summary_text.delta") {
|
|
92
|
+
yield* ensureMessageStart();
|
|
93
|
+
const { index, isNew } = getOrCreateBlockIndex(`reasoning:${event.output_index}:${event.summary_index}`, {
|
|
94
|
+
type: "reasoning",
|
|
95
|
+
reasoning: ""
|
|
96
|
+
});
|
|
97
|
+
if (isNew) yield {
|
|
98
|
+
event: "content-block-start",
|
|
99
|
+
index,
|
|
100
|
+
content: {
|
|
101
|
+
type: "reasoning",
|
|
102
|
+
reasoning: ""
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
const acc = blockAccumulators.get(index);
|
|
106
|
+
acc.reasoning = (acc.reasoning ?? "") + event.delta;
|
|
107
|
+
yield {
|
|
108
|
+
event: "content-block-delta",
|
|
109
|
+
index,
|
|
110
|
+
delta: {
|
|
111
|
+
type: "reasoning-delta",
|
|
112
|
+
reasoning: event.delta
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
if (event.type === "response.output_item.added" && (event.item.type === "function_call" || event.item.type === "custom_tool_call")) {
|
|
118
|
+
yield* ensureMessageStart();
|
|
119
|
+
const key = `tool:${event.output_index}`;
|
|
120
|
+
const isCustom = event.item.type === "custom_tool_call";
|
|
121
|
+
const initialArgs = event.item.type === "function_call" ? event.item.arguments ?? "" : event.item.input ?? "";
|
|
122
|
+
const { index, isNew } = getOrCreateBlockIndex(key, {
|
|
123
|
+
type: "tool_call_chunk",
|
|
124
|
+
id: event.item.call_id,
|
|
125
|
+
name: event.item.name,
|
|
126
|
+
args: initialArgs,
|
|
127
|
+
index: event.output_index,
|
|
128
|
+
...isCustom ? { isCustomTool: true } : {}
|
|
129
|
+
});
|
|
130
|
+
if (isNew) yield {
|
|
131
|
+
event: "content-block-start",
|
|
132
|
+
index,
|
|
133
|
+
content: {
|
|
134
|
+
type: "tool_call_chunk",
|
|
135
|
+
id: event.item.call_id,
|
|
136
|
+
name: event.item.name,
|
|
137
|
+
args: initialArgs,
|
|
138
|
+
index: event.output_index
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
if (initialArgs) {
|
|
142
|
+
const acc = blockAccumulators.get(index);
|
|
143
|
+
yield {
|
|
144
|
+
event: "content-block-delta",
|
|
145
|
+
index,
|
|
146
|
+
delta: {
|
|
147
|
+
type: "block-delta",
|
|
148
|
+
fields: {
|
|
149
|
+
type: "tool_call_chunk",
|
|
150
|
+
...acc.id != null ? { id: acc.id } : {},
|
|
151
|
+
...acc.name != null ? { name: acc.name } : {},
|
|
152
|
+
args: acc.args
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
if (event.type === "response.function_call_arguments.delta" || event.type === "response.custom_tool_call_input.delta") {
|
|
160
|
+
yield* ensureMessageStart();
|
|
161
|
+
const { index, isNew } = getOrCreateBlockIndex(`tool:${event.output_index}`, {
|
|
162
|
+
type: "tool_call_chunk",
|
|
163
|
+
args: "",
|
|
164
|
+
index: event.output_index,
|
|
165
|
+
...event.type === "response.custom_tool_call_input.delta" ? { isCustomTool: true } : {}
|
|
166
|
+
});
|
|
167
|
+
if (isNew) yield {
|
|
168
|
+
event: "content-block-start",
|
|
169
|
+
index,
|
|
170
|
+
content: {
|
|
171
|
+
type: "tool_call_chunk",
|
|
172
|
+
args: "",
|
|
173
|
+
index: event.output_index
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
const acc = blockAccumulators.get(index);
|
|
177
|
+
acc.args = (acc.args ?? "") + event.delta;
|
|
178
|
+
yield {
|
|
179
|
+
event: "content-block-delta",
|
|
180
|
+
index,
|
|
181
|
+
delta: {
|
|
182
|
+
type: "block-delta",
|
|
183
|
+
fields: {
|
|
184
|
+
type: "tool_call_chunk",
|
|
185
|
+
...acc.id != null ? { id: acc.id } : {},
|
|
186
|
+
...acc.name != null ? { name: acc.name } : {},
|
|
187
|
+
args: acc.args
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
if (event.type === "response.output_item.done" && (event.item.type === "function_call" || event.item.type === "custom_tool_call")) {
|
|
194
|
+
yield* ensureMessageStart();
|
|
195
|
+
const key = `tool:${event.output_index}`;
|
|
196
|
+
const args = event.item.type === "function_call" ? event.item.arguments ?? "" : event.item.input ?? "";
|
|
197
|
+
const { index, isNew } = getOrCreateBlockIndex(key, {
|
|
198
|
+
type: "tool_call_chunk",
|
|
199
|
+
id: event.item.call_id,
|
|
200
|
+
name: event.item.name,
|
|
201
|
+
args,
|
|
202
|
+
index: event.output_index
|
|
203
|
+
});
|
|
204
|
+
if (isNew) yield {
|
|
205
|
+
event: "content-block-start",
|
|
206
|
+
index,
|
|
207
|
+
content: {
|
|
208
|
+
type: "tool_call_chunk",
|
|
209
|
+
id: event.item.call_id,
|
|
210
|
+
name: event.item.name,
|
|
211
|
+
args,
|
|
212
|
+
index: event.output_index
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
else {
|
|
216
|
+
const acc = blockAccumulators.get(index);
|
|
217
|
+
acc.args = args;
|
|
218
|
+
acc.id = event.item.call_id;
|
|
219
|
+
acc.name = event.item.name;
|
|
220
|
+
}
|
|
221
|
+
yield* finalizeBlock(index);
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
if (event.type === "response.completed" || event.type === "response.incomplete") {
|
|
225
|
+
yield* ensureMessageStart();
|
|
226
|
+
messageId = event.response.id;
|
|
227
|
+
finishReason = mapResponseStatusToFinishReason(event.response.status, event.type);
|
|
228
|
+
responseMetadata = {
|
|
229
|
+
model_provider: provider,
|
|
230
|
+
id: event.response.id,
|
|
231
|
+
model: event.response.model,
|
|
232
|
+
status: event.response.status
|
|
233
|
+
};
|
|
234
|
+
if (shouldStreamUsage && event.response.usage) {
|
|
235
|
+
usageSnapshot = convertResponsesUsageToUsageMetadata(event.response.usage);
|
|
236
|
+
yield {
|
|
237
|
+
event: "usage",
|
|
238
|
+
usage: usageSnapshot
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
if (event.type === "response.image_generation_call.partial_image") continue;
|
|
244
|
+
yield* ensureMessageStart();
|
|
245
|
+
yield {
|
|
246
|
+
event: "provider",
|
|
247
|
+
provider,
|
|
248
|
+
name: event.type,
|
|
249
|
+
payload: event
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
if (!messageStarted) yield { event: "message-start" };
|
|
253
|
+
for (const [index] of blockAccumulators) if (!finalizedBlockIndices.has(index)) yield* finalizeBlock(index);
|
|
254
|
+
yield {
|
|
255
|
+
event: "message-finish",
|
|
256
|
+
reason: finishReason,
|
|
257
|
+
...usageSnapshot ? { usage: usageSnapshot } : {},
|
|
258
|
+
...responseMetadata ? { responseMetadata } : {}
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
function mapResponseStatusToFinishReason(status, eventType) {
|
|
262
|
+
if (eventType === "response.incomplete") return "length";
|
|
263
|
+
if (status === "completed") return "stop";
|
|
264
|
+
if (status === "incomplete") return "length";
|
|
265
|
+
return "stop";
|
|
266
|
+
}
|
|
267
|
+
//#endregion
|
|
268
|
+
export { convertOpenAIResponsesStream };
|
|
269
|
+
|
|
270
|
+
//# sourceMappingURL=responses_stream_events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responses_stream_events.js","names":[],"sources":["../../src/utils/responses_stream_events.ts"],"sourcesContent":["/**\n * Converts OpenAI Responses API stream events into LangChain ChatModelStreamEvents.\n *\n * @module\n */\n\nimport { OpenAI as OpenAIClient } from \"openai\";\nimport { finalizeContentBlock } from \"@langchain/core/language_models/compat\";\nimport type {\n ChatModelStreamEvent,\n FinishReason,\n} from \"@langchain/core/language_models/event\";\nimport type { ContentBlock, UsageMetadata } from \"@langchain/core/messages\";\nimport { convertResponsesUsageToUsageMetadata } from \"../converters/responses.js\";\n\nexport interface ConvertOpenAIResponsesStreamOptions {\n streamUsage?: boolean;\n provider?: string;\n}\n\ntype RawEvent = OpenAIClient.Responses.ResponseStreamEvent;\ntype BlockKey =\n | `text:${number}:${number}`\n | `reasoning:${number}:${number}`\n | `tool:${number}`;\n\nexport async function* convertOpenAIResponsesStream(\n source: AsyncIterable<RawEvent>,\n options: ConvertOpenAIResponsesStreamOptions = {}\n): AsyncGenerator<ChatModelStreamEvent> {\n const shouldStreamUsage = options.streamUsage ?? true;\n const provider = options.provider ?? \"openai\";\n\n const blockAccumulators = new Map<\n number,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n Record<string, any>\n >();\n const blockKeyToIndex = new Map<BlockKey, number>();\n let nextBlockIndex = 0;\n let messageStarted = false;\n let messageId: string | undefined;\n let usageSnapshot: UsageMetadata | undefined;\n let finishReason: FinishReason | undefined;\n let responseMetadata: Record<string, unknown> | undefined;\n const finalizedBlockIndices = new Set<number>();\n\n const getOrCreateBlockIndex = (\n key: BlockKey,\n initial: Record<string, unknown>\n ): { index: number; isNew: boolean } => {\n const existing = blockKeyToIndex.get(key);\n if (existing !== undefined) {\n return { index: existing, isNew: false };\n }\n const index = nextBlockIndex++;\n blockKeyToIndex.set(key, index);\n blockAccumulators.set(index, { ...initial });\n return { index, isNew: true };\n };\n\n const ensureMessageStart = function* () {\n if (!messageStarted) {\n messageStarted = true;\n yield {\n event: \"message-start\" as const,\n id: messageId,\n };\n }\n };\n\n const finalizeBlock = function* (index: number) {\n if (finalizedBlockIndices.has(index)) {\n return;\n }\n const acc = blockAccumulators.get(index);\n if (!acc) {\n return;\n }\n finalizedBlockIndices.add(index);\n yield {\n event: \"content-block-finish\" as const,\n index,\n content: finalizeContentBlock(acc as ContentBlock),\n };\n };\n\n for await (const event of source) {\n if (event.type === \"response.created\") {\n messageId = event.response.id;\n yield* ensureMessageStart();\n yield {\n event: \"provider\" as const,\n provider,\n name: \"response.created\",\n payload: { model: event.response.model, id: event.response.id },\n };\n continue;\n }\n\n if (event.type === \"response.output_text.delta\") {\n yield* ensureMessageStart();\n const key: BlockKey = `text:${event.output_index}:${event.content_index}`;\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"text\",\n text: \"\",\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: { type: \"text\", text: \"\" } as ContentBlock,\n };\n }\n const acc = blockAccumulators.get(index)!;\n acc.text = (acc.text ?? \"\") + event.delta;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"text-delta\" as const, text: event.delta },\n };\n continue;\n }\n\n if (event.type === \"response.reasoning_summary_text.delta\") {\n yield* ensureMessageStart();\n const key: BlockKey = `reasoning:${event.output_index}:${event.summary_index}`;\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"reasoning\",\n reasoning: \"\",\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: { type: \"reasoning\", reasoning: \"\" } as ContentBlock,\n };\n }\n const acc = blockAccumulators.get(index)!;\n acc.reasoning = (acc.reasoning ?? \"\") + event.delta;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"reasoning-delta\" as const, reasoning: event.delta },\n };\n continue;\n }\n\n if (\n event.type === \"response.output_item.added\" &&\n (event.item.type === \"function_call\" ||\n event.item.type === \"custom_tool_call\")\n ) {\n yield* ensureMessageStart();\n const key: BlockKey = `tool:${event.output_index}`;\n const isCustom = event.item.type === \"custom_tool_call\";\n const initialArgs =\n event.item.type === \"function_call\"\n ? (event.item.arguments ?? \"\")\n : (event.item.input ?? \"\");\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"tool_call_chunk\",\n id: event.item.call_id,\n name: event.item.name,\n args: initialArgs,\n index: event.output_index,\n ...(isCustom ? { isCustomTool: true } : {}),\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: {\n type: \"tool_call_chunk\",\n id: event.item.call_id,\n name: event.item.name,\n args: initialArgs,\n index: event.output_index,\n } as ContentBlock,\n };\n }\n if (initialArgs) {\n const acc = blockAccumulators.get(index)!;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: {\n type: \"block-delta\" as const,\n fields: {\n type: \"tool_call_chunk\",\n ...(acc.id != null ? { id: acc.id } : {}),\n ...(acc.name != null ? { name: acc.name } : {}),\n args: acc.args,\n },\n },\n };\n }\n continue;\n }\n\n if (\n event.type === \"response.function_call_arguments.delta\" ||\n event.type === \"response.custom_tool_call_input.delta\"\n ) {\n yield* ensureMessageStart();\n const key: BlockKey = `tool:${event.output_index}`;\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"tool_call_chunk\",\n args: \"\",\n index: event.output_index,\n ...(event.type === \"response.custom_tool_call_input.delta\"\n ? { isCustomTool: true }\n : {}),\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: {\n type: \"tool_call_chunk\",\n args: \"\",\n index: event.output_index,\n } as ContentBlock,\n };\n }\n const acc = blockAccumulators.get(index)!;\n acc.args = (acc.args ?? \"\") + event.delta;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: {\n type: \"block-delta\" as const,\n fields: {\n type: \"tool_call_chunk\",\n ...(acc.id != null ? { id: acc.id } : {}),\n ...(acc.name != null ? { name: acc.name } : {}),\n args: acc.args,\n },\n },\n };\n continue;\n }\n\n if (\n event.type === \"response.output_item.done\" &&\n (event.item.type === \"function_call\" ||\n event.item.type === \"custom_tool_call\")\n ) {\n yield* ensureMessageStart();\n const key: BlockKey = `tool:${event.output_index}`;\n const args =\n event.item.type === \"function_call\"\n ? (event.item.arguments ?? \"\")\n : (event.item.input ?? \"\");\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"tool_call_chunk\",\n id: event.item.call_id,\n name: event.item.name,\n args,\n index: event.output_index,\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: {\n type: \"tool_call_chunk\",\n id: event.item.call_id,\n name: event.item.name,\n args,\n index: event.output_index,\n } as ContentBlock,\n };\n } else {\n const acc = blockAccumulators.get(index)!;\n acc.args = args;\n acc.id = event.item.call_id;\n acc.name = event.item.name;\n }\n yield* finalizeBlock(index);\n continue;\n }\n\n if (\n event.type === \"response.completed\" ||\n event.type === \"response.incomplete\"\n ) {\n yield* ensureMessageStart();\n messageId = event.response.id;\n finishReason = mapResponseStatusToFinishReason(\n event.response.status,\n event.type\n );\n responseMetadata = {\n model_provider: provider,\n id: event.response.id,\n model: event.response.model,\n status: event.response.status,\n };\n if (shouldStreamUsage && event.response.usage) {\n usageSnapshot = convertResponsesUsageToUsageMetadata(\n event.response.usage\n );\n yield { event: \"usage\" as const, usage: usageSnapshot };\n }\n continue;\n }\n\n if (event.type === \"response.image_generation_call.partial_image\") {\n continue;\n }\n\n yield* ensureMessageStart();\n yield {\n event: \"provider\" as const,\n provider,\n name: event.type,\n payload: event,\n };\n }\n\n if (!messageStarted) {\n yield { event: \"message-start\" as const };\n }\n\n for (const [index] of blockAccumulators) {\n if (!finalizedBlockIndices.has(index)) {\n yield* finalizeBlock(index);\n }\n }\n\n yield {\n event: \"message-finish\" as const,\n reason: finishReason,\n ...(usageSnapshot ? { usage: usageSnapshot } : {}),\n ...(responseMetadata ? { responseMetadata } : {}),\n };\n}\n\nfunction mapResponseStatusToFinishReason(\n status: string | undefined,\n eventType: \"response.completed\" | \"response.incomplete\"\n): FinishReason {\n if (eventType === \"response.incomplete\") {\n return \"length\";\n }\n if (status === \"completed\") {\n return \"stop\";\n }\n if (status === \"incomplete\") {\n return \"length\";\n }\n return \"stop\";\n}\n"],"mappings":";;;AA0BA,gBAAuB,6BACrB,QACA,UAA+C,EAAE,EACX;CACtC,MAAM,oBAAoB,QAAQ,eAAe;CACjD,MAAM,WAAW,QAAQ,YAAY;CAErC,MAAM,oCAAoB,IAAI,KAI3B;CACH,MAAM,kCAAkB,IAAI,KAAuB;CACnD,IAAI,iBAAiB;CACrB,IAAI,iBAAiB;CACrB,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,MAAM,wCAAwB,IAAI,KAAa;CAE/C,MAAM,yBACJ,KACA,YACsC;EACtC,MAAM,WAAW,gBAAgB,IAAI,IAAI;AACzC,MAAI,aAAa,KAAA,EACf,QAAO;GAAE,OAAO;GAAU,OAAO;GAAO;EAE1C,MAAM,QAAQ;AACd,kBAAgB,IAAI,KAAK,MAAM;AAC/B,oBAAkB,IAAI,OAAO,EAAE,GAAG,SAAS,CAAC;AAC5C,SAAO;GAAE;GAAO,OAAO;GAAM;;CAG/B,MAAM,qBAAqB,aAAa;AACtC,MAAI,CAAC,gBAAgB;AACnB,oBAAiB;AACjB,SAAM;IACJ,OAAO;IACP,IAAI;IACL;;;CAIL,MAAM,gBAAgB,WAAW,OAAe;AAC9C,MAAI,sBAAsB,IAAI,MAAM,CAClC;EAEF,MAAM,MAAM,kBAAkB,IAAI,MAAM;AACxC,MAAI,CAAC,IACH;AAEF,wBAAsB,IAAI,MAAM;AAChC,QAAM;GACJ,OAAO;GACP;GACA,SAAS,qBAAqB,IAAoB;GACnD;;AAGH,YAAW,MAAM,SAAS,QAAQ;AAChC,MAAI,MAAM,SAAS,oBAAoB;AACrC,eAAY,MAAM,SAAS;AAC3B,UAAO,oBAAoB;AAC3B,SAAM;IACJ,OAAO;IACP;IACA,MAAM;IACN,SAAS;KAAE,OAAO,MAAM,SAAS;KAAO,IAAI,MAAM,SAAS;KAAI;IAChE;AACD;;AAGF,MAAI,MAAM,SAAS,8BAA8B;AAC/C,UAAO,oBAAoB;GAE3B,MAAM,EAAE,OAAO,UAAU,sBAAsB,QADjB,MAAM,aAAa,GAAG,MAAM,iBACN;IAClD,MAAM;IACN,MAAM;IACP,CAAC;AACF,OAAI,MACF,OAAM;IACJ,OAAO;IACP;IACA,SAAS;KAAE,MAAM;KAAQ,MAAM;KAAI;IACpC;GAEH,MAAM,MAAM,kBAAkB,IAAI,MAAM;AACxC,OAAI,QAAQ,IAAI,QAAQ,MAAM,MAAM;AACpC,SAAM;IACJ,OAAO;IACP;IACA,OAAO;KAAE,MAAM;KAAuB,MAAM,MAAM;KAAO;IAC1D;AACD;;AAGF,MAAI,MAAM,SAAS,yCAAyC;AAC1D,UAAO,oBAAoB;GAE3B,MAAM,EAAE,OAAO,UAAU,sBAAsB,aADZ,MAAM,aAAa,GAAG,MAAM,iBACX;IAClD,MAAM;IACN,WAAW;IACZ,CAAC;AACF,OAAI,MACF,OAAM;IACJ,OAAO;IACP;IACA,SAAS;KAAE,MAAM;KAAa,WAAW;KAAI;IAC9C;GAEH,MAAM,MAAM,kBAAkB,IAAI,MAAM;AACxC,OAAI,aAAa,IAAI,aAAa,MAAM,MAAM;AAC9C,SAAM;IACJ,OAAO;IACP;IACA,OAAO;KAAE,MAAM;KAA4B,WAAW,MAAM;KAAO;IACpE;AACD;;AAGF,MACE,MAAM,SAAS,iCACd,MAAM,KAAK,SAAS,mBACnB,MAAM,KAAK,SAAS,qBACtB;AACA,UAAO,oBAAoB;GAC3B,MAAM,MAAgB,QAAQ,MAAM;GACpC,MAAM,WAAW,MAAM,KAAK,SAAS;GACrC,MAAM,cACJ,MAAM,KAAK,SAAS,kBACf,MAAM,KAAK,aAAa,KACxB,MAAM,KAAK,SAAS;GAC3B,MAAM,EAAE,OAAO,UAAU,sBAAsB,KAAK;IAClD,MAAM;IACN,IAAI,MAAM,KAAK;IACf,MAAM,MAAM,KAAK;IACjB,MAAM;IACN,OAAO,MAAM;IACb,GAAI,WAAW,EAAE,cAAc,MAAM,GAAG,EAAE;IAC3C,CAAC;AACF,OAAI,MACF,OAAM;IACJ,OAAO;IACP;IACA,SAAS;KACP,MAAM;KACN,IAAI,MAAM,KAAK;KACf,MAAM,MAAM,KAAK;KACjB,MAAM;KACN,OAAO,MAAM;KACd;IACF;AAEH,OAAI,aAAa;IACf,MAAM,MAAM,kBAAkB,IAAI,MAAM;AACxC,UAAM;KACJ,OAAO;KACP;KACA,OAAO;MACL,MAAM;MACN,QAAQ;OACN,MAAM;OACN,GAAI,IAAI,MAAM,OAAO,EAAE,IAAI,IAAI,IAAI,GAAG,EAAE;OACxC,GAAI,IAAI,QAAQ,OAAO,EAAE,MAAM,IAAI,MAAM,GAAG,EAAE;OAC9C,MAAM,IAAI;OACX;MACF;KACF;;AAEH;;AAGF,MACE,MAAM,SAAS,4CACf,MAAM,SAAS,yCACf;AACA,UAAO,oBAAoB;GAE3B,MAAM,EAAE,OAAO,UAAU,sBAAsB,QADjB,MAAM,gBACgB;IAClD,MAAM;IACN,MAAM;IACN,OAAO,MAAM;IACb,GAAI,MAAM,SAAS,0CACf,EAAE,cAAc,MAAM,GACtB,EAAE;IACP,CAAC;AACF,OAAI,MACF,OAAM;IACJ,OAAO;IACP;IACA,SAAS;KACP,MAAM;KACN,MAAM;KACN,OAAO,MAAM;KACd;IACF;GAEH,MAAM,MAAM,kBAAkB,IAAI,MAAM;AACxC,OAAI,QAAQ,IAAI,QAAQ,MAAM,MAAM;AACpC,SAAM;IACJ,OAAO;IACP;IACA,OAAO;KACL,MAAM;KACN,QAAQ;MACN,MAAM;MACN,GAAI,IAAI,MAAM,OAAO,EAAE,IAAI,IAAI,IAAI,GAAG,EAAE;MACxC,GAAI,IAAI,QAAQ,OAAO,EAAE,MAAM,IAAI,MAAM,GAAG,EAAE;MAC9C,MAAM,IAAI;MACX;KACF;IACF;AACD;;AAGF,MACE,MAAM,SAAS,gCACd,MAAM,KAAK,SAAS,mBACnB,MAAM,KAAK,SAAS,qBACtB;AACA,UAAO,oBAAoB;GAC3B,MAAM,MAAgB,QAAQ,MAAM;GACpC,MAAM,OACJ,MAAM,KAAK,SAAS,kBACf,MAAM,KAAK,aAAa,KACxB,MAAM,KAAK,SAAS;GAC3B,MAAM,EAAE,OAAO,UAAU,sBAAsB,KAAK;IAClD,MAAM;IACN,IAAI,MAAM,KAAK;IACf,MAAM,MAAM,KAAK;IACjB;IACA,OAAO,MAAM;IACd,CAAC;AACF,OAAI,MACF,OAAM;IACJ,OAAO;IACP;IACA,SAAS;KACP,MAAM;KACN,IAAI,MAAM,KAAK;KACf,MAAM,MAAM,KAAK;KACjB;KACA,OAAO,MAAM;KACd;IACF;QACI;IACL,MAAM,MAAM,kBAAkB,IAAI,MAAM;AACxC,QAAI,OAAO;AACX,QAAI,KAAK,MAAM,KAAK;AACpB,QAAI,OAAO,MAAM,KAAK;;AAExB,UAAO,cAAc,MAAM;AAC3B;;AAGF,MACE,MAAM,SAAS,wBACf,MAAM,SAAS,uBACf;AACA,UAAO,oBAAoB;AAC3B,eAAY,MAAM,SAAS;AAC3B,kBAAe,gCACb,MAAM,SAAS,QACf,MAAM,KACP;AACD,sBAAmB;IACjB,gBAAgB;IAChB,IAAI,MAAM,SAAS;IACnB,OAAO,MAAM,SAAS;IACtB,QAAQ,MAAM,SAAS;IACxB;AACD,OAAI,qBAAqB,MAAM,SAAS,OAAO;AAC7C,oBAAgB,qCACd,MAAM,SAAS,MAChB;AACD,UAAM;KAAE,OAAO;KAAkB,OAAO;KAAe;;AAEzD;;AAGF,MAAI,MAAM,SAAS,+CACjB;AAGF,SAAO,oBAAoB;AAC3B,QAAM;GACJ,OAAO;GACP;GACA,MAAM,MAAM;GACZ,SAAS;GACV;;AAGH,KAAI,CAAC,eACH,OAAM,EAAE,OAAO,iBAA0B;AAG3C,MAAK,MAAM,CAAC,UAAU,kBACpB,KAAI,CAAC,sBAAsB,IAAI,MAAM,CACnC,QAAO,cAAc,MAAM;AAI/B,OAAM;EACJ,OAAO;EACP,QAAQ;EACR,GAAI,gBAAgB,EAAE,OAAO,eAAe,GAAG,EAAE;EACjD,GAAI,mBAAmB,EAAE,kBAAkB,GAAG,EAAE;EACjD;;AAGH,SAAS,gCACP,QACA,WACc;AACd,KAAI,cAAc,sBAChB,QAAO;AAET,KAAI,WAAW,YACb,QAAO;AAET,KAAI,WAAW,aACb,QAAO;AAET,QAAO"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require("@langchain/core/language_models/openai_completions_stream");
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@langchain/openai",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.1",
|
|
4
4
|
"description": "OpenAI integrations for LangChain.js",
|
|
5
5
|
"author": "LangChain",
|
|
6
6
|
"license": "MIT",
|
|
@@ -15,25 +15,25 @@
|
|
|
15
15
|
"homepage": "https://github.com/langchain-ai/langchainjs/tree/main/libs/providers/langchain-openai/",
|
|
16
16
|
"dependencies": {
|
|
17
17
|
"js-tiktoken": "^1.0.12",
|
|
18
|
-
"openai": "^6.
|
|
18
|
+
"openai": "^6.41.0",
|
|
19
19
|
"zod": "^3.25.76 || ^4"
|
|
20
20
|
},
|
|
21
21
|
"peerDependencies": {
|
|
22
|
-
"@langchain/core": "^1.
|
|
22
|
+
"@langchain/core": "^1.2.0"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"@azure/identity": "^4.2.1",
|
|
26
26
|
"@cfworker/json-schema": "^4.1.1",
|
|
27
27
|
"@tsconfig/recommended": "^1.0.10",
|
|
28
|
-
"@types/node": "^25.
|
|
29
|
-
"@vitest/coverage-v8": "^
|
|
28
|
+
"@types/node": "^25.9.1",
|
|
29
|
+
"@vitest/coverage-v8": "^4.1.8",
|
|
30
30
|
"dotenv": "^17.4.0",
|
|
31
31
|
"dpdm": "^3.14.0",
|
|
32
32
|
"rimraf": "^6.1.3",
|
|
33
|
-
"typescript": "~
|
|
34
|
-
"vitest": "^4.1.
|
|
33
|
+
"typescript": "~6.0.3",
|
|
34
|
+
"vitest": "^4.1.8",
|
|
35
35
|
"zod-to-json-schema": "^3.25.2",
|
|
36
|
-
"@langchain/core": "^1.
|
|
36
|
+
"@langchain/core": "^1.2.0",
|
|
37
37
|
"@langchain/standard-tests": "0.0.23",
|
|
38
38
|
"@langchain/tsconfig": "0.0.1"
|
|
39
39
|
},
|