{"record":{"id":"8a51746eb2b84c31","repo":"moeru-ai/airi","slug":"speech-pipeline-openai-compatible-no-model-in-p","errorCode":null,"errorMessage":"[Speech Pipeline] OpenAI Compatible: No model in provider config, using default","messagePattern":"\\[Speech Pipeline\\] OpenAI Compatible: No model in provider config, using default","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"packages/stage-ui/src/components/scenes/Stage.vue","lineNumber":475,"sourceCode":"    if (!request.text && !request.special)\n      return null\n\n    const providerConfig = providerStore.getProviderConfig(activeSpeechProvider.value)\n\n    // For OpenAI Compatible providers, always use provider config for model and voice\n    // since these are manually configured in provider settings\n    let model = activeSpeechModel.value\n    let voice = activeSpeechVoice.value\n\n    if (activeSpeechProvider.value === 'openai-compatible-audio-speech') {\n      // Always prefer provider config for OpenAI Compatible (user configured it there)\n      if (providerConfig?.model) {\n        model = providerConfig.model as string\n      }\n      else {\n        // Fallback to default if not in provider config\n        model = 'tts-1'\n        console.warn('[Speech Pipeline] OpenAI Compatible: No model in provider config, using default', { providerConfig })\n      }\n\n      if (providerConfig?.voice) {\n        voice = {\n          id: providerConfig.voice as string,\n          name: providerConfig.voice as string,\n          description: providerConfig.voice as string,\n          previewURL: '',\n          languages: [{ code: 'en', title: 'English' }],\n          provider: activeSpeechProvider.value,\n          gender: 'neutral',\n        }\n      }\n      else {\n        // Fallback to default if not in provider config\n        voice = {\n          id: 'alloy',\n          name: 'alloy',","sourceCodeStart":457,"sourceCodeEnd":493,"githubUrl":"https://github.com/moeru-ai/airi/blob/677329427f32468c74b17f3ec47eeca4e05bec65/packages/stage-ui/src/components/scenes/Stage.vue#L457-L493","documentation":"For the openai-compatible-audio-speech provider, Stage.vue prefers the model stored in the provider config over the globally selected speech model. If providerConfig.model is unset, it falls back to 'tts-1' and warns. On endpoints that do not serve tts-1 the subsequent synthesis call will fail with an API error.","triggerScenarios":"The openai-compatible-audio-speech provider was saved without a model field in its provider settings while TTS is requested during a conversation.","commonSituations":"Fresh provider setup where only API key, base URL and voice were entered; config written by an older version that did not persist model; non-OpenAI compatible endpoints whose TTS models have different names.","solutions":["Open Settings > Providers > openai-compatible-audio-speech, set the model field (e.g. tts-1 or your endpoint's equivalent) and save","With API key and base URL set, load models for the provider and pick one from the fetched list","If the default is intended, verify the endpoint actually serves tts-1 by calling it directly"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// Before enabling TTS for openai-compatible-audio-speech\nconst config = providers.value['openai-compatible-audio-speech']\nif (!config?.model) {\n  // mark provider incomplete in settings UI instead of relying on the tts-1 default\n  console.warn('[Speech Pipeline] OpenAI Compatible: No model in provider config, using default')\n}","typeGuard":"function hasProviderModel(config: unknown): config is { model: string } {\n  return Boolean(config) && typeof config === 'object' && typeof (config as any).model === 'string' && (config as any).model.length > 0\n}","tryCatchPattern":null,"preventionTips":["Make model a required field in the openai-compatible-audio-speech settings form","Verify the endpoint actually serves the configured (or default tts-1) model before relying on the fallback","Treat the warn as a signal of incomplete provider setup, not a working state"],"tags":["speech","tts","openai-compatible","provider-config","default-fallback"],"backgroundTag":"missing-model-in-provider-config","analyzedSha":"677329427f32468c74b17f3ec47eeca4e05bec65","analyzedAt":"2026-08-18T17:29:58.153Z","contentChangedAt":"2026-08-18T17:29:58.153Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}