From dc6424a3cc9a3990bbe83ee770abea0462d6fa62 Mon Sep 17 00:00:00 2001 From: ScreenTinker Date: Tue, 9 Jun 2026 13:47:47 -0500 Subject: [PATCH] feat(ai): separate optional image API key (#41) Image generation reused the single (text-endpoint) API key, which breaks the common 'local LLM with no key + OpenAI for images' setup. Add an optional image_api_key (encrypted, write-only, never returned); generate-design uses it for image calls and falls back to the main key when blank (all-OpenAI setups). Local sd.cpp / ComfyUI still need no key. Schema column + migration. --- frontend/js/i18n/en.js | 3 +++ frontend/js/views/designer.js | 5 +++++ server/db/database.js | 2 ++ server/db/schema.sql | 1 + server/routes/ai.js | 23 +++++++++++++++-------- 5 files changed, 26 insertions(+), 8 deletions(-) diff --git a/frontend/js/i18n/en.js b/frontend/js/i18n/en.js index 065f07c..08947fd 100644 --- a/frontend/js/i18n/en.js +++ b/frontend/js/i18n/en.js @@ -615,6 +615,9 @@ export default { 'designer.ai.image_base_url': 'Image endpoint URL', 'designer.ai.image_model': 'Image model', 'designer.ai.image_model_ph': 'optional โ€” e.g. dall-e-3; blank for sd.cpp / ComfyUI', + 'designer.ai.image_api_key': 'Image API key (optional)', + 'designer.ai.image_key_ph': 'blank = reuse the key above', + 'designer.ai.image_key_hint': 'Only if your image provider needs a different key than your text endpoint (e.g. local LLM + OpenAI images). Blank reuses the key above; local sd.cpp / ComfyUI need none.', 'designer.ai.failed': 'Generation failed', 'designer.ai.need_prompt': 'Enter a prompt first', 'designer.ai.settings_title': 'AI design settings', diff --git a/frontend/js/views/designer.js b/frontend/js/views/designer.js index 9672ebe..9bdedc0 100644 --- a/frontend/js/views/designer.js +++ b/frontend/js/views/designer.js @@ -360,6 +360,9 @@ async function openAiSettings() {
+
+ +
${t('designer.ai.image_key_hint')}