The decision
Founder, 2026-09-16: the ProviderSetupTemplate layer "was never supposed to
happen — they should be normal providers like everyone else."
SenseNova, Baseten, Groq, Cerebras, Command Code and friends are currently
special-cased as named setup templates. They are ordinary OpenAI-compatible
Chat Completions hosts and should be configured the way every other custom
route already is.
Deleting this loses no capability
A full generic named-custom-provider mechanism already exists in
crates/config/src/lib.rs: parse_custom_provider_config_key (:1073),
named_custom_provider_id (:2795), named_custom_provider_table (:2802),
named_custom_provider_config (:2830), custom_provider_table_mut (:2843),
set_custom_provider_value (:2858). Any host with a base URL, a model and a
key env is already expressible as [providers.<name>].
Templates only pre-fill those three values for ten named vendors and put them
in a picker. That is a convenience list, not a capability — which is exactly
why it should not be a compiled-in enum of blessed vendors.
The module's own doc already concedes the architecture: "Hosted Chat
Completions backends are descriptor rows — not new enum variants and not
compiled model rosters. Live GET /v1/models and the Codewhale catalog are the
offering list." The templates are the last place that rule is not followed.
Blast radius (measured, not estimated)
crates/config/src/provider_templates.rs is 543 lines with 10 template rows.
Fourteen files reference the concept:
| File |
Notes |
crates/config/src/provider_templates.rs |
the module itself |
crates/tui/src/tui/provider_picker.rs |
188 mentions — the picker flow is the bulk of the work |
crates/tui/src/tui/ui/apply.rs |
AppAction::OpenTemplateSetup, new_for_template_list, new_for_template_setup |
crates/tui/src/tui/app/types.rs |
the AppAction variant |
crates/tui/src/tui/views/mod.rs, model_picker.rs |
view plumbing |
crates/tui/src/commands/groups/core/provider.rs, setup.rs |
/provider and /setup entry points |
crates/config/src/lib.rs, settings_schema.rs |
config surface |
crates/tui/src/client.rs, pricing.rs, provider_catalog_live.rs, provider_lake.rs |
route/pricing lookups |
docs/PROVIDERS.md carries a table headed Template that goes with it.
What replaces it
/provider and /setup keep a path for "paste a Base URL and a key" — that is
the generic route, and it is what these vendors always were. The vendor list
becomes documentation (a table of known-good base URLs, models and key env
names) rather than compiled-in rows and a picker.
Sequencing
Not one sweep. provider_picker.rs is the bulk and should move on its own,
after the config-side rows are gone and the docs say what to do instead.
Related
The decision
Founder, 2026-09-16: the
ProviderSetupTemplatelayer "was never supposed tohappen — they should be normal providers like everyone else."
SenseNova, Baseten, Groq, Cerebras, Command Code and friends are currently
special-cased as named setup templates. They are ordinary OpenAI-compatible
Chat Completions hosts and should be configured the way every other custom
route already is.
Deleting this loses no capability
A full generic named-custom-provider mechanism already exists in
crates/config/src/lib.rs:parse_custom_provider_config_key(:1073),named_custom_provider_id(:2795),named_custom_provider_table(:2802),named_custom_provider_config(:2830),custom_provider_table_mut(:2843),set_custom_provider_value(:2858). Any host with a base URL, a model and akey env is already expressible as
[providers.<name>].Templates only pre-fill those three values for ten named vendors and put them
in a picker. That is a convenience list, not a capability — which is exactly
why it should not be a compiled-in enum of blessed vendors.
The module's own doc already concedes the architecture: "Hosted Chat
Completions backends are descriptor rows — not new enum variants and not
compiled model rosters. Live
GET /v1/modelsand the Codewhale catalog are theoffering list." The templates are the last place that rule is not followed.
Blast radius (measured, not estimated)
crates/config/src/provider_templates.rsis 543 lines with 10 template rows.Fourteen files reference the concept:
crates/config/src/provider_templates.rscrates/tui/src/tui/provider_picker.rscrates/tui/src/tui/ui/apply.rsAppAction::OpenTemplateSetup,new_for_template_list,new_for_template_setupcrates/tui/src/tui/app/types.rsAppActionvariantcrates/tui/src/tui/views/mod.rs,model_picker.rscrates/tui/src/commands/groups/core/provider.rs,setup.rs/providerand/setupentry pointscrates/config/src/lib.rs,settings_schema.rscrates/tui/src/client.rs,pricing.rs,provider_catalog_live.rs,provider_lake.rsdocs/PROVIDERS.mdcarries a table headed Template that goes with it.What replaces it
/providerand/setupkeep a path for "paste a Base URL and a key" — that isthe generic route, and it is what these vendors always were. The vendor list
becomes documentation (a table of known-good base URLs, models and key env
names) rather than compiled-in rows and a picker.
Sequencing
Not one sweep.
provider_picker.rsis the bulk and should move on its own,after the config-side rows are gone and the docs say what to do instead.
Related
AICraft is a legitimate provider (Hainan AICraft Matrix Technology Co., Ltd.,
ICP 琼ICP备2026009730号-1) and stays supported as an ordinary configured
provider. Note for whoever writes the replacement docs: that PR listed
claude-4.6-sonnetas AICraft's default model, but AICraft advertisesDeepSeek, Qwen, GLM, MiniMax and Doubao and lists no Anthropic models at all —
do not carry that default across.