@mappies/miniwat-provider-bedrock 0.8.0 → 0.10.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/dist/index.cjs +94 -30
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +94 -30
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -73,24 +73,40 @@ var BedrockAdapter = class {
|
|
|
73
73
|
}
|
|
74
74
|
};
|
|
75
75
|
}
|
|
76
|
-
static toBedrockMessages(history) {
|
|
76
|
+
static toBedrockMessages(history, flattenToolHistory = false) {
|
|
77
77
|
return history.filter(
|
|
78
78
|
(m) => (m.content ?? "").trim().length > 0 || (m.toolUse?.length ?? 0) > 0 || (m.toolResult?.length ?? 0) > 0
|
|
79
79
|
).map((m) => {
|
|
80
80
|
const role = m.type === import_miniwat_agent_core2.MessageType.User || m.type === import_miniwat_agent_core2.MessageType.ToolResult ? "user" : "assistant";
|
|
81
81
|
const content = [];
|
|
82
|
-
if (
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
toolResult
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
82
|
+
if (flattenToolHistory) {
|
|
83
|
+
if ((m.content ?? "").trim().length > 0) {
|
|
84
|
+
content.push({ text: m.content });
|
|
85
|
+
} else if (m.toolUse?.length) {
|
|
86
|
+
content.push({ text: "I used the available tools to gather information." });
|
|
87
|
+
}
|
|
88
|
+
if (m.toolResult?.length) {
|
|
89
|
+
content.push(...m.toolResult.map((r) => ({
|
|
90
|
+
text: [
|
|
91
|
+
r.status ? "Tool result:" : "Tool result (failed):",
|
|
92
|
+
this.toolResultToText(r.content)
|
|
93
|
+
].join("\n")
|
|
94
|
+
})));
|
|
95
|
+
}
|
|
96
|
+
} else {
|
|
97
|
+
if (m.toolUse?.length) {
|
|
98
|
+
content.push(...m.toolUse.map((t) => ({ toolUse: t })));
|
|
99
|
+
} else if ((m.content ?? "").trim().length > 0) {
|
|
100
|
+
content.push({ text: m.content });
|
|
101
|
+
}
|
|
102
|
+
if (m.toolResult?.length) {
|
|
103
|
+
content.push(...m.toolResult.map((r) => ({
|
|
104
|
+
toolResult: {
|
|
105
|
+
...r,
|
|
106
|
+
status: r.status ? "success" : "error"
|
|
107
|
+
}
|
|
108
|
+
})));
|
|
109
|
+
}
|
|
94
110
|
}
|
|
95
111
|
if (content.length === 0) {
|
|
96
112
|
content.push({ text: "" });
|
|
@@ -98,13 +114,29 @@ var BedrockAdapter = class {
|
|
|
98
114
|
return { role, content };
|
|
99
115
|
});
|
|
100
116
|
}
|
|
101
|
-
static
|
|
117
|
+
static toolResultToText(content) {
|
|
118
|
+
const maxLength = 12e3;
|
|
119
|
+
const text = !Array.isArray(content) ? typeof content === "string" ? content : JSON.stringify(content) ?? String(content) : content.map((item) => {
|
|
120
|
+
if (typeof item?.text === "string") {
|
|
121
|
+
return item.text;
|
|
122
|
+
}
|
|
123
|
+
if (item?.json !== void 0) {
|
|
124
|
+
return JSON.stringify(item.json);
|
|
125
|
+
}
|
|
126
|
+
return JSON.stringify(item);
|
|
127
|
+
}).filter(Boolean).join("\n");
|
|
128
|
+
return text.length > maxLength ? `${text.slice(0, maxLength)}
|
|
129
|
+
[Tool result truncated]` : text;
|
|
130
|
+
}
|
|
131
|
+
static toToolResultContent(result, status = true) {
|
|
132
|
+
const emptyResultText = status ? "The tool completed successfully but returned no results." : "The tool failed and returned no additional error details.";
|
|
102
133
|
try {
|
|
103
134
|
if (result instanceof Error) {
|
|
104
|
-
|
|
135
|
+
const message = result.message.trim();
|
|
136
|
+
return [{ text: message.length > 0 ? message : emptyResultText }];
|
|
105
137
|
}
|
|
106
|
-
if (result === null || result === void 0 || result === "") {
|
|
107
|
-
return [{ text:
|
|
138
|
+
if (result === null || result === void 0 || typeof result === "string" && result.trim().length === 0) {
|
|
139
|
+
return [{ text: emptyResultText }];
|
|
108
140
|
}
|
|
109
141
|
if (typeof result === "object") {
|
|
110
142
|
let json = JSON.parse(JSON.stringify(result));
|
|
@@ -177,18 +209,18 @@ var BedrockModel = class {
|
|
|
177
209
|
const resultPromise = this.toolDispatcher.execute(toolUse.name, toolUse.input);
|
|
178
210
|
if (opts?.onThinking && toolUse.name) {
|
|
179
211
|
const inputText = await this.toolDispatcher.getInputText(toolUse.name, toolUse.input);
|
|
180
|
-
if (inputText) opts.onThinking(inputText);
|
|
212
|
+
if (inputText && opts.onThinking) await opts.onThinking(inputText);
|
|
181
213
|
}
|
|
182
214
|
const result = await resultPromise;
|
|
183
215
|
results.push({
|
|
184
216
|
toolUseId: toolUse.toolUseId,
|
|
185
|
-
content: BedrockAdapter.toToolResultContent(result),
|
|
217
|
+
content: BedrockAdapter.toToolResultContent(result, true),
|
|
186
218
|
status: true
|
|
187
219
|
});
|
|
188
220
|
} catch (err) {
|
|
189
221
|
results.push({
|
|
190
222
|
toolUseId: toolUse.toolUseId,
|
|
191
|
-
content: BedrockAdapter.toToolResultContent(err),
|
|
223
|
+
content: BedrockAdapter.toToolResultContent(err, false),
|
|
192
224
|
status: false
|
|
193
225
|
});
|
|
194
226
|
}
|
|
@@ -198,21 +230,43 @@ var BedrockModel = class {
|
|
|
198
230
|
async runConversationLoop(messages, inference, options, instruction) {
|
|
199
231
|
let currentMessages = [...messages];
|
|
200
232
|
let iterations = 0;
|
|
233
|
+
const toolsEnabled = options?.toolsEnabled ?? true;
|
|
234
|
+
const maxToolCalls = toolsEnabled ? Math.max(0, options?.maxToolCalls ?? 3) : 0;
|
|
235
|
+
const maxIterations = 20;
|
|
236
|
+
let toolCalls = 0;
|
|
201
237
|
while (true) {
|
|
202
|
-
if (++iterations >
|
|
203
|
-
|
|
204
|
-
|
|
238
|
+
if (++iterations > maxIterations) {
|
|
239
|
+
throw new Error("Too many conversation iterations");
|
|
240
|
+
}
|
|
241
|
+
const remainingToolCalls = Math.max(0, maxToolCalls - toolCalls);
|
|
242
|
+
const canUseTools = toolsEnabled && remainingToolCalls > 0 && iterations < maxIterations;
|
|
243
|
+
const brMessages = BedrockAdapter.toBedrockMessages(currentMessages, !canUseTools);
|
|
244
|
+
let systemPrompt = await (0, import_miniwat_agent_core3.resolveInstructionValue)(instruction?.system?.value, void 0);
|
|
245
|
+
if (!canUseTools && toolCalls > 0) {
|
|
246
|
+
systemPrompt = [
|
|
247
|
+
systemPrompt,
|
|
248
|
+
[
|
|
249
|
+
"You have reached the tool-use limit.",
|
|
250
|
+
"Tool use is no longer available.",
|
|
251
|
+
"Do not output tool calls, function-call syntax, tool-call markup, or special tokens such as <|tool_calls_section_begin|>.",
|
|
252
|
+
"Do not request or suggest performing additional searches.",
|
|
253
|
+
"Do not say that you will search for more information.",
|
|
254
|
+
"Use only the information already available in the conversation and the tool results above.",
|
|
255
|
+
"Complete the CURRENT TASK using the available information."
|
|
256
|
+
].join(" ")
|
|
257
|
+
].filter(Boolean).join("\n\n");
|
|
258
|
+
}
|
|
205
259
|
const converseCommandInput = {
|
|
206
260
|
modelId: this.modelId,
|
|
207
261
|
messages: brMessages,
|
|
208
262
|
system: systemPrompt ? [{ text: systemPrompt }] : void 0,
|
|
209
263
|
inferenceConfig: {
|
|
210
|
-
temperature: inference?.temperature
|
|
264
|
+
temperature: inference?.temperature,
|
|
211
265
|
maxTokens: inference?.maxTokens,
|
|
212
266
|
topP: inference?.topP
|
|
213
267
|
}
|
|
214
268
|
};
|
|
215
|
-
|
|
269
|
+
const tools = canUseTools ? (await this.toolDispatcher.list()).map(BedrockAdapter.toBedrockTool) : [];
|
|
216
270
|
if (tools.length > 0) {
|
|
217
271
|
converseCommandInput.toolConfig = { tools };
|
|
218
272
|
}
|
|
@@ -253,7 +307,11 @@ var BedrockModel = class {
|
|
|
253
307
|
currentToolUse.inputBuffer += event.contentBlockDelta.delta.toolUse.input;
|
|
254
308
|
}
|
|
255
309
|
if (event.contentBlockStop && currentToolUse?.inputBuffer) {
|
|
256
|
-
|
|
310
|
+
try {
|
|
311
|
+
currentToolUse.input = JSON.parse(currentToolUse.inputBuffer);
|
|
312
|
+
} catch (error) {
|
|
313
|
+
throw new Error(`Invalid arguments for tool "${currentToolUse.name}": ${currentToolUse.inputBuffer}.`);
|
|
314
|
+
}
|
|
257
315
|
delete currentToolUse.inputBuffer;
|
|
258
316
|
currentToolUse = void 0;
|
|
259
317
|
}
|
|
@@ -264,7 +322,8 @@ var BedrockModel = class {
|
|
|
264
322
|
await options.onThinking?.(chunks.join(""));
|
|
265
323
|
chunks = [];
|
|
266
324
|
}
|
|
267
|
-
|
|
325
|
+
toolCalls += toolUses.length;
|
|
326
|
+
const toolUseMessage = BedrockMessage.toToolUseMessage(assistantText, toolUses);
|
|
268
327
|
currentMessages.push(toolUseMessage);
|
|
269
328
|
if (options?.onTooling) {
|
|
270
329
|
await options.onTooling(toolUseMessage);
|
|
@@ -306,7 +365,8 @@ var BedrockModel = class {
|
|
|
306
365
|
name: c.toolUse.name,
|
|
307
366
|
input: c.toolUse.input
|
|
308
367
|
}));
|
|
309
|
-
|
|
368
|
+
toolCalls += toolUses.length;
|
|
369
|
+
const toolUseMessage = BedrockMessage.toToolUseMessage(text, toolUses);
|
|
310
370
|
currentMessages.push(toolUseMessage);
|
|
311
371
|
if (options?.onTooling) {
|
|
312
372
|
await options.onTooling(toolUseMessage);
|
|
@@ -335,7 +395,9 @@ var BedrockModel = class {
|
|
|
335
395
|
{
|
|
336
396
|
streaming: false,
|
|
337
397
|
onThinking: option?.event?.onThinking,
|
|
338
|
-
onTooling: option?.event?.onTooling
|
|
398
|
+
onTooling: option?.event?.onTooling,
|
|
399
|
+
maxToolCalls: option?.maxToolCalls,
|
|
400
|
+
toolsEnabled: option?.toolsEnabled
|
|
339
401
|
},
|
|
340
402
|
option?.instruction
|
|
341
403
|
);
|
|
@@ -356,7 +418,9 @@ var BedrockModel = class {
|
|
|
356
418
|
streaming: true,
|
|
357
419
|
onChunk: (c) => out.write(c),
|
|
358
420
|
onThinking: option?.event?.onThinking,
|
|
359
|
-
onTooling: option?.event?.onTooling
|
|
421
|
+
onTooling: option?.event?.onTooling,
|
|
422
|
+
maxToolCalls: option?.maxToolCalls,
|
|
423
|
+
toolsEnabled: option?.toolsEnabled
|
|
360
424
|
},
|
|
361
425
|
option?.instruction
|
|
362
426
|
);
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/bedrockModel.ts","../src/bedrockMessage.ts","../src/bedrockAdapter.ts"],"sourcesContent":["export { BedrockModel } from './bedrockModel';","import { PassThrough, Readable } from \"stream\";\nimport { ResponseMessage, Message, InferenceOptions, ToolUse, ToolResult, Model, ModelOption, resolveInstructionValue, Instruction } from '@mappies/miniwat-agent-core'\nimport { McpConfig, ToolDispatcher } from '@mappies/miniwat-mcp-core'\nimport BedrockMessage from \"./bedrockMessage\";\nimport { BedrockRuntimeClient, ConverseCommand, ConverseStreamCommand, Message as BrMessage, StopReason, BedrockRuntimeClientConfig, ConverseStreamCommandInput } from \"@aws-sdk/client-bedrock-runtime\";\nimport { BedrockAdapter } from \"./bedrockAdapter\";\n\nexport class BedrockModel implements Model\n{\n private modelId: string;\n private toolDispatcher: ToolDispatcher;\n private client: BedrockRuntimeClient;\n\n constructor(options: { region?: string; modelId: string; mcpConfig?:McpConfig, clientConfig?: BedrockRuntimeClientConfig; })\n {\n this.toolDispatcher = new ToolDispatcher(options?.mcpConfig);\n this.modelId = options.modelId;\n\n this.client = new BedrockRuntimeClient({\n region: options?.region ?? process.env.DEFAULT_AWS_REGION ?? process.env.AWS_REGION,\n ...options?.clientConfig\n });\n }\n\n private async streamBufferedText(chunks: string[], write: (chunk: string) => void)\n {\n for(const chunk of chunks)\n {\n write(chunk);\n await new Promise(r => setTimeout(r, 8 + Math.random() * 12));\n }\n }\n\n private extractAssistantText(res: any, messages: BrMessage[]): string\n {\n const content = res?.output?.message?.content ?? [];\n let text = content.map((c: any) => c.text ?? \"\").join(\"\");\n\n if(!text)\n {\n text = BedrockAdapter.getResponseFromStopReasonWhenResponseIsEmpty(res.stopReason);\n }\n\n return text;\n }\n\n private async executeTools(toolUses: ToolUse[], opts?: any): Promise<ToolResult[]>\n {\n const results: ToolResult[] = [];\n\n for(const toolUse of toolUses)\n {\n try\n {\n const resultPromise = this.toolDispatcher.execute(toolUse.name, toolUse.input);\n\n // Show a thinking message for the tool\n if (opts?.onThinking && toolUse.name)\n {\n const inputText = await this.toolDispatcher.getInputText(toolUse.name, toolUse.input);\n if(inputText) opts.onThinking(inputText);\n }\n\n const result = await resultPromise;\n\n results.push({\n toolUseId: toolUse.toolUseId,\n content: BedrockAdapter.toToolResultContent(result),\n status: true\n });\n }\n catch(err: any)\n {\n results.push({\n toolUseId: toolUse.toolUseId,\n content: BedrockAdapter.toToolResultContent(err),\n status: false\n });\n }\n }\n\n return results;\n }\n\n private async runConversationLoop(messages: Message[], \n inference?: InferenceOptions, \n options?: { streaming?: boolean; \n onChunk?: (chunk: string) => void, \n onThinking?: (msg: string) => Promise<void>,\n onTooling?: (msg: Message) => Promise<void>\n },\n instruction?: Instruction): Promise<{ message: Message; stopReason?: StopReason; usage?: any }>\n {\n let currentMessages = [...messages];\n let iterations = 0;\n\n while(true)\n {\n if (++iterations > 20) throw new Error(\"Too many tool iterations\");\n\n const brMessages = BedrockAdapter.toBedrockMessages(currentMessages);\n\n const systemPrompt = await resolveInstructionValue(instruction?.system?.value, undefined);\n\n const converseCommandInput:ConverseStreamCommandInput = {\n modelId: this.modelId,\n messages: brMessages,\n system: systemPrompt ? [{ text: systemPrompt }] : undefined,\n inferenceConfig: {\n temperature: inference?.temperature ?? 0.2,\n maxTokens: inference?.maxTokens,\n topP: inference?.topP\n }\n }\n\n let tools = (await this.toolDispatcher.list()).map(BedrockAdapter.toBedrockTool);\n\n if(tools.length > 0)\n {\n converseCommandInput.toolConfig = { tools }\n }\n\n if (options?.streaming)\n {\n const res = await this.client.send(new ConverseStreamCommand(converseCommandInput));\n\n let chunks: string[] = [];\n let streamingStarted = false;\n let toolUses: ToolUse[] = [];\n let currentToolUse: ToolUse | undefined;\n let assistantText = '';\n\n for await (const event of res.stream ?? [])\n {\n\n if (event.modelStreamErrorException)\n {\n throw new Error(event.modelStreamErrorException?.message ?? \"Model stream error\");\n }\n\n if (event.contentBlockDelta?.delta?.text)\n {\n const chunk = event.contentBlockDelta.delta.text;\n assistantText += chunk;\n\n if (!streamingStarted)\n {\n chunks.push(chunk);\n\n if (chunks.length > 20)\n {\n streamingStarted = true;\n await this.streamBufferedText(chunks, options.onChunk!);\n chunks = [];\n }\n }\n else\n {\n options.onChunk?.(chunk);\n }\n }\n\n if (event.contentBlockStart?.start?.toolUse)\n {\n currentToolUse = {\n toolUseId: event.contentBlockStart.start.toolUse.toolUseId as string,\n name: event.contentBlockStart.start.toolUse.name as string,\n inputBuffer: \"\"\n };\n toolUses.push(currentToolUse);\n }\n\n if (currentToolUse && event.contentBlockDelta?.delta?.toolUse?.input)\n {\n currentToolUse.inputBuffer += event.contentBlockDelta.delta.toolUse.input;\n }\n\n if (event.contentBlockStop && currentToolUse?.inputBuffer)\n {\n currentToolUse.input = JSON.parse(currentToolUse.inputBuffer);\n delete currentToolUse.inputBuffer;\n currentToolUse = undefined;\n }\n\n if (event.messageStop)\n {\n const reason = event.messageStop.stopReason;\n\n if (reason === \"tool_use\")\n {\n\n if (!streamingStarted && chunks.length > 0)\n {\n await options.onThinking?.(chunks.join(\"\"));\n chunks = [];\n }\n\n const toolUseMessage = BedrockMessage.toToolUseMessage('', toolUses);\n currentMessages.push(toolUseMessage);\n if(options?.onTooling) { await options.onTooling(toolUseMessage)}\n\n const toolResults = await this.executeTools(toolUses, options);\n\n const toolResultMessage = BedrockMessage.toToolResultMessage(toolResults);\n currentMessages.push(toolResultMessage);\n if(options?.onTooling) { await options.onTooling(toolResultMessage)}\n\n break;\n }\n\n if (typeof reason === \"string\")\n {\n if (/content|filter|guardrail/i.test(reason))\n {\n throw new Error(\"Output blocked by content filtering policy: \" + reason);\n }\n else if (reason === \"max_tokens\")\n {\n options.onChunk?.(BedrockAdapter.getResponseFromStopReasonWhenResponseIsEmpty(reason));\n }\n else if (!streamingStarted)\n {\n if (chunks.length > 0)\n {\n await this.streamBufferedText(chunks, options.onChunk!);\n } else\n {\n options.onChunk?.(BedrockAdapter.getResponseFromStopReasonWhenResponseIsEmpty(reason));\n }\n }\n }\n\n return {\n message: BedrockMessage.toAssistantMessage(assistantText),\n stopReason: reason\n };\n }\n }\n }\n else\n {\n const res = await this.client.send(new ConverseCommand(converseCommandInput));\n const text = this.extractAssistantText(res, brMessages);\n\n const content = res?.output?.message?.content ?? [];\n\n if (res.stopReason === \"tool_use\")\n {\n const toolUses = content.filter((c: any) => c.toolUse)\n .map((c: any) => ({\n toolUseId: c.toolUse.toolUseId,\n name: c.toolUse.name,\n input: c.toolUse.input\n }));\n\n const toolUseMessage = BedrockMessage.toToolUseMessage('', toolUses);\n currentMessages.push(toolUseMessage);\n if(options?.onTooling) { await options.onTooling(toolUseMessage)}\n\n const toolResults = await this.executeTools(toolUses, options);\n\n const toolResultMessage = BedrockMessage.toToolResultMessage(toolResults);\n currentMessages.push(toolResultMessage);\n if(options?.onTooling) { await options.onTooling(toolResultMessage)}\n\n continue;\n }\n\n const msg = BedrockMessage.toAssistantMessage(text);\n\n return {\n message: msg,\n stopReason: res.stopReason,\n usage: res.usage\n };\n }\n }\n }\n\n async invoke(messages: Message[], option?: ModelOption): Promise<ResponseMessage>\n {\n const response = await this.runConversationLoop(messages, option?.inference, {\n streaming: false,\n onThinking: option?.event?.onThinking,\n onTooling: option?.event?.onTooling\n },\n option?.instruction);\n\n return new ResponseMessage({\n stopReason: response.stopReason as StopReason,\n tokenUsage: response.usage,\n message: response.message\n });\n }\n\n async stream(messages: Message[], option?: ModelOption): Promise<Readable>\n {\n const out = new PassThrough({ encoding: \"utf8\" });\n\n (async () =>\n {\n try\n {\n await this.runConversationLoop(messages, option?.inference, {\n streaming: true,\n onChunk: c => out.write(c),\n onThinking: option?.event?.onThinking,\n onTooling: option?.event?.onTooling\n },\n option?.instruction);\n\n out.write('');\n out.end();\n }\n catch (e)\n {\n out.emit(\"throw\", e);\n out.write('');\n out.end();\n }\n })();\n\n return out;\n }\n}","import { MessageType, Message, ToolUse, ToolResult } from '@mappies/miniwat-agent-core'\n\nexport default class BedrockMessage extends Message\n{\n constructor(data:Partial<Message>)\n {\n super(data)\n }\n \n public static toAssistantMessage(text: string): Message\n {\n return new Message({\n type: MessageType.Agent,\n content: text,\n createdTimestamp: new Date().toISOString(),\n });\n }\n \n public static toToolUseMessage(text:string, toolUses: ToolUse[]): Message\n {\n return new Message({\n type: MessageType.Agent,\n content: text,\n createdTimestamp: new Date().toISOString(),\n toolUse: toolUses.map(({ toolUseId, name, input }) => (<ToolUse>{ toolUseId, name, input })),\n });\n }\n \n public static toToolResultMessage(toolResult: ToolResult[]): Message\n {\n return new Message({\n type: MessageType.ToolResult,\n toolResult\n });\n }\n}","import { MessageType, Message, Tool } from '@mappies/miniwat-agent-core'\nimport { Message as BrMessage, StopReason, Tool as BedrockTool } from \"@aws-sdk/client-bedrock-runtime\";\n\nexport class BedrockAdapter\n{\n static toBedrockTool(tool: Tool): BedrockTool\n {\n return {\n toolSpec: {\n name: tool.name,\n description: tool.description,\n inputSchema: { json: tool.schema } as any\n }\n };\n }\n \n static toBedrockMessages(history: Message[]): BrMessage[]\n {\n return history\n .filter(m =>\n (m.content ?? \"\").trim().length > 0 ||\n (m.toolUse?.length ?? 0) > 0 ||\n (m.toolResult?.length ?? 0) > 0\n )\n .map(m =>\n {\n const role = m.type === MessageType.User || m.type === MessageType.ToolResult\n ? \"user\"\n : \"assistant\";\n\n const content: any[] = [];\n\n if (m.toolUse?.length)\n {\n content.push(...m.toolUse.map(t => ({ toolUse: t })));\n }\n else if ((m.content ?? \"\").trim().length > 0)\n {\n content.push({ text: m.content });\n }\n\n if (m.toolResult?.length)\n {\n content.push(...m.toolResult.map(r => ({\n toolResult: {\n ...r,\n status: r.status ? \"success\" : \"error\"\n }\n })));\n }\n\n if (content.length === 0)\n {\n content.push({ text: \"\" });\n }\n\n return { role, content };\n });\n }\n\n static toToolResultContent(result: unknown): { text?: string; json?: object }[] \n {\n try \n {\n if(result instanceof Error)\n {\n return [{ text: result.message }];\n }\n\n if(result === null || result === undefined || result === '')\n {\n return [{ text: '' }];\n }\n\n if(typeof result === \"object\") \n {\n let json = JSON.parse(JSON.stringify(result));\n\n if(Array.isArray(json))\n {\n json = { result: json };\n }\n\n return [{ json }];\n }\n\n return [{ text: String(result) }];\n }\n catch (e: unknown) \n {\n const message = e instanceof Error ? e.message : String(e);\n\n return [{\n json: {\n error: \"Failed to serialize tool result\",\n message\n }\n }];\n }\n }\n\n static getResponseFromStopReasonWhenResponseIsEmpty(stopReason: StopReason): string\n {\n switch (stopReason)\n {\n case \"max_tokens\":\n return \"My response was cut off due to length limits. Would you like me to continue or summarize the remaining information?\";\n case \"stop_sequence\":\n return \"I've reached a natural stopping point in my response. Please let me know if you need additional information.\";\n case \"guardrail_intervened\":\n return \"I'm unable to provide a response to this request as it doesn't align with my usage guidelines. Please rephrase your question or ask something else.\";\n case \"content_filtered\":\n return \"I cannot generate a response for this request due to content policy restrictions. Please try rephrasing your question.\";\n case \"model_context_window_exceeded\":\n return \"The conversation or request is too long for me to process. Please try with a shorter input or start a new conversation.\";\n case \"end_turn\":\n return \"What can I help with?\";\n case \"tool_use\":\n return \"\";\n default:\n return \"I couldn't complete the response. Please try again.\";\n }\n }\n}"],"mappings":"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","names":["import_miniwat_agent_core","import_miniwat_agent_core"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/bedrockModel.ts","../src/bedrockMessage.ts","../src/bedrockAdapter.ts"],"sourcesContent":["export { BedrockModel } from './bedrockModel';","import { PassThrough, Readable } from \"stream\";\nimport { ResponseMessage, Message, InferenceOptions, ToolUse, ToolResult, Model, ModelOption, resolveInstructionValue, Instruction } from '@mappies/miniwat-agent-core'\nimport { McpConfig, ToolDispatcher } from '@mappies/miniwat-mcp-core'\nimport BedrockMessage from \"./bedrockMessage\";\nimport { BedrockRuntimeClient, ConverseCommand, ConverseStreamCommand, Message as BrMessage, StopReason, BedrockRuntimeClientConfig, ConverseStreamCommandInput } from \"@aws-sdk/client-bedrock-runtime\";\nimport { BedrockAdapter } from \"./bedrockAdapter\";\n\nexport class BedrockModel implements Model\n{\n private modelId: string;\n private toolDispatcher: ToolDispatcher;\n private client: BedrockRuntimeClient;\n\n constructor(options: { region?: string; modelId: string; mcpConfig?:McpConfig, clientConfig?: BedrockRuntimeClientConfig; })\n {\n this.toolDispatcher = new ToolDispatcher(options?.mcpConfig);\n this.modelId = options.modelId;\n\n this.client = new BedrockRuntimeClient({\n region: options?.region ?? process.env.DEFAULT_AWS_REGION ?? process.env.AWS_REGION,\n ...options?.clientConfig\n });\n }\n\n private async streamBufferedText(chunks: string[], write: (chunk: string) => void)\n {\n for(const chunk of chunks)\n {\n write(chunk);\n await new Promise(r => setTimeout(r, 8 + Math.random() * 12));\n }\n }\n\n private extractAssistantText(res: any, messages: BrMessage[]): string\n {\n const content = res?.output?.message?.content ?? [];\n let text = content.map((c: any) => c.text ?? \"\").join(\"\");\n\n if(!text)\n {\n text = BedrockAdapter.getResponseFromStopReasonWhenResponseIsEmpty(res.stopReason);\n }\n\n return text;\n }\n\n private async executeTools(toolUses: ToolUse[], opts?: any): Promise<ToolResult[]>\n {\n const results: ToolResult[] = [];\n\n for(const toolUse of toolUses)\n {\n try\n {\n const resultPromise = this.toolDispatcher.execute(toolUse.name, toolUse.input);\n\n // Show a thinking message for the tool\n if (opts?.onThinking && toolUse.name)\n {\n const inputText = await this.toolDispatcher.getInputText(toolUse.name, toolUse.input);\n if(inputText && opts.onThinking) await opts.onThinking(inputText);\n }\n\n const result = await resultPromise;\n\n results.push({\n toolUseId: toolUse.toolUseId,\n content: BedrockAdapter.toToolResultContent(result, true),\n status: true\n });\n }\n catch(err: any)\n {\n results.push({\n toolUseId: toolUse.toolUseId,\n content: BedrockAdapter.toToolResultContent(err, false),\n status: false\n });\n }\n }\n\n return results;\n }\n\n private async runConversationLoop(messages: Message[],\n inference?: InferenceOptions,\n options?: { streaming?: boolean;\n onChunk?: (chunk: string) => void,\n onThinking?: (msg: string) => Promise<void>,\n onTooling?: (msg: Message) => Promise<void>,\n maxToolCalls?: number,\n toolsEnabled?: boolean\n },\n instruction?: Instruction): Promise<{ message: Message; stopReason?: StopReason; usage?: any }>\n {\n let currentMessages = [...messages];\n let iterations = 0;\n\n const toolsEnabled = options?.toolsEnabled ?? true;\n const maxToolCalls = toolsEnabled ? Math.max(0, options?.maxToolCalls ?? 3) : 0;\n const maxIterations = 20;\n let toolCalls = 0;\n\n while(true)\n {\n if (++iterations > maxIterations)\n {\n throw new Error(\"Too many conversation iterations\");\n }\n\n const remainingToolCalls = Math.max(0, maxToolCalls - toolCalls);\n const canUseTools = toolsEnabled && remainingToolCalls > 0 && iterations < maxIterations;\n\n const brMessages = BedrockAdapter.toBedrockMessages(currentMessages, !canUseTools);\n\n let systemPrompt = await resolveInstructionValue(instruction?.system?.value, undefined);\n\n if (!canUseTools && toolCalls > 0)\n {\n systemPrompt = [\n systemPrompt,\n [\n \"You have reached the tool-use limit.\",\n \"Tool use is no longer available.\",\n \"Do not output tool calls, function-call syntax, tool-call markup, or special tokens such as <|tool_calls_section_begin|>.\",\n \"Do not request or suggest performing additional searches.\",\n \"Do not say that you will search for more information.\",\n \"Use only the information already available in the conversation and the tool results above.\",\n \"Complete the CURRENT TASK using the available information.\"\n ].join(\" \")\n ]\n .filter(Boolean)\n .join(\"\\n\\n\");\n }\n\n const converseCommandInput:ConverseStreamCommandInput = {\n modelId: this.modelId,\n messages: brMessages,\n system: systemPrompt ? [{ text: systemPrompt }] : undefined,\n inferenceConfig: {\n temperature: inference?.temperature,\n maxTokens: inference?.maxTokens,\n topP: inference?.topP\n }\n }\n\n const tools = canUseTools\n ? (await this.toolDispatcher.list()).map(BedrockAdapter.toBedrockTool)\n : [];\n\n if(tools.length > 0)\n {\n converseCommandInput.toolConfig = { tools }\n }\n\n if (options?.streaming)\n {\n const res = await this.client.send(new ConverseStreamCommand(converseCommandInput));\n\n let chunks: string[] = [];\n let streamingStarted = false;\n let toolUses: ToolUse[] = [];\n let currentToolUse: ToolUse | undefined;\n let assistantText = '';\n\n for await (const event of res.stream ?? [])\n {\n\n if (event.modelStreamErrorException)\n {\n throw new Error(event.modelStreamErrorException?.message ?? \"Model stream error\");\n }\n\n if (event.contentBlockDelta?.delta?.text)\n {\n const chunk = event.contentBlockDelta.delta.text;\n assistantText += chunk;\n\n if (!streamingStarted)\n {\n chunks.push(chunk);\n\n if (chunks.length > 20)\n {\n streamingStarted = true;\n await this.streamBufferedText(chunks, options.onChunk!);\n chunks = [];\n }\n }\n else\n {\n options.onChunk?.(chunk);\n }\n }\n\n if (event.contentBlockStart?.start?.toolUse)\n {\n currentToolUse = {\n toolUseId: event.contentBlockStart.start.toolUse.toolUseId as string,\n name: event.contentBlockStart.start.toolUse.name as string,\n inputBuffer: \"\"\n };\n toolUses.push(currentToolUse);\n }\n\n if (currentToolUse && event.contentBlockDelta?.delta?.toolUse?.input)\n {\n currentToolUse.inputBuffer += event.contentBlockDelta.delta.toolUse.input;\n }\n\n if (event.contentBlockStop && currentToolUse?.inputBuffer)\n {\n try\n {\n currentToolUse.input = JSON.parse(currentToolUse.inputBuffer);\n }\n catch (error)\n {\n throw new Error(`Invalid arguments for tool \"${currentToolUse.name}\": ${currentToolUse.inputBuffer}.`);\n }\n\n delete currentToolUse.inputBuffer;\n currentToolUse = undefined;\n }\n\n if (event.messageStop)\n {\n const reason = event.messageStop.stopReason;\n\n if (reason === \"tool_use\")\n {\n\n if (!streamingStarted && chunks.length > 0)\n {\n await options.onThinking?.(chunks.join(\"\"));\n chunks = [];\n }\n\n toolCalls += toolUses.length;\n\n const toolUseMessage = BedrockMessage.toToolUseMessage(assistantText, toolUses);\n currentMessages.push(toolUseMessage);\n if(options?.onTooling) { await options.onTooling(toolUseMessage)}\n\n const toolResults = await this.executeTools(toolUses, options);\n\n const toolResultMessage = BedrockMessage.toToolResultMessage(toolResults);\n currentMessages.push(toolResultMessage);\n if(options?.onTooling) { await options.onTooling(toolResultMessage)}\n\n break;\n }\n\n if (typeof reason === \"string\")\n {\n if (/content|filter|guardrail/i.test(reason))\n {\n throw new Error(\"Output blocked by content filtering policy: \" + reason);\n }\n else if (reason === \"max_tokens\")\n {\n options.onChunk?.(BedrockAdapter.getResponseFromStopReasonWhenResponseIsEmpty(reason));\n }\n else if (!streamingStarted)\n {\n if (chunks.length > 0)\n {\n await this.streamBufferedText(chunks, options.onChunk!);\n } else\n {\n options.onChunk?.(BedrockAdapter.getResponseFromStopReasonWhenResponseIsEmpty(reason));\n }\n }\n }\n\n return {\n message: BedrockMessage.toAssistantMessage(assistantText),\n stopReason: reason\n };\n }\n }\n }\n else\n {\n const res = await this.client.send(new ConverseCommand(converseCommandInput));\n const text = this.extractAssistantText(res, brMessages);\n\n const content = res?.output?.message?.content ?? [];\n\n if (res.stopReason === \"tool_use\")\n {\n const toolUses = content.filter((c: any) => c.toolUse)\n .map((c: any) => ({\n toolUseId: c.toolUse.toolUseId,\n name: c.toolUse.name,\n input: c.toolUse.input\n }));\n\n toolCalls += toolUses.length;\n\n const toolUseMessage = BedrockMessage.toToolUseMessage(text, toolUses);\n currentMessages.push(toolUseMessage);\n if(options?.onTooling) { await options.onTooling(toolUseMessage)}\n\n const toolResults = await this.executeTools(toolUses, options);\n\n const toolResultMessage = BedrockMessage.toToolResultMessage(toolResults);\n currentMessages.push(toolResultMessage);\n if(options?.onTooling) { await options.onTooling(toolResultMessage)}\n\n continue;\n }\n\n const msg = BedrockMessage.toAssistantMessage(text);\n\n return {\n message: msg,\n stopReason: res.stopReason,\n usage: res.usage\n };\n }\n }\n }\n\n async invoke(messages: Message[], option?: ModelOption): Promise<ResponseMessage>\n {\n const response = await this.runConversationLoop(messages, option?.inference, {\n streaming: false,\n onThinking: option?.event?.onThinking,\n onTooling: option?.event?.onTooling,\n maxToolCalls: option?.maxToolCalls,\n toolsEnabled: option?.toolsEnabled\n },\n option?.instruction);\n\n return new ResponseMessage({\n stopReason: response.stopReason as StopReason,\n tokenUsage: response.usage,\n message: response.message\n });\n }\n\n async stream(messages: Message[], option?: ModelOption): Promise<Readable>\n {\n const out = new PassThrough({ encoding: \"utf8\" });\n\n (async () =>\n {\n try\n {\n await this.runConversationLoop(messages, option?.inference, {\n streaming: true,\n onChunk: c => out.write(c),\n onThinking: option?.event?.onThinking,\n onTooling: option?.event?.onTooling,\n maxToolCalls: option?.maxToolCalls,\n toolsEnabled: option?.toolsEnabled\n },\n option?.instruction);\n\n out.write('');\n out.end();\n }\n catch (e)\n {\n out.emit(\"throw\", e);\n out.write('');\n out.end();\n }\n })();\n\n return out;\n }\n}","import { MessageType, Message, ToolUse, ToolResult } from '@mappies/miniwat-agent-core'\n\nexport default class BedrockMessage extends Message\n{\n constructor(data:Partial<Message>)\n {\n super(data)\n }\n \n public static toAssistantMessage(text: string): Message\n {\n return new Message({\n type: MessageType.Agent,\n content: text,\n createdTimestamp: new Date().toISOString(),\n });\n }\n \n public static toToolUseMessage(text:string, toolUses: ToolUse[]): Message\n {\n return new Message({\n type: MessageType.Agent,\n content: text,\n createdTimestamp: new Date().toISOString(),\n toolUse: toolUses.map(({ toolUseId, name, input }) => (<ToolUse>{ toolUseId, name, input })),\n });\n }\n \n public static toToolResultMessage(toolResult: ToolResult[]): Message\n {\n return new Message({\n type: MessageType.ToolResult,\n toolResult\n });\n }\n}","import { MessageType, Message, Tool } from '@mappies/miniwat-agent-core'\nimport { Message as BrMessage, StopReason, Tool as BedrockTool } from \"@aws-sdk/client-bedrock-runtime\";\n\nexport class BedrockAdapter\n{\n static toBedrockTool(tool: Tool): BedrockTool\n {\n return {\n toolSpec: {\n name: tool.name,\n description: tool.description,\n inputSchema: { json: tool.schema } as any\n }\n };\n }\n\n static toBedrockMessages(history: Message[], flattenToolHistory = false): BrMessage[]\n {\n return history\n .filter(m =>\n (m.content ?? \"\").trim().length > 0 ||\n (m.toolUse?.length ?? 0) > 0 ||\n (m.toolResult?.length ?? 0) > 0\n )\n .map(m =>\n {\n const role = m.type === MessageType.User || m.type === MessageType.ToolResult\n ? \"user\"\n : \"assistant\";\n\n const content: any[] = [];\n\n if (flattenToolHistory)\n {\n if ((m.content ?? \"\").trim().length > 0)\n {\n content.push({ text: m.content });\n }\n else if (m.toolUse?.length)\n {\n content.push({ text: \"I used the available tools to gather information.\" });\n }\n\n if (m.toolResult?.length)\n {\n content.push(...m.toolResult.map(r => ({\n text: [\n r.status ? \"Tool result:\" : \"Tool result (failed):\",\n this.toolResultToText(r.content)\n ].join(\"\\n\")\n })));\n }\n }\n else\n {\n if (m.toolUse?.length)\n {\n content.push(...m.toolUse.map(t => ({ toolUse: t })));\n }\n else if ((m.content ?? \"\").trim().length > 0)\n {\n content.push({ text: m.content });\n }\n\n if (m.toolResult?.length)\n {\n content.push(...m.toolResult.map(r => ({\n toolResult: {\n ...r,\n status: r.status ? \"success\" : \"error\"\n }\n })));\n }\n }\n\n if (content.length === 0)\n {\n content.push({ text: \"\" });\n }\n\n return { role, content };\n });\n }\n\n private static toolResultToText(content: unknown): string\n {\n const maxLength = 12000;\n\n const text = !Array.isArray(content)\n ? (typeof content === \"string\" ? content : (JSON.stringify(content) ?? String(content)))\n : content\n .map((item: any) =>\n {\n if (typeof item?.text === \"string\")\n {\n return item.text;\n }\n\n if (item?.json !== undefined)\n {\n return JSON.stringify(item.json);\n }\n\n return JSON.stringify(item);\n })\n .filter(Boolean)\n .join(\"\\n\");\n\n return text.length > maxLength\n ? `${text.slice(0, maxLength)}\\n[Tool result truncated]`\n : text;\n }\n\n static toToolResultContent(result: unknown, status = true): { text?: string; json?: object }[]\n {\n const emptyResultText = status\n ? \"The tool completed successfully but returned no results.\"\n : \"The tool failed and returned no additional error details.\";\n\n try\n {\n if(result instanceof Error)\n {\n const message = result.message.trim();\n return [{ text: message.length > 0 ? message : emptyResultText }];\n }\n\n if(result === null || result === undefined || (typeof result === \"string\" && result.trim().length === 0))\n {\n return [{ text: emptyResultText }];\n }\n\n if(typeof result === \"object\")\n {\n let json = JSON.parse(JSON.stringify(result));\n\n if(Array.isArray(json))\n {\n json = { result: json };\n }\n\n return [{ json }];\n }\n\n return [{ text: String(result) }];\n }\n catch (e: unknown)\n {\n const message = e instanceof Error ? e.message : String(e);\n\n return [{\n json: {\n error: \"Failed to serialize tool result\",\n message\n }\n }];\n }\n }\n\n static getResponseFromStopReasonWhenResponseIsEmpty(stopReason: StopReason): string\n {\n switch (stopReason)\n {\n case \"max_tokens\":\n return \"My response was cut off due to length limits. Would you like me to continue or summarize the remaining information?\";\n case \"stop_sequence\":\n return \"I've reached a natural stopping point in my response. Please let me know if you need additional information.\";\n case \"guardrail_intervened\":\n return \"I'm unable to provide a response to this request as it doesn't align with my usage guidelines. Please rephrase your question or ask something else.\";\n case \"content_filtered\":\n return \"I cannot generate a response for this request due to content policy restrictions. Please try rephrasing your question.\";\n case \"model_context_window_exceeded\":\n return \"The conversation or request is too long for me to process. Please try with a shorter input or start a new conversation.\";\n case \"end_turn\":\n return \"What can I help with?\";\n case \"tool_use\":\n return \"\";\n default:\n return \"I couldn't complete the response. Please try again.\";\n }\n }\n}"],"mappings":"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","names":["import_miniwat_agent_core","import_miniwat_agent_core"]}
|
package/dist/index.js
CHANGED
|
@@ -47,24 +47,40 @@ var BedrockAdapter = class {
|
|
|
47
47
|
}
|
|
48
48
|
};
|
|
49
49
|
}
|
|
50
|
-
static toBedrockMessages(history) {
|
|
50
|
+
static toBedrockMessages(history, flattenToolHistory = false) {
|
|
51
51
|
return history.filter(
|
|
52
52
|
(m) => (m.content ?? "").trim().length > 0 || (m.toolUse?.length ?? 0) > 0 || (m.toolResult?.length ?? 0) > 0
|
|
53
53
|
).map((m) => {
|
|
54
54
|
const role = m.type === MessageType2.User || m.type === MessageType2.ToolResult ? "user" : "assistant";
|
|
55
55
|
const content = [];
|
|
56
|
-
if (
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
toolResult
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
56
|
+
if (flattenToolHistory) {
|
|
57
|
+
if ((m.content ?? "").trim().length > 0) {
|
|
58
|
+
content.push({ text: m.content });
|
|
59
|
+
} else if (m.toolUse?.length) {
|
|
60
|
+
content.push({ text: "I used the available tools to gather information." });
|
|
61
|
+
}
|
|
62
|
+
if (m.toolResult?.length) {
|
|
63
|
+
content.push(...m.toolResult.map((r) => ({
|
|
64
|
+
text: [
|
|
65
|
+
r.status ? "Tool result:" : "Tool result (failed):",
|
|
66
|
+
this.toolResultToText(r.content)
|
|
67
|
+
].join("\n")
|
|
68
|
+
})));
|
|
69
|
+
}
|
|
70
|
+
} else {
|
|
71
|
+
if (m.toolUse?.length) {
|
|
72
|
+
content.push(...m.toolUse.map((t) => ({ toolUse: t })));
|
|
73
|
+
} else if ((m.content ?? "").trim().length > 0) {
|
|
74
|
+
content.push({ text: m.content });
|
|
75
|
+
}
|
|
76
|
+
if (m.toolResult?.length) {
|
|
77
|
+
content.push(...m.toolResult.map((r) => ({
|
|
78
|
+
toolResult: {
|
|
79
|
+
...r,
|
|
80
|
+
status: r.status ? "success" : "error"
|
|
81
|
+
}
|
|
82
|
+
})));
|
|
83
|
+
}
|
|
68
84
|
}
|
|
69
85
|
if (content.length === 0) {
|
|
70
86
|
content.push({ text: "" });
|
|
@@ -72,13 +88,29 @@ var BedrockAdapter = class {
|
|
|
72
88
|
return { role, content };
|
|
73
89
|
});
|
|
74
90
|
}
|
|
75
|
-
static
|
|
91
|
+
static toolResultToText(content) {
|
|
92
|
+
const maxLength = 12e3;
|
|
93
|
+
const text = !Array.isArray(content) ? typeof content === "string" ? content : JSON.stringify(content) ?? String(content) : content.map((item) => {
|
|
94
|
+
if (typeof item?.text === "string") {
|
|
95
|
+
return item.text;
|
|
96
|
+
}
|
|
97
|
+
if (item?.json !== void 0) {
|
|
98
|
+
return JSON.stringify(item.json);
|
|
99
|
+
}
|
|
100
|
+
return JSON.stringify(item);
|
|
101
|
+
}).filter(Boolean).join("\n");
|
|
102
|
+
return text.length > maxLength ? `${text.slice(0, maxLength)}
|
|
103
|
+
[Tool result truncated]` : text;
|
|
104
|
+
}
|
|
105
|
+
static toToolResultContent(result, status = true) {
|
|
106
|
+
const emptyResultText = status ? "The tool completed successfully but returned no results." : "The tool failed and returned no additional error details.";
|
|
76
107
|
try {
|
|
77
108
|
if (result instanceof Error) {
|
|
78
|
-
|
|
109
|
+
const message = result.message.trim();
|
|
110
|
+
return [{ text: message.length > 0 ? message : emptyResultText }];
|
|
79
111
|
}
|
|
80
|
-
if (result === null || result === void 0 || result === "") {
|
|
81
|
-
return [{ text:
|
|
112
|
+
if (result === null || result === void 0 || typeof result === "string" && result.trim().length === 0) {
|
|
113
|
+
return [{ text: emptyResultText }];
|
|
82
114
|
}
|
|
83
115
|
if (typeof result === "object") {
|
|
84
116
|
let json = JSON.parse(JSON.stringify(result));
|
|
@@ -151,18 +183,18 @@ var BedrockModel = class {
|
|
|
151
183
|
const resultPromise = this.toolDispatcher.execute(toolUse.name, toolUse.input);
|
|
152
184
|
if (opts?.onThinking && toolUse.name) {
|
|
153
185
|
const inputText = await this.toolDispatcher.getInputText(toolUse.name, toolUse.input);
|
|
154
|
-
if (inputText) opts.onThinking(inputText);
|
|
186
|
+
if (inputText && opts.onThinking) await opts.onThinking(inputText);
|
|
155
187
|
}
|
|
156
188
|
const result = await resultPromise;
|
|
157
189
|
results.push({
|
|
158
190
|
toolUseId: toolUse.toolUseId,
|
|
159
|
-
content: BedrockAdapter.toToolResultContent(result),
|
|
191
|
+
content: BedrockAdapter.toToolResultContent(result, true),
|
|
160
192
|
status: true
|
|
161
193
|
});
|
|
162
194
|
} catch (err) {
|
|
163
195
|
results.push({
|
|
164
196
|
toolUseId: toolUse.toolUseId,
|
|
165
|
-
content: BedrockAdapter.toToolResultContent(err),
|
|
197
|
+
content: BedrockAdapter.toToolResultContent(err, false),
|
|
166
198
|
status: false
|
|
167
199
|
});
|
|
168
200
|
}
|
|
@@ -172,21 +204,43 @@ var BedrockModel = class {
|
|
|
172
204
|
async runConversationLoop(messages, inference, options, instruction) {
|
|
173
205
|
let currentMessages = [...messages];
|
|
174
206
|
let iterations = 0;
|
|
207
|
+
const toolsEnabled = options?.toolsEnabled ?? true;
|
|
208
|
+
const maxToolCalls = toolsEnabled ? Math.max(0, options?.maxToolCalls ?? 3) : 0;
|
|
209
|
+
const maxIterations = 20;
|
|
210
|
+
let toolCalls = 0;
|
|
175
211
|
while (true) {
|
|
176
|
-
if (++iterations >
|
|
177
|
-
|
|
178
|
-
|
|
212
|
+
if (++iterations > maxIterations) {
|
|
213
|
+
throw new Error("Too many conversation iterations");
|
|
214
|
+
}
|
|
215
|
+
const remainingToolCalls = Math.max(0, maxToolCalls - toolCalls);
|
|
216
|
+
const canUseTools = toolsEnabled && remainingToolCalls > 0 && iterations < maxIterations;
|
|
217
|
+
const brMessages = BedrockAdapter.toBedrockMessages(currentMessages, !canUseTools);
|
|
218
|
+
let systemPrompt = await resolveInstructionValue(instruction?.system?.value, void 0);
|
|
219
|
+
if (!canUseTools && toolCalls > 0) {
|
|
220
|
+
systemPrompt = [
|
|
221
|
+
systemPrompt,
|
|
222
|
+
[
|
|
223
|
+
"You have reached the tool-use limit.",
|
|
224
|
+
"Tool use is no longer available.",
|
|
225
|
+
"Do not output tool calls, function-call syntax, tool-call markup, or special tokens such as <|tool_calls_section_begin|>.",
|
|
226
|
+
"Do not request or suggest performing additional searches.",
|
|
227
|
+
"Do not say that you will search for more information.",
|
|
228
|
+
"Use only the information already available in the conversation and the tool results above.",
|
|
229
|
+
"Complete the CURRENT TASK using the available information."
|
|
230
|
+
].join(" ")
|
|
231
|
+
].filter(Boolean).join("\n\n");
|
|
232
|
+
}
|
|
179
233
|
const converseCommandInput = {
|
|
180
234
|
modelId: this.modelId,
|
|
181
235
|
messages: brMessages,
|
|
182
236
|
system: systemPrompt ? [{ text: systemPrompt }] : void 0,
|
|
183
237
|
inferenceConfig: {
|
|
184
|
-
temperature: inference?.temperature
|
|
238
|
+
temperature: inference?.temperature,
|
|
185
239
|
maxTokens: inference?.maxTokens,
|
|
186
240
|
topP: inference?.topP
|
|
187
241
|
}
|
|
188
242
|
};
|
|
189
|
-
|
|
243
|
+
const tools = canUseTools ? (await this.toolDispatcher.list()).map(BedrockAdapter.toBedrockTool) : [];
|
|
190
244
|
if (tools.length > 0) {
|
|
191
245
|
converseCommandInput.toolConfig = { tools };
|
|
192
246
|
}
|
|
@@ -227,7 +281,11 @@ var BedrockModel = class {
|
|
|
227
281
|
currentToolUse.inputBuffer += event.contentBlockDelta.delta.toolUse.input;
|
|
228
282
|
}
|
|
229
283
|
if (event.contentBlockStop && currentToolUse?.inputBuffer) {
|
|
230
|
-
|
|
284
|
+
try {
|
|
285
|
+
currentToolUse.input = JSON.parse(currentToolUse.inputBuffer);
|
|
286
|
+
} catch (error) {
|
|
287
|
+
throw new Error(`Invalid arguments for tool "${currentToolUse.name}": ${currentToolUse.inputBuffer}.`);
|
|
288
|
+
}
|
|
231
289
|
delete currentToolUse.inputBuffer;
|
|
232
290
|
currentToolUse = void 0;
|
|
233
291
|
}
|
|
@@ -238,7 +296,8 @@ var BedrockModel = class {
|
|
|
238
296
|
await options.onThinking?.(chunks.join(""));
|
|
239
297
|
chunks = [];
|
|
240
298
|
}
|
|
241
|
-
|
|
299
|
+
toolCalls += toolUses.length;
|
|
300
|
+
const toolUseMessage = BedrockMessage.toToolUseMessage(assistantText, toolUses);
|
|
242
301
|
currentMessages.push(toolUseMessage);
|
|
243
302
|
if (options?.onTooling) {
|
|
244
303
|
await options.onTooling(toolUseMessage);
|
|
@@ -280,7 +339,8 @@ var BedrockModel = class {
|
|
|
280
339
|
name: c.toolUse.name,
|
|
281
340
|
input: c.toolUse.input
|
|
282
341
|
}));
|
|
283
|
-
|
|
342
|
+
toolCalls += toolUses.length;
|
|
343
|
+
const toolUseMessage = BedrockMessage.toToolUseMessage(text, toolUses);
|
|
284
344
|
currentMessages.push(toolUseMessage);
|
|
285
345
|
if (options?.onTooling) {
|
|
286
346
|
await options.onTooling(toolUseMessage);
|
|
@@ -309,7 +369,9 @@ var BedrockModel = class {
|
|
|
309
369
|
{
|
|
310
370
|
streaming: false,
|
|
311
371
|
onThinking: option?.event?.onThinking,
|
|
312
|
-
onTooling: option?.event?.onTooling
|
|
372
|
+
onTooling: option?.event?.onTooling,
|
|
373
|
+
maxToolCalls: option?.maxToolCalls,
|
|
374
|
+
toolsEnabled: option?.toolsEnabled
|
|
313
375
|
},
|
|
314
376
|
option?.instruction
|
|
315
377
|
);
|
|
@@ -330,7 +392,9 @@ var BedrockModel = class {
|
|
|
330
392
|
streaming: true,
|
|
331
393
|
onChunk: (c) => out.write(c),
|
|
332
394
|
onThinking: option?.event?.onThinking,
|
|
333
|
-
onTooling: option?.event?.onTooling
|
|
395
|
+
onTooling: option?.event?.onTooling,
|
|
396
|
+
maxToolCalls: option?.maxToolCalls,
|
|
397
|
+
toolsEnabled: option?.toolsEnabled
|
|
334
398
|
},
|
|
335
399
|
option?.instruction
|
|
336
400
|
);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/bedrockModel.ts","../src/bedrockMessage.ts","../src/bedrockAdapter.ts"],"sourcesContent":["import { PassThrough, Readable } from \"stream\";\nimport { ResponseMessage, Message, InferenceOptions, ToolUse, ToolResult, Model, ModelOption, resolveInstructionValue, Instruction } from '@mappies/miniwat-agent-core'\nimport { McpConfig, ToolDispatcher } from '@mappies/miniwat-mcp-core'\nimport BedrockMessage from \"./bedrockMessage\";\nimport { BedrockRuntimeClient, ConverseCommand, ConverseStreamCommand, Message as BrMessage, StopReason, BedrockRuntimeClientConfig, ConverseStreamCommandInput } from \"@aws-sdk/client-bedrock-runtime\";\nimport { BedrockAdapter } from \"./bedrockAdapter\";\n\nexport class BedrockModel implements Model\n{\n private modelId: string;\n private toolDispatcher: ToolDispatcher;\n private client: BedrockRuntimeClient;\n\n constructor(options: { region?: string; modelId: string; mcpConfig?:McpConfig, clientConfig?: BedrockRuntimeClientConfig; })\n {\n this.toolDispatcher = new ToolDispatcher(options?.mcpConfig);\n this.modelId = options.modelId;\n\n this.client = new BedrockRuntimeClient({\n region: options?.region ?? process.env.DEFAULT_AWS_REGION ?? process.env.AWS_REGION,\n ...options?.clientConfig\n });\n }\n\n private async streamBufferedText(chunks: string[], write: (chunk: string) => void)\n {\n for(const chunk of chunks)\n {\n write(chunk);\n await new Promise(r => setTimeout(r, 8 + Math.random() * 12));\n }\n }\n\n private extractAssistantText(res: any, messages: BrMessage[]): string\n {\n const content = res?.output?.message?.content ?? [];\n let text = content.map((c: any) => c.text ?? \"\").join(\"\");\n\n if(!text)\n {\n text = BedrockAdapter.getResponseFromStopReasonWhenResponseIsEmpty(res.stopReason);\n }\n\n return text;\n }\n\n private async executeTools(toolUses: ToolUse[], opts?: any): Promise<ToolResult[]>\n {\n const results: ToolResult[] = [];\n\n for(const toolUse of toolUses)\n {\n try\n {\n const resultPromise = this.toolDispatcher.execute(toolUse.name, toolUse.input);\n\n // Show a thinking message for the tool\n if (opts?.onThinking && toolUse.name)\n {\n const inputText = await this.toolDispatcher.getInputText(toolUse.name, toolUse.input);\n if(inputText) opts.onThinking(inputText);\n }\n\n const result = await resultPromise;\n\n results.push({\n toolUseId: toolUse.toolUseId,\n content: BedrockAdapter.toToolResultContent(result),\n status: true\n });\n }\n catch(err: any)\n {\n results.push({\n toolUseId: toolUse.toolUseId,\n content: BedrockAdapter.toToolResultContent(err),\n status: false\n });\n }\n }\n\n return results;\n }\n\n private async runConversationLoop(messages: Message[], \n inference?: InferenceOptions, \n options?: { streaming?: boolean; \n onChunk?: (chunk: string) => void, \n onThinking?: (msg: string) => Promise<void>,\n onTooling?: (msg: Message) => Promise<void>\n },\n instruction?: Instruction): Promise<{ message: Message; stopReason?: StopReason; usage?: any }>\n {\n let currentMessages = [...messages];\n let iterations = 0;\n\n while(true)\n {\n if (++iterations > 20) throw new Error(\"Too many tool iterations\");\n\n const brMessages = BedrockAdapter.toBedrockMessages(currentMessages);\n\n const systemPrompt = await resolveInstructionValue(instruction?.system?.value, undefined);\n\n const converseCommandInput:ConverseStreamCommandInput = {\n modelId: this.modelId,\n messages: brMessages,\n system: systemPrompt ? [{ text: systemPrompt }] : undefined,\n inferenceConfig: {\n temperature: inference?.temperature ?? 0.2,\n maxTokens: inference?.maxTokens,\n topP: inference?.topP\n }\n }\n\n let tools = (await this.toolDispatcher.list()).map(BedrockAdapter.toBedrockTool);\n\n if(tools.length > 0)\n {\n converseCommandInput.toolConfig = { tools }\n }\n\n if (options?.streaming)\n {\n const res = await this.client.send(new ConverseStreamCommand(converseCommandInput));\n\n let chunks: string[] = [];\n let streamingStarted = false;\n let toolUses: ToolUse[] = [];\n let currentToolUse: ToolUse | undefined;\n let assistantText = '';\n\n for await (const event of res.stream ?? [])\n {\n\n if (event.modelStreamErrorException)\n {\n throw new Error(event.modelStreamErrorException?.message ?? \"Model stream error\");\n }\n\n if (event.contentBlockDelta?.delta?.text)\n {\n const chunk = event.contentBlockDelta.delta.text;\n assistantText += chunk;\n\n if (!streamingStarted)\n {\n chunks.push(chunk);\n\n if (chunks.length > 20)\n {\n streamingStarted = true;\n await this.streamBufferedText(chunks, options.onChunk!);\n chunks = [];\n }\n }\n else\n {\n options.onChunk?.(chunk);\n }\n }\n\n if (event.contentBlockStart?.start?.toolUse)\n {\n currentToolUse = {\n toolUseId: event.contentBlockStart.start.toolUse.toolUseId as string,\n name: event.contentBlockStart.start.toolUse.name as string,\n inputBuffer: \"\"\n };\n toolUses.push(currentToolUse);\n }\n\n if (currentToolUse && event.contentBlockDelta?.delta?.toolUse?.input)\n {\n currentToolUse.inputBuffer += event.contentBlockDelta.delta.toolUse.input;\n }\n\n if (event.contentBlockStop && currentToolUse?.inputBuffer)\n {\n currentToolUse.input = JSON.parse(currentToolUse.inputBuffer);\n delete currentToolUse.inputBuffer;\n currentToolUse = undefined;\n }\n\n if (event.messageStop)\n {\n const reason = event.messageStop.stopReason;\n\n if (reason === \"tool_use\")\n {\n\n if (!streamingStarted && chunks.length > 0)\n {\n await options.onThinking?.(chunks.join(\"\"));\n chunks = [];\n }\n\n const toolUseMessage = BedrockMessage.toToolUseMessage('', toolUses);\n currentMessages.push(toolUseMessage);\n if(options?.onTooling) { await options.onTooling(toolUseMessage)}\n\n const toolResults = await this.executeTools(toolUses, options);\n\n const toolResultMessage = BedrockMessage.toToolResultMessage(toolResults);\n currentMessages.push(toolResultMessage);\n if(options?.onTooling) { await options.onTooling(toolResultMessage)}\n\n break;\n }\n\n if (typeof reason === \"string\")\n {\n if (/content|filter|guardrail/i.test(reason))\n {\n throw new Error(\"Output blocked by content filtering policy: \" + reason);\n }\n else if (reason === \"max_tokens\")\n {\n options.onChunk?.(BedrockAdapter.getResponseFromStopReasonWhenResponseIsEmpty(reason));\n }\n else if (!streamingStarted)\n {\n if (chunks.length > 0)\n {\n await this.streamBufferedText(chunks, options.onChunk!);\n } else\n {\n options.onChunk?.(BedrockAdapter.getResponseFromStopReasonWhenResponseIsEmpty(reason));\n }\n }\n }\n\n return {\n message: BedrockMessage.toAssistantMessage(assistantText),\n stopReason: reason\n };\n }\n }\n }\n else\n {\n const res = await this.client.send(new ConverseCommand(converseCommandInput));\n const text = this.extractAssistantText(res, brMessages);\n\n const content = res?.output?.message?.content ?? [];\n\n if (res.stopReason === \"tool_use\")\n {\n const toolUses = content.filter((c: any) => c.toolUse)\n .map((c: any) => ({\n toolUseId: c.toolUse.toolUseId,\n name: c.toolUse.name,\n input: c.toolUse.input\n }));\n\n const toolUseMessage = BedrockMessage.toToolUseMessage('', toolUses);\n currentMessages.push(toolUseMessage);\n if(options?.onTooling) { await options.onTooling(toolUseMessage)}\n\n const toolResults = await this.executeTools(toolUses, options);\n\n const toolResultMessage = BedrockMessage.toToolResultMessage(toolResults);\n currentMessages.push(toolResultMessage);\n if(options?.onTooling) { await options.onTooling(toolResultMessage)}\n\n continue;\n }\n\n const msg = BedrockMessage.toAssistantMessage(text);\n\n return {\n message: msg,\n stopReason: res.stopReason,\n usage: res.usage\n };\n }\n }\n }\n\n async invoke(messages: Message[], option?: ModelOption): Promise<ResponseMessage>\n {\n const response = await this.runConversationLoop(messages, option?.inference, {\n streaming: false,\n onThinking: option?.event?.onThinking,\n onTooling: option?.event?.onTooling\n },\n option?.instruction);\n\n return new ResponseMessage({\n stopReason: response.stopReason as StopReason,\n tokenUsage: response.usage,\n message: response.message\n });\n }\n\n async stream(messages: Message[], option?: ModelOption): Promise<Readable>\n {\n const out = new PassThrough({ encoding: \"utf8\" });\n\n (async () =>\n {\n try\n {\n await this.runConversationLoop(messages, option?.inference, {\n streaming: true,\n onChunk: c => out.write(c),\n onThinking: option?.event?.onThinking,\n onTooling: option?.event?.onTooling\n },\n option?.instruction);\n\n out.write('');\n out.end();\n }\n catch (e)\n {\n out.emit(\"throw\", e);\n out.write('');\n out.end();\n }\n })();\n\n return out;\n }\n}","import { MessageType, Message, ToolUse, ToolResult } from '@mappies/miniwat-agent-core'\n\nexport default class BedrockMessage extends Message\n{\n constructor(data:Partial<Message>)\n {\n super(data)\n }\n \n public static toAssistantMessage(text: string): Message\n {\n return new Message({\n type: MessageType.Agent,\n content: text,\n createdTimestamp: new Date().toISOString(),\n });\n }\n \n public static toToolUseMessage(text:string, toolUses: ToolUse[]): Message\n {\n return new Message({\n type: MessageType.Agent,\n content: text,\n createdTimestamp: new Date().toISOString(),\n toolUse: toolUses.map(({ toolUseId, name, input }) => (<ToolUse>{ toolUseId, name, input })),\n });\n }\n \n public static toToolResultMessage(toolResult: ToolResult[]): Message\n {\n return new Message({\n type: MessageType.ToolResult,\n toolResult\n });\n }\n}","import { MessageType, Message, Tool } from '@mappies/miniwat-agent-core'\nimport { Message as BrMessage, StopReason, Tool as BedrockTool } from \"@aws-sdk/client-bedrock-runtime\";\n\nexport class BedrockAdapter\n{\n static toBedrockTool(tool: Tool): BedrockTool\n {\n return {\n toolSpec: {\n name: tool.name,\n description: tool.description,\n inputSchema: { json: tool.schema } as any\n }\n };\n }\n \n static toBedrockMessages(history: Message[]): BrMessage[]\n {\n return history\n .filter(m =>\n (m.content ?? \"\").trim().length > 0 ||\n (m.toolUse?.length ?? 0) > 0 ||\n (m.toolResult?.length ?? 0) > 0\n )\n .map(m =>\n {\n const role = m.type === MessageType.User || m.type === MessageType.ToolResult\n ? \"user\"\n : \"assistant\";\n\n const content: any[] = [];\n\n if (m.toolUse?.length)\n {\n content.push(...m.toolUse.map(t => ({ toolUse: t })));\n }\n else if ((m.content ?? \"\").trim().length > 0)\n {\n content.push({ text: m.content });\n }\n\n if (m.toolResult?.length)\n {\n content.push(...m.toolResult.map(r => ({\n toolResult: {\n ...r,\n status: r.status ? \"success\" : \"error\"\n }\n })));\n }\n\n if (content.length === 0)\n {\n content.push({ text: \"\" });\n }\n\n return { role, content };\n });\n }\n\n static toToolResultContent(result: unknown): { text?: string; json?: object }[] \n {\n try \n {\n if(result instanceof Error)\n {\n return [{ text: result.message }];\n }\n\n if(result === null || result === undefined || result === '')\n {\n return [{ text: '' }];\n }\n\n if(typeof result === \"object\") \n {\n let json = JSON.parse(JSON.stringify(result));\n\n if(Array.isArray(json))\n {\n json = { result: json };\n }\n\n return [{ json }];\n }\n\n return [{ text: String(result) }];\n }\n catch (e: unknown) \n {\n const message = e instanceof Error ? e.message : String(e);\n\n return [{\n json: {\n error: \"Failed to serialize tool result\",\n message\n }\n }];\n }\n }\n\n static getResponseFromStopReasonWhenResponseIsEmpty(stopReason: StopReason): string\n {\n switch (stopReason)\n {\n case \"max_tokens\":\n return \"My response was cut off due to length limits. Would you like me to continue or summarize the remaining information?\";\n case \"stop_sequence\":\n return \"I've reached a natural stopping point in my response. Please let me know if you need additional information.\";\n case \"guardrail_intervened\":\n return \"I'm unable to provide a response to this request as it doesn't align with my usage guidelines. Please rephrase your question or ask something else.\";\n case \"content_filtered\":\n return \"I cannot generate a response for this request due to content policy restrictions. Please try rephrasing your question.\";\n case \"model_context_window_exceeded\":\n return \"The conversation or request is too long for me to process. Please try with a shorter input or start a new conversation.\";\n case \"end_turn\":\n return \"What can I help with?\";\n case \"tool_use\":\n return \"\";\n default:\n return \"I couldn't complete the response. Please try again.\";\n }\n }\n}"],"mappings":"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","names":["MessageType"]}
|
|
1
|
+
{"version":3,"sources":["../src/bedrockModel.ts","../src/bedrockMessage.ts","../src/bedrockAdapter.ts"],"sourcesContent":["import { PassThrough, Readable } from \"stream\";\nimport { ResponseMessage, Message, InferenceOptions, ToolUse, ToolResult, Model, ModelOption, resolveInstructionValue, Instruction } from '@mappies/miniwat-agent-core'\nimport { McpConfig, ToolDispatcher } from '@mappies/miniwat-mcp-core'\nimport BedrockMessage from \"./bedrockMessage\";\nimport { BedrockRuntimeClient, ConverseCommand, ConverseStreamCommand, Message as BrMessage, StopReason, BedrockRuntimeClientConfig, ConverseStreamCommandInput } from \"@aws-sdk/client-bedrock-runtime\";\nimport { BedrockAdapter } from \"./bedrockAdapter\";\n\nexport class BedrockModel implements Model\n{\n private modelId: string;\n private toolDispatcher: ToolDispatcher;\n private client: BedrockRuntimeClient;\n\n constructor(options: { region?: string; modelId: string; mcpConfig?:McpConfig, clientConfig?: BedrockRuntimeClientConfig; })\n {\n this.toolDispatcher = new ToolDispatcher(options?.mcpConfig);\n this.modelId = options.modelId;\n\n this.client = new BedrockRuntimeClient({\n region: options?.region ?? process.env.DEFAULT_AWS_REGION ?? process.env.AWS_REGION,\n ...options?.clientConfig\n });\n }\n\n private async streamBufferedText(chunks: string[], write: (chunk: string) => void)\n {\n for(const chunk of chunks)\n {\n write(chunk);\n await new Promise(r => setTimeout(r, 8 + Math.random() * 12));\n }\n }\n\n private extractAssistantText(res: any, messages: BrMessage[]): string\n {\n const content = res?.output?.message?.content ?? [];\n let text = content.map((c: any) => c.text ?? \"\").join(\"\");\n\n if(!text)\n {\n text = BedrockAdapter.getResponseFromStopReasonWhenResponseIsEmpty(res.stopReason);\n }\n\n return text;\n }\n\n private async executeTools(toolUses: ToolUse[], opts?: any): Promise<ToolResult[]>\n {\n const results: ToolResult[] = [];\n\n for(const toolUse of toolUses)\n {\n try\n {\n const resultPromise = this.toolDispatcher.execute(toolUse.name, toolUse.input);\n\n // Show a thinking message for the tool\n if (opts?.onThinking && toolUse.name)\n {\n const inputText = await this.toolDispatcher.getInputText(toolUse.name, toolUse.input);\n if(inputText && opts.onThinking) await opts.onThinking(inputText);\n }\n\n const result = await resultPromise;\n\n results.push({\n toolUseId: toolUse.toolUseId,\n content: BedrockAdapter.toToolResultContent(result, true),\n status: true\n });\n }\n catch(err: any)\n {\n results.push({\n toolUseId: toolUse.toolUseId,\n content: BedrockAdapter.toToolResultContent(err, false),\n status: false\n });\n }\n }\n\n return results;\n }\n\n private async runConversationLoop(messages: Message[],\n inference?: InferenceOptions,\n options?: { streaming?: boolean;\n onChunk?: (chunk: string) => void,\n onThinking?: (msg: string) => Promise<void>,\n onTooling?: (msg: Message) => Promise<void>,\n maxToolCalls?: number,\n toolsEnabled?: boolean\n },\n instruction?: Instruction): Promise<{ message: Message; stopReason?: StopReason; usage?: any }>\n {\n let currentMessages = [...messages];\n let iterations = 0;\n\n const toolsEnabled = options?.toolsEnabled ?? true;\n const maxToolCalls = toolsEnabled ? Math.max(0, options?.maxToolCalls ?? 3) : 0;\n const maxIterations = 20;\n let toolCalls = 0;\n\n while(true)\n {\n if (++iterations > maxIterations)\n {\n throw new Error(\"Too many conversation iterations\");\n }\n\n const remainingToolCalls = Math.max(0, maxToolCalls - toolCalls);\n const canUseTools = toolsEnabled && remainingToolCalls > 0 && iterations < maxIterations;\n\n const brMessages = BedrockAdapter.toBedrockMessages(currentMessages, !canUseTools);\n\n let systemPrompt = await resolveInstructionValue(instruction?.system?.value, undefined);\n\n if (!canUseTools && toolCalls > 0)\n {\n systemPrompt = [\n systemPrompt,\n [\n \"You have reached the tool-use limit.\",\n \"Tool use is no longer available.\",\n \"Do not output tool calls, function-call syntax, tool-call markup, or special tokens such as <|tool_calls_section_begin|>.\",\n \"Do not request or suggest performing additional searches.\",\n \"Do not say that you will search for more information.\",\n \"Use only the information already available in the conversation and the tool results above.\",\n \"Complete the CURRENT TASK using the available information.\"\n ].join(\" \")\n ]\n .filter(Boolean)\n .join(\"\\n\\n\");\n }\n\n const converseCommandInput:ConverseStreamCommandInput = {\n modelId: this.modelId,\n messages: brMessages,\n system: systemPrompt ? [{ text: systemPrompt }] : undefined,\n inferenceConfig: {\n temperature: inference?.temperature,\n maxTokens: inference?.maxTokens,\n topP: inference?.topP\n }\n }\n\n const tools = canUseTools\n ? (await this.toolDispatcher.list()).map(BedrockAdapter.toBedrockTool)\n : [];\n\n if(tools.length > 0)\n {\n converseCommandInput.toolConfig = { tools }\n }\n\n if (options?.streaming)\n {\n const res = await this.client.send(new ConverseStreamCommand(converseCommandInput));\n\n let chunks: string[] = [];\n let streamingStarted = false;\n let toolUses: ToolUse[] = [];\n let currentToolUse: ToolUse | undefined;\n let assistantText = '';\n\n for await (const event of res.stream ?? [])\n {\n\n if (event.modelStreamErrorException)\n {\n throw new Error(event.modelStreamErrorException?.message ?? \"Model stream error\");\n }\n\n if (event.contentBlockDelta?.delta?.text)\n {\n const chunk = event.contentBlockDelta.delta.text;\n assistantText += chunk;\n\n if (!streamingStarted)\n {\n chunks.push(chunk);\n\n if (chunks.length > 20)\n {\n streamingStarted = true;\n await this.streamBufferedText(chunks, options.onChunk!);\n chunks = [];\n }\n }\n else\n {\n options.onChunk?.(chunk);\n }\n }\n\n if (event.contentBlockStart?.start?.toolUse)\n {\n currentToolUse = {\n toolUseId: event.contentBlockStart.start.toolUse.toolUseId as string,\n name: event.contentBlockStart.start.toolUse.name as string,\n inputBuffer: \"\"\n };\n toolUses.push(currentToolUse);\n }\n\n if (currentToolUse && event.contentBlockDelta?.delta?.toolUse?.input)\n {\n currentToolUse.inputBuffer += event.contentBlockDelta.delta.toolUse.input;\n }\n\n if (event.contentBlockStop && currentToolUse?.inputBuffer)\n {\n try\n {\n currentToolUse.input = JSON.parse(currentToolUse.inputBuffer);\n }\n catch (error)\n {\n throw new Error(`Invalid arguments for tool \"${currentToolUse.name}\": ${currentToolUse.inputBuffer}.`);\n }\n\n delete currentToolUse.inputBuffer;\n currentToolUse = undefined;\n }\n\n if (event.messageStop)\n {\n const reason = event.messageStop.stopReason;\n\n if (reason === \"tool_use\")\n {\n\n if (!streamingStarted && chunks.length > 0)\n {\n await options.onThinking?.(chunks.join(\"\"));\n chunks = [];\n }\n\n toolCalls += toolUses.length;\n\n const toolUseMessage = BedrockMessage.toToolUseMessage(assistantText, toolUses);\n currentMessages.push(toolUseMessage);\n if(options?.onTooling) { await options.onTooling(toolUseMessage)}\n\n const toolResults = await this.executeTools(toolUses, options);\n\n const toolResultMessage = BedrockMessage.toToolResultMessage(toolResults);\n currentMessages.push(toolResultMessage);\n if(options?.onTooling) { await options.onTooling(toolResultMessage)}\n\n break;\n }\n\n if (typeof reason === \"string\")\n {\n if (/content|filter|guardrail/i.test(reason))\n {\n throw new Error(\"Output blocked by content filtering policy: \" + reason);\n }\n else if (reason === \"max_tokens\")\n {\n options.onChunk?.(BedrockAdapter.getResponseFromStopReasonWhenResponseIsEmpty(reason));\n }\n else if (!streamingStarted)\n {\n if (chunks.length > 0)\n {\n await this.streamBufferedText(chunks, options.onChunk!);\n } else\n {\n options.onChunk?.(BedrockAdapter.getResponseFromStopReasonWhenResponseIsEmpty(reason));\n }\n }\n }\n\n return {\n message: BedrockMessage.toAssistantMessage(assistantText),\n stopReason: reason\n };\n }\n }\n }\n else\n {\n const res = await this.client.send(new ConverseCommand(converseCommandInput));\n const text = this.extractAssistantText(res, brMessages);\n\n const content = res?.output?.message?.content ?? [];\n\n if (res.stopReason === \"tool_use\")\n {\n const toolUses = content.filter((c: any) => c.toolUse)\n .map((c: any) => ({\n toolUseId: c.toolUse.toolUseId,\n name: c.toolUse.name,\n input: c.toolUse.input\n }));\n\n toolCalls += toolUses.length;\n\n const toolUseMessage = BedrockMessage.toToolUseMessage(text, toolUses);\n currentMessages.push(toolUseMessage);\n if(options?.onTooling) { await options.onTooling(toolUseMessage)}\n\n const toolResults = await this.executeTools(toolUses, options);\n\n const toolResultMessage = BedrockMessage.toToolResultMessage(toolResults);\n currentMessages.push(toolResultMessage);\n if(options?.onTooling) { await options.onTooling(toolResultMessage)}\n\n continue;\n }\n\n const msg = BedrockMessage.toAssistantMessage(text);\n\n return {\n message: msg,\n stopReason: res.stopReason,\n usage: res.usage\n };\n }\n }\n }\n\n async invoke(messages: Message[], option?: ModelOption): Promise<ResponseMessage>\n {\n const response = await this.runConversationLoop(messages, option?.inference, {\n streaming: false,\n onThinking: option?.event?.onThinking,\n onTooling: option?.event?.onTooling,\n maxToolCalls: option?.maxToolCalls,\n toolsEnabled: option?.toolsEnabled\n },\n option?.instruction);\n\n return new ResponseMessage({\n stopReason: response.stopReason as StopReason,\n tokenUsage: response.usage,\n message: response.message\n });\n }\n\n async stream(messages: Message[], option?: ModelOption): Promise<Readable>\n {\n const out = new PassThrough({ encoding: \"utf8\" });\n\n (async () =>\n {\n try\n {\n await this.runConversationLoop(messages, option?.inference, {\n streaming: true,\n onChunk: c => out.write(c),\n onThinking: option?.event?.onThinking,\n onTooling: option?.event?.onTooling,\n maxToolCalls: option?.maxToolCalls,\n toolsEnabled: option?.toolsEnabled\n },\n option?.instruction);\n\n out.write('');\n out.end();\n }\n catch (e)\n {\n out.emit(\"throw\", e);\n out.write('');\n out.end();\n }\n })();\n\n return out;\n }\n}","import { MessageType, Message, ToolUse, ToolResult } from '@mappies/miniwat-agent-core'\n\nexport default class BedrockMessage extends Message\n{\n constructor(data:Partial<Message>)\n {\n super(data)\n }\n \n public static toAssistantMessage(text: string): Message\n {\n return new Message({\n type: MessageType.Agent,\n content: text,\n createdTimestamp: new Date().toISOString(),\n });\n }\n \n public static toToolUseMessage(text:string, toolUses: ToolUse[]): Message\n {\n return new Message({\n type: MessageType.Agent,\n content: text,\n createdTimestamp: new Date().toISOString(),\n toolUse: toolUses.map(({ toolUseId, name, input }) => (<ToolUse>{ toolUseId, name, input })),\n });\n }\n \n public static toToolResultMessage(toolResult: ToolResult[]): Message\n {\n return new Message({\n type: MessageType.ToolResult,\n toolResult\n });\n }\n}","import { MessageType, Message, Tool } from '@mappies/miniwat-agent-core'\nimport { Message as BrMessage, StopReason, Tool as BedrockTool } from \"@aws-sdk/client-bedrock-runtime\";\n\nexport class BedrockAdapter\n{\n static toBedrockTool(tool: Tool): BedrockTool\n {\n return {\n toolSpec: {\n name: tool.name,\n description: tool.description,\n inputSchema: { json: tool.schema } as any\n }\n };\n }\n\n static toBedrockMessages(history: Message[], flattenToolHistory = false): BrMessage[]\n {\n return history\n .filter(m =>\n (m.content ?? \"\").trim().length > 0 ||\n (m.toolUse?.length ?? 0) > 0 ||\n (m.toolResult?.length ?? 0) > 0\n )\n .map(m =>\n {\n const role = m.type === MessageType.User || m.type === MessageType.ToolResult\n ? \"user\"\n : \"assistant\";\n\n const content: any[] = [];\n\n if (flattenToolHistory)\n {\n if ((m.content ?? \"\").trim().length > 0)\n {\n content.push({ text: m.content });\n }\n else if (m.toolUse?.length)\n {\n content.push({ text: \"I used the available tools to gather information.\" });\n }\n\n if (m.toolResult?.length)\n {\n content.push(...m.toolResult.map(r => ({\n text: [\n r.status ? \"Tool result:\" : \"Tool result (failed):\",\n this.toolResultToText(r.content)\n ].join(\"\\n\")\n })));\n }\n }\n else\n {\n if (m.toolUse?.length)\n {\n content.push(...m.toolUse.map(t => ({ toolUse: t })));\n }\n else if ((m.content ?? \"\").trim().length > 0)\n {\n content.push({ text: m.content });\n }\n\n if (m.toolResult?.length)\n {\n content.push(...m.toolResult.map(r => ({\n toolResult: {\n ...r,\n status: r.status ? \"success\" : \"error\"\n }\n })));\n }\n }\n\n if (content.length === 0)\n {\n content.push({ text: \"\" });\n }\n\n return { role, content };\n });\n }\n\n private static toolResultToText(content: unknown): string\n {\n const maxLength = 12000;\n\n const text = !Array.isArray(content)\n ? (typeof content === \"string\" ? content : (JSON.stringify(content) ?? String(content)))\n : content\n .map((item: any) =>\n {\n if (typeof item?.text === \"string\")\n {\n return item.text;\n }\n\n if (item?.json !== undefined)\n {\n return JSON.stringify(item.json);\n }\n\n return JSON.stringify(item);\n })\n .filter(Boolean)\n .join(\"\\n\");\n\n return text.length > maxLength\n ? `${text.slice(0, maxLength)}\\n[Tool result truncated]`\n : text;\n }\n\n static toToolResultContent(result: unknown, status = true): { text?: string; json?: object }[]\n {\n const emptyResultText = status\n ? \"The tool completed successfully but returned no results.\"\n : \"The tool failed and returned no additional error details.\";\n\n try\n {\n if(result instanceof Error)\n {\n const message = result.message.trim();\n return [{ text: message.length > 0 ? message : emptyResultText }];\n }\n\n if(result === null || result === undefined || (typeof result === \"string\" && result.trim().length === 0))\n {\n return [{ text: emptyResultText }];\n }\n\n if(typeof result === \"object\")\n {\n let json = JSON.parse(JSON.stringify(result));\n\n if(Array.isArray(json))\n {\n json = { result: json };\n }\n\n return [{ json }];\n }\n\n return [{ text: String(result) }];\n }\n catch (e: unknown)\n {\n const message = e instanceof Error ? e.message : String(e);\n\n return [{\n json: {\n error: \"Failed to serialize tool result\",\n message\n }\n }];\n }\n }\n\n static getResponseFromStopReasonWhenResponseIsEmpty(stopReason: StopReason): string\n {\n switch (stopReason)\n {\n case \"max_tokens\":\n return \"My response was cut off due to length limits. Would you like me to continue or summarize the remaining information?\";\n case \"stop_sequence\":\n return \"I've reached a natural stopping point in my response. Please let me know if you need additional information.\";\n case \"guardrail_intervened\":\n return \"I'm unable to provide a response to this request as it doesn't align with my usage guidelines. Please rephrase your question or ask something else.\";\n case \"content_filtered\":\n return \"I cannot generate a response for this request due to content policy restrictions. Please try rephrasing your question.\";\n case \"model_context_window_exceeded\":\n return \"The conversation or request is too long for me to process. Please try with a shorter input or start a new conversation.\";\n case \"end_turn\":\n return \"What can I help with?\";\n case \"tool_use\":\n return \"\";\n default:\n return \"I couldn't complete the response. Please try again.\";\n }\n }\n}"],"mappings":"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","names":["MessageType"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mappies/miniwat-provider-bedrock",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"description": "Bedrock provider for Miniwat",
|
|
5
5
|
"homepage": "https://gitlab.com/mappies/miniwat-provider-bedrock#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
46
|
"@aws-sdk/client-bedrock-runtime": "^3.908.0",
|
|
47
|
-
"@mappies/miniwat-agent-core": "^0.
|
|
47
|
+
"@mappies/miniwat-agent-core": "^0.17.0",
|
|
48
48
|
"@mappies/miniwat-mcp-core": "^0.2.0"
|
|
49
49
|
}
|
|
50
50
|
}
|