@mappies/miniwat-provider-bedrock 0.9.0 → 0.11.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 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 (m.toolUse?.length) {
83
- content.push(...m.toolUse.map((t) => ({ toolUse: t })));
84
- } else if ((m.content ?? "").trim().length > 0) {
85
- content.push({ text: m.content });
86
- }
87
- if (m.toolResult?.length) {
88
- content.push(...m.toolResult.map((r) => ({
89
- toolResult: {
90
- ...r,
91
- status: r.status ? "success" : "error"
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,6 +114,20 @@ var BedrockAdapter = class {
98
114
  return { role, content };
99
115
  });
100
116
  }
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
+ }
101
131
  static toToolResultContent(result, status = true) {
102
132
  const emptyResultText = status ? "The tool completed successfully but returned no results." : "The tool failed and returned no additional error details.";
103
133
  try {
@@ -153,6 +183,12 @@ var BedrockModel = class {
153
183
  constructor(options) {
154
184
  this.toolDispatcher = new import_miniwat_mcp_core.ToolDispatcher(options?.mcpConfig);
155
185
  this.modelId = options.modelId;
186
+ if (options?.guardrailConfig?.guardrailIdentifier) {
187
+ this.guardrailConfig = {
188
+ guardrailIdentifier: options.guardrailConfig.guardrailIdentifier,
189
+ guardrailVersion: options.guardrailConfig.guardrailVersion
190
+ };
191
+ }
156
192
  this.client = new import_client_bedrock_runtime.BedrockRuntimeClient({
157
193
  region: options?.region ?? process.env.DEFAULT_AWS_REGION ?? process.env.AWS_REGION,
158
194
  ...options?.clientConfig
@@ -210,8 +246,22 @@ var BedrockModel = class {
210
246
  }
211
247
  const remainingToolCalls = Math.max(0, maxToolCalls - toolCalls);
212
248
  const canUseTools = toolsEnabled && remainingToolCalls > 0 && iterations < maxIterations;
213
- const brMessages = BedrockAdapter.toBedrockMessages(currentMessages);
214
- const systemPrompt = await (0, import_miniwat_agent_core3.resolveInstructionValue)(instruction?.system?.value, void 0);
249
+ const brMessages = BedrockAdapter.toBedrockMessages(currentMessages, !canUseTools);
250
+ let systemPrompt = await (0, import_miniwat_agent_core3.resolveInstructionValue)(instruction?.system?.value, void 0);
251
+ if (!canUseTools && toolCalls > 0) {
252
+ systemPrompt = [
253
+ systemPrompt,
254
+ [
255
+ "You have reached the tool-use limit.",
256
+ "Tool use is no longer available.",
257
+ "Do not output tool calls, function-call syntax, tool-call markup, or special tokens such as <|tool_calls_section_begin|>.",
258
+ "Do not request or suggest performing additional searches.",
259
+ "Do not say that you will search for more information.",
260
+ "Use only the information already available in the conversation and the tool results above.",
261
+ "Complete the CURRENT TASK using the available information."
262
+ ].join(" ")
263
+ ].filter(Boolean).join("\n\n");
264
+ }
215
265
  const converseCommandInput = {
216
266
  modelId: this.modelId,
217
267
  messages: brMessages,
@@ -222,6 +272,9 @@ var BedrockModel = class {
222
272
  topP: inference?.topP
223
273
  }
224
274
  };
275
+ if (this.guardrailConfig) {
276
+ converseCommandInput.guardrailConfig = this.guardrailConfig;
277
+ }
225
278
  const tools = canUseTools ? (await this.toolDispatcher.list()).map(BedrockAdapter.toBedrockTool) : [];
226
279
  if (tools.length > 0) {
227
280
  converseCommandInput.toolConfig = { tools };
@@ -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) 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);\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,\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}\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, 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}\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, GuardrailConfiguration } 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 private guardrailConfig?: GuardrailConfiguration;\n\n constructor(options: { region?: string; modelId: string; mcpConfig?:McpConfig, clientConfig?: BedrockRuntimeClientConfig; guardrailConfig?: { guardrailIdentifier: string; guardrailVersion?: string; }; })\n {\n this.toolDispatcher = new ToolDispatcher(options?.mcpConfig);\n this.modelId = options.modelId;\n\n if (options?.guardrailConfig?.guardrailIdentifier)\n {\n this.guardrailConfig = {\n guardrailIdentifier: options.guardrailConfig.guardrailIdentifier,\n guardrailVersion: options.guardrailConfig.guardrailVersion\n };\n }\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 if (this.guardrailConfig)\n {\n converseCommandInput.guardrailConfig = this.guardrailConfig;\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.d.cts CHANGED
@@ -7,11 +7,16 @@ declare class BedrockModel implements Model {
7
7
  private modelId;
8
8
  private toolDispatcher;
9
9
  private client;
10
+ private guardrailConfig?;
10
11
  constructor(options: {
11
12
  region?: string;
12
13
  modelId: string;
13
14
  mcpConfig?: McpConfig;
14
15
  clientConfig?: BedrockRuntimeClientConfig;
16
+ guardrailConfig?: {
17
+ guardrailIdentifier: string;
18
+ guardrailVersion?: string;
19
+ };
15
20
  });
16
21
  private streamBufferedText;
17
22
  private extractAssistantText;
package/dist/index.d.ts CHANGED
@@ -7,11 +7,16 @@ declare class BedrockModel implements Model {
7
7
  private modelId;
8
8
  private toolDispatcher;
9
9
  private client;
10
+ private guardrailConfig?;
10
11
  constructor(options: {
11
12
  region?: string;
12
13
  modelId: string;
13
14
  mcpConfig?: McpConfig;
14
15
  clientConfig?: BedrockRuntimeClientConfig;
16
+ guardrailConfig?: {
17
+ guardrailIdentifier: string;
18
+ guardrailVersion?: string;
19
+ };
15
20
  });
16
21
  private streamBufferedText;
17
22
  private extractAssistantText;
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 (m.toolUse?.length) {
57
- content.push(...m.toolUse.map((t) => ({ toolUse: t })));
58
- } else if ((m.content ?? "").trim().length > 0) {
59
- content.push({ text: m.content });
60
- }
61
- if (m.toolResult?.length) {
62
- content.push(...m.toolResult.map((r) => ({
63
- toolResult: {
64
- ...r,
65
- status: r.status ? "success" : "error"
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,6 +88,20 @@ var BedrockAdapter = class {
72
88
  return { role, content };
73
89
  });
74
90
  }
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
+ }
75
105
  static toToolResultContent(result, status = true) {
76
106
  const emptyResultText = status ? "The tool completed successfully but returned no results." : "The tool failed and returned no additional error details.";
77
107
  try {
@@ -127,6 +157,12 @@ var BedrockModel = class {
127
157
  constructor(options) {
128
158
  this.toolDispatcher = new ToolDispatcher(options?.mcpConfig);
129
159
  this.modelId = options.modelId;
160
+ if (options?.guardrailConfig?.guardrailIdentifier) {
161
+ this.guardrailConfig = {
162
+ guardrailIdentifier: options.guardrailConfig.guardrailIdentifier,
163
+ guardrailVersion: options.guardrailConfig.guardrailVersion
164
+ };
165
+ }
130
166
  this.client = new BedrockRuntimeClient({
131
167
  region: options?.region ?? process.env.DEFAULT_AWS_REGION ?? process.env.AWS_REGION,
132
168
  ...options?.clientConfig
@@ -184,8 +220,22 @@ var BedrockModel = class {
184
220
  }
185
221
  const remainingToolCalls = Math.max(0, maxToolCalls - toolCalls);
186
222
  const canUseTools = toolsEnabled && remainingToolCalls > 0 && iterations < maxIterations;
187
- const brMessages = BedrockAdapter.toBedrockMessages(currentMessages);
188
- const systemPrompt = await resolveInstructionValue(instruction?.system?.value, void 0);
223
+ const brMessages = BedrockAdapter.toBedrockMessages(currentMessages, !canUseTools);
224
+ let systemPrompt = await resolveInstructionValue(instruction?.system?.value, void 0);
225
+ if (!canUseTools && toolCalls > 0) {
226
+ systemPrompt = [
227
+ systemPrompt,
228
+ [
229
+ "You have reached the tool-use limit.",
230
+ "Tool use is no longer available.",
231
+ "Do not output tool calls, function-call syntax, tool-call markup, or special tokens such as <|tool_calls_section_begin|>.",
232
+ "Do not request or suggest performing additional searches.",
233
+ "Do not say that you will search for more information.",
234
+ "Use only the information already available in the conversation and the tool results above.",
235
+ "Complete the CURRENT TASK using the available information."
236
+ ].join(" ")
237
+ ].filter(Boolean).join("\n\n");
238
+ }
189
239
  const converseCommandInput = {
190
240
  modelId: this.modelId,
191
241
  messages: brMessages,
@@ -196,6 +246,9 @@ var BedrockModel = class {
196
246
  topP: inference?.topP
197
247
  }
198
248
  };
249
+ if (this.guardrailConfig) {
250
+ converseCommandInput.guardrailConfig = this.guardrailConfig;
251
+ }
199
252
  const tools = canUseTools ? (await this.toolDispatcher.list()).map(BedrockAdapter.toBedrockTool) : [];
200
253
  if (tools.length > 0) {
201
254
  converseCommandInput.toolConfig = { tools };
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) 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);\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,\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}\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, 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}\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, GuardrailConfiguration } 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 private guardrailConfig?: GuardrailConfiguration;\n\n constructor(options: { region?: string; modelId: string; mcpConfig?:McpConfig, clientConfig?: BedrockRuntimeClientConfig; guardrailConfig?: { guardrailIdentifier: string; guardrailVersion?: string; }; })\n {\n this.toolDispatcher = new ToolDispatcher(options?.mcpConfig);\n this.modelId = options.modelId;\n\n if (options?.guardrailConfig?.guardrailIdentifier)\n {\n this.guardrailConfig = {\n guardrailIdentifier: options.guardrailConfig.guardrailIdentifier,\n guardrailVersion: options.guardrailConfig.guardrailVersion\n };\n }\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 if (this.guardrailConfig)\n {\n converseCommandInput.guardrailConfig = this.guardrailConfig;\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.9.0",
3
+ "version": "0.11.0",
4
4
  "description": "Bedrock provider for Miniwat",
5
5
  "homepage": "https://gitlab.com/mappies/miniwat-provider-bedrock#readme",
6
6
  "bugs": {
@@ -40,7 +40,7 @@
40
40
  "@types/node": "^25.6.0",
41
41
  "tsup": "^8.5.1",
42
42
  "typescript": "^5.9.3",
43
- "vitest": "^4.1.0"
43
+ "vitest": "^5.0.0"
44
44
  },
45
45
  "dependencies": {
46
46
  "@aws-sdk/client-bedrock-runtime": "^3.908.0",