From 886a530f26ac61f698b2582f9b22820274ec1de7 Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 26 Mar 2026 20:23:46 +0100 Subject: [PATCH] feat: implement internal credits handling in AI image generation - Added support for internal credits feature in the generateImage action. - Conditional reservation of credits based on the INTERNAL_CREDITS_ENABLED environment variable. - Updated error handling to ensure credits are released or committed only when reservations are made. --- convex/ai.ts | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/convex/ai.ts b/convex/ai.ts index 24dce4a..0b69c15 100644 --- a/convex/ai.ts +++ b/convex/ai.ts @@ -17,6 +17,9 @@ export const generateImage = action({ aspectRatio: v.optional(v.string()), }, handler: async (ctx, args) => { + const internalCreditsEnabled = + process.env.INTERNAL_CREDITS_ENABLED === "true"; + const apiKey = process.env.OPENROUTER_API_KEY; if (!apiKey) { throw new Error("OPENROUTER_API_KEY is not set"); @@ -32,13 +35,15 @@ export const generateImage = action({ throw new Error("User not found"); } - const reservationId = await ctx.runMutation(api.credits.reserve, { - estimatedCost: modelConfig.estimatedCostPerImage, - description: `Bildgenerierung — ${modelConfig.name}`, - model: modelId, - nodeId: args.nodeId, - canvasId: args.canvasId, - }); + const reservationId = internalCreditsEnabled + ? await ctx.runMutation(api.credits.reserve, { + estimatedCost: modelConfig.estimatedCostPerImage, + description: `Bildgenerierung — ${modelConfig.name}`, + model: modelId, + nodeId: args.nodeId, + canvasId: args.canvasId, + }) + : null; await ctx.runMutation(api.nodes.updateStatus, { nodeId: args.nodeId, @@ -96,14 +101,18 @@ export const generateImage = action({ status: "done", }); - await ctx.runMutation(api.credits.commit, { - transactionId: reservationId, - actualCost: creditCost, - }); + if (reservationId) { + await ctx.runMutation(api.credits.commit, { + transactionId: reservationId, + actualCost: creditCost, + }); + } } catch (error) { - await ctx.runMutation(api.credits.release, { - transactionId: reservationId, - }); + if (reservationId) { + await ctx.runMutation(api.credits.release, { + transactionId: reservationId, + }); + } await ctx.runMutation(api.nodes.updateStatus, { nodeId: args.nodeId,