@mappies/miniwat-provider-bedrock 0.1.0 → 0.3.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 +41 -15
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +41 -15
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -79,14 +79,21 @@ var BedrockAdapter = class {
|
|
|
79
79
|
).map((m) => {
|
|
80
80
|
const role = m.type === import_miniwat_api_core2.MessageType.User || m.type === import_miniwat_api_core2.MessageType.ToolResult ? "user" : "assistant";
|
|
81
81
|
const content = [];
|
|
82
|
-
if ((m.content ?? "").trim().length > 0) {
|
|
83
|
-
content.push({ text: m.content });
|
|
84
|
-
}
|
|
85
82
|
if (m.toolUse?.length) {
|
|
86
83
|
content.push(...m.toolUse.map((t) => ({ toolUse: t })));
|
|
84
|
+
} else if ((m.content ?? "").trim().length > 0) {
|
|
85
|
+
content.push({ text: m.content });
|
|
87
86
|
}
|
|
88
87
|
if (m.toolResult?.length) {
|
|
89
|
-
content.push(...m.toolResult.map((r) => ({
|
|
88
|
+
content.push(...m.toolResult.map((r) => ({
|
|
89
|
+
toolResult: {
|
|
90
|
+
...r,
|
|
91
|
+
status: r.status ? "success" : "error"
|
|
92
|
+
}
|
|
93
|
+
})));
|
|
94
|
+
}
|
|
95
|
+
if (content.length === 0) {
|
|
96
|
+
content.push({ text: "" });
|
|
90
97
|
}
|
|
91
98
|
return { role, content };
|
|
92
99
|
});
|
|
@@ -142,7 +149,7 @@ var BedrockAdapter = class {
|
|
|
142
149
|
// src/bedrockLlmProvider.ts
|
|
143
150
|
var BedrockLlmProvider = class {
|
|
144
151
|
constructor(options) {
|
|
145
|
-
this.toolDispatcher = new import_miniwat_mcp_core.ToolDispatcher();
|
|
152
|
+
this.toolDispatcher = new import_miniwat_mcp_core.ToolDispatcher(options?.mcpConfig);
|
|
146
153
|
this.modelId = options.modelId;
|
|
147
154
|
this.systemPrompt = options?.systemPrompt;
|
|
148
155
|
this.client = new import_client_bedrock_runtime.BedrockRuntimeClient({
|
|
@@ -203,11 +210,12 @@ var BedrockLlmProvider = class {
|
|
|
203
210
|
temperature: inference?.temperature ?? 0.2,
|
|
204
211
|
maxTokens: inference?.maxTokens,
|
|
205
212
|
topP: inference?.topP
|
|
206
|
-
},
|
|
207
|
-
toolConfig: {
|
|
208
|
-
tools: (await this.toolDispatcher.list()).map(BedrockAdapter.toBedrockTool)
|
|
209
213
|
}
|
|
210
214
|
};
|
|
215
|
+
let tools = (await this.toolDispatcher.list()).map(BedrockAdapter.toBedrockTool);
|
|
216
|
+
if (tools.length > 0) {
|
|
217
|
+
converseCommandInput.toolConfig = { tools };
|
|
218
|
+
}
|
|
211
219
|
if (options?.streaming) {
|
|
212
220
|
const res = await this.client.send(new import_client_bedrock_runtime.ConverseStreamCommand(converseCommandInput));
|
|
213
221
|
let chunks = [];
|
|
@@ -253,12 +261,20 @@ var BedrockLlmProvider = class {
|
|
|
253
261
|
const reason = event.messageStop.stopReason;
|
|
254
262
|
if (reason === "tool_use") {
|
|
255
263
|
if (!streamingStarted && chunks.length > 0) {
|
|
256
|
-
options.onThinking?.(chunks.join(""));
|
|
264
|
+
await options.onThinking?.(chunks.join(""));
|
|
257
265
|
chunks = [];
|
|
258
266
|
}
|
|
259
|
-
|
|
267
|
+
const toolUseMessage = BedrockMessage.toToolUseMessage("", toolUses);
|
|
268
|
+
currentMessages.push(toolUseMessage);
|
|
269
|
+
if (options?.onTooling) {
|
|
270
|
+
await options.onTooling(toolUseMessage);
|
|
271
|
+
}
|
|
260
272
|
const toolResults = await this.executeTools(toolUses, options);
|
|
261
|
-
|
|
273
|
+
const toolResultMessage = BedrockMessage.toToolResultMessage(toolResults);
|
|
274
|
+
currentMessages.push(toolResultMessage);
|
|
275
|
+
if (options?.onTooling) {
|
|
276
|
+
await options.onTooling(toolResultMessage);
|
|
277
|
+
}
|
|
262
278
|
break;
|
|
263
279
|
}
|
|
264
280
|
if (typeof reason === "string") {
|
|
@@ -290,9 +306,17 @@ var BedrockLlmProvider = class {
|
|
|
290
306
|
name: c.toolUse.name,
|
|
291
307
|
input: c.toolUse.input
|
|
292
308
|
}));
|
|
293
|
-
|
|
309
|
+
const toolUseMessage = BedrockMessage.toToolUseMessage("", toolUses);
|
|
310
|
+
currentMessages.push(toolUseMessage);
|
|
311
|
+
if (options?.onTooling) {
|
|
312
|
+
await options.onTooling(toolUseMessage);
|
|
313
|
+
}
|
|
294
314
|
const toolResults = await this.executeTools(toolUses, options);
|
|
295
|
-
|
|
315
|
+
const toolResultMessage = BedrockMessage.toToolResultMessage(toolResults);
|
|
316
|
+
currentMessages.push(toolResultMessage);
|
|
317
|
+
if (options?.onTooling) {
|
|
318
|
+
await options.onTooling(toolResultMessage);
|
|
319
|
+
}
|
|
296
320
|
continue;
|
|
297
321
|
}
|
|
298
322
|
const msg = BedrockMessage.toAssistantMessage(text);
|
|
@@ -307,7 +331,8 @@ var BedrockLlmProvider = class {
|
|
|
307
331
|
async invoke(messages, inference, callback) {
|
|
308
332
|
const response = await this.runConversationLoop(messages, inference, {
|
|
309
333
|
streaming: false,
|
|
310
|
-
onThinking: callback?.onThinking
|
|
334
|
+
onThinking: callback?.onThinking,
|
|
335
|
+
onTooling: callback?.onTooling
|
|
311
336
|
});
|
|
312
337
|
messages.push(response.message);
|
|
313
338
|
return new import_miniwat_api_core3.ResponseMessage({
|
|
@@ -323,7 +348,8 @@ var BedrockLlmProvider = class {
|
|
|
323
348
|
await this.runConversationLoop(messages, inference, {
|
|
324
349
|
streaming: true,
|
|
325
350
|
onChunk: (c) => out.write(c),
|
|
326
|
-
onThinking: callback?.onThinking
|
|
351
|
+
onThinking: callback?.onThinking,
|
|
352
|
+
onTooling: callback?.onTooling
|
|
327
353
|
});
|
|
328
354
|
out.write("");
|
|
329
355
|
out.end();
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/bedrockLlmProvider.ts","../src/bedrockMessage.ts","../src/bedrockAdapter.ts"],"sourcesContent":["export { BedrockLlmProvider } from './bedrockLlmProvider';","import { PassThrough, Readable } from \"stream\";\nimport { ResponseMessage, Message, LlmProvider, InferenceOptions, ToolUse, ToolResult } from '@mappies/miniwat-api-core'\nimport { ToolDispatcher } from '@mappies/miniwat-mcp-core'\nimport BedrockMessage from \"./bedrockMessage\";\nimport { BedrockRuntimeClient, ConverseCommand, ConverseStreamCommand, Message as BrMessage, StopReason, BedrockRuntimeClientConfig } from \"@aws-sdk/client-bedrock-runtime\";\nimport { BedrockAdapter } from \"./bedrockAdapter\";\n\nexport class BedrockLlmProvider implements LlmProvider\n{\n private modelId: string;\n private systemPrompt?: string;\n private toolDispatcher: ToolDispatcher;\n private client: BedrockRuntimeClient;\n\n constructor(options: { region?: string; modelId: string; systemPrompt?: string; clientConfig?: BedrockRuntimeClientConfig; })\n {\n this.toolDispatcher = new ToolDispatcher();\n this.modelId = options.modelId;\n this.systemPrompt = options?.systemPrompt;\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[], inference?: InferenceOptions, options?: { streaming?: boolean; onChunk?: (chunk: string) => void; onThinking?: (msg: string) => Promise<void>;}): 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 converseCommandInput = {\n modelId: this.modelId,\n messages: brMessages,\n system: this.systemPrompt ? [{ text: this.systemPrompt }] : undefined,\n inferenceConfig: {\n temperature: inference?.temperature ?? 0.2,\n maxTokens: inference?.maxTokens,\n topP: inference?.topP\n },\n toolConfig: {\n tools: (await this.toolDispatcher.list()).map(BedrockAdapter.toBedrockTool)\n }\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 options.onThinking?.(chunks.join(\"\"));\n chunks = [];\n }\n\n currentMessages.push(BedrockMessage.toToolUseMessage(assistantText, toolUses));\n\n const toolResults = await this.executeTools(toolUses, options);\n\n currentMessages.push(BedrockMessage.toToolResultMessage(toolResults));\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 currentMessages.push(BedrockMessage.toToolUseMessage(text, toolUses));\n\n const toolResults = await this.executeTools(toolUses, options);\n\n currentMessages.push(BedrockMessage.toToolResultMessage(toolResults));\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[], inference?: InferenceOptions, callback?: { onThinking: (s: string) => Promise<void>; }): Promise<ResponseMessage>\n {\n const response = await this.runConversationLoop(messages, inference, {\n streaming: false,\n onThinking: callback?.onThinking\n });\n\n messages.push(response.message);\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[], inference?: InferenceOptions, callback?: { onThinking: (s: string) => Promise<void>; }): Promise<Readable>\n {\n const out = new PassThrough({ encoding: \"utf8\" });\n\n (async () =>\n {\n try\n {\n await this.runConversationLoop(messages, inference, {\n streaming: true,\n onChunk: c => out.write(c),\n onThinking: callback?.onThinking\n });\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-api-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-api-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.content ?? \"\").trim().length > 0)\n {\n content.push({ text: m.content });\n }\n\n if (m.toolUse?.length)\n {\n content.push(...m.toolUse.map(t => ({ toolUse: t })));\n }\n\n if (m.toolResult?.length)\n {\n content.push(...m.toolResult.map(r => ({ toolResult: {...r, \"status\": r.status ? \"success\" : \"error\"} })));\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_api_core","import_miniwat_api_core"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/bedrockLlmProvider.ts","../src/bedrockMessage.ts","../src/bedrockAdapter.ts"],"sourcesContent":["export { BedrockLlmProvider } from './bedrockLlmProvider';","import { PassThrough, Readable } from \"stream\";\nimport { ResponseMessage, Message, LlmProvider, InferenceOptions, ToolUse, ToolResult } from '@mappies/miniwat-api-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 BedrockLlmProvider implements LlmProvider\n{\n private modelId: string;\n private systemPrompt?: string;\n private toolDispatcher: ToolDispatcher;\n private client: BedrockRuntimeClient;\n\n constructor(options: { region?: string; modelId: string; systemPrompt?: string; mcpConfig?:McpConfig, clientConfig?: BedrockRuntimeClientConfig; })\n {\n this.toolDispatcher = new ToolDispatcher(options?.mcpConfig);\n this.modelId = options.modelId;\n this.systemPrompt = options?.systemPrompt;\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 }): 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 converseCommandInput:ConverseStreamCommandInput = {\n modelId: this.modelId,\n messages: brMessages,\n system: this.systemPrompt ? [{ text: this.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[], inference?: InferenceOptions, callback?: { \n onThinking: (s: string) => Promise<void>,\n onTooling?: (msg: Message) => Promise<void> \n }): Promise<ResponseMessage>\n {\n const response = await this.runConversationLoop(messages, inference, {\n streaming: false,\n onThinking: callback?.onThinking,\n onTooling: callback?.onTooling\n });\n\n messages.push(response.message);\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[], inference?: InferenceOptions, callback?: { \n onThinking: (s: string) => Promise<void>,\n onTooling?: (msg: Message) => Promise<void> \n }): Promise<Readable>\n {\n const out = new PassThrough({ encoding: \"utf8\" });\n\n (async () =>\n {\n try\n {\n await this.runConversationLoop(messages, inference, {\n streaming: true,\n onChunk: c => out.write(c),\n onThinking: callback?.onThinking,\n onTooling: callback?.onTooling\n });\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-api-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-api-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":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,oBAAsC;AACtC,IAAAA,2BAA6F;AAC7F,8BAA0C;;;ACF1C,8BAA0D;AAE1D,IAAqB,iBAArB,cAA4C,gCAC5C;AAAA,EACI,YAAY,MACZ;AACI,UAAM,IAAI;AAAA,EACd;AAAA,EAEA,OAAc,mBAAmB,MACjC;AACI,WAAO,IAAI,gCAAQ;AAAA,MACf,MAAM,oCAAY;AAAA,MAClB,SAAS;AAAA,MACT,mBAAkB,oBAAI,KAAK,GAAE,YAAY;AAAA,IAC7C,CAAC;AAAA,EACL;AAAA,EAEA,OAAc,iBAAiB,MAAa,UAC5C;AACI,WAAO,IAAI,gCAAQ;AAAA,MACX,MAAM,oCAAY;AAAA,MAClB,SAAS;AAAA,MACT,mBAAkB,oBAAI,KAAK,GAAE,YAAY;AAAA,MACzC,SAAS,SAAS,IAAI,CAAC,EAAE,WAAW,MAAM,MAAM,OAAgB,EAAE,WAAW,MAAM,MAAM,EAAE;AAAA,IACnG,CAAC;AAAA,EACL;AAAA,EAEA,OAAc,oBAAoB,YAClC;AACI,WAAO,IAAI,gCAAQ;AAAA,MACf,MAAM,oCAAY;AAAA,MAClB;AAAA,IACJ,CAAC;AAAA,EACL;AACJ;;;AD/BA,oCAAuK;;;AEJvK,IAAAC,2BAA2C;AAGpC,IAAM,iBAAN,MACP;AAAA,EACI,OAAO,cAAc,MACrB;AACI,WAAO;AAAA,MACH,UAAU;AAAA,QACN,MAAM,KAAK;AAAA,QACX,aAAa,KAAK;AAAA,QAClB,aAAa,EAAE,MAAM,KAAK,OAAO;AAAA,MACrC;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,OAAO,kBAAkB,SACzB;AACI,WAAO,QACF;AAAA,MAAO,QACH,EAAE,WAAW,IAAI,KAAK,EAAE,SAAS,MACjC,EAAE,SAAS,UAAU,KAAK,MAC1B,EAAE,YAAY,UAAU,KAAK;AAAA,IAClC,EACC,IAAI,OACL;AACI,YAAM,OAAO,EAAE,SAAS,qCAAY,QAAQ,EAAE,SAAS,qCAAY,aACpD,SACA;AAEf,YAAM,UAAiB,CAAC;AAExB,UAAI,EAAE,SAAS,QACf;AACI,gBAAQ,KAAK,GAAG,EAAE,QAAQ,IAAI,QAAM,EAAE,SAAS,EAAE,EAAE,CAAC;AAAA,MACxD,YACU,EAAE,WAAW,IAAI,KAAK,EAAE,SAAS,GAC3C;AACI,gBAAQ,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC;AAAA,MACpC;AAEA,UAAI,EAAE,YAAY,QAClB;AACI,gBAAQ,KAAK,GAAG,EAAE,WAAW,IAAI,QAAM;AAAA,UACnC,YAAY;AAAA,YACR,GAAG;AAAA,YACH,QAAQ,EAAE,SAAS,YAAY;AAAA,UACnC;AAAA,QACJ,EAAE,CAAC;AAAA,MACP;AAEA,UAAI,QAAQ,WAAW,GACvB;AACI,gBAAQ,KAAK,EAAE,MAAM,GAAG,CAAC;AAAA,MAC7B;AAEA,aAAO,EAAE,MAAM,QAAQ;AAAA,IAC3B,CAAC;AAAA,EACT;AAAA,EAEA,OAAO,oBAAoB,QAC3B;AACI,QACA;AACI,UAAG,kBAAkB,OACrB;AACI,eAAO,CAAC,EAAE,MAAM,OAAO,QAAQ,CAAC;AAAA,MACpC;AAEA,UAAG,WAAW,QAAQ,WAAW,UAAa,WAAW,IACzD;AACI,eAAO,CAAC,EAAE,MAAM,GAAG,CAAC;AAAA,MACxB;AAEA,UAAG,OAAO,WAAW,UACrB;AACI,YAAI,OAAO,KAAK,MAAM,KAAK,UAAU,MAAM,CAAC;AAE5C,YAAG,MAAM,QAAQ,IAAI,GACrB;AACI,iBAAO,EAAE,QAAQ,KAAK;AAAA,QAC1B;AAEA,eAAO,CAAC,EAAE,KAAK,CAAC;AAAA,MACpB;AAEA,aAAO,CAAC,EAAE,MAAM,OAAO,MAAM,EAAE,CAAC;AAAA,IACpC,SACO,GACP;AACI,YAAM,UAAU,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AAEzD,aAAO,CAAC;AAAA,QACJ,MAAM;AAAA,UACF,OAAO;AAAA,UACP;AAAA,QACJ;AAAA,MACJ,CAAC;AAAA,IACL;AAAA,EACJ;AAAA,EAEA,OAAO,6CAA6C,YACpD;AACI,YAAQ,YACR;AAAA,MACI,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX;AACI,eAAO;AAAA,IACf;AAAA,EACJ;AACJ;;;AFpHO,IAAM,qBAAN,MACP;AAAA,EAMI,YAAY,SACZ;AACI,SAAK,iBAAiB,IAAI,uCAAe,SAAS,SAAS;AAC3D,SAAK,UAAU,QAAQ;AACvB,SAAK,eAAe,SAAS;AAE7B,SAAK,SAAS,IAAI,mDAAqB;AAAA,MACnC,QAAQ,SAAS,UAAU,QAAQ,IAAI,sBAAsB,QAAQ,IAAI;AAAA,MACzE,GAAG,SAAS;AAAA,IAChB,CAAC;AAAA,EACL;AAAA,EAEA,MAAc,mBAAmB,QAAkB,OACnD;AACI,eAAU,SAAS,QACnB;AACI,YAAM,KAAK;AACX,YAAM,IAAI,QAAQ,OAAK,WAAW,GAAG,IAAI,KAAK,OAAO,IAAI,EAAE,CAAC;AAAA,IAChE;AAAA,EACJ;AAAA,EAEQ,qBAAqB,KAAU,UACvC;AACI,UAAM,UAAU,KAAK,QAAQ,SAAS,WAAW,CAAC;AAClD,QAAI,OAAO,QAAQ,IAAI,CAAC,MAAW,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE;AAExD,QAAG,CAAC,MACJ;AACI,aAAO,eAAe,6CAA6C,IAAI,UAAU;AAAA,IACrF;AAEA,WAAO;AAAA,EACX;AAAA,EAEA,MAAc,aAAa,UAAqB,MAChD;AACI,UAAM,UAAwB,CAAC;AAE/B,eAAU,WAAW,UACrB;AACI,UACA;AACI,cAAM,gBAAgB,KAAK,eAAe,QAAQ,QAAQ,MAAM,QAAQ,KAAK;AAG7E,YAAI,MAAM,cAAc,QAAQ,MAChC;AACI,gBAAM,YAAY,MAAM,KAAK,eAAe,aAAa,QAAQ,MAAM,QAAQ,KAAK;AACpF,cAAG,UAAW,MAAK,WAAW,SAAS;AAAA,QAC3C;AAEA,cAAM,SAAS,MAAM;AAErB,gBAAQ,KAAK;AAAA,UACT,WAAW,QAAQ;AAAA,UACnB,SAAS,eAAe,oBAAoB,MAAM;AAAA,UAClD,QAAQ;AAAA,QACZ,CAAC;AAAA,MACL,SACM,KACN;AACI,gBAAQ,KAAK;AAAA,UACT,WAAW,QAAQ;AAAA,UACnB,SAAS,eAAe,oBAAoB,GAAG;AAAA,UAC/C,QAAQ;AAAA,QACZ,CAAC;AAAA,MACL;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA,EAEA,MAAc,oBAAoB,UACA,WACA,SAKlC;AACI,QAAI,kBAAkB,CAAC,GAAG,QAAQ;AAClC,QAAI,aAAa;AAEjB,WAAM,MACN;AACI,UAAI,EAAE,aAAa,GAAI,OAAM,IAAI,MAAM,0BAA0B;AAEjE,YAAM,aAAa,eAAe,kBAAkB,eAAe;AAEnE,YAAM,uBAAkD;AAAA,QACxB,SAAS,KAAK;AAAA,QACd,UAAU;AAAA,QACV,QAAQ,KAAK,eAAe,CAAC,EAAE,MAAM,KAAK,aAAa,CAAC,IAAI;AAAA,QAC5D,iBAAiB;AAAA,UACb,aAAa,WAAW,eAAe;AAAA,UACvC,WAAW,WAAW;AAAA,UACtB,MAAM,WAAW;AAAA,QACrB;AAAA,MACJ;AAE5B,UAAI,SAAS,MAAM,KAAK,eAAe,KAAK,GAAG,IAAI,eAAe,aAAa;AAE/E,UAAG,MAAM,SAAS,GAClB;AACI,6BAAqB,aAAa,EAAE,MAAM;AAAA,MAC9C;AAEA,UAAI,SAAS,WACb;AACI,cAAM,MAAM,MAAM,KAAK,OAAO,KAAK,IAAI,oDAAsB,oBAAoB,CAAC;AAElF,YAAI,SAAmB,CAAC;AACxB,YAAI,mBAAmB;AACvB,YAAI,WAAsB,CAAC;AAC3B,YAAI;AACJ,YAAI,gBAAgB;AAEpB,yBAAiB,SAAS,IAAI,UAAU,CAAC,GACzC;AAEI,cAAI,MAAM,2BACV;AACI,kBAAM,IAAI,MAAM,MAAM,2BAA2B,WAAW,oBAAoB;AAAA,UACpF;AAEA,cAAI,MAAM,mBAAmB,OAAO,MACpC;AACI,kBAAM,QAAQ,MAAM,kBAAkB,MAAM;AAC5C,6BAAiB;AAEjB,gBAAI,CAAC,kBACL;AACI,qBAAO,KAAK,KAAK;AAEjB,kBAAI,OAAO,SAAS,IACpB;AACI,mCAAmB;AACnB,sBAAM,KAAK,mBAAmB,QAAQ,QAAQ,OAAQ;AACtD,yBAAS,CAAC;AAAA,cACd;AAAA,YACJ,OAEA;AACI,sBAAQ,UAAU,KAAK;AAAA,YAC3B;AAAA,UACJ;AAEA,cAAI,MAAM,mBAAmB,OAAO,SACpC;AACI,6BAAiB;AAAA,cACb,WAAW,MAAM,kBAAkB,MAAM,QAAQ;AAAA,cACjD,MAAM,MAAM,kBAAkB,MAAM,QAAQ;AAAA,cAC5C,aAAa;AAAA,YACjB;AACA,qBAAS,KAAK,cAAc;AAAA,UAChC;AAEA,cAAI,kBAAkB,MAAM,mBAAmB,OAAO,SAAS,OAC/D;AACI,2BAAe,eAAe,MAAM,kBAAkB,MAAM,QAAQ;AAAA,UACxE;AAEA,cAAI,MAAM,oBAAoB,gBAAgB,aAC9C;AACI,2BAAe,QAAQ,KAAK,MAAM,eAAe,WAAW;AAC5D,mBAAO,eAAe;AACtB,6BAAiB;AAAA,UACrB;AAEA,cAAI,MAAM,aACV;AACI,kBAAM,SAAS,MAAM,YAAY;AAEjC,gBAAI,WAAW,YACf;AAEI,kBAAI,CAAC,oBAAoB,OAAO,SAAS,GACzC;AACI,sBAAM,QAAQ,aAAa,OAAO,KAAK,EAAE,CAAC;AAC1C,yBAAS,CAAC;AAAA,cACd;AAEA,oBAAM,iBAAiB,eAAe,iBAAiB,IAAI,QAAQ;AACnE,8BAAgB,KAAK,cAAc;AACnC,kBAAG,SAAS,WAAW;AAAE,sBAAM,QAAQ,UAAU,cAAc;AAAA,cAAC;AAEhE,oBAAM,cAAc,MAAM,KAAK,aAAa,UAAU,OAAO;AAE7D,oBAAM,oBAAoB,eAAe,oBAAoB,WAAW;AACxE,8BAAgB,KAAK,iBAAiB;AACtC,kBAAG,SAAS,WAAW;AAAE,sBAAM,QAAQ,UAAU,iBAAiB;AAAA,cAAC;AAEnE;AAAA,YACJ;AAEA,gBAAI,OAAO,WAAW,UACtB;AACI,kBAAI,4BAA4B,KAAK,MAAM,GAC3C;AACI,sBAAM,IAAI,MAAM,iDAAiD,MAAM;AAAA,cAC3E,WACS,WAAW,cACpB;AACI,wBAAQ,UAAU,eAAe,6CAA6C,MAAM,CAAC;AAAA,cACzF,WACS,CAAC,kBACV;AACI,oBAAI,OAAO,SAAS,GACpB;AACI,wBAAM,KAAK,mBAAmB,QAAQ,QAAQ,OAAQ;AAAA,gBAC1D,OACA;AACI,0BAAQ,UAAU,eAAe,6CAA6C,MAAM,CAAC;AAAA,gBACzF;AAAA,cACJ;AAAA,YACJ;AAEA,mBAAO;AAAA,cACH,SAAS,eAAe,mBAAmB,aAAa;AAAA,cACxD,YAAY;AAAA,YAChB;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ,OAEA;AACI,cAAM,MAAM,MAAM,KAAK,OAAO,KAAK,IAAI,8CAAgB,oBAAoB,CAAC;AAC5E,cAAM,OAAO,KAAK,qBAAqB,KAAK,UAAU;AAEtD,cAAM,UAAU,KAAK,QAAQ,SAAS,WAAW,CAAC;AAElD,YAAI,IAAI,eAAe,YACvB;AACI,gBAAM,WAAW,QAAQ,OAAO,CAAC,MAAW,EAAE,OAAO,EAC5B,IAAI,CAAC,OAAY;AAAA,YACd,WAAW,EAAE,QAAQ;AAAA,YACrB,MAAM,EAAE,QAAQ;AAAA,YAChB,OAAO,EAAE,QAAQ;AAAA,UACrB,EAAE;AAE1B,gBAAM,iBAAiB,eAAe,iBAAiB,IAAI,QAAQ;AACnE,0BAAgB,KAAK,cAAc;AACnC,cAAG,SAAS,WAAW;AAAE,kBAAM,QAAQ,UAAU,cAAc;AAAA,UAAC;AAEhE,gBAAM,cAAc,MAAM,KAAK,aAAa,UAAU,OAAO;AAE7D,gBAAM,oBAAoB,eAAe,oBAAoB,WAAW;AACxE,0BAAgB,KAAK,iBAAiB;AACtC,cAAG,SAAS,WAAW;AAAE,kBAAM,QAAQ,UAAU,iBAAiB;AAAA,UAAC;AAEnE;AAAA,QACJ;AAEA,cAAM,MAAM,eAAe,mBAAmB,IAAI;AAElD,eAAO;AAAA,UACH,SAAS;AAAA,UACT,YAAY,IAAI;AAAA,UAChB,OAAO,IAAI;AAAA,QACf;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAM,OAAO,UAAqB,WAA8B,UAIhE;AACI,UAAM,WAAW,MAAM,KAAK,oBAAoB,UAAU,WAAW;AAAA,MACjE,WAAW;AAAA,MACX,YAAY,UAAU;AAAA,MACtB,WAAW,UAAU;AAAA,IACzB,CAAC;AAED,aAAS,KAAK,SAAS,OAAO;AAE9B,WAAO,IAAI,yCAAgB;AAAA,MACvB,YAAY,SAAS;AAAA,MACrB,YAAY,SAAS;AAAA,MACrB,SAAS,SAAS;AAAA,IACtB,CAAC;AAAA,EACL;AAAA,EAEA,MAAM,OAAO,UAAqB,WAA8B,UAIhE;AACI,UAAM,MAAM,IAAI,0BAAY,EAAE,UAAU,OAAO,CAAC;AAEhD,KAAC,YACD;AACI,UACA;AACI,cAAM,KAAK,oBAAoB,UAAU,WAAW;AAAA,UAChD,WAAW;AAAA,UACX,SAAS,OAAK,IAAI,MAAM,CAAC;AAAA,UACzB,YAAY,UAAU;AAAA,UACtB,WAAW,UAAU;AAAA,QACzB,CAAC;AAED,YAAI,MAAM,EAAE;AACZ,YAAI,IAAI;AAAA,MACZ,SACO,GACP;AACI,YAAI,KAAK,SAAS,CAAC;AACnB,YAAI,MAAM,EAAE;AACZ,YAAI,IAAI;AAAA,MACZ;AAAA,IACJ,GAAG;AAEH,WAAO;AAAA,EACX;AACJ;","names":["import_miniwat_api_core","import_miniwat_api_core"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Readable } from 'stream';
|
|
2
2
|
import { LlmProvider, Message, InferenceOptions, ResponseMessage } from '@mappies/miniwat-api-core';
|
|
3
|
+
import { McpConfig } from '@mappies/miniwat-mcp-core';
|
|
3
4
|
import { BedrockRuntimeClientConfig } from '@aws-sdk/client-bedrock-runtime';
|
|
4
5
|
|
|
5
6
|
declare class BedrockLlmProvider implements LlmProvider {
|
|
@@ -11,6 +12,7 @@ declare class BedrockLlmProvider implements LlmProvider {
|
|
|
11
12
|
region?: string;
|
|
12
13
|
modelId: string;
|
|
13
14
|
systemPrompt?: string;
|
|
15
|
+
mcpConfig?: McpConfig;
|
|
14
16
|
clientConfig?: BedrockRuntimeClientConfig;
|
|
15
17
|
});
|
|
16
18
|
private streamBufferedText;
|
|
@@ -19,9 +21,11 @@ declare class BedrockLlmProvider implements LlmProvider {
|
|
|
19
21
|
private runConversationLoop;
|
|
20
22
|
invoke(messages: Message[], inference?: InferenceOptions, callback?: {
|
|
21
23
|
onThinking: (s: string) => Promise<void>;
|
|
24
|
+
onTooling?: (msg: Message) => Promise<void>;
|
|
22
25
|
}): Promise<ResponseMessage>;
|
|
23
26
|
stream(messages: Message[], inference?: InferenceOptions, callback?: {
|
|
24
27
|
onThinking: (s: string) => Promise<void>;
|
|
28
|
+
onTooling?: (msg: Message) => Promise<void>;
|
|
25
29
|
}): Promise<Readable>;
|
|
26
30
|
}
|
|
27
31
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Readable } from 'stream';
|
|
2
2
|
import { LlmProvider, Message, InferenceOptions, ResponseMessage } from '@mappies/miniwat-api-core';
|
|
3
|
+
import { McpConfig } from '@mappies/miniwat-mcp-core';
|
|
3
4
|
import { BedrockRuntimeClientConfig } from '@aws-sdk/client-bedrock-runtime';
|
|
4
5
|
|
|
5
6
|
declare class BedrockLlmProvider implements LlmProvider {
|
|
@@ -11,6 +12,7 @@ declare class BedrockLlmProvider implements LlmProvider {
|
|
|
11
12
|
region?: string;
|
|
12
13
|
modelId: string;
|
|
13
14
|
systemPrompt?: string;
|
|
15
|
+
mcpConfig?: McpConfig;
|
|
14
16
|
clientConfig?: BedrockRuntimeClientConfig;
|
|
15
17
|
});
|
|
16
18
|
private streamBufferedText;
|
|
@@ -19,9 +21,11 @@ declare class BedrockLlmProvider implements LlmProvider {
|
|
|
19
21
|
private runConversationLoop;
|
|
20
22
|
invoke(messages: Message[], inference?: InferenceOptions, callback?: {
|
|
21
23
|
onThinking: (s: string) => Promise<void>;
|
|
24
|
+
onTooling?: (msg: Message) => Promise<void>;
|
|
22
25
|
}): Promise<ResponseMessage>;
|
|
23
26
|
stream(messages: Message[], inference?: InferenceOptions, callback?: {
|
|
24
27
|
onThinking: (s: string) => Promise<void>;
|
|
28
|
+
onTooling?: (msg: Message) => Promise<void>;
|
|
25
29
|
}): Promise<Readable>;
|
|
26
30
|
}
|
|
27
31
|
|
package/dist/index.js
CHANGED
|
@@ -53,14 +53,21 @@ var BedrockAdapter = class {
|
|
|
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.content ?? "").trim().length > 0) {
|
|
57
|
-
content.push({ text: m.content });
|
|
58
|
-
}
|
|
59
56
|
if (m.toolUse?.length) {
|
|
60
57
|
content.push(...m.toolUse.map((t) => ({ toolUse: t })));
|
|
58
|
+
} else if ((m.content ?? "").trim().length > 0) {
|
|
59
|
+
content.push({ text: m.content });
|
|
61
60
|
}
|
|
62
61
|
if (m.toolResult?.length) {
|
|
63
|
-
content.push(...m.toolResult.map((r) => ({
|
|
62
|
+
content.push(...m.toolResult.map((r) => ({
|
|
63
|
+
toolResult: {
|
|
64
|
+
...r,
|
|
65
|
+
status: r.status ? "success" : "error"
|
|
66
|
+
}
|
|
67
|
+
})));
|
|
68
|
+
}
|
|
69
|
+
if (content.length === 0) {
|
|
70
|
+
content.push({ text: "" });
|
|
64
71
|
}
|
|
65
72
|
return { role, content };
|
|
66
73
|
});
|
|
@@ -116,7 +123,7 @@ var BedrockAdapter = class {
|
|
|
116
123
|
// src/bedrockLlmProvider.ts
|
|
117
124
|
var BedrockLlmProvider = class {
|
|
118
125
|
constructor(options) {
|
|
119
|
-
this.toolDispatcher = new ToolDispatcher();
|
|
126
|
+
this.toolDispatcher = new ToolDispatcher(options?.mcpConfig);
|
|
120
127
|
this.modelId = options.modelId;
|
|
121
128
|
this.systemPrompt = options?.systemPrompt;
|
|
122
129
|
this.client = new BedrockRuntimeClient({
|
|
@@ -177,11 +184,12 @@ var BedrockLlmProvider = class {
|
|
|
177
184
|
temperature: inference?.temperature ?? 0.2,
|
|
178
185
|
maxTokens: inference?.maxTokens,
|
|
179
186
|
topP: inference?.topP
|
|
180
|
-
},
|
|
181
|
-
toolConfig: {
|
|
182
|
-
tools: (await this.toolDispatcher.list()).map(BedrockAdapter.toBedrockTool)
|
|
183
187
|
}
|
|
184
188
|
};
|
|
189
|
+
let tools = (await this.toolDispatcher.list()).map(BedrockAdapter.toBedrockTool);
|
|
190
|
+
if (tools.length > 0) {
|
|
191
|
+
converseCommandInput.toolConfig = { tools };
|
|
192
|
+
}
|
|
185
193
|
if (options?.streaming) {
|
|
186
194
|
const res = await this.client.send(new ConverseStreamCommand(converseCommandInput));
|
|
187
195
|
let chunks = [];
|
|
@@ -227,12 +235,20 @@ var BedrockLlmProvider = class {
|
|
|
227
235
|
const reason = event.messageStop.stopReason;
|
|
228
236
|
if (reason === "tool_use") {
|
|
229
237
|
if (!streamingStarted && chunks.length > 0) {
|
|
230
|
-
options.onThinking?.(chunks.join(""));
|
|
238
|
+
await options.onThinking?.(chunks.join(""));
|
|
231
239
|
chunks = [];
|
|
232
240
|
}
|
|
233
|
-
|
|
241
|
+
const toolUseMessage = BedrockMessage.toToolUseMessage("", toolUses);
|
|
242
|
+
currentMessages.push(toolUseMessage);
|
|
243
|
+
if (options?.onTooling) {
|
|
244
|
+
await options.onTooling(toolUseMessage);
|
|
245
|
+
}
|
|
234
246
|
const toolResults = await this.executeTools(toolUses, options);
|
|
235
|
-
|
|
247
|
+
const toolResultMessage = BedrockMessage.toToolResultMessage(toolResults);
|
|
248
|
+
currentMessages.push(toolResultMessage);
|
|
249
|
+
if (options?.onTooling) {
|
|
250
|
+
await options.onTooling(toolResultMessage);
|
|
251
|
+
}
|
|
236
252
|
break;
|
|
237
253
|
}
|
|
238
254
|
if (typeof reason === "string") {
|
|
@@ -264,9 +280,17 @@ var BedrockLlmProvider = class {
|
|
|
264
280
|
name: c.toolUse.name,
|
|
265
281
|
input: c.toolUse.input
|
|
266
282
|
}));
|
|
267
|
-
|
|
283
|
+
const toolUseMessage = BedrockMessage.toToolUseMessage("", toolUses);
|
|
284
|
+
currentMessages.push(toolUseMessage);
|
|
285
|
+
if (options?.onTooling) {
|
|
286
|
+
await options.onTooling(toolUseMessage);
|
|
287
|
+
}
|
|
268
288
|
const toolResults = await this.executeTools(toolUses, options);
|
|
269
|
-
|
|
289
|
+
const toolResultMessage = BedrockMessage.toToolResultMessage(toolResults);
|
|
290
|
+
currentMessages.push(toolResultMessage);
|
|
291
|
+
if (options?.onTooling) {
|
|
292
|
+
await options.onTooling(toolResultMessage);
|
|
293
|
+
}
|
|
270
294
|
continue;
|
|
271
295
|
}
|
|
272
296
|
const msg = BedrockMessage.toAssistantMessage(text);
|
|
@@ -281,7 +305,8 @@ var BedrockLlmProvider = class {
|
|
|
281
305
|
async invoke(messages, inference, callback) {
|
|
282
306
|
const response = await this.runConversationLoop(messages, inference, {
|
|
283
307
|
streaming: false,
|
|
284
|
-
onThinking: callback?.onThinking
|
|
308
|
+
onThinking: callback?.onThinking,
|
|
309
|
+
onTooling: callback?.onTooling
|
|
285
310
|
});
|
|
286
311
|
messages.push(response.message);
|
|
287
312
|
return new ResponseMessage({
|
|
@@ -297,7 +322,8 @@ var BedrockLlmProvider = class {
|
|
|
297
322
|
await this.runConversationLoop(messages, inference, {
|
|
298
323
|
streaming: true,
|
|
299
324
|
onChunk: (c) => out.write(c),
|
|
300
|
-
onThinking: callback?.onThinking
|
|
325
|
+
onThinking: callback?.onThinking,
|
|
326
|
+
onTooling: callback?.onTooling
|
|
301
327
|
});
|
|
302
328
|
out.write("");
|
|
303
329
|
out.end();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/bedrockLlmProvider.ts","../src/bedrockMessage.ts","../src/bedrockAdapter.ts"],"sourcesContent":["import { PassThrough, Readable } from \"stream\";\nimport { ResponseMessage, Message, LlmProvider, InferenceOptions, ToolUse, ToolResult } from '@mappies/miniwat-api-core'\nimport { ToolDispatcher } from '@mappies/miniwat-mcp-core'\nimport BedrockMessage from \"./bedrockMessage\";\nimport { BedrockRuntimeClient, ConverseCommand, ConverseStreamCommand, Message as BrMessage, StopReason, BedrockRuntimeClientConfig } from \"@aws-sdk/client-bedrock-runtime\";\nimport { BedrockAdapter } from \"./bedrockAdapter\";\n\nexport class BedrockLlmProvider implements LlmProvider\n{\n private modelId: string;\n private systemPrompt?: string;\n private toolDispatcher: ToolDispatcher;\n private client: BedrockRuntimeClient;\n\n constructor(options: { region?: string; modelId: string; systemPrompt?: string; clientConfig?: BedrockRuntimeClientConfig; })\n {\n this.toolDispatcher = new ToolDispatcher();\n this.modelId = options.modelId;\n this.systemPrompt = options?.systemPrompt;\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[], inference?: InferenceOptions, options?: { streaming?: boolean; onChunk?: (chunk: string) => void; onThinking?: (msg: string) => Promise<void>;}): 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 converseCommandInput = {\n modelId: this.modelId,\n messages: brMessages,\n system: this.systemPrompt ? [{ text: this.systemPrompt }] : undefined,\n inferenceConfig: {\n temperature: inference?.temperature ?? 0.2,\n maxTokens: inference?.maxTokens,\n topP: inference?.topP\n },\n toolConfig: {\n tools: (await this.toolDispatcher.list()).map(BedrockAdapter.toBedrockTool)\n }\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 options.onThinking?.(chunks.join(\"\"));\n chunks = [];\n }\n\n currentMessages.push(BedrockMessage.toToolUseMessage(assistantText, toolUses));\n\n const toolResults = await this.executeTools(toolUses, options);\n\n currentMessages.push(BedrockMessage.toToolResultMessage(toolResults));\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 currentMessages.push(BedrockMessage.toToolUseMessage(text, toolUses));\n\n const toolResults = await this.executeTools(toolUses, options);\n\n currentMessages.push(BedrockMessage.toToolResultMessage(toolResults));\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[], inference?: InferenceOptions, callback?: { onThinking: (s: string) => Promise<void>; }): Promise<ResponseMessage>\n {\n const response = await this.runConversationLoop(messages, inference, {\n streaming: false,\n onThinking: callback?.onThinking\n });\n\n messages.push(response.message);\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[], inference?: InferenceOptions, callback?: { onThinking: (s: string) => Promise<void>; }): Promise<Readable>\n {\n const out = new PassThrough({ encoding: \"utf8\" });\n\n (async () =>\n {\n try\n {\n await this.runConversationLoop(messages, inference, {\n streaming: true,\n onChunk: c => out.write(c),\n onThinking: callback?.onThinking\n });\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-api-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-api-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.content ?? \"\").trim().length > 0)\n {\n content.push({ text: m.content });\n }\n\n if (m.toolUse?.length)\n {\n content.push(...m.toolUse.map(t => ({ toolUse: t })));\n }\n\n if (m.toolResult?.length)\n {\n content.push(...m.toolResult.map(r => ({ toolResult: {...r, \"status\": r.status ? \"success\" : \"error\"} })));\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/bedrockLlmProvider.ts","../src/bedrockMessage.ts","../src/bedrockAdapter.ts"],"sourcesContent":["import { PassThrough, Readable } from \"stream\";\nimport { ResponseMessage, Message, LlmProvider, InferenceOptions, ToolUse, ToolResult } from '@mappies/miniwat-api-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 BedrockLlmProvider implements LlmProvider\n{\n private modelId: string;\n private systemPrompt?: string;\n private toolDispatcher: ToolDispatcher;\n private client: BedrockRuntimeClient;\n\n constructor(options: { region?: string; modelId: string; systemPrompt?: string; mcpConfig?:McpConfig, clientConfig?: BedrockRuntimeClientConfig; })\n {\n this.toolDispatcher = new ToolDispatcher(options?.mcpConfig);\n this.modelId = options.modelId;\n this.systemPrompt = options?.systemPrompt;\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 }): 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 converseCommandInput:ConverseStreamCommandInput = {\n modelId: this.modelId,\n messages: brMessages,\n system: this.systemPrompt ? [{ text: this.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[], inference?: InferenceOptions, callback?: { \n onThinking: (s: string) => Promise<void>,\n onTooling?: (msg: Message) => Promise<void> \n }): Promise<ResponseMessage>\n {\n const response = await this.runConversationLoop(messages, inference, {\n streaming: false,\n onThinking: callback?.onThinking,\n onTooling: callback?.onTooling\n });\n\n messages.push(response.message);\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[], inference?: InferenceOptions, callback?: { \n onThinking: (s: string) => Promise<void>,\n onTooling?: (msg: Message) => Promise<void> \n }): Promise<Readable>\n {\n const out = new PassThrough({ encoding: \"utf8\" });\n\n (async () =>\n {\n try\n {\n await this.runConversationLoop(messages, inference, {\n streaming: true,\n onChunk: c => out.write(c),\n onThinking: callback?.onThinking,\n onTooling: callback?.onTooling\n });\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-api-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-api-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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mappies/miniwat-provider-bedrock",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Bedrock provider for Miniwat",
|
|
5
5
|
"homepage": "https://github.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-api-core": "^0.
|
|
47
|
+
"@mappies/miniwat-api-core": "^0.4.0",
|
|
48
48
|
"@mappies/miniwat-mcp-core": "^0.2.0"
|
|
49
49
|
}
|
|
50
50
|
}
|