fix: AI assistant generate_project_cover now uses configured provider
The tool was hardcoded to only check isDalleConfigured(), ignoring Gemini even when it was the configured image provider. This caused "DALL-E is not configured" errors for all 13 projects. Fix: reads imageProvider from SystemSettings and routes to Gemini or DALL-E accordingly (same logic as the generateCover mutation). Co-Authored-By: claude-flow <ruv@ruv.net>
This commit is contained in:
@@ -3813,43 +3813,64 @@ const executors = {
|
|||||||
if (!project) return { error: `Project not found: ${params.projectId}` };
|
if (!project) return { error: `Project not found: ${params.projectId}` };
|
||||||
|
|
||||||
const settings = await ctx.db.systemSettings.findUnique({ where: { id: "singleton" } });
|
const settings = await ctx.db.systemSettings.findUnique({ where: { id: "singleton" } });
|
||||||
if (!isDalleConfigured(settings)) {
|
const imageProvider = settings?.imageProvider ?? "dalle";
|
||||||
return { error: "DALL-E is not configured. Set up the DALL-E deployment in Admin → Settings." };
|
const { isGeminiConfigured: isGeminiOk } = await import("../gemini-client.js");
|
||||||
|
const useGemini = imageProvider === "gemini" && isGeminiOk(settings);
|
||||||
|
const useDalle = imageProvider === "dalle" && isDalleConfigured(settings);
|
||||||
|
|
||||||
|
if (!useGemini && !useDalle) {
|
||||||
|
return { error: "No image provider configured. Set up DALL-E or Gemini in Admin → Settings." };
|
||||||
}
|
}
|
||||||
|
|
||||||
const clientName = project.client?.name ? ` for ${project.client.name}` : "";
|
const clientName = project.client?.name ? ` for ${project.client.name}` : "";
|
||||||
const basePrompt = `Professional cover art for a 3D automotive visualization project: "${project.name}"${clientName}. Style: cinematic, modern, photorealistic CGI rendering, dramatic lighting, studio environment. No text or typography in the image.`;
|
const basePrompt = `Professional cover art for a 3D automotive visualization project: "${project.name}"${clientName}. Style: cinematic, modern, photorealistic CGI rendering, dramatic lighting, studio environment. No text or typography in the image.`;
|
||||||
const finalPrompt = params.prompt ? `${basePrompt} Additional direction: ${params.prompt}` : basePrompt;
|
const finalPrompt = params.prompt ? `${basePrompt} Additional direction: ${params.prompt}` : basePrompt;
|
||||||
|
|
||||||
const dalleClient = createDalleClient(settings!);
|
let coverImageUrl: string;
|
||||||
const model = settings!.aiProvider === "azure" ? settings!.azureDalleDeployment! : "dall-e-3";
|
|
||||||
|
|
||||||
try {
|
if (useGemini) {
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
try {
|
||||||
const response: any = await dalleClient.images.generate({
|
const { generateGeminiImage, parseGeminiError } = await import("../gemini-client.js");
|
||||||
model,
|
coverImageUrl = await generateGeminiImage(
|
||||||
prompt: finalPrompt,
|
settings!.geminiApiKey!,
|
||||||
size: "1024x1024",
|
finalPrompt,
|
||||||
n: 1,
|
settings!.geminiModel ?? undefined,
|
||||||
response_format: "b64_json",
|
);
|
||||||
});
|
} catch (err) {
|
||||||
|
const { parseGeminiError: parseErr } = await import("../gemini-client.js");
|
||||||
|
return { error: `Gemini error: ${parseErr(err)}` };
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const dalleClient = createDalleClient(settings!);
|
||||||
|
const model = settings!.aiProvider === "azure" ? settings!.azureDalleDeployment! : "dall-e-3";
|
||||||
|
|
||||||
const b64 = response.data?.[0]?.b64_json;
|
try {
|
||||||
if (!b64) return { error: "No image data returned from DALL-E" };
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
const response: any = await dalleClient.images.generate({
|
||||||
|
model,
|
||||||
|
prompt: finalPrompt,
|
||||||
|
size: "1024x1024",
|
||||||
|
n: 1,
|
||||||
|
response_format: "b64_json",
|
||||||
|
});
|
||||||
|
|
||||||
const coverImageUrl = `data:image/png;base64,${b64}`;
|
const b64 = response.data?.[0]?.b64_json;
|
||||||
await ctx.db.project.update({ where: { id: params.projectId }, data: { coverImageUrl } });
|
if (!b64) return { error: "No image data returned from DALL-E" };
|
||||||
|
coverImageUrl = `data:image/png;base64,${b64}`;
|
||||||
return {
|
} catch (err) {
|
||||||
__action: "invalidate",
|
return { error: `DALL-E error: ${parseAiError(err)}` };
|
||||||
scope: ["project"],
|
}
|
||||||
success: true,
|
|
||||||
message: `Generated cover art for project "${project.name}"`,
|
|
||||||
coverImageUrl: coverImageUrl.slice(0, 100) + "...[truncated]",
|
|
||||||
};
|
|
||||||
} catch (err) {
|
|
||||||
return { error: `DALL-E error: ${parseAiError(err)}` };
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
await ctx.db.project.update({ where: { id: params.projectId }, data: { coverImageUrl } });
|
||||||
|
|
||||||
|
return {
|
||||||
|
__action: "invalidate",
|
||||||
|
scope: ["project"],
|
||||||
|
success: true,
|
||||||
|
message: `Generated cover art for project "${project.name}" using ${useGemini ? "Gemini" : "DALL-E"}`,
|
||||||
|
coverImageUrl: coverImageUrl.slice(0, 100) + "...[truncated]",
|
||||||
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
async remove_project_cover(params: { projectId: string }, ctx: ToolContext) {
|
async remove_project_cover(params: { projectId: string }, ctx: ToolContext) {
|
||||||
|
|||||||
Reference in New Issue
Block a user