venice / src /lib /venice-api.ts
divyamagrawal06's picture
Mirror Venice frontend
6fffa8d verified
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,
};
}