claude_code_switcher/templates/
zai.rs1use crate::{
4 settings::{
5 ClaudeSettings, EndpointConfig, HTTPConfig, ModelConfig, Permissions, ProviderConfig,
6 },
7 snapshots::SnapshotScope,
8 templates::Template,
9};
10use std::collections::HashMap;
11
12#[derive(Debug, Clone)]
14pub struct ZaiTemplate;
15
16impl Template for ZaiTemplate {
17 fn template_type(&self) -> crate::templates::TemplateType {
18 crate::templates::TemplateType::Zai
19 }
20
21 fn env_var_name(&self) -> &'static str {
22 "Z_AI_API_KEY"
23 }
24
25 fn display_name(&self) -> &'static str {
26 "ZAI (GLM)"
27 }
28
29 fn description(&self) -> &'static str {
30 "Zhipu AI GLM-4.6 with thinking capabilities and large context window"
31 }
32
33 fn create_settings(&self, api_key: &str, scope: &SnapshotScope) -> ClaudeSettings {
34 let mut settings = ClaudeSettings::new();
35
36 if matches!(scope, SnapshotScope::Common | SnapshotScope::All) {
37 settings.provider = Some(ProviderConfig {
38 id: "zhipu".to_string(),
39 metadata: None,
40 });
41
42 settings.model = Some(ModelConfig {
43 name: "glm-4.6".to_string(),
44 metadata: None,
45 });
46
47 settings.endpoint = Some(EndpointConfig {
48 id: "zhipu".to_string(),
49 api_base: "https://open.bigmodel.cn/api/anthropic".to_string(),
50 api_key: None,
51 endpoint_id: None,
52 metadata: None,
53 });
54
55 settings.http = Some(HTTPConfig {
56 timeout_ms: Some(3000000),
57 max_retries: Some(3),
58 retry_backoff_factor: Some(2.0),
59 });
60
61 settings.permissions = Some(Permissions {
62 allow_network_access: Some(true),
63 allow_filesystem_access: Some(true),
64 allow_command_execution: Some(false),
65 });
66 }
67
68 if matches!(scope, SnapshotScope::Env | SnapshotScope::All) {
69 let mut env = HashMap::new();
70 env.insert("ANTHROPIC_AUTH_TOKEN".to_string(), api_key.to_string());
71 env.insert(
72 "ANTHROPIC_BASE_URL".to_string(),
73 "https://open.bigmodel.cn/api/anthropic".to_string(),
74 );
75 env.insert("API_TIMEOUT_MS".to_string(), "3000000".to_string());
76 env.insert("ANTHROPIC_MODEL".to_string(), "glm-4.6".to_string());
77 env.insert(
78 "ANTHROPIC_SMALL_FAST_MODEL".to_string(),
79 "glm-4.6".to_string(),
80 );
81 env.insert("ENABLE_THINKING".to_string(), "true".to_string());
82 env.insert("REASONING_EFFORT".to_string(), "ultrathink".to_string());
83 env.insert("MAX_THINKING_TOKENS".to_string(), "32000".to_string());
84 env.insert("ENABLE_STREAMING".to_string(), "true".to_string());
85 env.insert("MAX_OUTPUT_TOKENS".to_string(), "96000".to_string());
86 env.insert("MAX_MCP_OUTPUT_TOKENS".to_string(), "64000".to_string());
87 env.insert("AUTH_HEADER_MODE".to_string(), "x-api-key".to_string());
88 settings.environment = Some(env);
89 }
90
91 settings
92 }
93}
94
95pub fn create_zai_template(api_key: &str, scope: &SnapshotScope) -> ClaudeSettings {
97 let template = ZaiTemplate;
98 template.create_settings(api_key, scope)
99}