aiChatAvailableModels GraphQL query does not include self-hosted models
<!--IssueSummary start--> <details> <summary> Everyone can contribute. [Help move this issue forward](https://handbook.gitlab.com/handbook/marketing/developer-relations/contributor-success/community-contributors-workflows/#contributor-links) while earning points, leveling up and collecting rewards. </summary> - [Close this issue](https://contributors.gitlab.com/manage-issue?action=close&projectId=278964&issueIid=594381) </details> <!--IssueSummary end--> ## Summary The `aiChatAvailableModels` GraphQL query does not return self-hosted custom models configured via Admin > Settings > AI-Powered Features > Self-hosted models. This prevents third-party clients (e.g., opencode, VS Code extensions) from discovering and using self-hosted models for agentic chat. ## Current Behavior When a self-hosted model (e.g., a custom Claude Sonnet deployment) is configured for the `duo_agent_platform_agentic_chat` feature via the GitLab admin UI, the `aiChatAvailableModels` GraphQL query only returns cloud-managed models from the AI Gateway's `/v1/models%2Fdefinitions` endpoint. The self-hosted model is not included in `selectableModels`. ### Reproduction 1. Configure a self-hosted model in Admin > Settings > AI-Powered Features > Self-hosted models 2. Assign it to the `duo_agent_platform_agentic_chat` feature 3. Query `aiChatAvailableModels`: ```graphql query { aiChatAvailableModels(rootNamespaceId: "gid://gitlab/Group/<id>") { defaultModel { name ref } selectableModels { name ref } pinnedModel { name ref } } } ``` 4. The self-hosted model does not appear in the response ### Observed on GitLab 18.10.0-ee (self-managed) ## Root Cause The resolver at `ee/app/graphql/resolvers/ai/chat/available_models_resolver.rb` uses `Ai::ModelSelection::FetchModelDefinitionsService` which fetches model definitions from the **cloud AI Gateway** (`/v1/models%2Fdefinitions`). The `ModelSelection::FeatureSetting` decorator then resolves `selectable_models` only against this cloud-managed list. Self-hosted models are stored in `Ai::SelfHostedModel` and are checked by `Ai::FeatureSettingSelectionService` (line 30-32), but this lookup result is not reflected in the `aiChatAvailableModels` decorator output. Meanwhile, the Duo Chat web UI works correctly with self-hosted models because it uses `FeatureSettingSelectionService` directly to route to the self-hosted AI Gateway endpoint, bypassing the `aiChatAvailableModels` query. ## Expected Behavior The `aiChatAvailableModels` query should include self-hosted models configured for the `agentic_chat` feature on self-managed instances. Specifically: - Self-hosted models from `Ai::SelfHostedModel` that are assigned to the agentic chat feature should appear in `selectableModels` - If a self-hosted model is configured as the default for agentic chat, it should appear as `defaultModel` ## Relevant Code - Resolver: `ee/app/graphql/resolvers/ai/chat/available_models_resolver.rb` - Model definitions service: `ee/app/services/ai/model_selection/fetch_model_definitions_service.rb` - Decorator (cloud models only): `ee/lib/gitlab/graphql/representation/model_selection/feature_setting.rb` - Decorator (includes self-hosted): `ee/lib/gitlab/graphql/representation/ai_feature_setting.rb` — this decorator has `with_self_hosted_models` support but is not used by `aiChatAvailableModels` - Feature setting selection: `ee/app/services/ai/feature_setting_selection_service.rb` ## Impact Third-party clients that rely on `aiChatAvailableModels` for model discovery cannot discover or use self-hosted models. This affects: - [opencode](https://opencode.ai) — uses this query for workflow model discovery - Any VS Code extension or IDE integration using the same GraphQL endpoint
issue