@llumiverse/drivers 0.20.0 → 0.22.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.
Files changed (101) hide show
  1. package/lib/cjs/azure/azure_foundry.js +388 -0
  2. package/lib/cjs/azure/azure_foundry.js.map +1 -0
  3. package/lib/cjs/bedrock/index.js +43 -27
  4. package/lib/cjs/bedrock/index.js.map +1 -1
  5. package/lib/cjs/groq/index.js +91 -10
  6. package/lib/cjs/groq/index.js.map +1 -1
  7. package/lib/cjs/index.js +2 -1
  8. package/lib/cjs/index.js.map +1 -1
  9. package/lib/cjs/mistral/index.js +2 -1
  10. package/lib/cjs/mistral/index.js.map +1 -1
  11. package/lib/cjs/openai/azure_openai.js +72 -0
  12. package/lib/cjs/openai/azure_openai.js.map +1 -0
  13. package/lib/cjs/openai/index.js +6 -9
  14. package/lib/cjs/openai/index.js.map +1 -1
  15. package/lib/cjs/openai/openai.js +2 -2
  16. package/lib/cjs/openai/openai.js.map +1 -1
  17. package/lib/cjs/openai/openai_format.js +138 -0
  18. package/lib/cjs/openai/openai_format.js.map +1 -0
  19. package/lib/cjs/vertexai/index.js +26 -18
  20. package/lib/cjs/vertexai/index.js.map +1 -1
  21. package/lib/cjs/vertexai/models/claude.js +5 -3
  22. package/lib/cjs/vertexai/models/claude.js.map +1 -1
  23. package/lib/cjs/vertexai/models/gemini.js +39 -12
  24. package/lib/cjs/vertexai/models/gemini.js.map +1 -1
  25. package/lib/cjs/watsonx/index.js +1 -1
  26. package/lib/cjs/watsonx/index.js.map +1 -1
  27. package/lib/cjs/xai/index.js +3 -3
  28. package/lib/cjs/xai/index.js.map +1 -1
  29. package/lib/esm/azure/azure_foundry.js +382 -0
  30. package/lib/esm/azure/azure_foundry.js.map +1 -0
  31. package/lib/esm/bedrock/index.js +43 -27
  32. package/lib/esm/bedrock/index.js.map +1 -1
  33. package/lib/esm/groq/index.js +91 -10
  34. package/lib/esm/groq/index.js.map +1 -1
  35. package/lib/esm/index.js +2 -1
  36. package/lib/esm/index.js.map +1 -1
  37. package/lib/esm/mistral/index.js +2 -1
  38. package/lib/esm/mistral/index.js.map +1 -1
  39. package/lib/esm/openai/azure_openai.js +68 -0
  40. package/lib/esm/openai/azure_openai.js.map +1 -0
  41. package/lib/esm/openai/index.js +5 -8
  42. package/lib/esm/openai/index.js.map +1 -1
  43. package/lib/esm/openai/openai.js +2 -2
  44. package/lib/esm/openai/openai.js.map +1 -1
  45. package/lib/esm/openai/openai_format.js +134 -0
  46. package/lib/esm/openai/openai_format.js.map +1 -0
  47. package/lib/esm/vertexai/index.js +26 -18
  48. package/lib/esm/vertexai/index.js.map +1 -1
  49. package/lib/esm/vertexai/models/claude.js +5 -3
  50. package/lib/esm/vertexai/models/claude.js.map +1 -1
  51. package/lib/esm/vertexai/models/gemini.js +39 -12
  52. package/lib/esm/vertexai/models/gemini.js.map +1 -1
  53. package/lib/esm/watsonx/index.js +1 -1
  54. package/lib/esm/watsonx/index.js.map +1 -1
  55. package/lib/esm/xai/index.js +2 -2
  56. package/lib/esm/xai/index.js.map +1 -1
  57. package/lib/types/azure/azure_foundry.d.ts +50 -0
  58. package/lib/types/azure/azure_foundry.d.ts.map +1 -0
  59. package/lib/types/bedrock/index.d.ts +2 -2
  60. package/lib/types/bedrock/index.d.ts.map +1 -1
  61. package/lib/types/groq/index.d.ts +5 -5
  62. package/lib/types/groq/index.d.ts.map +1 -1
  63. package/lib/types/index.d.ts +2 -1
  64. package/lib/types/index.d.ts.map +1 -1
  65. package/lib/types/mistral/index.d.ts +2 -2
  66. package/lib/types/mistral/index.d.ts.map +1 -1
  67. package/lib/types/openai/azure_openai.d.ts +25 -0
  68. package/lib/types/openai/azure_openai.d.ts.map +1 -0
  69. package/lib/types/openai/index.d.ts +6 -7
  70. package/lib/types/openai/index.d.ts.map +1 -1
  71. package/lib/types/openai/openai.d.ts +2 -2
  72. package/lib/types/openai/openai.d.ts.map +1 -1
  73. package/lib/types/openai/openai_format.d.ts +19 -0
  74. package/lib/types/openai/openai_format.d.ts.map +1 -0
  75. package/lib/types/vertexai/index.d.ts.map +1 -1
  76. package/lib/types/vertexai/models/claude.d.ts.map +1 -1
  77. package/lib/types/vertexai/models/gemini.d.ts +3 -2
  78. package/lib/types/vertexai/models/gemini.d.ts.map +1 -1
  79. package/lib/types/xai/index.d.ts.map +1 -1
  80. package/package.json +27 -23
  81. package/src/azure/azure_foundry.ts +458 -0
  82. package/src/bedrock/index.ts +44 -28
  83. package/src/groq/index.ts +107 -16
  84. package/src/index.ts +2 -1
  85. package/src/mistral/index.ts +3 -2
  86. package/src/openai/azure_openai.ts +92 -0
  87. package/src/openai/index.ts +19 -22
  88. package/src/openai/openai.ts +2 -5
  89. package/src/openai/openai_format.ts +165 -0
  90. package/src/vertexai/index.ts +29 -22
  91. package/src/vertexai/models/claude.ts +5 -3
  92. package/src/vertexai/models/gemini.ts +50 -12
  93. package/src/watsonx/index.ts +5 -5
  94. package/src/xai/index.ts +2 -3
  95. package/lib/cjs/openai/azure.js +0 -31
  96. package/lib/cjs/openai/azure.js.map +0 -1
  97. package/lib/esm/openai/azure.js +0 -27
  98. package/lib/esm/openai/azure.js.map +0 -1
  99. package/lib/types/openai/azure.d.ts +0 -20
  100. package/lib/types/openai/azure.d.ts.map +0 -1
  101. package/src/openai/azure.ts +0 -54
