You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fix: address 49 review findings from 16 agents, CodeRabbit, and Gemini
Backend:
- Replace vendor names in tests with generic test-provider/test-subscription-token
- Wrap _AUTH_OWNED_FIELDS in MappingProxyType for immutability
- Guard ToS consent stamping to subscription auth only
- Resolve auth_type override before preset discovery decision
- Fix litellm_driver class docstring (litellm_provider routing key)
- Consistent extra_headers assignment in _build_kwargs
- Rename _validate_api_key_clear_consistency to _validate_credential_clear_consistency
- Restore DTO Attributes docstrings (CreateProviderRequest, ProviderResponse, CreateFromPresetRequest)
- Remove vendor names from schema.py litellm_provider docstring
- Fix USD -> base currency in cost docstrings
- Fix subscription_token docstring (not OAuth)
- Update Anthropic preset Sonnet model to claude-sonnet-4-6-20250514
Tests:
- Add SUBSCRIPTION auth tests for _build_kwargs, build_discovery_headers
- Add _apply_credential_updates SUBSCRIPTION transition tests
- Add auth-type-switch cleanup tests (subscription <-> api_key)
- Add ProviderPreset validator rejection test
- Remove redundant @pytest.mark.unit class decorators
Frontend:
- Remove double-fetch on mount in useProvidersData/useProviderDetailData
- Remove dead deleteTarget code from ProvidersPage
- Use shared InputField/SelectField in ProviderFilters
- Export ProviderHealthBadgeProps, add a11y.test to stories
- ProviderFormDrawer: hide unsupported auth options, reset Custom state,
send clear_* flags in edit mode, fix base URL visibility, show presetsError
- Extract PresetOptionCard, ProviderGridItem, ProviderModelRow components
- Use SectionCard in ProviderDetailSkeleton
- Add aria-live to TestConnectionResult, fix error truncation
- Fix replaceAll for auth_type display
- Replace hardcoded hover shadow with design token
- EmptyState for missing provider instead of null
- Remove redundant decodeURIComponent
- Fix last-check date format (add date, not just time)
- Fix health sort: unknown sorts after down
- Remove hardcoded $ currency symbol
- Add discoveringModels loading flag to store
Docs:
- Add missing API endpoints to operations.md
- Add supported_auth_types and fix vLLM auto-probe in operations.md
- Add ProviderHealthStatus type and getProviderHealthColor to brand-and-ux.md
- Expand Providers description in page-structure.md
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: docs/design/operations.md
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -117,8 +117,8 @@ Providers can be managed at runtime through the API without restarting:
117
117
- Auto-triggered on preset creation for no-auth providers with empty model lists.
118
118
- SSRF trust is determined by a dynamic `host:port` allowlist (`ProviderDiscoveryPolicy`), seeded from preset `candidate_urls` at startup and auto-updated on provider create/update/delete. Trusted URLs bypass SSRF validation; untrusted URLs go through full private-IP/DNS-rebinding checks. Bypasses are logged at WARNING level (`PROVIDER_DISCOVERY_SSRF_BYPASSED`).
119
119
-**Discovery allowlist**: `GET /api/v1/providers/discovery-policy` (read), `POST /api/v1/providers/discovery-policy/entries` (add entry), `POST /api/v1/providers/discovery-policy/remove-entry` (remove entry) -- manage the dynamic SSRF allowlist of trusted `host:port` pairs for provider discovery. Persisted in the settings system (DB > env > YAML > code).
120
-
-**Presets**: `GET /api/v1/providers/presets` lists built-in cloud and local provider templates (11 presets: Anthropic, OpenAI, Google AI, Mistral, Groq, DeepSeek, Azure OpenAI, Ollama, LM Studio, vLLM, OpenRouter); `POST /api/v1/providers/from-preset` creates from a template
121
-
-**Preset auto-probe**: `POST /api/v1/providers/probe-preset` -- for presets with `candidate_urls` (local providers: Ollama, LM Studio, vLLM), probes each URL in priority order (`host.docker.internal`, Docker bridge IP, `localhost`) with a 5-second timeout. Returns the first reachable URL and discovered model count. Used by the setup wizard to auto-detect local providers running on the host machine. SSRF validation is intentionally skipped because only hardcoded preset URLs are probed, never user input.
120
+
-**Presets**: `GET /api/v1/providers/presets` lists built-in cloud and local provider templates (11 presets: Anthropic, OpenAI, Google AI, Mistral, Groq, DeepSeek, Azure OpenAI, Ollama, LM Studio, vLLM, OpenRouter); `POST /api/v1/providers/from-preset` creates from a template. Each preset declares `supported_auth_types` (e.g. `["api_key"]`, `["none"]`, `["api_key", "subscription"]`) which the UI uses to present the available authentication options during provider creation.
121
+
-**Preset auto-probe**: `POST /api/v1/providers/probe-preset` -- for presets with `candidate_urls` (local providers: Ollama and LM Studio), probes each URL in priority order (`host.docker.internal`, Docker bridge IP, `localhost`) with a 5-second timeout. Returns the first reachable URL and discovered model count. Used by the setup wizard to auto-detect local providers running on the host machine. SSRF validation is intentionally skipped because only hardcoded preset URLs are probed, never user input. Note: vLLM's `candidate_urls` is intentionally empty (users deploy vLLM at arbitrary endpoints), so it cannot be auto-probed and requires manual URL configuration.
122
122
-**Hot-reload**: On mutation, `ProviderManagementService` rebuilds `ProviderRegistry` + `ModelRouter` and atomically swaps them in `AppState` -- no downtime
-**Routing key**: Optional `litellm_provider` field decouples the provider display name from LiteLLM routing (e.g. a provider named "my-claude" can route to `anthropic` via `litellm_provider: anthropic`). Falls back to provider name when unset.
@@ -1103,7 +1103,7 @@ future CLI tool are thin clients that call the API -- they contain no business l
1103
1103
| `/api/v1/approvals` | Pending human approvals queue |
1104
1104
| `/api/v1/analytics` | `GET /overview` (metrics summary with budget status, 7d spend sparkline, agent counts), `GET /trends?period=7d\|30d\|90d&metric=spend\|tasks_completed\|active_agents\|success_rate` (time-series bucketed metrics; hourly buckets for 7d, daily for 30d/90d; defaults: `period=7d`, `metric=spend`), `GET /forecast?horizon_days=1..90` (budget spend projection with daily projections and exhaustion estimate; default 14; 400 on out-of-range) |
| `GET /api/v1/setup/status`, `GET /api/v1/setup/templates`, `POST /api/v1/setup/company`, `POST /api/v1/setup/agent`, `GET /api/v1/setup/agents`, `PUT /api/v1/setup/agents/{index}/model` (`{index}` = zero-based position in the list returned by `GET /api/v1/setup/agents`; not a stable ID -- re-fetch to resolve; out-of-range returns 404), `GET /api/v1/setup/name-locales/available`, `GET /api/v1/setup/name-locales`, `PUT /api/v1/setup/name-locales`, `POST /api/v1/setup/complete` | First-run setup wizard: status check (public, reports `has_company`/`has_agents`/`has_providers`/`has_name_locales` for step resume), template listing, company creation (auto-creates template agents with model matching), agent listing + model reassignment, manual agent creation (blank path), name locale management (list available Faker locales, get/set selected locales for agent name generation), completion gate (requires company + agents + providers) |
1108
1108
| `/api/v1/users` | CEO-only user CRUD: create, list, get, update role, delete human user accounts |
Copy file name to clipboardExpand all lines: docs/design/page-structure.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -99,7 +99,7 @@ Meeting history list with status/type filters. Click opens meeting detail (`/mee
99
99
100
100
#### Providers (`/providers`)
101
101
102
-
LLM provider management. CRUD cards for configured providers. Connection test button. Preset-based creation flow. Model auto-discovery. Provider detail/edit at `/providers/{name}`.
102
+
LLM provider management. CRUD cards for configured providers with health status display (up/degraded/down) and health metrics (average response time, error rate percentage, call count). Connection test button. Preset-based creation flow with subscription auth support requiring ToS acceptance for applicable providers. Model auto-discovery. Provider list supports filtering and sorting by health status, name, and model count. Provider detail/edit at `/providers/{name}`.
103
103
104
104
No WebSocket subscription -- provider changes are low-frequency admin operations. TanStack Query polling is sufficient.
0 commit comments