branch:
chat-agent.ts
1824 bytesRaw
import { createWorkersAI } from "workers-ai-provider";
import { AIChatAgent } from "@cloudflare/ai-chat";
import {
streamText,
convertToModelMessages,
pruneMessages,
tool,
stepCountIs
} from "ai";
import { z } from "zod";
export class ChatAgent extends AIChatAgent<Env> {
maxPersistedMessages = 200;
async onChatMessage() {
const workersai = createWorkersAI({ binding: this.env.AI });
const result = streamText({
model: workersai("@cf/moonshotai/kimi-k2.5", {
sessionAffinity: this.sessionAffinity
}),
system:
"You are a helpful assistant running on Cloudflare Workers. " +
"You can check the weather and get the user's timezone.",
messages: pruneMessages({
messages: await convertToModelMessages(this.messages),
toolCalls: "before-last-2-messages",
reasoning: "before-last-message"
}),
tools: {
getWeather: tool({
description: "Get the current weather for a city",
inputSchema: z.object({
city: z.string().describe("City name")
}),
execute: async ({ city }) => {
const conditions = ["sunny", "cloudy", "rainy", "snowy"];
const temp = Math.floor(Math.random() * 30) + 5;
return {
city,
temperature: temp,
condition:
conditions[Math.floor(Math.random() * conditions.length)],
unit: "celsius"
};
}
}),
getUserTimezone: tool({
description:
"Get the user's timezone from their browser. Use this when you need to know the user's local time.",
inputSchema: z.object({})
})
},
stopWhen: stepCountIs(5)
});
return result.toUIMessageStreamResponse();
}
}