| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- import { streamText } from "ai";
- import { createGatewayProvider } from "@ai-sdk/gateway";
- import { buildUserPrompt } from "@json-render/core";
- import { catalog, customRules } from "../../lib/render/catalog";
- const SYSTEM_PROMPT = catalog.prompt({ customRules });
- const MAX_PROMPT_LENGTH = 500;
- const DEFAULT_MODEL = "anthropic/claude-haiku-4.5";
- // Explicitly pass the API key since Expo's Metro bundler only inlines
- // process.env values that are directly referenced in application code.
- // The default `gateway` singleton reads process.env.AI_GATEWAY_API_KEY
- // internally, which Metro won't bundle.
- const gateway = createGatewayProvider({
- apiKey: process.env.AI_GATEWAY_API_KEY,
- });
- export async function POST(req: Request) {
- console.log("[API] POST /api/generate called");
- console.log("[API] API key present:", !!process.env.AI_GATEWAY_API_KEY);
- console.log("[API] Model:", process.env.AI_GATEWAY_MODEL || DEFAULT_MODEL);
- try {
- const { prompt, context } = await req.json();
- console.log("[API] prompt:", prompt);
- const userPrompt = buildUserPrompt({
- prompt,
- currentSpec: context?.previousSpec,
- state: context?.state,
- maxPromptLength: MAX_PROMPT_LENGTH,
- });
- const modelId = process.env.AI_GATEWAY_MODEL || DEFAULT_MODEL;
- const model = gateway(modelId);
- console.log("[API] calling streamText with model:", modelId);
- const result = streamText({
- model,
- system: SYSTEM_PROMPT,
- prompt: userPrompt,
- temperature: 0.7,
- });
- console.log("[API] returning text stream response");
- return result.toTextStreamResponse();
- } catch (error) {
- const message = error instanceof Error ? error.message : "Unknown error";
- console.error("API generate error:", message);
- return new Response(JSON.stringify({ error: message }), {
- status: 500,
- headers: { "Content-Type": "application/json" },
- });
- }
- }
|