import Anthropic from "@anthropic-ai/sdk";
import { ReaderClient } from "@vakra-dev/reader-js";
const anthropic = new Anthropic();
const reader = new ReaderClient({ apiKey: process.env.READER_KEY! });
async function runAgent(userMessage: string) {
const messages: any[] = [{ role: "user", content: userMessage }];
while (true) {
const response = await anthropic.messages.create({
model: "claude-opus-4-6",
max_tokens: 2048,
tools,
messages,
});
if (response.stop_reason === "end_turn") {
return response.content.find((c: any) => c.type === "text")?.text ?? "";
}
if (response.stop_reason === "tool_use") {
messages.push({ role: "assistant", content: response.content });
const toolUseBlocks = response.content.filter((c: any) => c.type === "tool_use");
const toolResults = await Promise.all(
toolUseBlocks.map(async (block: any) => {
if (block.name === "read_url") {
try {
const result = await reader.read({ url: block.input.url });
if (result.kind === "scrape") {
return {
type: "tool_result",
tool_use_id: block.id,
content: result.data.markdown ?? "",
};
}
} catch (err: any) {
return {
type: "tool_result",
tool_use_id: block.id,
content: `Error fetching URL: ${err.message}`,
is_error: true,
};
}
}
return {
type: "tool_result",
tool_use_id: block.id,
content: "Unknown tool",
is_error: true,
};
}),
);
messages.push({ role: "user", content: toolResults });
continue;
}
return "";
}
}