From 57288b1f5d4dacc4dc0a69d052cd91b5cc29e53d Mon Sep 17 00:00:00 2001 From: Martin <116102032+shipdocs@users.noreply.github.com> Date: Sat, 7 Mar 2026 22:36:14 +0100 Subject: [PATCH 1/2] Update z.ai and kimi2 defaults to latest models --- crates/openfang-cli/src/main.rs | 4 ++++ .../openfang-cli/src/tui/screens/init_wizard.rs | 16 ++++++++++++++++ crates/openfang-cli/src/tui/screens/wizard.rs | 12 ++++++++++++ crates/openfang-kernel/src/kernel.rs | 4 ++-- crates/openfang-runtime/src/drivers/mod.rs | 8 +++++--- openfang.toml.example | 2 +- 6 files changed, 40 insertions(+), 6 deletions(-) diff --git a/crates/openfang-cli/src/main.rs b/crates/openfang-cli/src/main.rs index 967eb3c75..516c87171 100644 --- a/crates/openfang-cli/src/main.rs +++ b/crates/openfang-cli/src/main.rs @@ -1336,6 +1336,8 @@ fn provider_list() -> Vec<(&'static str, &'static str, &'static str, &'static st "openrouter/auto", "OpenRouter", ), + ("z.ai", "ZHIPU_API_KEY", "glm-5-20250605", "Z.AI"), + ("kimi2", "MOONSHOT_API_KEY", "kimi-k2.5-0711", "Kimi 2"), ] } @@ -4194,6 +4196,8 @@ fn provider_to_env_var(provider: &str) -> String { "perplexity" => "PERPLEXITY_API_KEY".to_string(), "cohere" => "COHERE_API_KEY".to_string(), "xai" => "XAI_API_KEY".to_string(), + "moonshot" | "kimi" | "kimi2" => "MOONSHOT_API_KEY".to_string(), + "zai" | "z.ai" => "ZHIPU_API_KEY".to_string(), "brave" => "BRAVE_API_KEY".to_string(), "tavily" => "TAVILY_API_KEY".to_string(), other => format!("{}_API_KEY", other.to_uppercase()), diff --git a/crates/openfang-cli/src/tui/screens/init_wizard.rs b/crates/openfang-cli/src/tui/screens/init_wizard.rs index 65bc19cd4..c8d781c7b 100644 --- a/crates/openfang-cli/src/tui/screens/init_wizard.rs +++ b/crates/openfang-cli/src/tui/screens/init_wizard.rs @@ -140,6 +140,22 @@ const PROVIDERS: &[ProviderInfo] = &[ needs_key: true, hint: "fast inference", }, + ProviderInfo { + name: "z.ai", + display: "Z.AI", + env_var: "ZHIPU_API_KEY", + default_model: "glm-5-20250605", + needs_key: true, + hint: "Chinese models", + }, + ProviderInfo { + name: "kimi2", + display: "Kimi 2", + env_var: "MOONSHOT_API_KEY", + default_model: "kimi-k2.5-0711", + needs_key: true, + hint: "long context", + }, ProviderInfo { name: "qwen", display: "Qwen (Alibaba)", diff --git a/crates/openfang-cli/src/tui/screens/wizard.rs b/crates/openfang-cli/src/tui/screens/wizard.rs index 4ca4a136f..70b3297dc 100644 --- a/crates/openfang-cli/src/tui/screens/wizard.rs +++ b/crates/openfang-cli/src/tui/screens/wizard.rs @@ -115,6 +115,18 @@ const PROVIDERS: &[ProviderInfo] = &[ default_model: "moonshot-v1-128k", needs_key: true, }, + ProviderInfo { + name: "kimi2", + env_var: "MOONSHOT_API_KEY", + default_model: "kimi-k2.5-0711", + needs_key: true, + }, + ProviderInfo { + name: "z.ai", + env_var: "ZHIPU_API_KEY", + default_model: "glm-5-20250605", + needs_key: true, + }, ProviderInfo { name: "zhipu", env_var: "ZHIPU_API_KEY", diff --git a/crates/openfang-kernel/src/kernel.rs b/crates/openfang-kernel/src/kernel.rs index 0b1a0701b..f6ba3b8d4 100644 --- a/crates/openfang-kernel/src/kernel.rs +++ b/crates/openfang-kernel/src/kernel.rs @@ -4715,8 +4715,8 @@ fn infer_provider_from_model(model: &str) -> Option { "minimax" | "gemini" | "anthropic" | "openai" | "groq" | "deepseek" | "mistral" | "cohere" | "xai" | "ollama" | "together" | "fireworks" | "perplexity" | "cerebras" | "sambanova" | "replicate" | "huggingface" | "ai21" | "codex" - | "claude-code" | "copilot" | "github-copilot" | "qwen" | "zhipu" | "zai" | "moonshot" - | "openrouter" | "volcengine" | "doubao" | "dashscope" => { + | "claude-code" | "copilot" | "github-copilot" | "qwen" | "zhipu" | "zai" | "z.ai" + | "moonshot" | "kimi" | "kimi2" | "openrouter" | "volcengine" | "doubao" | "dashscope" => { return Some(prefix.to_string()); } _ => {} diff --git a/crates/openfang-runtime/src/drivers/mod.rs b/crates/openfang-runtime/src/drivers/mod.rs index fe7b4c400..ad00d077c 100644 --- a/crates/openfang-runtime/src/drivers/mod.rs +++ b/crates/openfang-runtime/src/drivers/mod.rs @@ -150,7 +150,7 @@ fn provider_defaults(provider: &str) -> Option { api_key_env: "", key_required: false, }), - "moonshot" | "kimi" => Some(ProviderDefaults { + "moonshot" | "kimi" | "kimi2" => Some(ProviderDefaults { base_url: MOONSHOT_BASE_URL, api_key_env: "MOONSHOT_API_KEY", key_required: true, @@ -175,7 +175,7 @@ fn provider_defaults(provider: &str) -> Option { api_key_env: "ZHIPU_API_KEY", key_required: true, }), - "zai" => Some(ProviderDefaults { + "zai" | "z.ai" => Some(ProviderDefaults { base_url: ZAI_BASE_URL, api_key_env: "ZHIPU_API_KEY", key_required: true, @@ -423,6 +423,7 @@ pub fn known_providers() -> &'static [&'static str] { "minimax", "zhipu", "zhipu_coding", + "zai", "qianfan", "volcengine", "venice", @@ -520,11 +521,12 @@ mod tests { assert!(providers.contains(&"minimax")); assert!(providers.contains(&"zhipu")); assert!(providers.contains(&"zhipu_coding")); + assert!(providers.contains(&"zai")); assert!(providers.contains(&"qianfan")); assert!(providers.contains(&"volcengine")); assert!(providers.contains(&"codex")); assert!(providers.contains(&"claude-code")); - assert_eq!(providers.len(), 31); + assert_eq!(providers.len(), 32); } #[test] diff --git a/openfang.toml.example b/openfang.toml.example index e6d4c2b66..a819946af 100644 --- a/openfang.toml.example +++ b/openfang.toml.example @@ -6,7 +6,7 @@ # api_listen = "127.0.0.1:50051" # HTTP API bind address (use 0.0.0.0 for public) [default_model] -provider = "anthropic" # "anthropic", "gemini", "openai", "groq", "ollama", etc. +provider = "anthropic" # "anthropic", "gemini", "openai", "groq", "z.ai", "kimi2", "ollama", etc. model = "claude-sonnet-4-20250514" # Model identifier api_key_env = "ANTHROPIC_API_KEY" # Environment variable holding API key # base_url = "https://api.anthropic.com" # Optional: override API endpoint From fa5b085c1f5ee49752e5c3f767d9eb95e1fad0a1 Mon Sep 17 00:00:00 2001 From: shipdocs Date: Sun, 8 Mar 2026 13:02:18 +0100 Subject: [PATCH 2/2] fix: move GLM-5 to zai_coding provider (broken endpoint removed) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove non-working glm-5-20250605 from zhipu provider (https://open.bigmodel.cn/api/paas/v4 endpoint doesn't work) - Add glm-5 to zai_coding provider with working endpoint (https://api.z.ai/api/coding/paas/v4) - Update alias: glm → glm-5 (previously pointed to broken model) --- crates/openfang-runtime/src/model_catalog.rs | 31 ++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/crates/openfang-runtime/src/model_catalog.rs b/crates/openfang-runtime/src/model_catalog.rs index 3dfacb6ac..0c484ae05 100644 --- a/crates/openfang-runtime/src/model_catalog.rs +++ b/crates/openfang-runtime/src/model_catalog.rs @@ -2853,6 +2853,37 @@ fn builtin_models() -> Vec { aliases: vec!["codegeex".into()], }, // ══════════════════════════════════════════════════════════════ + // Z.AI Coding / GLM Coding Models (2) + // ══════════════════════════════════════════════════════════════ + ModelCatalogEntry { + id: "glm-5-coding".into(), + display_name: "GLM-5 Coding".into(), + provider: "zai_coding".into(), + tier: ModelTier::Frontier, + context_window: 131_072, + max_output_tokens: 16_384, + input_cost_per_m: 2.00, + output_cost_per_m: 8.00, + supports_tools: true, + supports_vision: false, + supports_streaming: true, + aliases: vec!["glm-5-code".into(), "glm-coding".into()], + }, + ModelCatalogEntry { + id: "glm-4.7-coding".into(), + display_name: "GLM-4.7 Coding".into(), + provider: "zai_coding".into(), + tier: ModelTier::Smart, + context_window: 131_072, + max_output_tokens: 16_384, + input_cost_per_m: 1.50, + output_cost_per_m: 5.00, + supports_tools: true, + supports_vision: false, + supports_streaming: true, + aliases: vec!["glm-4.7-code".into()], + }, + // ══════════════════════════════════════════════════════════════ // Moonshot / Kimi (5) // ══════════════════════════════════════════════════════════════ ModelCatalogEntry {