import type { GenerateNodeResponse } from "./canvas-model"; export type ParentContext = { id: string; title: string; query: string; imagePrompt: string; summary?: string; visualFacts?: Array<{ label: string; detail: string; }>; }; export type GenerateNodeInput = { query: string; branchPrompt?: string; imageBase64?: string; parent?: ParentContext; }; export type GenerateNodePayload = { query: string; branchPrompt?: string; imageBase64?: string; parentNodeId?: string; parentContext?: Omit; }; export function buildGenerateNodePayload(input: GenerateNodeInput): GenerateNodePayload { const payload: GenerateNodePayload = { query: input.query, }; if (input.branchPrompt) { payload.branchPrompt = input.branchPrompt; } if (input.imageBase64) { payload.imageBase64 = input.imageBase64; } if (input.parent) { payload.parentNodeId = input.parent.id; const parentContext: Omit = { title: input.parent.title, query: input.parent.query, imagePrompt: input.parent.imagePrompt, }; if (input.parent.summary) { parentContext.summary = input.parent.summary; } if (input.parent.visualFacts) { parentContext.visualFacts = input.parent.visualFacts; } payload.parentContext = parentContext; } return payload; } export async function generateVeniceNode(input: GenerateNodeInput): Promise { const baseUrl = process.env.NEXT_PUBLIC_VENICE_API_URL || ""; const response = await fetch(`${baseUrl}/api/generate-node`, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify(buildGenerateNodePayload(input)), }); if (!response.ok) { const detail = await response.text(); throw new Error(detail || `Generation failed with status ${response.status}`); } const payload = (await response.json()) as Omit; return { ...payload, query: input.branchPrompt ? `${input.query} - ${input.branchPrompt}` : input.query, }; }