@@ -0,0 +1,388 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AzureFoundryDriver = void 0;
4
+ exports.parseAzureFoundryModelId = parseAzureFoundryModelId;
5
+ exports.isCompositeModelId = isCompositeModelId;
6
+ const identity_1 = require("@azure/identity");
7
+ const core_1 = require("@llumiverse/core");
8
+ const ai_projects_1 = require("@azure/ai-projects");
9
+ const ai_inference_1 = require("@azure-rest/ai-inference");
10
+ const azure_openai_js_1 = require("../openai/azure_openai.js");
11
+ const core_sse_1 = require("@azure/core-sse");
12
+ const openai_format_js_1 = require("../openai/openai_format.js");
13
+ class AzureFoundryDriver extends core_1.AbstractDriver {
14
+ service;
15
+ provider = core_1.Providers.azure_foundry;
16
+ OPENAI_API_VERSION = "2025-01-01-preview";
17
+ INFERENCE_API_VERSION = "2024-05-01-preview";
18
+ constructor(opts) {
19
+ super(opts);
20
+ this.formatPrompt = openai_format_js_1.formatOpenAILikeMultimodalPrompt;
21
+ if (!opts.endpoint) {
22
+ throw new Error("Azure AI Foundry endpoint is required");
23
+ }
24
+ try {
25
+ if (!opts.azureADTokenProvider) {
26
+ // Using Microsoft Entra ID (Azure AD) for authentication
27
+ opts.azureADTokenProvider = new identity_1.DefaultAzureCredential();
28
+ }
29
+ }
30
+ catch (error) {
31
+ this.logger.error("Failed to initialize Azure AD token provider:", error);
32
+ throw new Error("Failed to initialize Azure AD token provider");
33
+ }
34
+ // Initialize AI Projects client which provides access to inference operations
35
+ this.service = new ai_projects_1.AIProjectClient(opts.endpoint, opts.azureADTokenProvider);
36
+ if (opts.apiVersion) {
37
+ this.OPENAI_API_VERSION = opts.apiVersion;
38
+ this.INFERENCE_API_VERSION = opts.apiVersion;
39
+ this.logger.info(`[Azure Foundry] Overriding default API version, using API version: ${opts.apiVersion}`);
40
+ }
41
+ }
42
+ /**
43
+ * Get default authentication for Azure AI Foundry API
44
+ */
45
+ getDefaultAIFoundryAuth() {
46
+ const scope = "https://ai.azure.com/.default";
47
+ const azureADTokenProvider = (0, identity_1.getBearerTokenProvider)(new identity_1.DefaultAzureCredential(), scope);
48
+ return azureADTokenProvider;
49
+ }
50
+ async isOpenAIDeployment(model) {
51
+ const { deploymentName } = parseAzureFoundryModelId(model);
52
+ let deployment = undefined;
53
+ // First, verify the deployment exists
54
+ try {
55
+ deployment = await this.service.deployments.get(deploymentName);
56
+ this.logger.debug(`[Azure Foundry] Deployment ${deploymentName} found`);
57
+ }
58
+ catch (deploymentError) {
59
+ this.logger.error(`[Azure Foundry] Deployment ${deploymentName} not found:`, deploymentError);
60
+ }
61
+ return deployment.modelPublisher == "OpenAI";
62
+ }
63
+ canStream(_options) {
64
+ return Promise.resolve(true);
65
+ }
66
+ async requestTextCompletion(prompt, options) {
67
+ const { deploymentName } = parseAzureFoundryModelId(options.model);
68
+ const model_options = options.model_options;
69
+ const isOpenAI = await this.isOpenAIDeployment(options.model);
70
+ let response;
71
+ if (isOpenAI) {
72
+ // Use the Azure OpenAI client for OpenAI models
73
+ const azureOpenAI = await this.service.inference.azureOpenAI({ apiVersion: this.OPENAI_API_VERSION });
74
+ const subDriver = new azure_openai_js_1.AzureOpenAIDriver(azureOpenAI);
75
+ // Use deployment name for API calls
76
+ const modifiedOptions = { ...options, model: deploymentName };
77
+ const response = await subDriver.requestTextCompletion(prompt, modifiedOptions);
78
+ return response;
79
+ }
80
+ else {
81
+ // Use the chat completions client from the inference operations
82
+ const chatClient = this.service.inference.chatCompletions({ apiVersion: this.INFERENCE_API_VERSION });
83
+ response = await chatClient.post({
84
+ body: {
85
+ messages: prompt,
86
+ max_tokens: model_options?.max_tokens,
87
+ model: deploymentName,
88
+ stream: true,
89
+ temperature: model_options?.temperature,
90
+ top_p: model_options?.top_p,
91
+ frequency_penalty: model_options?.frequency_penalty,
92
+ presence_penalty: model_options?.presence_penalty,
93
+ stop: model_options?.stop_sequence,
94
+ }
95
+ });
96
+ if (response.status !== "200") {
97
+ this.logger.error(`[Azure Foundry] Chat completion request failed:`, response);
98
+ throw new Error(`Chat completion request failed with status ${response.status}: ${response.body}`);
99
+ }
100
+ return this.extractDataFromResponse(response.body);
101
+ }
102
+ }
103
+ async requestTextCompletionStream(prompt, options) {
104
+ const { deploymentName } = parseAzureFoundryModelId(options.model);
105
+ const model_options = options.model_options;
106
+ const isOpenAI = await this.isOpenAIDeployment(options.model);
107
+ if (isOpenAI) {
108
+ const azureOpenAI = await this.service.inference.azureOpenAI({ apiVersion: this.OPENAI_API_VERSION });
109
+ const subDriver = new azure_openai_js_1.AzureOpenAIDriver(azureOpenAI);
110
+ const modifiedOptions = { ...options, model: deploymentName };
111
+ const stream = await subDriver.requestTextCompletionStream(prompt, modifiedOptions);
112
+ return stream;
113
+ }
114
+ else {
115
+ const chatClient = this.service.inference.chatCompletions({ apiVersion: this.INFERENCE_API_VERSION });
116
+ const response = await chatClient.post({
117
+ body: {
118
+ messages: prompt,
119
+ max_tokens: model_options?.max_tokens,
120
+ model: deploymentName,
121
+ stream: true,
122
+ temperature: model_options?.temperature,
123
+ top_p: model_options?.top_p,
124
+ frequency_penalty: model_options?.frequency_penalty,
125
+ presence_penalty: model_options?.presence_penalty,
126
+ stop: model_options?.stop_sequence,
127
+ }
128
+ }).asNodeStream();
129
+ // We type assert from NodeJS.ReadableStream to NodeJSReadableStream
130
+ // The Azure Examples, expect a .destroy() method on the stream
131
+ const stream = response.body;
132
+ if (!stream) {
133
+ throw new Error("The response stream is undefined");
134
+ }
135
+ if (response.status !== "200") {
136
+ stream.destroy();
137
+ throw new Error(`Failed to get chat completions, http operation failed with ${response.status} code`);
138
+ }
139
+ const sseStream = (0, core_sse_1.createSseStream)(stream);
140
+ return this.processStreamResponse(sseStream);
141
+ }
142
+ }
143
+ async *processStreamResponse(sseStream) {
144
+ try {
145
+ for await (const event of sseStream) {
146
+ if (event.data === "[DONE]") {
147
+ break;
148
+ }
149
+ try {
150
+ const data = JSON.parse(event.data);
151
+ if (!data) {
152
+ this.logger.warn(`[Azure Foundry] Received empty data in streaming response`);
153
+ continue;
154
+ }
155
+ const choice = data.choices?.[0];
156
+ if (!choice) {
157
+ continue;
158
+ }
159
+ const chunk = {
160
+ result: choice.delta?.content || "",
161
+ finish_reason: this.convertFinishReason(choice.finish_reason),
162
+ token_usage: {
163
+ prompt: data.usage?.prompt_tokens,
164
+ result: data.usage?.completion_tokens,
165
+ total: data.usage?.total_tokens,
166
+ },
167
+ };
168
+ yield chunk;
169
+ }
170
+ catch (parseError) {
171
+ this.logger.warn(`[Azure Foundry] Failed to parse streaming response:`, parseError);
172
+ continue;
173
+ }
174
+ }
175
+ }
176
+ catch (error) {
177
+ this.logger.error(`[Azure Foundry] Streaming error:`, error);
178
+ throw error;
179
+ }
180
+ }
181
+ extractDataFromResponse(result) {
182
+ const tokenInfo = {
183
+ prompt: result.usage?.prompt_tokens,
184
+ result: result.usage?.completion_tokens,
185
+ total: result.usage?.total_tokens,
186
+ };
187
+ const choice = result.choices?.[0];
188
+ if (!choice) {
189
+ this.logger?.error("[Azure Foundry] No choices in response", result);
190
+ throw new Error("No choices in response");
191
+ }
192
+ const data = choice.message?.content;
193
+ const toolCalls = choice.message?.tool_calls;
194
+ if (!data && !toolCalls) {
195
+ this.logger?.error("[Azure Foundry] Response is not valid", result);
196
+ throw new Error("Response is not valid: no content or tool calls");
197
+ }
198
+ const completion = {
199
+ result: data,
200
+ token_usage: tokenInfo,
201
+ finish_reason: this.convertFinishReason(choice.finish_reason),
202
+ };
203
+ if (toolCalls && toolCalls.length > 0) {
204
+ completion.tool_use = toolCalls.map((call) => ({
205
+ id: call.id,
206
+ tool_name: call.function?.name,
207
+ tool_input: call.function?.arguments ? JSON.parse(call.function.arguments) : {}
208
+ }));
209
+ }
210
+ return completion;
211
+ }
212
+ convertFinishReason(reason) {
213
+ if (!reason)
214
+ return undefined;
215
+ // Map Azure AI finish reasons to standard format
216
+ switch (reason) {
217
+ case 'stop': return 'stop';
218
+ case 'length': return 'length';
219
+ case 'tool_calls': return 'tool_use';
220
+ default: return reason;
221
+ }
222
+ }
223
+ async validateConnection() {
224
+ try {
225
+ // Test the AI Projects client by listing deployments
226
+ const deploymentsIterable = this.service.deployments.list();
227
+ let hasDeployments = false;
228
+ for await (const deployment of deploymentsIterable) {
229
+ hasDeployments = true;
230
+ this.logger.debug(`[Azure Foundry] Found deployment: ${deployment.name} (${deployment.type})`);
231
+ break; // Just check if we can get at least one deployment
232
+ }
233
+ if (!hasDeployments) {
234
+ this.logger.warn("[Azure Foundry] No deployments found in the project");
235
+ }
236
+ return true;
237
+ }
238
+ catch (error) {
239
+ this.logger.error("Azure Foundry connection validation failed:", error);
240
+ return false;
241
+ }
242
+ }
243
+ async generateEmbeddings(options) {
244
+ if (!options.model) {
245
+ throw new Error("Default embedding model selection not supported for Azure Foundry. Please specify a model.");
246
+ }
247
+ if (options.text) {
248
+ return this.generateTextEmbeddings(options);
249
+ }
250
+ else if (options.image) {
251
+ return this.generateImageEmbeddings(options);
252
+ }
253
+ else {
254
+ throw new Error("No text or images provided for embeddings");
255
+ }
256
+ }
257
+ async generateTextEmbeddings(options) {
258
+ if (!options.text) {
259
+ throw new Error("No text provided for text embeddings");
260
+ }
261
+ const { deploymentName } = parseAzureFoundryModelId(options.model || "");
262
+ let response;
263
+ try {
264
+ // Use the embeddings client from the inference operations
265
+ const embeddingsClient = this.service.inference.embeddings({ apiVersion: this.INFERENCE_API_VERSION });
266
+ response = await embeddingsClient.post({
267
+ body: {
268
+ input: Array.isArray(options.text) ? options.text : [options.text],
269
+ model: deploymentName
270
+ }
271
+ });
272
+ }
273
+ catch (error) {
274
+ this.logger.error("Azure Foundry text embeddings error:", error);
275
+ throw error;
276
+ }
277
+ if ((0, ai_inference_1.isUnexpected)(response)) {
278
+ throw new Error(`Text embeddings request failed: ${response.status} ${response.body?.error?.message || 'Unknown error'}`);
279
+ }
280
+ const embeddings = response.body.data?.[0]?.embedding;
281
+ if (!embeddings || !Array.isArray(embeddings) || embeddings.length === 0) {
282
+ throw new Error("No valid embedding array found in response");
283
+ }
284
+ return {
285
+ values: embeddings,
286
+ model: options.model ?? ""
287
+ };
288
+ }
289
+ async generateImageEmbeddings(options) {
290
+ if (!options.image) {
291
+ throw new Error("No images provided for image embeddings");
292
+ }
293
+ const { deploymentName } = parseAzureFoundryModelId(options.model || "");
294
+ let response;
295
+ try {
296
+ // Use the embeddings client from the inference operations
297
+ const embeddingsClient = this.service.inference.embeddings({ apiVersion: this.INFERENCE_API_VERSION });
298
+ response = await embeddingsClient.post({
299
+ body: {
300
+ input: Array.isArray(options.image) ? options.image : [options.image],
301
+ model: deploymentName
302
+ }
303
+ });
304
+ }
305
+ catch (error) {
306
+ this.logger.error("Azure Foundry image embeddings error:", error);
307
+ throw error;
308
+ }
309
+ if ((0, ai_inference_1.isUnexpected)(response)) {
310
+ throw new Error(`Image embeddings request failed: ${response.status} ${response.body?.error?.message || 'Unknown error'}`);
311
+ }
312
+ const embeddings = response.body.data?.[0]?.embedding;
313
+ if (!embeddings || !Array.isArray(embeddings) || embeddings.length === 0) {
314
+ throw new Error("No valid embedding array found in response");
315
+ }
316
+ return {
317
+ values: embeddings,
318
+ model: options.model ?? ""
319
+ };
320
+ }
321
+ async listModels() {
322
+ const filter = (m) => {
323
+ // Only include models that support chat completions
324
+ return !!m.capabilities.chat_completion;
325
+ };
326
+ return this._listModels(filter);
327
+ }
328
+ async _listModels(filter) {
329
+ let deploymentsIterable;
330
+ try {
331
+ // List all deployments in the Azure AI Foundry project
332
+ deploymentsIterable = this.service.deployments.list();
333
+ }
334
+ catch (error) {
335
+ this.logger.error("Failed to list deployments:", error);
336
+ throw new Error("Failed to list deployments in Azure AI Foundry project");
337
+ }
338
+ const deployments = [];
339
+ for await (const page of deploymentsIterable.byPage()) {
340
+ for (const deployment of page) {
341
+ deployments.push(deployment);
342
+ }
343
+ }
344
+ let modelDeployments = deployments.filter((d) => {
345
+ return d.type === "ModelDeployment";
346
+ });
347
+ if (filter) {
348
+ modelDeployments = modelDeployments.filter(filter);
349
+ }
350
+ const aiModels = modelDeployments.map((model) => {
351
+ // Create composite ID: deployment_name::base_model
352
+ const compositeId = `${model.name}::${model.modelName}`;
353
+ const modelCapability = (0, core_1.getModelCapabilities)(model.modelName, core_1.Providers.azure_foundry);
354
+ return {
355
+ id: compositeId,
356
+ name: model.name,
357
+ description: `${model.modelName} - ${model.modelVersion}`,
358
+ version: model.modelVersion,
359
+ provider: this.provider,
360
+ owner: model.modelPublisher,
361
+ input_modalities: (0, core_1.modelModalitiesToArray)(modelCapability.input),
362
+ output_modalities: (0, core_1.modelModalitiesToArray)(modelCapability.output),
363
+ tool_support: modelCapability.tool_support,
364
+ };
365
+ }).sort((modelA, modelB) => modelA.id.localeCompare(modelB.id));
366
+ return aiModels;
367
+ }
368
+ }
369
+ exports.AzureFoundryDriver = AzureFoundryDriver;
370
+ // Helper functions to parse the composite ID
371
+ function parseAzureFoundryModelId(compositeId) {
372
+ const parts = compositeId.split('::');
373
+ if (parts.length === 2) {
374
+ return {
375
+ deploymentName: parts[0],
376
+ baseModel: parts[1]
377
+ };
378
+ }
379
+ // Backwards compatibility: if no delimiter found, treat as deployment name
380
+ return {
381
+ deploymentName: compositeId,
382
+ baseModel: compositeId
383
+ };
384
+ }
385
+ function isCompositeModelId(modelId) {
386
+ return modelId.includes('::');
387
+ }
388
+ //# sourceMappingURL=azure_foundry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"azure_foundry.js","sourceRoot":"","sources":["../../../src/azure/azure_foundry.ts"],"names":[],"mappings":"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"}
@@ -38,11 +38,13 @@ function maxTokenFallbackClaude(option) {
38
38
  return modelOptions.max_tokens;
39
39
  }
