generate+api.ts 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import { streamText } from "ai";
  2. import { createGatewayProvider } from "@ai-sdk/gateway";
  3. import { buildUserPrompt } from "@json-render/core";
  4. import { catalog, customRules } from "../../lib/render/catalog";
  5. const SYSTEM_PROMPT = catalog.prompt({ customRules });
  6. const MAX_PROMPT_LENGTH = 500;
  7. const DEFAULT_MODEL = "anthropic/claude-haiku-4.5";
  8. // Explicitly pass the API key since Expo's Metro bundler only inlines
  9. // process.env values that are directly referenced in application code.
  10. // The default `gateway` singleton reads process.env.AI_GATEWAY_API_KEY
  11. // internally, which Metro won't bundle.
  12. const gateway = createGatewayProvider({
  13. apiKey: process.env.AI_GATEWAY_API_KEY,
  14. });
  15. export async function POST(req: Request) {
  16. console.log("[API] POST /api/generate called");
  17. console.log("[API] API key present:", !!process.env.AI_GATEWAY_API_KEY);
  18. console.log("[API] Model:", process.env.AI_GATEWAY_MODEL || DEFAULT_MODEL);
  19. try {
  20. const { prompt, context } = await req.json();
  21. console.log("[API] prompt:", prompt);
  22. const userPrompt = buildUserPrompt({
  23. prompt,
  24. currentSpec: context?.previousSpec,
  25. state: context?.state,
  26. maxPromptLength: MAX_PROMPT_LENGTH,
  27. });
  28. const modelId = process.env.AI_GATEWAY_MODEL || DEFAULT_MODEL;
  29. const model = gateway(modelId);
  30. console.log("[API] calling streamText with model:", modelId);
  31. const result = streamText({
  32. model,
  33. system: SYSTEM_PROMPT,
  34. prompt: userPrompt,
  35. temperature: 0.7,
  36. });
  37. console.log("[API] returning text stream response");
  38. return result.toTextStreamResponse();
  39. } catch (error) {
  40. const message = error instanceof Error ? error.message : "Unknown error";
  41. console.error("API generate error:", message);
  42. return new Response(JSON.stringify({ error: message }), {
  43. status: 500,
  44. headers: { "Content-Type": "application/json" },
  45. });
  46. }
  47. }