systemprompt_cli/commands/admin/setup/
catalog.rs1use std::collections::HashMap;
16
17use systemprompt_identifiers::{ProviderId, RouteId};
18use systemprompt_models::profile::{GatewayRoute, ProviderRegistry};
19
20use super::secrets::SecretsData;
21
22struct ProviderDefault {
23 name: &'static str,
24 route_pattern: &'static str,
25 default_upstream: Option<&'static str>,
26 present: fn(&SecretsData) -> bool,
27}
28
29const PROVIDER_DEFAULTS: &[ProviderDefault] = &[
30 ProviderDefault {
31 name: "anthropic",
32 route_pattern: "claude-*",
33 default_upstream: None,
34 present: |s| s.anthropic.is_some(),
35 },
36 ProviderDefault {
37 name: "openai",
38 route_pattern: "gpt-*",
39 default_upstream: Some("gpt-5-mini"),
40 present: |s| s.openai.is_some(),
41 },
42 ProviderDefault {
43 name: "gemini",
44 route_pattern: "gemini-*",
45 default_upstream: None,
46 present: |s| s.gemini.is_some(),
47 },
48];
49
50fn present_defaults(secrets: &SecretsData) -> Vec<&'static ProviderDefault> {
51 PROVIDER_DEFAULTS
52 .iter()
53 .filter(|p| (p.present)(secrets))
54 .collect()
55}
56
57pub fn build_routes(secrets: &SecretsData) -> Vec<GatewayRoute> {
58 present_defaults(secrets)
59 .iter()
60 .map(|d| {
61 let mut route = GatewayRoute {
62 id: RouteId::new(""),
63 model_pattern: d.route_pattern.to_owned(),
64 provider: ProviderId::new(d.name),
65 upstream_model: d.default_upstream.map(str::to_owned),
66 extra_headers: HashMap::new(),
67 pricing: None,
68 when: None,
69 requires: None,
70 };
71 route.ensure_id();
72 route
73 })
74 .collect()
75}
76
77pub fn build_registry(secrets: &SecretsData) -> ProviderRegistry {
78 let seed = match ProviderRegistry::default_seed() {
79 Ok(seed) => seed,
80 Err(e) => {
81 tracing::error!(
82 error = %e,
83 "embedded default provider catalog failed to parse; seeding an empty provider \
84 registry"
85 );
86 return ProviderRegistry::default();
87 },
88 };
89 ProviderRegistry {
90 providers: present_defaults(secrets)
91 .iter()
92 .filter_map(|d| seed.find_provider(d.name).cloned())
93 .collect(),
94 }
95}