@librechat/agents 3.1.73 → 3.1.75-dev.0
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 +66 -0
- package/dist/cjs/agents/AgentContext.cjs +146 -57
- package/dist/cjs/agents/AgentContext.cjs.map +1 -1
- package/dist/cjs/graphs/Graph.cjs +13 -3
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/index.cjs +145 -52
- package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/types.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +25 -15
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +84 -70
- package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/index.cjs +1 -1
- package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/utils/message_inputs.cjs +213 -3
- package/dist/cjs/llm/bedrock/utils/message_inputs.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/utils/message_outputs.cjs +2 -1
- package/dist/cjs/llm/bedrock/utils/message_outputs.cjs.map +1 -1
- package/dist/cjs/llm/google/utils/common.cjs +5 -4
- package/dist/cjs/llm/google/utils/common.cjs.map +1 -1
- package/dist/cjs/llm/openai/index.cjs +468 -647
- package/dist/cjs/llm/openai/index.cjs.map +1 -1
- package/dist/cjs/llm/openai/utils/index.cjs +1 -448
- package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
- package/dist/cjs/llm/openrouter/index.cjs +57 -175
- package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
- package/dist/cjs/llm/vertexai/index.cjs +5 -3
- package/dist/cjs/llm/vertexai/index.cjs.map +1 -1
- package/dist/cjs/main.cjs +1 -0
- package/dist/cjs/main.cjs.map +1 -1
- package/dist/cjs/messages/cache.cjs +39 -4
- package/dist/cjs/messages/cache.cjs.map +1 -1
- package/dist/cjs/messages/core.cjs +7 -6
- package/dist/cjs/messages/core.cjs.map +1 -1
- package/dist/cjs/messages/format.cjs +7 -6
- package/dist/cjs/messages/format.cjs.map +1 -1
- package/dist/cjs/messages/langchain.cjs +26 -0
- package/dist/cjs/messages/langchain.cjs.map +1 -0
- package/dist/cjs/messages/prune.cjs +7 -6
- package/dist/cjs/messages/prune.cjs.map +1 -1
- package/dist/cjs/tools/BashExecutor.cjs +21 -11
- package/dist/cjs/tools/BashExecutor.cjs.map +1 -1
- package/dist/cjs/tools/CodeExecutor.cjs +37 -10
- package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
- package/dist/cjs/tools/ProgrammaticToolCalling.cjs +16 -11
- package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
- package/dist/cjs/tools/ToolNode.cjs +5 -1
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/esm/agents/AgentContext.mjs +147 -58
- package/dist/esm/agents/AgentContext.mjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +13 -3
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/llm/anthropic/index.mjs +146 -54
- package/dist/esm/llm/anthropic/index.mjs.map +1 -1
- package/dist/esm/llm/anthropic/types.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs +25 -15
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/message_outputs.mjs +84 -71
- package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -1
- package/dist/esm/llm/bedrock/index.mjs +1 -1
- package/dist/esm/llm/bedrock/index.mjs.map +1 -1
- package/dist/esm/llm/bedrock/utils/message_inputs.mjs +214 -4
- package/dist/esm/llm/bedrock/utils/message_inputs.mjs.map +1 -1
- package/dist/esm/llm/bedrock/utils/message_outputs.mjs +2 -1
- package/dist/esm/llm/bedrock/utils/message_outputs.mjs.map +1 -1
- package/dist/esm/llm/google/utils/common.mjs +5 -4
- package/dist/esm/llm/google/utils/common.mjs.map +1 -1
- package/dist/esm/llm/openai/index.mjs +469 -648
- package/dist/esm/llm/openai/index.mjs.map +1 -1
- package/dist/esm/llm/openai/utils/index.mjs +4 -449
- package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
- package/dist/esm/llm/openrouter/index.mjs +57 -175
- package/dist/esm/llm/openrouter/index.mjs.map +1 -1
- package/dist/esm/llm/vertexai/index.mjs +5 -3
- package/dist/esm/llm/vertexai/index.mjs.map +1 -1
- package/dist/esm/main.mjs +1 -1
- package/dist/esm/messages/cache.mjs +39 -4
- package/dist/esm/messages/cache.mjs.map +1 -1
- package/dist/esm/messages/core.mjs +7 -6
- package/dist/esm/messages/core.mjs.map +1 -1
- package/dist/esm/messages/format.mjs +7 -6
- package/dist/esm/messages/format.mjs.map +1 -1
- package/dist/esm/messages/langchain.mjs +23 -0
- package/dist/esm/messages/langchain.mjs.map +1 -0
- package/dist/esm/messages/prune.mjs +7 -6
- package/dist/esm/messages/prune.mjs.map +1 -1
- package/dist/esm/tools/BashExecutor.mjs +22 -12
- package/dist/esm/tools/BashExecutor.mjs.map +1 -1
- package/dist/esm/tools/CodeExecutor.mjs +37 -11
- package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
- package/dist/esm/tools/ProgrammaticToolCalling.mjs +17 -12
- package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
- package/dist/esm/tools/ToolNode.mjs +5 -1
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/types/agents/AgentContext.d.ts +29 -4
- package/dist/types/agents/__tests__/promptCacheLiveHelpers.d.ts +46 -0
- package/dist/types/llm/anthropic/index.d.ts +22 -9
- package/dist/types/llm/anthropic/types.d.ts +5 -1
- package/dist/types/llm/anthropic/utils/message_outputs.d.ts +13 -6
- package/dist/types/llm/anthropic/utils/output_parsers.d.ts +1 -1
- package/dist/types/llm/openai/index.d.ts +21 -24
- package/dist/types/llm/openrouter/index.d.ts +11 -9
- package/dist/types/llm/vertexai/index.d.ts +1 -0
- package/dist/types/messages/cache.d.ts +4 -1
- package/dist/types/messages/langchain.d.ts +27 -0
- package/dist/types/tools/CodeExecutor.d.ts +6 -0
- package/dist/types/types/graph.d.ts +26 -38
- package/dist/types/types/llm.d.ts +3 -3
- package/dist/types/types/run.d.ts +2 -0
- package/dist/types/types/stream.d.ts +1 -1
- package/dist/types/types/tools.d.ts +9 -0
- package/package.json +17 -16
- package/src/agents/AgentContext.ts +189 -71
- package/src/agents/__tests__/AgentContext.anthropic.live.test.ts +116 -0
- package/src/agents/__tests__/AgentContext.bedrock.live.test.ts +149 -0
- package/src/agents/__tests__/AgentContext.test.ts +333 -2
- package/src/agents/__tests__/promptCacheLiveHelpers.ts +165 -0
- package/src/graphs/Graph.ts +24 -4
- package/src/graphs/__tests__/composition.smoke.test.ts +188 -0
- package/src/llm/anthropic/index.ts +252 -84
- package/src/llm/anthropic/llm.spec.ts +751 -102
- package/src/llm/anthropic/types.ts +9 -1
- package/src/llm/anthropic/utils/message_inputs.ts +43 -20
- package/src/llm/anthropic/utils/message_outputs.ts +119 -101
- package/src/llm/anthropic/utils/server-tool-inputs.test.ts +77 -0
- package/src/llm/bedrock/index.ts +2 -2
- package/src/llm/bedrock/llm.spec.ts +341 -0
- package/src/llm/bedrock/utils/message_inputs.ts +303 -4
- package/src/llm/bedrock/utils/message_outputs.ts +2 -1
- package/src/llm/custom-chat-models.smoke.test.ts +662 -0
- package/src/llm/google/llm.spec.ts +339 -57
- package/src/llm/google/utils/common.ts +53 -48
- package/src/llm/openai/contentBlocks.test.ts +346 -0
- package/src/llm/openai/index.ts +736 -837
- package/src/llm/openai/utils/index.ts +84 -64
- package/src/llm/openrouter/index.ts +124 -247
- package/src/llm/openrouter/reasoning.test.ts +8 -1
- package/src/llm/vertexai/index.ts +11 -5
- package/src/llm/vertexai/llm.spec.ts +28 -1
- package/src/messages/cache.test.ts +106 -4
- package/src/messages/cache.ts +57 -5
- package/src/messages/core.ts +16 -9
- package/src/messages/format.ts +9 -6
- package/src/messages/langchain.ts +39 -0
- package/src/messages/prune.ts +12 -8
- package/src/scripts/caching.ts +2 -3
- package/src/specs/anthropic.simple.test.ts +61 -0
- package/src/specs/summarization.test.ts +58 -61
- package/src/tools/BashExecutor.ts +37 -13
- package/src/tools/CodeExecutor.ts +55 -11
- package/src/tools/ProgrammaticToolCalling.ts +29 -14
- package/src/tools/ToolNode.ts +5 -1
- package/src/tools/__tests__/ProgrammaticToolCalling.test.ts +60 -0
- package/src/types/graph.ts +35 -88
- package/src/types/llm.ts +3 -3
- package/src/types/run.ts +2 -0
- package/src/types/stream.ts +1 -1
- package/src/types/tools.ts +9 -0
- package/src/utils/llmConfig.ts +1 -6
|
@@ -5,10 +5,22 @@
|
|
|
5
5
|
import {
|
|
6
6
|
type BaseMessage,
|
|
7
7
|
isAIMessage,
|
|
8
|
+
type Data,
|
|
8
9
|
parseBase64DataUrl,
|
|
9
10
|
parseMimeType,
|
|
10
11
|
MessageContentComplex,
|
|
12
|
+
type StandardContentBlockConverter,
|
|
13
|
+
convertToProviderContentBlock,
|
|
14
|
+
isDataContentBlock,
|
|
11
15
|
} from '@langchain/core/messages';
|
|
16
|
+
import type {
|
|
17
|
+
AudioFormat,
|
|
18
|
+
AudioSource,
|
|
19
|
+
DocumentFormat,
|
|
20
|
+
DocumentSource,
|
|
21
|
+
VideoFormat,
|
|
22
|
+
VideoSource,
|
|
23
|
+
} from '@aws-sdk/client-bedrock-runtime';
|
|
12
24
|
import type {
|
|
13
25
|
BedrockMessage,
|
|
14
26
|
BedrockSystemContentBlock,
|
|
@@ -127,6 +139,258 @@ export function extractImageInfo(base64: string): BedrockContentBlock {
|
|
|
127
139
|
};
|
|
128
140
|
}
|
|
129
141
|
|
|
142
|
+
type MediaContentBlock = MessageContentComplex & {
|
|
143
|
+
data?: string | Uint8Array;
|
|
144
|
+
url?: string;
|
|
145
|
+
fileId?: string;
|
|
146
|
+
mimeType?: string;
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
const mimeTypeToVideoFormat: Record<string, VideoFormat> = {
|
|
150
|
+
'video/flv': 'flv',
|
|
151
|
+
'video/mkv': 'mkv',
|
|
152
|
+
'video/mov': 'mov',
|
|
153
|
+
'video/mp4': 'mp4',
|
|
154
|
+
'video/mpeg': 'mpeg',
|
|
155
|
+
'video/mpg': 'mpg',
|
|
156
|
+
'video/three_gp': 'three_gp',
|
|
157
|
+
'video/webm': 'webm',
|
|
158
|
+
'video/wmv': 'wmv',
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
const mimeTypeToAudioFormat: Record<string, AudioFormat> = {
|
|
162
|
+
'audio/aac': 'aac',
|
|
163
|
+
'audio/flac': 'flac',
|
|
164
|
+
'audio/m4a': 'm4a',
|
|
165
|
+
'audio/mka': 'mka',
|
|
166
|
+
'audio/mkv': 'mkv',
|
|
167
|
+
'audio/mp3': 'mp3',
|
|
168
|
+
'audio/mp4': 'mp4',
|
|
169
|
+
'audio/mpeg': 'mpeg',
|
|
170
|
+
'audio/mpga': 'mpga',
|
|
171
|
+
'audio/ogg': 'ogg',
|
|
172
|
+
'audio/opus': 'opus',
|
|
173
|
+
'audio/pcm': 'pcm',
|
|
174
|
+
'audio/wav': 'wav',
|
|
175
|
+
'audio/webm': 'webm',
|
|
176
|
+
'audio/x-aac': 'x-aac',
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
const mimeTypeToDocumentFormat: Partial<Record<string, DocumentFormat>> = {
|
|
180
|
+
'text/csv': 'csv',
|
|
181
|
+
'application/msword': 'doc',
|
|
182
|
+
'application/vnd.openxmlformats-officedocument.wordprocessingml.document':
|
|
183
|
+
'docx',
|
|
184
|
+
'text/html': 'html',
|
|
185
|
+
'text/markdown': 'md',
|
|
186
|
+
'application/pdf': 'pdf',
|
|
187
|
+
'text/plain': 'txt',
|
|
188
|
+
'application/vnd.ms-excel': 'xls',
|
|
189
|
+
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'xlsx',
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
function base64ToBytes(data: string): Uint8Array {
|
|
193
|
+
return Uint8Array.from(atob(data), (char) => char.charCodeAt(0));
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
function getMediaFormat<T extends string>(
|
|
197
|
+
mimeType: string | undefined,
|
|
198
|
+
formatMap: Record<string, T>
|
|
199
|
+
): T | undefined {
|
|
200
|
+
if (mimeType == null || mimeType === '') {
|
|
201
|
+
return undefined;
|
|
202
|
+
}
|
|
203
|
+
return formatMap[mimeType] ?? (parseMimeType(mimeType).subtype as T);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
function resolveMediaSource(
|
|
207
|
+
block: MediaContentBlock
|
|
208
|
+
): AudioSource | VideoSource {
|
|
209
|
+
if (typeof block.data === 'string') {
|
|
210
|
+
return { bytes: base64ToBytes(block.data) };
|
|
211
|
+
}
|
|
212
|
+
if (block.data instanceof Uint8Array) {
|
|
213
|
+
return { bytes: block.data };
|
|
214
|
+
}
|
|
215
|
+
if (typeof block.url === 'string') {
|
|
216
|
+
const parsedData = parseBase64DataUrl({
|
|
217
|
+
dataUrl: block.url,
|
|
218
|
+
asTypedArray: true,
|
|
219
|
+
});
|
|
220
|
+
if (parsedData != null) {
|
|
221
|
+
return { bytes: parsedData.data as Uint8Array };
|
|
222
|
+
}
|
|
223
|
+
throw new Error(
|
|
224
|
+
`Only base64 data URLs are supported for ${block.type} blocks with 'url' field with ChatBedrockConverse.`
|
|
225
|
+
);
|
|
226
|
+
}
|
|
227
|
+
if (typeof block.fileId === 'string') {
|
|
228
|
+
return { s3Location: { uri: block.fileId } };
|
|
229
|
+
}
|
|
230
|
+
throw new Error(
|
|
231
|
+
`${block.type} block must include one of: 'data' (base64 string or Uint8Array), 'url' (base64 data URL), or 'fileId' (S3 URI).`
|
|
232
|
+
);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
function convertMultimodalVideoBlock(
|
|
236
|
+
block: MediaContentBlock
|
|
237
|
+
): BedrockContentBlock {
|
|
238
|
+
return {
|
|
239
|
+
video: {
|
|
240
|
+
format: getMediaFormat(block.mimeType, mimeTypeToVideoFormat),
|
|
241
|
+
source: resolveMediaSource(block) as VideoSource,
|
|
242
|
+
},
|
|
243
|
+
} as BedrockContentBlock;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
function convertMultimodalAudioBlock(
|
|
247
|
+
block: MediaContentBlock
|
|
248
|
+
): BedrockContentBlock {
|
|
249
|
+
return {
|
|
250
|
+
audio: {
|
|
251
|
+
format: getMediaFormat(block.mimeType, mimeTypeToAudioFormat),
|
|
252
|
+
source: resolveMediaSource(block) as AudioSource,
|
|
253
|
+
},
|
|
254
|
+
} as BedrockContentBlock;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
function getDocumentName(block: Data.StandardFileBlock): string {
|
|
258
|
+
return (
|
|
259
|
+
(block.metadata?.name as string | undefined) ??
|
|
260
|
+
(block.metadata?.filename as string | undefined) ??
|
|
261
|
+
(block.metadata?.title as string | undefined) ??
|
|
262
|
+
globalThis.crypto.randomUUID().replace(/-/g, '').slice(0, 12)
|
|
263
|
+
);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
function getDocumentFormat(
|
|
267
|
+
mimeType: string | undefined
|
|
268
|
+
): DocumentFormat | undefined {
|
|
269
|
+
if (mimeType == null || mimeType === '') {
|
|
270
|
+
return undefined;
|
|
271
|
+
}
|
|
272
|
+
const parsedMimeType = parseMimeType(mimeType);
|
|
273
|
+
const format =
|
|
274
|
+
mimeTypeToDocumentFormat[
|
|
275
|
+
`${parsedMimeType.type}/${parsedMimeType.subtype}`
|
|
276
|
+
];
|
|
277
|
+
if (format === undefined) {
|
|
278
|
+
throw new Error(
|
|
279
|
+
`Unsupported file mime type: "${mimeType}" ChatBedrockConverse only supports ${Object.keys(
|
|
280
|
+
mimeTypeToDocumentFormat
|
|
281
|
+
).join(', ')} formats.`
|
|
282
|
+
);
|
|
283
|
+
}
|
|
284
|
+
return format;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
const standardContentBlockConverter: StandardContentBlockConverter<{
|
|
288
|
+
text: BedrockContentBlock;
|
|
289
|
+
image: BedrockContentBlock;
|
|
290
|
+
file: BedrockContentBlock;
|
|
291
|
+
}> = {
|
|
292
|
+
providerName: 'ChatBedrockConverse',
|
|
293
|
+
|
|
294
|
+
fromStandardTextBlock(block: Data.StandardTextBlock): BedrockContentBlock {
|
|
295
|
+
return { text: block.text };
|
|
296
|
+
},
|
|
297
|
+
|
|
298
|
+
fromStandardImageBlock(block: Data.StandardImageBlock): BedrockContentBlock {
|
|
299
|
+
if (block.source_type === 'url') {
|
|
300
|
+
const parsedData = parseBase64DataUrl({
|
|
301
|
+
dataUrl: block.url,
|
|
302
|
+
asTypedArray: true,
|
|
303
|
+
});
|
|
304
|
+
if (parsedData == null) {
|
|
305
|
+
throw new Error(
|
|
306
|
+
[
|
|
307
|
+
'Only base64 data URLs are supported for image blocks with source type ',
|
|
308
|
+
'url',
|
|
309
|
+
' with ChatBedrockConverse.',
|
|
310
|
+
].join(String.fromCharCode(39))
|
|
311
|
+
);
|
|
312
|
+
}
|
|
313
|
+
return {
|
|
314
|
+
image: {
|
|
315
|
+
format: parseMimeType(parsedData.mime_type).subtype as
|
|
316
|
+
| 'gif'
|
|
317
|
+
| 'jpeg'
|
|
318
|
+
| 'png'
|
|
319
|
+
| 'webp',
|
|
320
|
+
source: { bytes: parsedData.data as Uint8Array },
|
|
321
|
+
},
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
if (block.source_type === 'base64') {
|
|
325
|
+
let format: 'gif' | 'jpeg' | 'png' | 'webp' | undefined;
|
|
326
|
+
if (block.mime_type != null && block.mime_type !== '') {
|
|
327
|
+
format = parseMimeType(block.mime_type).subtype as typeof format;
|
|
328
|
+
}
|
|
329
|
+
if (format != null && !['gif', 'jpeg', 'png', 'webp'].includes(format)) {
|
|
330
|
+
throw new Error(
|
|
331
|
+
`Unsupported image mime type: "${block.mime_type}" ChatBedrockConverse only supports "image/gif", "image/jpeg", "image/png", and "image/webp" formats.`
|
|
332
|
+
);
|
|
333
|
+
}
|
|
334
|
+
return {
|
|
335
|
+
image: {
|
|
336
|
+
format,
|
|
337
|
+
source: { bytes: base64ToBytes(block.data) },
|
|
338
|
+
},
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
throw new Error(
|
|
342
|
+
`Image source type '${block.source_type}' not supported with ChatBedrockConverse.`
|
|
343
|
+
);
|
|
344
|
+
},
|
|
345
|
+
|
|
346
|
+
fromStandardFileBlock(block: Data.StandardFileBlock): BedrockContentBlock {
|
|
347
|
+
const name = getDocumentName(block);
|
|
348
|
+
if (block.source_type === 'text') {
|
|
349
|
+
return {
|
|
350
|
+
document: {
|
|
351
|
+
name,
|
|
352
|
+
format: 'txt',
|
|
353
|
+
source: { bytes: new TextEncoder().encode(block.text) },
|
|
354
|
+
},
|
|
355
|
+
} as BedrockContentBlock;
|
|
356
|
+
}
|
|
357
|
+
if (block.source_type === 'url') {
|
|
358
|
+
const parsedData = parseBase64DataUrl({
|
|
359
|
+
dataUrl: block.url,
|
|
360
|
+
asTypedArray: true,
|
|
361
|
+
});
|
|
362
|
+
if (parsedData == null) {
|
|
363
|
+
throw new Error(
|
|
364
|
+
[
|
|
365
|
+
'Only base64 data URLs are supported for file blocks with source type ',
|
|
366
|
+
'url',
|
|
367
|
+
' with ChatBedrockConverse.',
|
|
368
|
+
].join(String.fromCharCode(39))
|
|
369
|
+
);
|
|
370
|
+
}
|
|
371
|
+
return {
|
|
372
|
+
document: {
|
|
373
|
+
name,
|
|
374
|
+
format: getDocumentFormat(parsedData.mime_type),
|
|
375
|
+
source: { bytes: parsedData.data as Uint8Array } as DocumentSource,
|
|
376
|
+
},
|
|
377
|
+
} as BedrockContentBlock;
|
|
378
|
+
}
|
|
379
|
+
if (block.source_type === 'base64') {
|
|
380
|
+
return {
|
|
381
|
+
document: {
|
|
382
|
+
name,
|
|
383
|
+
format: getDocumentFormat(block.mime_type),
|
|
384
|
+
source: { bytes: base64ToBytes(block.data) } as DocumentSource,
|
|
385
|
+
},
|
|
386
|
+
} as BedrockContentBlock;
|
|
387
|
+
}
|
|
388
|
+
throw new Error(
|
|
389
|
+
`File source type '${block.source_type}' not supported with ChatBedrockConverse.`
|
|
390
|
+
);
|
|
391
|
+
},
|
|
392
|
+
};
|
|
393
|
+
|
|
130
394
|
/**
|
|
131
395
|
* Check if a block has a cache point.
|
|
132
396
|
*/
|
|
@@ -161,6 +425,10 @@ function convertLangChainContentBlockToConverseContentBlock({
|
|
|
161
425
|
return { text: block };
|
|
162
426
|
}
|
|
163
427
|
|
|
428
|
+
if (isDataContentBlock(block)) {
|
|
429
|
+
return convertToProviderContentBlock(block, standardContentBlockConverter);
|
|
430
|
+
}
|
|
431
|
+
|
|
164
432
|
if (block.type === 'text') {
|
|
165
433
|
return { text: (block as { text: string }).text };
|
|
166
434
|
}
|
|
@@ -231,6 +499,32 @@ function convertLangChainContentBlockToConverseContentBlock({
|
|
|
231
499
|
}
|
|
232
500
|
}
|
|
233
501
|
|
|
502
|
+
if (
|
|
503
|
+
block.type === 'video' &&
|
|
504
|
+
(block as { video?: unknown }).video !== undefined
|
|
505
|
+
) {
|
|
506
|
+
return {
|
|
507
|
+
video: (block as { video: unknown }).video,
|
|
508
|
+
} as BedrockContentBlock;
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
if (block.type === 'video') {
|
|
512
|
+
return convertMultimodalVideoBlock(block as MediaContentBlock);
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
if (
|
|
516
|
+
block.type === 'audio' &&
|
|
517
|
+
(block as { audio?: unknown }).audio !== undefined
|
|
518
|
+
) {
|
|
519
|
+
return {
|
|
520
|
+
audio: (block as { audio: unknown }).audio,
|
|
521
|
+
} as BedrockContentBlock;
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
if (block.type === 'audio') {
|
|
525
|
+
return convertMultimodalAudioBlock(block as MediaContentBlock);
|
|
526
|
+
}
|
|
527
|
+
|
|
234
528
|
if (
|
|
235
529
|
block.type === 'document' &&
|
|
236
530
|
(block as { document?: unknown }).document !== undefined
|
|
@@ -298,7 +592,10 @@ function convertSystemMessageToConverseMessage(
|
|
|
298
592
|
*/
|
|
299
593
|
function convertAIMessageToConverseMessage(msg: BaseMessage): BedrockMessage {
|
|
300
594
|
// Check for v1 format from other providers (PR #9766 fix)
|
|
301
|
-
|
|
595
|
+
const responseMetadata = msg.response_metadata as
|
|
596
|
+
| { output_version?: string }
|
|
597
|
+
| undefined;
|
|
598
|
+
if (responseMetadata?.output_version === 'v1') {
|
|
302
599
|
return convertFromV1ToChatBedrockConverseMessage(msg);
|
|
303
600
|
}
|
|
304
601
|
|
|
@@ -392,7 +689,9 @@ function convertFromV1ToChatBedrockConverseMessage(
|
|
|
392
689
|
};
|
|
393
690
|
|
|
394
691
|
if (Array.isArray(msg.content)) {
|
|
395
|
-
for (const block of msg.content
|
|
692
|
+
for (const block of msg.content as Array<
|
|
693
|
+
MessageContentComplex | MessageContentReasoningBlock
|
|
694
|
+
>) {
|
|
396
695
|
if (typeof block === 'string') {
|
|
397
696
|
assistantMsg.content?.push({ text: block });
|
|
398
697
|
} else if (block.type === 'text') {
|
|
@@ -539,11 +838,11 @@ export function convertToConverseMessages(messages: BaseMessage[]): {
|
|
|
539
838
|
// Combine consecutive user tool result messages into a single message
|
|
540
839
|
const combinedConverseMessages = converseMessages.reduce<BedrockMessage[]>(
|
|
541
840
|
(acc, curr) => {
|
|
542
|
-
|
|
543
|
-
if (lastMessage == null) {
|
|
841
|
+
if (acc.length === 0) {
|
|
544
842
|
acc.push(curr);
|
|
545
843
|
return acc;
|
|
546
844
|
}
|
|
845
|
+
const lastMessage = acc[acc.length - 1];
|
|
547
846
|
const lastHasToolResult =
|
|
548
847
|
lastMessage.content?.some((c) => 'toolResult' in c) === true;
|
|
549
848
|
const currHasToolResult =
|
|
@@ -17,6 +17,7 @@ import type {
|
|
|
17
17
|
MessageContentReasoningBlockReasoningTextPartial,
|
|
18
18
|
MessageContentReasoningBlockRedacted,
|
|
19
19
|
} from '../types';
|
|
20
|
+
import { toLangChainContent } from '@/messages/langchain';
|
|
20
21
|
|
|
21
22
|
/**
|
|
22
23
|
* Convert a Bedrock reasoning block delta to a LangChain partial reasoning block.
|
|
@@ -251,7 +252,7 @@ export function handleConverseStreamContentBlockDelta(
|
|
|
251
252
|
return new ChatGenerationChunk({
|
|
252
253
|
text: '',
|
|
253
254
|
message: new AIMessageChunk({
|
|
254
|
-
content: [reasoningBlock],
|
|
255
|
+
content: toLangChainContent([reasoningBlock]),
|
|
255
256
|
additional_kwargs: {
|
|
256
257
|
// Set reasoning_content for stream handler to detect reasoning mode
|
|
257
258
|
reasoning_content: reasoningText,
|