| 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<ParentContext, "id">; |
| }; |
|
|
| 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<ParentContext, "id"> = { |
| 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<GenerateNodeResponse> { |
| 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<GenerateNodeResponse, "query">; |
| return { |
| ...payload, |
| query: input.branchPrompt ? `${input.query} - ${input.branchPrompt}` : input.query, |
| }; |
| } |
|
|