diff --git a/apps/stage-tamagotchi/src/main/configs/artistry.ts b/apps/stage-tamagotchi/src/main/configs/artistry.ts index af5b752b1..bd44ad67d 100644 --- a/apps/stage-tamagotchi/src/main/configs/artistry.ts +++ b/apps/stage-tamagotchi/src/main/configs/artistry.ts @@ -3,7 +3,7 @@ import { any, array, number, object, optional, string } from 'valibot' import { createConfig } from '../libs/electron/persistence' export const artistryConfigSchema = object({ - artistryProvider: optional(string(), 'comfyui'), + artistryProvider: optional(string(), 'none'), artistryGlobals: optional(object({ comfyuiServerUrl: optional(string(), 'http://localhost:8188'), comfyuiSavedWorkflows: optional(array(any()), []), diff --git a/apps/stage-tamagotchi/src/main/services/airi/widgets/artistry-bridge.ts b/apps/stage-tamagotchi/src/main/services/airi/widgets/artistry-bridge.ts index bdccd2548..3c9252a02 100644 --- a/apps/stage-tamagotchi/src/main/services/airi/widgets/artistry-bridge.ts +++ b/apps/stage-tamagotchi/src/main/services/airi/widgets/artistry-bridge.ts @@ -25,6 +25,7 @@ import { ReplicateProvider } from './providers/replicate' const log = useLogg('artistry-bridge').useGlobalConfig() const DEFAULT_REMIX_ID = '48250602' +const DEFAULT_ARTISTRY_PROVIDER = 'none' interface ArtistrySyncSnapshot { provider?: string @@ -147,10 +148,15 @@ export async function generateHeadless(params: { } const executionPromise = (async () => { - const requestedProvider = (params.provider || artistryConfig.get()?.artistryProvider || 'comfyui').trim().toLowerCase() + const requestedProvider = (params.provider || artistryConfig.get()?.artistryProvider || DEFAULT_ARTISTRY_PROVIDER).trim().toLowerCase() + if (requestedProvider === 'none') { + log.log('[Headless] Provider is \'none\'. Bypassing generation.') + throw new Error('Artistry provider is disabled.') + } + const provider = artistryProviders.get(requestedProvider) if (!provider) { - log.error(`[Headless] CRITICAL: Provider '${requestedProvider}' not found in registry! fallback to replicate`) + log.error(`[Headless] Provider '${requestedProvider}' not found in registry.`) throw new Error(`Provider '${requestedProvider}' not found.`) } @@ -250,7 +256,7 @@ export async function generateHeadless(params: { return await executionPromise } catch (err) { - return { error: err instanceof Error ? err.message : String(err) } + return { error: errorMessageFrom(err) ?? String(err) } } finally { // Remove from map after completion so it can be re-triggered later @@ -291,7 +297,7 @@ async function handleArtistryTrigger(params: { globals: robustParse(artistryConfigOverrides.globals || artistryConfigOverrides.Globals || cardDefaults.globals, 'artistryGlobals'), } const { config: artistryConfig } = await injeca.resolve({ config: 'configs:artistry' } as { config: ProvidedBy> }) - const providerId = config.provider || cardDefaults.provider || artistryConfig.get()?.artistryProvider || 'comfyui' + const providerId = config.provider || cardDefaults.provider || artistryConfig.get()?.artistryProvider || DEFAULT_ARTISTRY_PROVIDER // [BY DESIGN]: Short-circuit if artistry is explicitly disabled (provider: 'none'). // This prevents noisy "Provider not found" errors when the feature is intentionally bypassed. @@ -463,7 +469,7 @@ export async function setupArtistryBridge(params: { defineInvokeHandler(params.context, artistrySyncConfig, (payload) => { log.log(`🔄 Syncing artistry config to main. Provider: ${payload.provider}`) params.artistryConfig.update({ - artistryProvider: payload.provider || params.artistryConfig.get()?.artistryProvider || 'comfyui', + artistryProvider: payload.provider || params.artistryConfig.get()?.artistryProvider || DEFAULT_ARTISTRY_PROVIDER, artistryGlobals: payload.globals || params.artistryConfig.get()?.artistryGlobals || { comfyuiServerUrl: 'http://localhost:8188', comfyuiSavedWorkflows: [], diff --git a/packages/stage-pages/src/pages/settings/modules/artistry.vue b/packages/stage-pages/src/pages/settings/modules/artistry.vue index 14caf4d61..e5d1802d7 100644 --- a/packages/stage-pages/src/pages/settings/modules/artistry.vue +++ b/packages/stage-pages/src/pages/settings/modules/artistry.vue @@ -57,9 +57,8 @@ const availableProviders = computed(() => [
{}) + */ +describe('artistry store', () => { + beforeEach(() => { + setActivePinia(createPinia()) + }) + + /** + * @example + * it('defaults to disabled artistry without treating ComfyUI as configured', () => {}) + */ + it('defaults to disabled artistry without treating ComfyUI as configured', () => { + const artistryStore = useArtistryStore() + + // @example + expect(artistryStore.globalProvider).toBe('none') + // @example + expect(artistryStore.activeProvider).toBe('none') + // @example + expect(artistryStore.configured).toBe(false) + }) +}) diff --git a/packages/stage-ui/src/stores/modules/artistry.ts b/packages/stage-ui/src/stores/modules/artistry.ts index b5e5ac5d1..43be6d45f 100644 --- a/packages/stage-ui/src/stores/modules/artistry.ts +++ b/packages/stage-ui/src/stores/modules/artistry.ts @@ -19,7 +19,7 @@ export interface ComfyUIWorkflowTemplate { export const useArtistryStore = defineStore('artistry', () => { // --- Persistent Global Settings (User Preferences) --- - const globalProvider = useLocalStorageManualReset('artistry-provider', 'comfyui') + const globalProvider = useLocalStorageManualReset('artistry-provider', 'none') const globalModel = useLocalStorageManualReset('artistry-model', '') const globalPromptPrefix = useLocalStorageManualReset('artistry-prompt-prefix', '') const globalProviderOptions = useLocalStorageManualReset | undefined>('artistry-provider-options', undefined) @@ -119,6 +119,9 @@ export const useArtistryStore = defineStore('artistry', () => { if (!activeProvider.value) return false + if (activeProvider.value === 'none') + return false + if (activeProvider.value === 'replicate') { return !!replicateApiKey.value }