codetether_agent/search/
model.rs1use std::sync::Arc;
7
8use anyhow::{Result, anyhow};
9
10use crate::provider::{Provider, ProviderRegistry};
11
12pub const DEFAULT_ROUTER_MODEL: &str = "zai/glm-5.1";
15
16pub fn resolve_router_model(
26 registry: &ProviderRegistry,
27 model_ref: &str,
28) -> Result<(Arc<dyn Provider>, String)> {
29 if let Some((prov_name, model_name)) = model_ref.split_once('/') {
30 if let Some(prov) = registry.get(prov_name) {
31 return Ok((prov, model_name.to_string()));
32 }
33 let first = registry.list().first().copied().ok_or_else(|| {
38 anyhow!("router provider '{prov_name}' not available and no providers configured")
39 })?;
40 let prov = registry
41 .get(first)
42 .ok_or_else(|| anyhow!("provider '{first}' missing"))?;
43 tracing::warn!(
44 requested = prov_name,
45 requested_model = model_name,
46 fallback_provider = first,
47 "router provider unavailable; falling back to first registered provider"
48 );
49 return Ok((prov, model_name.to_string()));
50 }
51 let first = registry
52 .list()
53 .first()
54 .copied()
55 .ok_or_else(|| anyhow!("no providers configured"))?;
56 let prov = registry
57 .get(first)
58 .ok_or_else(|| anyhow!("provider '{first}' missing"))?;
59 Ok((prov, model_ref.to_string()))
60}