claude_code_switcher/templates/
zai.rs

1//! ZAI (GLM/Zhipu) AI provider template implementation
2
3use crate::{
4    settings::{
5        ClaudeSettings, EndpointConfig, HTTPConfig, ModelConfig, Permissions, ProviderConfig,
6    },
7    snapshots::SnapshotScope,
8    templates::Template,
9};
10use std::collections::HashMap;
11
12/// ZAI (GLM/Zhipu) AI provider template
13#[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
95/// Create ZAI template settings (legacy compatibility function)
96pub fn create_zai_template(api_key: &str, scope: &SnapshotScope) -> ClaudeSettings {
97    let template = ZaiTemplate;
98    template.create_settings(api_key, scope)
99}