mirror of
https://github.com/vercel-labs/json-render.git
synced 2026-09-14 13:41:32 +08:00
53 lines
1.5 KiB
TypeScript
53 lines
1.5 KiB
TypeScript
import {
|
|
convertToModelMessages,
|
|
createUIMessageStream,
|
|
createUIMessageStreamResponse,
|
|
type UIMessage,
|
|
} from "ai";
|
|
import { pipeJsonRender } from "@json-render/core";
|
|
import { createAgent } from "@/lib/agent";
|
|
|
|
export const maxDuration = 60;
|
|
|
|
export async function POST(req: Request) {
|
|
if (!process.env.AI_GATEWAY_API_KEY) {
|
|
return new Response(
|
|
JSON.stringify({
|
|
error: "Missing AI_GATEWAY_API_KEY",
|
|
message:
|
|
"Set AI_GATEWAY_API_KEY in .env.local to enable AI. See https://vercel.com/ai-gateway.",
|
|
}),
|
|
{ status: 500, headers: { "Content-Type": "application/json" } },
|
|
);
|
|
}
|
|
|
|
const body = (await req.json()) as {
|
|
messages: UIMessage[];
|
|
messageId?: string;
|
|
};
|
|
|
|
if (!body.messages?.length) {
|
|
return new Response(
|
|
JSON.stringify({ error: "messages array is required" }),
|
|
{ status: 400, headers: { "Content-Type": "application/json" } },
|
|
);
|
|
}
|
|
|
|
// The client generates a stable messageId per turn so the agent can
|
|
// namespace state paths and element keys. Fall back to a random id.
|
|
const messageId =
|
|
body.messageId ?? `m${Math.random().toString(36).slice(2, 8)}`;
|
|
|
|
const agent = createAgent(messageId);
|
|
const modelMessages = await convertToModelMessages(body.messages);
|
|
const result = await agent.stream({ messages: modelMessages });
|
|
|
|
const stream = createUIMessageStream({
|
|
execute: async ({ writer }) => {
|
|
writer.merge(pipeJsonRender(result.toUIMessageStream()));
|
|
},
|
|
});
|
|
|
|
return createUIMessageStreamResponse({ stream });
|
|
}
|