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 { 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(); } }