llm_kernel/provider/
mapping.rs1#[derive(Debug, Clone, Copy, PartialEq, Eq)]
11pub enum Mapping {
12 Exact,
14 Aliased(&'static str),
16 Manual,
18}
19
20impl Mapping {
21 #[must_use]
24 pub fn upstream_key(&self) -> Option<&'static str> {
25 match self {
26 Mapping::Exact => None,
27 Mapping::Aliased(k) => Some(k),
28 Mapping::Manual => None,
29 }
30 }
31}
32
33#[must_use]
44pub fn resolve(catalog_id: &str) -> Mapping {
45 match catalog_id {
46 "anthropic" | "openai" | "zai" | "minimax" | "minimax-cn" | "deepseek" | "alibaba"
48 | "alibaba-cn" | "lmstudio" => Mapping::Exact,
49 "gemini" => Mapping::Aliased("google"),
51 "zai-cn" => Mapping::Aliased("zai"),
52 "zai-coding" | "zai-cn-coding" => Mapping::Aliased("zai-coding-plan"),
53 "kimi" => Mapping::Aliased("kimi-for-coding"),
54 "moonshot" => Mapping::Aliased("moonshotai"),
55 "alibaba-us" => Mapping::Aliased("alibaba"),
56 _ => Mapping::Manual,
58 }
59}
60
61#[cfg(test)]
62mod tests {
63 use super::*;
64
65 const EXACT: &[&str] = &[
66 "anthropic",
67 "openai",
68 "zai",
69 "minimax",
70 "minimax-cn",
71 "deepseek",
72 "alibaba",
73 "alibaba-cn",
74 "lmstudio",
75 ];
76 const MANUAL: &[&str] = &["native", "ve", "mimo", "ollama", "llamacpp"];
77
78 #[test]
79 fn test_exact_matches() {
80 for &id in EXACT {
81 assert_eq!(resolve(id), Mapping::Exact, "{id} should be Exact");
82 }
83 }
84
85 #[test]
86 fn test_aliased_matches() {
87 assert_eq!(resolve("gemini"), Mapping::Aliased("google"));
88 assert_eq!(resolve("zai-cn"), Mapping::Aliased("zai"));
89 assert_eq!(resolve("zai-coding"), Mapping::Aliased("zai-coding-plan"));
90 assert_eq!(
91 resolve("zai-cn-coding"),
92 Mapping::Aliased("zai-coding-plan")
93 );
94 assert_eq!(resolve("kimi"), Mapping::Aliased("kimi-for-coding"));
95 assert_eq!(resolve("moonshot"), Mapping::Aliased("moonshotai"));
96 assert_eq!(resolve("alibaba-us"), Mapping::Aliased("alibaba"));
97 }
98
99 #[test]
100 fn test_manual_matches() {
101 for &id in MANUAL {
102 assert_eq!(resolve(id), Mapping::Manual, "{id} should be Manual");
103 }
104 assert_eq!(resolve("totally-unknown"), Mapping::Manual);
105 }
106
107 #[test]
108 fn test_upstream_key_helper() {
109 assert_eq!(resolve("openai").upstream_key(), None); assert_eq!(resolve("gemini").upstream_key(), Some("google"));
111 assert_eq!(resolve("ollama").upstream_key(), None); }
113
114 #[test]
115 fn test_every_embedded_provider_is_classified() {
116 let ids = crate::provider::ProviderIndex::embedded().ids();
121 let aliased: &[&str] = &[
122 "gemini",
123 "zai-cn",
124 "zai-coding",
125 "zai-cn-coding",
126 "kimi",
127 "moonshot",
128 "alibaba-us",
129 ];
130 for id in &ids {
131 let m = resolve(id);
132 let is_exact = EXACT.contains(&id.as_str());
133 let is_aliased = aliased.contains(&id.as_str());
134 let is_manual = MANUAL.contains(&id.as_str());
135 assert!(
136 match m {
137 Mapping::Exact => is_exact,
138 Mapping::Aliased(_) => is_aliased,
139 Mapping::Manual => is_manual,
140 },
141 "provider {id} resolved to {m:?} but is not in any known bucket — \
142 add a mapping decision in resolve()"
143 );
144 }
145 }
146}