{"record":{"id":"14c063383b298927","repo":"plandex-ai/plandex","slug":"client-not-found-for-provider-composite-s","errorCode":null,"errorMessage":"client not found for provider composite: %s","messagePattern":"client not found for provider composite: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"app/server/model/client.go","lineNumber":121,"sourceCode":"\n// JSONUnmarshaler handles JSON unmarshaling for stream responses\ntype JSONUnmarshaler struct{}\n\nfunc CreateChatCompletionStream(\n\tclients map[string]ClientInfo,\n\tauthVars map[string]string,\n\tmodelConfig *shared.ModelRoleConfig,\n\tsettings *shared.PlanSettings,\n\torgUserConfig *shared.OrgUserConfig,\n\tcurrentOrgId string,\n\tcurrentUserId string,\n\tctx context.Context,\n\treq types.ExtendedChatCompletionRequest,\n) (*ExtendedChatCompletionStream, error) {\n\tproviderComposite := modelConfig.GetProviderComposite(authVars, settings, orgUserConfig)\n\t_, ok := clients[providerComposite]\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"client not found for provider composite: %s\", providerComposite)\n\t}\n\n\tbaseModelConfig := modelConfig.GetBaseModelConfig(authVars, settings, orgUserConfig)\n\n\t// ensure the model name is set correctly on fallbacks\n\treq.Model = baseModelConfig.ModelName\n\n\tresolveReq(&req, modelConfig, baseModelConfig, settings)\n\n\t// choose the fastest provider by latency/throughput on openrouter\n\tif baseModelConfig.Provider == shared.ModelProviderOpenRouter {\n\t\tif !strings.HasSuffix(string(req.Model), \":nitro\") && !strings.HasSuffix(string(req.Model), \":free\") && !strings.HasSuffix(string(req.Model), \":floor\") {\n\t\t\treq.Model += \":nitro\"\n\t\t}\n\t}\n\n\tif baseModelConfig.ReasoningBudget > 0 {\n\t\treq.ReasoningConfig = &types.ReasoningConfig{","sourceCodeStart":103,"sourceCodeEnd":139,"githubUrl":"https://github.com/plandex-ai/plandex/blob/e2d772072efadbe41d2946d97d79be55532dbab5/app/server/model/client.go#L103-L139","documentation":"CreateChatCompletionStream computes a provider composite key (provider + auth/settings/org config) via modelConfig.GetProviderComposite and looks it up in the pre-initialized clients map. If no client was registered for that composite (unsupported provider, missing API key, bad model config), it returns this error and no stream is created.","triggerScenarios":"The configured model's provider has no registered client: model string names an unsupported provider, required auth var (e.g. OPENAI_API_KEY / ANTHROPIC_API_KEY) is missing so the client was never initialized, org/user settings override the provider to one not in the clients map, or a typo in the provider name in settings.","commonSituations":"After switching models in plan settings to a provider without credentials configured; self-hosted deployments missing provider env vars; new provider added to model config but client registry not updated; OpenRouter/custom provider key not set.","solutions":["Set the missing provider API key env var(s) so the client is registered in the clients map at startup.","Check the log's composite string and confirm that provider is supported by this build.","Fix the model/provider selection in plan or org settings to a provider with configured credentials.","If adding a new provider, register its client in the clients map initialization code."],"exampleFix":"// before\nOPENAI_API_KEY=   # empty -> no client registered\n// after\nOPENAI_API_KEY=sk-...  # client registered for provider composite openai","handlingStrategy":"type-guard","validationCode":"// Go - verify a client exists before requesting a stream\nproviderComposite := modelConfig.GetProviderComposite(authVars, settings, orgUserConfig)\nif _, ok := clients[providerComposite]; !ok {\n    return fmt.Errorf(\"provider %s is not configured: check provider API keys\", providerComposite)\n}","typeGuard":"func clientConfigured(clients map[string]ClientInfo, providerComposite string) bool {\n    _, ok := clients[providerComposite]\n    return ok\n}","tryCatchPattern":"stream, err := model.CreateChatCompletionStream(clients, authVars, modelConfig, settings, orgUserConfig, orgId, userId, ctx, req)\nif err != nil {\n    if strings.Contains(err.Error(), \"client not found for provider composite\") {\n        return fmt.Errorf(\"provider not configured; set the provider API key or choose another model: %w\", err)\n    }\n    return err\n}","preventionTips":["Set all provider API key env vars before startup.","Verify the selected model's provider is registered in the clients map.","Log the provider composite at startup for each registered client.","Update both model config and client registry when adding providers.","Validate org/user settings overrides don't select unconfigured providers."],"tags":["config","llm","provider"],"backgroundTag":"provider-client-not-configured","analyzedSha":"e2d772072efadbe41d2946d97d79be55532dbab5","analyzedAt":"2026-09-05T20:56:53.631Z","contentChangedAt":"2026-09-05T20:56:53.631Z","schemaVersion":2},"datasetVersion":"2026-09-12T22:17:10.623Z"}