40
40
  else {
41
+ const thinking_budget = modelOptions?.thinking_budget_tokens ?? 0;
42
+ let maxSupportedTokens = (0, core_1.getMaxTokensLimitBedrock)(option.model) ?? 8192; // Should always return a number for claude, 8192 is to satisfy the TypeScript type checker;
41
43
  // Fallback to the default max tokens limit for the model
42
- if (option.model.includes('claude-3-7-sonnet') && (modelOptions?.thinking_budget_tokens ?? 0) < 64000) {
43
- return 64000; // Claude 3.7 can go up to 128k with a beta header, but when no max tokens is specified, we default to 64k.
44
+ if (option.model.includes('claude-3-7-sonnet') && (modelOptions?.thinking_budget_tokens ?? 0) < 48000) {
45
+ maxSupportedTokens = 64000; // Claude 3.7 can go up to 128k with a beta header, but when no max tokens is specified, we default to 64k.
44
46
  }
45
- return (0, core_1.getMaxTokensLimitBedrock)(option.model) ?? 8192; // Should always return a number for claude, 8192 is to satisfy the TypeScript type checker
47
+ return Math.min(16000 + thinking_budget, maxSupportedTokens); // Cap to 16k, to avoid taking up too much context window and quota.
46
48
  }
47
49
  }
