import { anthropic } from "@workspace/integrations-anthropic-ai"; export interface EvalResult { accepted: boolean; reason: string; } export interface WorkResult { result: string; } export interface AgentConfig { evalModel?: string; workModel?: string; } export class AgentService { private readonly evalModel: string; private readonly workModel: string; constructor(config?: AgentConfig) { this.evalModel = config?.evalModel ?? "claude-haiku-4-5"; this.workModel = config?.workModel ?? "claude-sonnet-4-6"; } async evaluateRequest(requestText: string): Promise { const message = await anthropic.messages.create({ model: this.evalModel, max_tokens: 8192, system: `You are Timmy, an AI agent gatekeeper. Evaluate whether a request is acceptable to act on. ACCEPT if the request is: clear enough to act on, ethical, lawful, and within the capability of a general-purpose AI. REJECT if the request is: harmful, illegal, unethical, incoherent, or spam. Respond ONLY with valid JSON: {"accepted": true, "reason": "..."} or {"accepted": false, "reason": "..."}`, messages: [{ role: "user", content: `Evaluate this request: ${requestText}` }], }); const block = message.content[0]; if (block.type !== "text") { throw new Error("Unexpected non-text response from eval model"); } let parsed: { accepted: boolean; reason: string }; try { const raw = block.text.replace(/^```(?:json)?\s*/i, "").replace(/\s*```$/, "").trim(); parsed = JSON.parse(raw) as { accepted: boolean; reason: string }; } catch { throw new Error(`Failed to parse eval JSON: ${block.text}`); } return { accepted: Boolean(parsed.accepted), reason: parsed.reason ?? "" }; } async executeWork(requestText: string): Promise { const message = await anthropic.messages.create({ model: this.workModel, max_tokens: 8192, system: `You are Timmy, a capable AI agent. A user has paid for you to handle their request. Fulfill it thoroughly and helpfully. Be concise yet complete.`, messages: [{ role: "user", content: requestText }], }); const block = message.content[0]; if (block.type !== "text") { throw new Error("Unexpected non-text response from work model"); } return { result: block.text }; } } export const agentService = new AgentService();