import { createClientFromRequest } from "npm:@base44/sdk@0.8.36";
import { ToolLoopAgent, tool, stepCountIs, hasToolCall } from "npm:ai@7.0.16";
import { createOpenAICompatible } from "npm:@ai-sdk/openai-compatible@3.0.5";
import { z } from "npm:zod@4.4.3";
Deno.serve(async (req) => {
const base44 = createClientFromRequest(req);
const user = await base44.auth.me();
if (!user) return Response.json({ error: "Unauthorized" }, { status: 401 });
const { return_id } = await req.json();
const request = await base44.entities.ReturnRequest.get(return_id);
const { baseURL, token } = base44.aiGateway.connection();
const base44Models = createOpenAICompatible({ name: "base44", baseURL, apiKey: token });
const agent = new ToolLoopAgent({
model: base44Models("automatic"),
instructions:
"Decide whether this return looks fine or needs the owner's attention. " +
"Check the customer's past orders as many times as you need, then submit your verdict.",
tools: {
searchOrders: tool({
description: "This customer's past orders, optionally filtered by status",
inputSchema: z.object({ status: z.string().optional() }),
execute: ({ status }) => {
const query = { customer_email: request.customer_email };
if (status) query.status = status;
return base44.entities.Order.filter(query, "-created_date", 50);
},
}),
submitVerdict: tool({
description: "Record the final verdict. Call this once, when you've decided.",
inputSchema: z.object({ decision: z.enum(["approved", "flagged"]), reason: z.string() }),
execute: ({ decision, reason }) =>
base44.entities.ReturnRequest.update(return_id, { status: decision, review_note: reason }),
}),
},
// stops at the first to trigger — submitVerdict was called, or 8 steps elapsed;
// mix whatever conditions fit the task (a step cap, a finish tool, a custom condition)
stopWhen: [stepCountIs(8), hasToolCall("submitVerdict")],
});
await agent.generate({ prompt: `Review this return request: ${JSON.stringify(request)}` });
return Response.json({ ok: true });
});