@office-ai/aioncli-core 0.24.1 → 0.24.2
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/docs/bedrock-integration-plan.md +595 -0
- package/dist/docs/get-started/authentication.md +162 -0
- package/dist/src/agents/introspection-agent.d.ts +2 -2
- package/dist/src/config/models.d.ts +26 -0
- package/dist/src/config/models.js +134 -0
- package/dist/src/config/models.js.map +1 -1
- package/dist/src/core/bedrockContentGenerator.d.ts +72 -0
- package/dist/src/core/bedrockContentGenerator.js +628 -0
- package/dist/src/core/bedrockContentGenerator.js.map +1 -0
- package/dist/src/core/contentGenerator.d.ts +3 -1
- package/dist/src/core/contentGenerator.js +29 -0
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/coreToolHookTriggers.js +3 -3
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/ide/types.d.ts +44 -44
- package/dist/src/utils/checkpointUtils.d.ts +2 -2
- package/dist/src/utils/retry.js +25 -0
- package/dist/src/utils/retry.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,628 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { FinishReason, GenerateContentResponse } from '@google/genai';
|
|
7
|
+
import { BedrockRuntimeClient, ConverseCommand, ConverseStreamCommand, } from '@aws-sdk/client-bedrock-runtime';
|
|
8
|
+
import { debugLogger } from '../utils/debugLogger.js';
|
|
9
|
+
import { retryWithBackoff } from '../utils/retry.js';
|
|
10
|
+
/**
|
|
11
|
+
* BedrockContentGenerator implements ContentGenerator interface for AWS Bedrock.
|
|
12
|
+
*/
|
|
13
|
+
export class BedrockContentGenerator {
|
|
14
|
+
client;
|
|
15
|
+
model;
|
|
16
|
+
region;
|
|
17
|
+
/**
|
|
18
|
+
* Accumulator for streaming tool calls.
|
|
19
|
+
* Bedrock sends tool input as JSON fragments across multiple contentBlockDelta events.
|
|
20
|
+
* We accumulate the fragments and emit complete functionCall when contentBlockStop arrives.
|
|
21
|
+
*/
|
|
22
|
+
streamingToolUses = new Map();
|
|
23
|
+
constructor(config) {
|
|
24
|
+
this.model = config.model;
|
|
25
|
+
this.region = config.region || process.env['AWS_REGION'] || 'us-east-1';
|
|
26
|
+
this.client = new BedrockRuntimeClient({
|
|
27
|
+
region: this.region,
|
|
28
|
+
});
|
|
29
|
+
const credentialSource = this.detectCredentialSource();
|
|
30
|
+
debugLogger.log(`[Bedrock] Initialized:\n` +
|
|
31
|
+
` Model: ${this.model}\n` +
|
|
32
|
+
` Region: ${this.region}\n` +
|
|
33
|
+
` Credentials: ${credentialSource}`);
|
|
34
|
+
}
|
|
35
|
+
detectCredentialSource() {
|
|
36
|
+
if (process.env['AWS_ACCESS_KEY_ID']) {
|
|
37
|
+
return 'Environment variables (AWS_ACCESS_KEY_ID)';
|
|
38
|
+
}
|
|
39
|
+
if (process.env['AWS_PROFILE']) {
|
|
40
|
+
return `AWS Profile (${process.env['AWS_PROFILE']})`;
|
|
41
|
+
}
|
|
42
|
+
return 'AWS SDK default credential chain';
|
|
43
|
+
}
|
|
44
|
+
async generateContent(request, _userPromptId) {
|
|
45
|
+
const startTime = Date.now();
|
|
46
|
+
const { messages, system } = this.convertToBedrockMessages(request);
|
|
47
|
+
// Convert tools if present
|
|
48
|
+
let toolConfig;
|
|
49
|
+
if (request.config?.tools && request.config.tools.length > 0) {
|
|
50
|
+
toolConfig = await this.convertToolsToBedrockFormat(request.config.tools);
|
|
51
|
+
}
|
|
52
|
+
// Wrap API call with retry logic
|
|
53
|
+
return retryWithBackoff(async () => {
|
|
54
|
+
try {
|
|
55
|
+
const command = new ConverseCommand({
|
|
56
|
+
modelId: this.model,
|
|
57
|
+
messages,
|
|
58
|
+
system,
|
|
59
|
+
toolConfig,
|
|
60
|
+
inferenceConfig: {
|
|
61
|
+
maxTokens: request.config?.maxOutputTokens || 4096,
|
|
62
|
+
temperature: request.config?.temperature ?? 1.0,
|
|
63
|
+
topP: request.config?.topP,
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
debugLogger.log(`[Bedrock] Sending request:\n` +
|
|
67
|
+
` Model: ${this.model}\n` +
|
|
68
|
+
` Messages: ${messages.length}\n` +
|
|
69
|
+
` System: ${system ? 'yes' : 'no'}`);
|
|
70
|
+
const response = await this.client.send(command);
|
|
71
|
+
const elapsedTime = Date.now() - startTime;
|
|
72
|
+
debugLogger.log(`[Bedrock] Response received (${elapsedTime}ms):\n` +
|
|
73
|
+
` Stop Reason: ${response.stopReason}\n` +
|
|
74
|
+
` Input Tokens: ${response.usage?.inputTokens || 0}\n` +
|
|
75
|
+
` Output Tokens: ${response.usage?.outputTokens || 0}`);
|
|
76
|
+
return this.convertToGeminiFormat(response);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
debugLogger.error(`[Bedrock] Error:`, error);
|
|
80
|
+
throw this.enhanceError(error);
|
|
81
|
+
}
|
|
82
|
+
}, {
|
|
83
|
+
maxAttempts: 3,
|
|
84
|
+
initialDelayMs: 1000,
|
|
85
|
+
maxDelayMs: 10000,
|
|
86
|
+
authType: 'bedrock',
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
async generateContentStream(request, _userPromptId) {
|
|
90
|
+
const startTime = Date.now();
|
|
91
|
+
const { messages, system } = this.convertToBedrockMessages(request);
|
|
92
|
+
// Convert tools if present
|
|
93
|
+
let toolConfig;
|
|
94
|
+
if (request.config?.tools && request.config.tools.length > 0) {
|
|
95
|
+
toolConfig = await this.convertToolsToBedrockFormat(request.config.tools);
|
|
96
|
+
}
|
|
97
|
+
// Wrap initial stream setup with retry logic
|
|
98
|
+
// Note: Once stream starts, we cannot retry mid-stream
|
|
99
|
+
const stream = await retryWithBackoff(async () => {
|
|
100
|
+
try {
|
|
101
|
+
const command = new ConverseStreamCommand({
|
|
102
|
+
modelId: this.model,
|
|
103
|
+
messages,
|
|
104
|
+
system,
|
|
105
|
+
toolConfig,
|
|
106
|
+
inferenceConfig: {
|
|
107
|
+
maxTokens: request.config?.maxOutputTokens || 4096,
|
|
108
|
+
temperature: request.config?.temperature ?? 1.0,
|
|
109
|
+
topP: request.config?.topP,
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
debugLogger.log(`[Bedrock] Sending stream request:\n` +
|
|
113
|
+
` Model: ${this.model}\n` +
|
|
114
|
+
` Messages: ${messages.length}\n` +
|
|
115
|
+
` System: ${system ? 'yes' : 'no'}\n` +
|
|
116
|
+
` Tools: ${toolConfig?.tools?.length || 0}`);
|
|
117
|
+
const response = await this.client.send(command);
|
|
118
|
+
if (!response.stream) {
|
|
119
|
+
throw new Error('No stream in response');
|
|
120
|
+
}
|
|
121
|
+
return response.stream;
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
debugLogger.error(`[Bedrock] Stream error:`, error);
|
|
125
|
+
throw this.enhanceError(error);
|
|
126
|
+
}
|
|
127
|
+
}, {
|
|
128
|
+
maxAttempts: 3,
|
|
129
|
+
initialDelayMs: 1000,
|
|
130
|
+
maxDelayMs: 10000,
|
|
131
|
+
authType: 'bedrock',
|
|
132
|
+
});
|
|
133
|
+
return this.streamGenerator(stream, startTime);
|
|
134
|
+
}
|
|
135
|
+
async countTokens(request) {
|
|
136
|
+
// Handle both array and single content
|
|
137
|
+
const contents = Array.isArray(request.contents)
|
|
138
|
+
? request.contents
|
|
139
|
+
: [request.contents];
|
|
140
|
+
const textParts = [];
|
|
141
|
+
for (const c of contents) {
|
|
142
|
+
if (typeof c === 'string') {
|
|
143
|
+
textParts.push(c);
|
|
144
|
+
}
|
|
145
|
+
else if ('parts' in c && c.parts) {
|
|
146
|
+
for (const p of c.parts) {
|
|
147
|
+
if (typeof p === 'string') {
|
|
148
|
+
textParts.push(p);
|
|
149
|
+
}
|
|
150
|
+
else if ('text' in p && p.text) {
|
|
151
|
+
textParts.push(p.text);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
const text = textParts.join('');
|
|
157
|
+
const totalTokens = Math.ceil(text.length / 4);
|
|
158
|
+
return { totalTokens };
|
|
159
|
+
}
|
|
160
|
+
async embedContent(_request) {
|
|
161
|
+
throw new Error('Embedding is not supported for Claude models on Bedrock.');
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Generator function to process streaming response from Bedrock.
|
|
165
|
+
* Handles text chunks and accumulates tool calls until complete.
|
|
166
|
+
*/
|
|
167
|
+
async *streamGenerator(stream, startTime) {
|
|
168
|
+
// Reset accumulator for new stream
|
|
169
|
+
this.streamingToolUses.clear();
|
|
170
|
+
let currentBlockIndex = 0;
|
|
171
|
+
try {
|
|
172
|
+
for await (const event of stream) {
|
|
173
|
+
// 1. Handle tool use start
|
|
174
|
+
if (event.contentBlockStart) {
|
|
175
|
+
const start = event.contentBlockStart;
|
|
176
|
+
currentBlockIndex = start.contentBlockIndex ?? 0;
|
|
177
|
+
// Check if this is a tool use block
|
|
178
|
+
if (start.start && 'toolUse' in start.start) {
|
|
179
|
+
const toolUse = start.start.toolUse;
|
|
180
|
+
this.streamingToolUses.set(currentBlockIndex, {
|
|
181
|
+
toolUseId: toolUse?.toolUseId,
|
|
182
|
+
name: toolUse?.name,
|
|
183
|
+
input: '',
|
|
184
|
+
});
|
|
185
|
+
debugLogger.log(`[Bedrock] Tool use started: ${toolUse?.name} (index ${currentBlockIndex})`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// 2. Handle content block delta - accumulate JSON input or emit text
|
|
189
|
+
if (event.contentBlockDelta) {
|
|
190
|
+
const delta = event.contentBlockDelta;
|
|
191
|
+
const index = delta.contentBlockIndex ?? currentBlockIndex;
|
|
192
|
+
// Check delta type
|
|
193
|
+
if (delta.delta) {
|
|
194
|
+
// Accumulate tool input (JSON may be fragmented)
|
|
195
|
+
if ('toolUse' in delta.delta && delta.delta.toolUse) {
|
|
196
|
+
const accumulated = this.streamingToolUses.get(index);
|
|
197
|
+
if (accumulated && delta.delta.toolUse.input) {
|
|
198
|
+
accumulated.input += delta.delta.toolUse.input;
|
|
199
|
+
debugLogger.log(`[Bedrock] Tool input fragment (${accumulated.input.length} chars)`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// Emit text content immediately
|
|
203
|
+
if ('text' in delta.delta && delta.delta.text) {
|
|
204
|
+
const response = new GenerateContentResponse();
|
|
205
|
+
response.candidates = [
|
|
206
|
+
{
|
|
207
|
+
content: {
|
|
208
|
+
role: 'model',
|
|
209
|
+
parts: [{ text: delta.delta.text }],
|
|
210
|
+
},
|
|
211
|
+
finishReason: FinishReason.STOP,
|
|
212
|
+
safetyRatings: [],
|
|
213
|
+
},
|
|
214
|
+
];
|
|
215
|
+
yield response;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
// 3. Handle content block stop - emit complete tool call
|
|
220
|
+
if (event.contentBlockStop) {
|
|
221
|
+
const index = event.contentBlockStop?.contentBlockIndex ?? currentBlockIndex;
|
|
222
|
+
const accumulated = this.streamingToolUses.get(index);
|
|
223
|
+
if (accumulated?.toolUseId && accumulated.name) {
|
|
224
|
+
try {
|
|
225
|
+
// Parse complete JSON input
|
|
226
|
+
const args = JSON.parse(accumulated.input || '{}');
|
|
227
|
+
debugLogger.log(`[Bedrock] Tool use complete: ${accumulated.name}`, JSON.stringify(args, null, 2));
|
|
228
|
+
const response = new GenerateContentResponse();
|
|
229
|
+
response.candidates = [
|
|
230
|
+
{
|
|
231
|
+
content: {
|
|
232
|
+
role: 'model',
|
|
233
|
+
parts: [
|
|
234
|
+
{
|
|
235
|
+
functionCall: {
|
|
236
|
+
id: accumulated.toolUseId,
|
|
237
|
+
name: accumulated.name,
|
|
238
|
+
args,
|
|
239
|
+
},
|
|
240
|
+
},
|
|
241
|
+
],
|
|
242
|
+
},
|
|
243
|
+
finishReason: FinishReason.STOP,
|
|
244
|
+
safetyRatings: [],
|
|
245
|
+
},
|
|
246
|
+
];
|
|
247
|
+
yield response;
|
|
248
|
+
// Clear this tool call
|
|
249
|
+
this.streamingToolUses.delete(index);
|
|
250
|
+
}
|
|
251
|
+
catch (error) {
|
|
252
|
+
debugLogger.error(`[Bedrock] Failed to parse tool input for ${accumulated.name}:`, accumulated.input, error);
|
|
253
|
+
throw new Error(`Invalid JSON in tool call ${accumulated.name}: ${error instanceof Error ? error.message : String(error)}`);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
// 4. Handle stream metadata (usage information)
|
|
258
|
+
if (event.metadata) {
|
|
259
|
+
const usage = event.metadata.usage;
|
|
260
|
+
if (usage) {
|
|
261
|
+
const response = new GenerateContentResponse();
|
|
262
|
+
response.usageMetadata = {
|
|
263
|
+
promptTokenCount: usage.inputTokens || 0,
|
|
264
|
+
candidatesTokenCount: usage.outputTokens || 0,
|
|
265
|
+
totalTokenCount: usage.totalTokens || 0,
|
|
266
|
+
};
|
|
267
|
+
yield response;
|
|
268
|
+
const elapsedTime = Date.now() - startTime;
|
|
269
|
+
debugLogger.log(`[Bedrock] Stream complete (${elapsedTime}ms):\n` +
|
|
270
|
+
` Input Tokens: ${usage.inputTokens || 0}\n` +
|
|
271
|
+
` Output Tokens: ${usage.outputTokens || 0}`);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
// 5. Handle message stop (finish reason)
|
|
275
|
+
if (event.messageStop) {
|
|
276
|
+
debugLogger.log(`[Bedrock] Message stop: ${event.messageStop.stopReason}`);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
finally {
|
|
281
|
+
// Ensure cleanup
|
|
282
|
+
this.streamingToolUses.clear();
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Convert Gemini request to Bedrock Converse format.
|
|
287
|
+
*/
|
|
288
|
+
convertToBedrockMessages(request) {
|
|
289
|
+
const messages = [];
|
|
290
|
+
let system;
|
|
291
|
+
// Handle system instruction
|
|
292
|
+
if (request.config?.systemInstruction) {
|
|
293
|
+
const sysInstr = request.config.systemInstruction;
|
|
294
|
+
// Type guard: Only pass if it's string, Content, or Content[]
|
|
295
|
+
if (typeof sysInstr === 'string' || this.isContentOrArray(sysInstr)) {
|
|
296
|
+
system = this.convertSystemInstruction(sysInstr);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
// Handle contents
|
|
300
|
+
const contents = Array.isArray(request.contents)
|
|
301
|
+
? request.contents
|
|
302
|
+
: [request.contents];
|
|
303
|
+
for (const content of contents) {
|
|
304
|
+
if (typeof content === 'string') {
|
|
305
|
+
messages.push({
|
|
306
|
+
role: 'user',
|
|
307
|
+
content: [{ text: content }],
|
|
308
|
+
});
|
|
309
|
+
continue;
|
|
310
|
+
}
|
|
311
|
+
if (!('role' in content) || !('parts' in content)) {
|
|
312
|
+
continue;
|
|
313
|
+
}
|
|
314
|
+
// Separate different part types
|
|
315
|
+
const textParts = [];
|
|
316
|
+
const functionCalls = [];
|
|
317
|
+
const functionResponses = [];
|
|
318
|
+
for (const part of content.parts || []) {
|
|
319
|
+
if (typeof part === 'string') {
|
|
320
|
+
textParts.push(part);
|
|
321
|
+
}
|
|
322
|
+
else if ('text' in part && part.text) {
|
|
323
|
+
textParts.push(part.text);
|
|
324
|
+
}
|
|
325
|
+
else if ('functionCall' in part && part.functionCall) {
|
|
326
|
+
functionCalls.push({
|
|
327
|
+
id: part.functionCall.id,
|
|
328
|
+
name: part.functionCall.name || '',
|
|
329
|
+
args: part.functionCall.args || {},
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
else if ('functionResponse' in part && part.functionResponse) {
|
|
333
|
+
functionResponses.push({
|
|
334
|
+
id: part.functionResponse.id,
|
|
335
|
+
response: part.functionResponse.response,
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
const role = content.role === 'model' ? 'assistant' : 'user';
|
|
340
|
+
// Handle function responses (tool results)
|
|
341
|
+
if (functionResponses.length > 0) {
|
|
342
|
+
const toolResultBlocks = functionResponses.map((fr) => ({
|
|
343
|
+
toolResult: {
|
|
344
|
+
toolUseId: fr.id || '',
|
|
345
|
+
content: [
|
|
346
|
+
{
|
|
347
|
+
text: typeof fr.response === 'string'
|
|
348
|
+
? fr.response
|
|
349
|
+
: JSON.stringify(fr.response),
|
|
350
|
+
},
|
|
351
|
+
],
|
|
352
|
+
},
|
|
353
|
+
}));
|
|
354
|
+
if (textParts.length > 0) {
|
|
355
|
+
toolResultBlocks.unshift({ text: textParts.join('\n') });
|
|
356
|
+
}
|
|
357
|
+
messages.push({
|
|
358
|
+
role: 'user',
|
|
359
|
+
content: toolResultBlocks,
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
// Handle function calls (tool uses)
|
|
363
|
+
else if (functionCalls.length > 0) {
|
|
364
|
+
const contentBlocks = [];
|
|
365
|
+
if (textParts.length > 0) {
|
|
366
|
+
contentBlocks.push({ text: textParts.join('\n') });
|
|
367
|
+
}
|
|
368
|
+
for (const fc of functionCalls) {
|
|
369
|
+
contentBlocks.push({
|
|
370
|
+
toolUse: {
|
|
371
|
+
toolUseId: fc.id || `tool_${Date.now()}_${Math.random()}`,
|
|
372
|
+
name: fc.name,
|
|
373
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
374
|
+
input: fc.args, // Bedrock accepts any JSON-serializable value
|
|
375
|
+
},
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
messages.push({
|
|
379
|
+
role: 'assistant',
|
|
380
|
+
content: contentBlocks,
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
// Handle regular text messages
|
|
384
|
+
else if (textParts.length > 0) {
|
|
385
|
+
messages.push({
|
|
386
|
+
role,
|
|
387
|
+
content: [{ text: textParts.join('\n') }],
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
return { messages, system };
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* Type guard to check if value is Content or Content[]
|
|
395
|
+
*/
|
|
396
|
+
isContentOrArray(value) {
|
|
397
|
+
if (Array.isArray(value)) {
|
|
398
|
+
return value.every((item) => typeof item === 'object' && item !== null && 'parts' in item);
|
|
399
|
+
}
|
|
400
|
+
return typeof value === 'object' && value !== null && 'parts' in value;
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Convert system instruction to Bedrock format.
|
|
404
|
+
*/
|
|
405
|
+
convertSystemInstruction(systemInstruction) {
|
|
406
|
+
let systemText = '';
|
|
407
|
+
if (Array.isArray(systemInstruction)) {
|
|
408
|
+
systemText = systemInstruction
|
|
409
|
+
.map((content) => {
|
|
410
|
+
if (typeof content === 'string')
|
|
411
|
+
return content;
|
|
412
|
+
if ('parts' in content) {
|
|
413
|
+
return (content.parts || [])
|
|
414
|
+
.map((p) => typeof p === 'string' ? p : 'text' in p ? p.text : '')
|
|
415
|
+
.join('\n');
|
|
416
|
+
}
|
|
417
|
+
return '';
|
|
418
|
+
})
|
|
419
|
+
.join('\n');
|
|
420
|
+
}
|
|
421
|
+
else if (typeof systemInstruction === 'string') {
|
|
422
|
+
systemText = systemInstruction;
|
|
423
|
+
}
|
|
424
|
+
else if ('parts' in systemInstruction) {
|
|
425
|
+
systemText = (systemInstruction.parts || [])
|
|
426
|
+
.map((p) => typeof p === 'string' ? p : 'text' in p ? p.text : '')
|
|
427
|
+
.join('\n');
|
|
428
|
+
}
|
|
429
|
+
return systemText ? [{ text: systemText }] : [];
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* Convert Bedrock response to Gemini format.
|
|
433
|
+
*/
|
|
434
|
+
convertToGeminiFormat(bedrockResponse) {
|
|
435
|
+
const response = new GenerateContentResponse();
|
|
436
|
+
const parts = [];
|
|
437
|
+
let finishReason = FinishReason.STOP;
|
|
438
|
+
const contentBlocks = bedrockResponse.output?.message?.content || [];
|
|
439
|
+
for (const block of contentBlocks) {
|
|
440
|
+
if ('text' in block && block.text) {
|
|
441
|
+
parts.push({ text: block.text });
|
|
442
|
+
}
|
|
443
|
+
else if ('toolUse' in block && block.toolUse) {
|
|
444
|
+
const toolUse = block.toolUse;
|
|
445
|
+
parts.push({
|
|
446
|
+
functionCall: {
|
|
447
|
+
id: toolUse.toolUseId,
|
|
448
|
+
name: toolUse.name || '',
|
|
449
|
+
args: toolUse.input || {},
|
|
450
|
+
},
|
|
451
|
+
});
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
if (bedrockResponse.stopReason) {
|
|
455
|
+
finishReason = this.convertStopReason(bedrockResponse.stopReason);
|
|
456
|
+
}
|
|
457
|
+
// Set response properties
|
|
458
|
+
response.candidates = [
|
|
459
|
+
{
|
|
460
|
+
content: {
|
|
461
|
+
role: 'model',
|
|
462
|
+
parts,
|
|
463
|
+
},
|
|
464
|
+
finishReason,
|
|
465
|
+
safetyRatings: [],
|
|
466
|
+
},
|
|
467
|
+
];
|
|
468
|
+
response.usageMetadata = bedrockResponse.usage
|
|
469
|
+
? {
|
|
470
|
+
promptTokenCount: bedrockResponse.usage.inputTokens || 0,
|
|
471
|
+
candidatesTokenCount: bedrockResponse.usage.outputTokens || 0,
|
|
472
|
+
totalTokenCount: bedrockResponse.usage.totalTokens || 0,
|
|
473
|
+
}
|
|
474
|
+
: undefined;
|
|
475
|
+
return response;
|
|
476
|
+
}
|
|
477
|
+
/**
|
|
478
|
+
* Convert Bedrock StopReason to Gemini FinishReason.
|
|
479
|
+
*/
|
|
480
|
+
convertStopReason(stopReason) {
|
|
481
|
+
switch (stopReason) {
|
|
482
|
+
case 'end_turn':
|
|
483
|
+
return FinishReason.STOP;
|
|
484
|
+
case 'max_tokens':
|
|
485
|
+
return FinishReason.MAX_TOKENS;
|
|
486
|
+
case 'stop_sequence':
|
|
487
|
+
return FinishReason.STOP;
|
|
488
|
+
case 'tool_use':
|
|
489
|
+
return FinishReason.STOP;
|
|
490
|
+
case 'content_filtered':
|
|
491
|
+
return FinishReason.SAFETY;
|
|
492
|
+
default:
|
|
493
|
+
return FinishReason.STOP;
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
/**
|
|
497
|
+
* Convert Gemini Tools to Bedrock ToolConfiguration format.
|
|
498
|
+
*/
|
|
499
|
+
async convertToolsToBedrockFormat(geminiTools) {
|
|
500
|
+
const bedrockTools = [];
|
|
501
|
+
for (const tool of geminiTools) {
|
|
502
|
+
let actualTool;
|
|
503
|
+
// Handle CallableTool vs Tool
|
|
504
|
+
if ('tool' in tool) {
|
|
505
|
+
// This is a CallableTool - resolve it
|
|
506
|
+
actualTool = await tool.tool();
|
|
507
|
+
}
|
|
508
|
+
else {
|
|
509
|
+
// This is already a Tool
|
|
510
|
+
actualTool = tool;
|
|
511
|
+
}
|
|
512
|
+
// Convert each function declaration to Bedrock tool format
|
|
513
|
+
if (actualTool.functionDeclarations) {
|
|
514
|
+
for (const func of actualTool.functionDeclarations) {
|
|
515
|
+
if (func.name && func.description) {
|
|
516
|
+
bedrockTools.push({
|
|
517
|
+
toolSpec: {
|
|
518
|
+
name: func.name,
|
|
519
|
+
description: func.description,
|
|
520
|
+
inputSchema: {
|
|
521
|
+
json: this.sanitizeJsonSchema(func.parameters || {}),
|
|
522
|
+
},
|
|
523
|
+
},
|
|
524
|
+
});
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
debugLogger.log(`[Bedrock] Converted ${bedrockTools.length} tools for Bedrock`);
|
|
530
|
+
return {
|
|
531
|
+
tools: bedrockTools,
|
|
532
|
+
};
|
|
533
|
+
}
|
|
534
|
+
/**
|
|
535
|
+
* Sanitize JSON schema for Bedrock compatibility.
|
|
536
|
+
* Bedrock has stricter requirements than Gemini:
|
|
537
|
+
* - Root level must have type: "object"
|
|
538
|
+
* - No nullable types (type: ["string", "null"])
|
|
539
|
+
* - No additionalProperties
|
|
540
|
+
*/
|
|
541
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
542
|
+
sanitizeJsonSchema(schema) {
|
|
543
|
+
const sanitized = JSON.parse(JSON.stringify(schema));
|
|
544
|
+
// Ensure root level has type: "object" (Bedrock requirement)
|
|
545
|
+
if (!sanitized.type) {
|
|
546
|
+
sanitized.type = 'object';
|
|
547
|
+
}
|
|
548
|
+
else if (sanitized.type !== 'object') {
|
|
549
|
+
// If root type is not object, wrap the schema
|
|
550
|
+
debugLogger.warn(`[Bedrock] Schema root type is "${sanitized.type}", wrapping in object`);
|
|
551
|
+
return {
|
|
552
|
+
type: 'object',
|
|
553
|
+
properties: {
|
|
554
|
+
value: sanitized,
|
|
555
|
+
},
|
|
556
|
+
required: ['value'],
|
|
557
|
+
};
|
|
558
|
+
}
|
|
559
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
560
|
+
function traverse(obj) {
|
|
561
|
+
if (typeof obj !== 'object' || obj === null)
|
|
562
|
+
return;
|
|
563
|
+
// Convert type: ["string", "null"] to type: "string"
|
|
564
|
+
if (Array.isArray(obj.type)) {
|
|
565
|
+
obj.type = obj.type.find((t) => t !== 'null') || 'string';
|
|
566
|
+
}
|
|
567
|
+
// Remove additionalProperties
|
|
568
|
+
if ('additionalProperties' in obj) {
|
|
569
|
+
delete obj.additionalProperties;
|
|
570
|
+
}
|
|
571
|
+
// Recursively process nested objects
|
|
572
|
+
for (const key in obj) {
|
|
573
|
+
if (typeof obj[key] === 'object') {
|
|
574
|
+
traverse(obj[key]);
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
traverse(sanitized);
|
|
579
|
+
return sanitized;
|
|
580
|
+
}
|
|
581
|
+
/**
|
|
582
|
+
* Enhance error with user-friendly messages.
|
|
583
|
+
*/
|
|
584
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
585
|
+
enhanceError(error) {
|
|
586
|
+
const errorName = error.name || '';
|
|
587
|
+
const errorMessage = error.message || String(error);
|
|
588
|
+
// Permission errors
|
|
589
|
+
if (errorName === 'AccessDeniedException') {
|
|
590
|
+
return new Error('Insufficient IAM permissions for Bedrock.\n' +
|
|
591
|
+
'Required permissions:\n' +
|
|
592
|
+
' - bedrock:InvokeModel\n' +
|
|
593
|
+
' - bedrock:InvokeModelWithResponseStream\n\n' +
|
|
594
|
+
'See: https://docs.aws.amazon.com/bedrock/latest/userguide/security-iam.html');
|
|
595
|
+
}
|
|
596
|
+
// Model not found
|
|
597
|
+
if (errorName === 'ResourceNotFoundException' ||
|
|
598
|
+
errorName === 'ModelNotFoundException') {
|
|
599
|
+
return new Error(`Model ${this.model} not available in region ${this.region}.\n\n` +
|
|
600
|
+
`List available models:\n` +
|
|
601
|
+
` aws bedrock list-foundation-models --region ${this.region} --by-provider Anthropic\n\n` +
|
|
602
|
+
`Or use a different region:\n` +
|
|
603
|
+
` export AWS_REGION="us-east-1"\n` +
|
|
604
|
+
` npm run start`);
|
|
605
|
+
}
|
|
606
|
+
// Validation errors
|
|
607
|
+
if (errorName === 'ValidationException') {
|
|
608
|
+
return new Error(`Bedrock validation error: ${errorMessage}\n` +
|
|
609
|
+
'This usually indicates incompatible parameters or schema issues.');
|
|
610
|
+
}
|
|
611
|
+
// Throttling
|
|
612
|
+
if (errorName === 'ThrottlingException') {
|
|
613
|
+
return new Error('AWS Bedrock rate limit exceeded.\n' +
|
|
614
|
+
'Solutions:\n' +
|
|
615
|
+
' 1. Wait and retry\n' +
|
|
616
|
+
' 2. Request quota increase: https://console.aws.amazon.com/servicequotas/\n' +
|
|
617
|
+
' 3. Use a different region');
|
|
618
|
+
}
|
|
619
|
+
// Quota exceeded
|
|
620
|
+
if (errorName === 'ServiceQuotaExceededException') {
|
|
621
|
+
return new Error('AWS service quota exceeded.\n' +
|
|
622
|
+
`Request quota increase: https://console.aws.amazon.com/servicequotas/home/services/bedrock/quotas`);
|
|
623
|
+
}
|
|
624
|
+
// Return original error if not recognized
|
|
625
|
+
return error;
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
//# sourceMappingURL=bedrockContentGenerator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bedrockContentGenerator.js","sourceRoot":"","sources":["../../../src/core/bedrockContentGenerator.ts"],"names":[],"mappings":"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"}
|