npm install ai @ai-sdk/amazon-bedrock @doconda/sdk
With the AI SDK
Credentials come from your AWS environment (AWS_REGION, AWS_ACCESS_KEY_ID…), like the rest of your code.
import { bedrock } from "@ai-sdk/amazon-bedrock"
import { generateText, isStepCount, jsonSchema, tool } from "ai"
import { Doconda } from "@doconda/sdk"
const doconda = new Doconda()
const tools = Object.fromEntries(
doconda.tools().map((t) => [
t.name,
tool({ description: t.description, inputSchema: jsonSchema(t.inputSchema), execute: (input) => t.run(input as Record<string, unknown>) }),
]),
)
const { text } = await generateText({
model: bedrock(process.env.BEDROCK_MODEL_ID!), // any model enabled in your Bedrock account
tools,
stopWhen: isStepCount(5),
prompt: "Create a 5-slide presentation on our quarterly results",
})
With the Converse API (@aws-sdk/client-bedrock-runtime)
With the Converse API (@aws-sdk/client-bedrock-runtime)
npm install @aws-sdk/client-bedrock-runtime @doconda/sdk
import { BedrockRuntimeClient, ConverseCommand, type Message } from "@aws-sdk/client-bedrock-runtime"
import { Doconda } from "@doconda/sdk"
const bedrock = new BedrockRuntimeClient({})
const tools = new Doconda().tools()
const toolConfig = { tools: tools.map((t) => ({ toolSpec: { name: t.name, description: t.description, inputSchema: { json: t.inputSchema } } })) }
const messages: Message[] = [{ role: "user", content: [{ text: "Make me an Excel file with the event budget" }] }]
while (true) {
const res = await bedrock.send(new ConverseCommand({ modelId: process.env.BEDROCK_MODEL_ID, messages, toolConfig }))
const message = res.output?.message
if (!message) break
messages.push(message)
if (res.stopReason !== "tool_use") break
const content = await Promise.all(
message.content!.filter((b) => b.toolUse).map(async ({ toolUse }) => {
const result = await tools.find((t) => t.name === toolUse!.name)!.run(toolUse!.input as Record<string, unknown>)
return { toolResult: { toolUseId: toolUse!.toolUseId, content: [{ text: JSON.stringify(result) }] } }
}),
)
messages.push({ role: "user", content })
}