48
50
  class BedrockDriver extends core_1.AbstractDriver {
@@ -82,7 +84,7 @@ class BedrockDriver extends core_1.AbstractDriver {
82
84
  }
83
85
  return await (0, converse_js_1.formatConversePrompt)(segments, opts);
84
86
  }
85
- static getExtractedExecution(result, _prompt, options) {
87
+ getExtractedExecution(result, _prompt, options) {
86
88
  let resultText = "";
87
89
  let reasoning = "";
88
90
  if (result.output?.message?.content) {
@@ -91,9 +93,9 @@ class BedrockDriver extends core_1.AbstractDriver {
91
93
  if (content.text) {
92
94
  resultText += content.text;
93
95
  }
94
- // Get reasoning content only if include_thoughts is true
95
- if (content.reasoningContent && options) {
96
- const claudeOptions = options.model_options;
96
+ else if (content.reasoningContent) {
97
+ // Get reasoning content only if include_thoughts is true
98
+ const claudeOptions = options?.model_options;
97
99
  if (claudeOptions?.include_thoughts) {
98
100
  if (content.reasoningContent.reasoningText) {
99
101
  reasoning += content.reasoningContent.reasoningText.text;
@@ -104,6 +106,14 @@ class BedrockDriver extends core_1.AbstractDriver {
104
106
  reasoning += `[Redacted thinking: ${redactedData}]`;
105
107
  }
106
108
  }
109
+ else {
110
+ this.logger.info("[Bedrock] Not outputting reasoning content as include_thoughts is false");
111
+ }
112
+ }
113
+ else {
114
+ // Get content block type
115
+ const type = Object.keys(content).find(key => key !== '$unknown' && content[key] !== undefined);
116
+ this.logger.info("[Bedrock] Unsupported content response type:", type);
107
117
  }
108
118
  }
109
119
  // Add spacing if we have reasoning content
@@ -123,7 +133,7 @@ class BedrockDriver extends core_1.AbstractDriver {
123
133
  return completionResult;
124
134
  }
125
135
  ;
126
- static getExtractedStream(result, _prompt, options) {
136
+ getExtractedStream(result, _prompt, options) {
127
137
  let output = "";
128
138
  let reasoning = "";
129
139
  let stop_reason = "";
@@ -158,8 +168,15 @@ class BedrockDriver extends core_1.AbstractDriver {
158
168
  else if (delta.reasoningContent.signature) {
159
169
  // Handle signature updates for reasoning content - end of thinking
160
170
  reasoning = "\n\n";
171
+ // Putting logging here so it only triggers once.
172
+ this.logger.info("[Bedrock] Not outputting reasoning content as include_thoughts is false");
161
173
  }
162
174
  }
175
+ else if (delta) {
176
+ // Get content block type
177
+ const type = Object.keys(delta).find(key => key !== '$unknown' && delta[key] !== undefined);
178
+ this.logger.info("[Bedrock] Unsupported content response type:", type);
179
+ }
163
180
  }
164
181
  // Handle content block stop events
165
182
  if (result.contentBlockStop) {
@@ -275,25 +292,23 @@ class BedrockDriver extends core_1.AbstractDriver {
275
292
  modelId: prompt.modelId,
276
293
  });
277
294
  let tool_use = undefined;
278
- //Get tool requests
279
- if (res.stopReason == "tool_use") {
280
- tool_use = res.output?.message?.content?.reduce((tools, c) => {
281
- if (c.toolUse) {
282
- tools.push({
283
- tool_name: c.toolUse.name ?? "",
284
- tool_input: c.toolUse.input,
285
- id: c.toolUse.toolUseId ?? "",
286
- });
287
- }
288
- return tools;
289
- }, []);
290
- //If no tools were used, set to undefined
291
- if (tool_use && tool_use.length == 0) {
292
- tool_use = undefined;
295
+ //Get tool requests, we check tool use regardless of finish reason, as you can hit length and still get a valid response.
296
+ tool_use = res.output?.message?.content?.reduce((tools, c) => {
297
+ if (c.toolUse) {
298
+ tools.push({
299
+ tool_name: c.toolUse.name ?? "",
300
+ tool_input: c.toolUse.input,
301
+ id: c.toolUse.toolUseId ?? "",
302
+ });
293
303
  }
304
+ return tools;
305
+ }, []);
306
+ //If no tools were used, set to undefined
307
+ if (tool_use && tool_use.length == 0) {
308
+ tool_use = undefined;
294
309
  }
295
310
  const completion = {
296
- ...BedrockDriver.getExtractedExecution(res, prompt, options),
311
+ ...this.getExtractedExecution(res, prompt, options),
297
312
  original_response: options.include_original_response ? res : undefined,
298
313
  conversation: conversation,
299
314
  tool_use: tool_use,
@@ -311,10 +326,10 @@ class BedrockDriver extends core_1.AbstractDriver {
311
326
  throw new Error("[Bedrock] Stream not found in response");
312
327
  }
313
328
  return (0, async_1.transformAsyncIterator)(stream, (streamSegment) => {
314
- return BedrockDriver.getExtractedStream(streamSegment, prompt, options);
329
+ return this.getExtractedStream(streamSegment, prompt, options);
315
330
  });
316
331
  }).catch((err) => {
317
- this.logger.error("[Bedrock] Failed to stream", err);
332
+ this.logger.error("[Bedrock] Failed to stream", { error: err });
318
333
  throw err;
319
334
  });
320
335
  }
@@ -626,7 +641,6 @@ class BedrockDriver extends core_1.AbstractDriver {
626
641
  id: m.modelArn ?? m.modelId,
627
642
  name: `${m.providerName} ${m.modelName}`,
628
643
  provider: this.provider,
629
- //description: ``,
630
644
  owner: m.providerName,
631
645
  can_stream: m.responseStreamingSupported ?? false,
632
646
  input_modalities: m.inputModalities ? formatAmazonModalities(m.inputModalities) : (0, core_1.modelModalitiesToArray)(modelCapability.input),
@@ -646,6 +660,7 @@ class BedrockDriver extends core_1.AbstractDriver {
646
660
  id: m.modelArn,
647
661
  name: m.modelName ?? m.modelArn,
648
662
  provider: this.provider,
663
+ owner: "custom",
649
664
  description: `Custom model from ${m.baseModelName}`,
650
665
  is_custom: true,
651
666
  input_modalities: (0, core_1.modelModalitiesToArray)(modelCapability.input),
@@ -679,6 +694,7 @@ class BedrockDriver extends core_1.AbstractDriver {
679
694
  id: p.inferenceProfileArn ?? p.inferenceProfileId,
680
695
  name: p.inferenceProfileName ?? p.inferenceProfileArn,
681
696
  provider: this.provider,
697
+ owner: providerName,
682
698
  input_modalities: (0, core_1.modelModalitiesToArray)(modelCapability.input),
683
699
  output_modalities: (0, core_1.modelModalitiesToArray)(modelCapability.output),
684
700
  tool_support: modelCapability.tool_support,