Files
cloudpods/pkg/aiproxy/models/catalog_seed_models.go
Zexi Li 40b3c82ab4 feat(aiproxy): add Z.AI / Zhipu provider with dual OpenAI and Anthropic API modes (#25131)
Register zhipu as a public OpenAI-compat provider with GLM catalog seeds,
Anthropic passthrough routing, and v4-style base URL path handling.
2026-07-13 11:25:22 +08:00

375 lines
19 KiB
Go

// Copyright 2019 Yunion
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package models
import (
"strings"
api "yunion.io/x/onecloud/pkg/apis/aiproxy"
)
// catalogSeedModel is a known upstream model id for built-in provider_key values.
// ModelKey is the id sent to the upstream API (no "provider/" prefix).
type catalogSeedModel struct {
ModelKey string
Description string
}
// catalogSeedModelsForProvider returns known public model ids for a provider_key.
// Used when creating ai_provider (PostCreate) and connectivity-test catalog fallback.
// Providers without a list return nil and a placeholder model_key "default" is used.
func catalogSeedModelsForProvider(providerKey string) []catalogSeedModel {
switch providerKey {
case api.ProviderKeyAnthropic:
return []catalogSeedModel{
{ModelKey: "claude-opus-4-20250514", Description: "Anthropic Claude Opus 4"},
{ModelKey: "claude-sonnet-4-20250514", Description: "Anthropic Claude Sonnet 4"},
{ModelKey: "claude-3-7-sonnet-20250219", Description: "Anthropic Claude 3.7 Sonnet"},
{ModelKey: "claude-3-5-sonnet-20241022", Description: "Anthropic Claude 3.5 Sonnet"},
{ModelKey: "claude-3-5-haiku-20241022", Description: "Anthropic Claude 3.5 Haiku"},
{ModelKey: "claude-3-opus-20240229", Description: "Anthropic Claude 3 Opus"},
{ModelKey: "claude-3-haiku-20240307", Description: "Anthropic Claude 3 Haiku"},
}
// disabled: uncommon provider
// case api.ProviderKeyAzure:
// // Azure OpenAI uses deployment names; these match common Azure OpenAI deployment ids.
// return []catalogSeedModel{
// {ModelKey: "gpt-4o", Description: "Azure OpenAI GPT-4o deployment"},
// {ModelKey: "gpt-4o-mini", Description: "Azure OpenAI GPT-4o mini deployment"},
// {ModelKey: "gpt-4", Description: "Azure OpenAI GPT-4 deployment"},
// {ModelKey: "gpt-35-turbo", Description: "Azure OpenAI GPT-3.5 Turbo deployment"},
// {ModelKey: "o3-mini", Description: "Azure OpenAI o3-mini deployment"},
// }
// disabled: uncommon provider
// case api.ProviderKeyBedrock:
// return []catalogSeedModel{
// {ModelKey: "anthropic.claude-3-5-sonnet-20241022-v2:0", Description: "Bedrock Claude 3.5 Sonnet"},
// {ModelKey: "anthropic.claude-3-5-haiku-20241022-v1:0", Description: "Bedrock Claude 3.5 Haiku"},
// {ModelKey: "anthropic.claude-3-opus-20240229-v1:0", Description: "Bedrock Claude 3 Opus"},
// {ModelKey: "anthropic.claude-3-sonnet-20240229-v1:0", Description: "Bedrock Claude 3 Sonnet"},
// {ModelKey: "anthropic.claude-3-haiku-20240307-v1:0", Description: "Bedrock Claude 3 Haiku"},
// {ModelKey: "meta.llama3-70b-instruct-v1:0", Description: "Bedrock Llama 3 70B Instruct"},
// {ModelKey: "meta.llama3-8b-instruct-v1:0", Description: "Bedrock Llama 3 8B Instruct"},
// {ModelKey: "mistral.mistral-large-2402-v1:0", Description: "Bedrock Mistral Large"},
// {ModelKey: "amazon.titan-text-express-v1", Description: "Bedrock Amazon Titan Text Express"},
// }
// disabled: uncommon provider
// case api.ProviderKeyCerebras:
// return []catalogSeedModel{
// {ModelKey: "llama3.1-8b", Description: "Cerebras Llama 3.1 8B"},
// {ModelKey: "llama3.1-70b", Description: "Cerebras Llama 3.1 70B"},
// {ModelKey: "llama-3.3-70b", Description: "Cerebras Llama 3.3 70B"},
// }
// disabled: uncommon provider
// case api.ProviderKeyCohere:
// return []catalogSeedModel{
// {ModelKey: "command-r-plus", Description: "Cohere Command R+"},
// {ModelKey: "command-r", Description: "Cohere Command R"},
// {ModelKey: "command-a", Description: "Cohere Command A"},
// {ModelKey: "command", Description: "Cohere Command"},
// {ModelKey: "command-light", Description: "Cohere Command Light"},
// {ModelKey: "embed-english-v3.0", Description: "Cohere Embed English v3"},
// {ModelKey: "embed-multilingual-v3.0", Description: "Cohere Embed Multilingual v3"},
// }
case api.ProviderKeyDeepseek:
return []catalogSeedModel{
{ModelKey: "deepseek-v4-flash", Description: "DeepSeek-V4-Flash; 1M context; high concurrency (2500); cost-efficient default"},
{ModelKey: "deepseek-v4-pro", Description: "DeepSeek-V4-Pro; 1M context; frontier reasoning/coding/agents (500 concurrency)"},
}
// disabled: uncommon provider
// case api.ProviderKeyElevenlabs:
// return []catalogSeedModel{
// {ModelKey: "eleven_multilingual_v2", Description: "ElevenLabs multilingual v2"},
// {ModelKey: "eleven_turbo_v2_5", Description: "ElevenLabs Turbo v2.5"},
// {ModelKey: "eleven_flash_v2_5", Description: "ElevenLabs Flash v2.5"},
// {ModelKey: "eleven_multilingual_v1", Description: "ElevenLabs multilingual v1"},
// }
// disabled: uncommon provider
// case api.ProviderKeyFireworks:
// return []catalogSeedModel{
// {ModelKey: "accounts/fireworks/models/llama-v3p1-8b-instruct", Description: "Fireworks Llama 3.1 8B Instruct"},
// {ModelKey: "accounts/fireworks/models/llama-v3p1-70b-instruct", Description: "Fireworks Llama 3.1 70B Instruct"},
// {ModelKey: "accounts/fireworks/models/llama-v3p3-70b-instruct", Description: "Fireworks Llama 3.3 70B Instruct"},
// {ModelKey: "accounts/fireworks/models/mixtral-8x7b-instruct", Description: "Fireworks Mixtral 8x7B Instruct"},
// }
case api.ProviderKeyGemini:
return []catalogSeedModel{
{ModelKey: "gemini-2.0-flash", Description: "Google Gemini 2.0 Flash"},
{ModelKey: "gemini-2.0-flash-lite", Description: "Google Gemini 2.0 Flash-Lite"},
{ModelKey: "gemini-1.5-pro", Description: "Google Gemini 1.5 Pro"},
{ModelKey: "gemini-1.5-flash", Description: "Google Gemini 1.5 Flash"},
{ModelKey: "gemini-1.5-flash-8b", Description: "Google Gemini 1.5 Flash 8B"},
{ModelKey: "gemini-embedding-001", Description: "Google Gemini Embedding 001"},
}
case api.ProviderKeyGroq:
return []catalogSeedModel{
{ModelKey: "llama-3.3-70b-versatile", Description: "Groq Llama 3.3 70B Versatile"},
{ModelKey: "llama-3.1-8b-instant", Description: "Groq Llama 3.1 8B Instant"},
{ModelKey: "llama-3.1-70b-versatile", Description: "Groq Llama 3.1 70B Versatile"},
{ModelKey: "mixtral-8x7b-32768", Description: "Groq Mixtral 8x7B"},
{ModelKey: "gemma2-9b-it", Description: "Groq Gemma2 9B IT"},
}
case api.ProviderKeyHuggingface:
return []catalogSeedModel{
{ModelKey: "meta-llama/Meta-Llama-3.1-8B-Instruct", Description: "HF Llama 3.1 8B Instruct"},
{ModelKey: "meta-llama/Meta-Llama-3.1-70B-Instruct", Description: "HF Llama 3.1 70B Instruct"},
{ModelKey: "mistralai/Mistral-7B-Instruct-v0.3", Description: "HF Mistral 7B Instruct"},
{ModelKey: "Qwen/Qwen2.5-72B-Instruct", Description: "HF Qwen2.5 72B Instruct"},
}
case api.ProviderKeyMistral:
return []catalogSeedModel{
{ModelKey: "mistral-large-latest", Description: "Mistral Large (latest)"},
{ModelKey: "mistral-small-latest", Description: "Mistral Small (latest)"},
{ModelKey: "pixtral-12b-2409", Description: "Mistral Pixtral 12B"},
{ModelKey: "codestral-latest", Description: "Mistral Codestral (latest)"},
{ModelKey: "ministral-8b-latest", Description: "Mistral Ministral 8B"},
{ModelKey: "open-mistral-nemo", Description: "Mistral Open Mistral Nemo"},
{ModelKey: "mixtral-8x22b", Description: "Mistral Mixtral 8x22B"},
{ModelKey: "mixtral-8x7b", Description: "Mistral Mixtral 8x7B"},
}
// disabled: uncommon provider
// case api.ProviderKeyNebius:
// return []catalogSeedModel{
// {ModelKey: "deepseek-ai/DeepSeek-V3", Description: "Nebius DeepSeek V3"},
// {ModelKey: "Qwen/Qwen2.5-72B-Instruct", Description: "Nebius Qwen2.5 72B Instruct"},
// {ModelKey: "meta-llama/Llama-3.3-70B-Instruct", Description: "Nebius Llama 3.3 70B Instruct"},
// }
case api.ProviderKeyOllama:
return []catalogSeedModel{
{ModelKey: "llama3.2", Description: "Ollama Llama 3.2"},
{ModelKey: "llama3.1", Description: "Ollama Llama 3.1"},
{ModelKey: "mistral", Description: "Ollama Mistral"},
{ModelKey: "qwen2.5", Description: "Ollama Qwen 2.5"},
{ModelKey: "codellama", Description: "Ollama Code Llama"},
{ModelKey: "phi3", Description: "Ollama Phi 3"},
}
case api.ProviderKeyVLLM:
return []catalogSeedModel{
{ModelKey: "meta-llama/Meta-Llama-3.1-8B-Instruct", Description: "vLLM Llama 3.1 8B Instruct"},
{ModelKey: "meta-llama/Meta-Llama-3.1-70B-Instruct", Description: "vLLM Llama 3.1 70B Instruct"},
{ModelKey: "Qwen/Qwen2.5-7B-Instruct", Description: "vLLM Qwen2.5 7B Instruct"},
{ModelKey: "Qwen/Qwen2.5-72B-Instruct", Description: "vLLM Qwen2.5 72B Instruct"},
{ModelKey: "mistralai/Mistral-7B-Instruct-v0.3", Description: "vLLM Mistral 7B Instruct"},
}
case api.ProviderKeyOpenAI:
return []catalogSeedModel{
{ModelKey: "gpt-5-nano", Description: "OpenAI GPT-5 nano"},
{ModelKey: "gpt-5-mini", Description: "OpenAI GPT-5 mini"},
{ModelKey: "gpt-5", Description: "OpenAI GPT-5"},
{ModelKey: "gpt-5.1", Description: "OpenAI GPT-5.1"},
{ModelKey: "gpt-5.1-mini", Description: "OpenAI GPT-5.1 mini"},
{ModelKey: "gpt-5.1-codex", Description: "OpenAI GPT-5.1 Codex"},
{ModelKey: "gpt-5.1-codex-max", Description: "OpenAI GPT-5.1 Codex Max"},
{ModelKey: "gpt-5.2", Description: "OpenAI GPT-5.2"},
{ModelKey: "gpt-5.2-pro", Description: "OpenAI GPT-5.2 pro"},
{ModelKey: "gpt-5.2-codex", Description: "OpenAI GPT-5.2 Codex"},
{ModelKey: "gpt-4.1", Description: "OpenAI GPT-4.1"},
{ModelKey: "gpt-4.1-mini", Description: "OpenAI GPT-4.1 mini"},
{ModelKey: "gpt-4.1-nano", Description: "OpenAI GPT-4.1 nano"},
{ModelKey: "gpt-4o", Description: "OpenAI GPT-4o"},
{ModelKey: "gpt-4o-mini", Description: "OpenAI GPT-4o mini"},
{ModelKey: "chatgpt-4o-latest", Description: "OpenAI ChatGPT-4o latest"},
{ModelKey: "gpt-4-turbo", Description: "OpenAI GPT-4 Turbo"},
{ModelKey: "gpt-4", Description: "OpenAI GPT-4"},
{ModelKey: "gpt-3.5-turbo", Description: "OpenAI GPT-3.5 Turbo"},
{ModelKey: "o1", Description: "OpenAI o1"},
{ModelKey: "o1-mini", Description: "OpenAI o1-mini"},
{ModelKey: "o1-preview", Description: "OpenAI o1-preview"},
{ModelKey: "o3", Description: "OpenAI o3"},
{ModelKey: "o3-mini", Description: "OpenAI o3-mini"},
{ModelKey: "o4-mini", Description: "OpenAI o4-mini"},
{ModelKey: "text-embedding-3-small", Description: "OpenAI text-embedding-3-small"},
{ModelKey: "text-embedding-3-large", Description: "OpenAI text-embedding-3-large"},
{ModelKey: "text-embedding-ada-002", Description: "OpenAI text-embedding-ada-002"},
}
case api.ProviderKeyOpenrouter:
return []catalogSeedModel{
{ModelKey: "openai/gpt-4o", Description: "OpenRouter OpenAI GPT-4o"},
{ModelKey: "openai/gpt-4o-mini", Description: "OpenRouter OpenAI GPT-4o mini"},
{ModelKey: "anthropic/claude-3.5-sonnet", Description: "OpenRouter Claude 3.5 Sonnet"},
{ModelKey: "anthropic/claude-3.5-haiku", Description: "OpenRouter Claude 3.5 Haiku"},
{ModelKey: "google/gemini-2.0-flash-001", Description: "OpenRouter Gemini 2.0 Flash"},
{ModelKey: "meta-llama/llama-3.3-70b-instruct", Description: "OpenRouter Llama 3.3 70B Instruct"},
{ModelKey: "mistralai/mistral-large", Description: "OpenRouter Mistral Large"},
}
// disabled: uncommon provider
// case api.ProviderKeyPerplexity:
// return []catalogSeedModel{
// {ModelKey: "sonar", Description: "Perplexity Sonar"},
// {ModelKey: "sonar-pro", Description: "Perplexity Sonar Pro"},
// {ModelKey: "sonar-reasoning", Description: "Perplexity Sonar Reasoning"},
// {ModelKey: "llama-3.1-sonar-small-128k-online", Description: "Perplexity Llama 3.1 Sonar Small online"},
// {ModelKey: "llama-3.1-sonar-large-128k-online", Description: "Perplexity Llama 3.1 Sonar Large online"},
// }
// disabled: uncommon provider
// case api.ProviderKeyReplicate:
// return []catalogSeedModel{
// {ModelKey: "meta/meta-llama-3-8b-instruct", Description: "Replicate Meta Llama 3 8B Instruct"},
// {ModelKey: "meta/meta-llama-3-70b-instruct", Description: "Replicate Meta Llama 3 70B Instruct"},
// {ModelKey: "mistralai/mixtral-8x7b-instruct-v0.1", Description: "Replicate Mixtral 8x7B Instruct"},
// }
// disabled: uncommon provider
// case api.ProviderKeyRunway:
// return []catalogSeedModel{
// {ModelKey: "gen3a_turbo", Description: "Runway Gen-3 Alpha Turbo"},
// {ModelKey: "gen3a", Description: "Runway Gen-3 Alpha"},
// {ModelKey: "gen4_aleph", Description: "Runway Gen-4 Aleph"},
// }
// disabled: uncommon provider
// case api.ProviderKeyVertex:
// return []catalogSeedModel{
// {ModelKey: "gemini-2.0-flash", Description: "Vertex AI Gemini 2.0 Flash"},
// {ModelKey: "gemini-1.5-pro", Description: "Vertex AI Gemini 1.5 Pro"},
// {ModelKey: "gemini-1.5-flash", Description: "Vertex AI Gemini 1.5 Flash"},
// {ModelKey: "publishers/google/models/gemini-1.5-pro", Description: "Vertex publisher path Gemini 1.5 Pro"},
// }
// disabled: uncommon provider
// case api.ProviderKeyXai:
// return []catalogSeedModel{
// {ModelKey: "grok-3", Description: "xAI Grok 3"},
// {ModelKey: "grok-3-mini", Description: "xAI Grok 3 mini"},
// {ModelKey: "grok-2-latest", Description: "xAI Grok 2 latest"},
// {ModelKey: "grok-2-1212", Description: "xAI Grok 2 1212"},
// {ModelKey: "grok-beta", Description: "xAI Grok beta"},
// }
// disabled: uncommon provider
// case api.ProviderKeyAliyun:
// return aliyunQwenSeedModels()
// disabled: uncommon provider
// case api.ProviderKeyBaidu:
// return baiduErnieSeedModels()
case api.ProviderKeyXiaomi:
return xiaomiMimoSeedModels()
case api.ProviderKeyMoonshot:
return moonshotKimiSeedModels()
case api.ProviderKeyZhipu:
return zhipuGLMSeedModels()
default:
return nil
}
}
func aliyunQwenSeedModels() []catalogSeedModel {
return []catalogSeedModel{
{ModelKey: "qwen-turbo", Description: "Alibaba Qwen Turbo"},
{ModelKey: "qwen-plus", Description: "Alibaba Qwen Plus"},
{ModelKey: "qwen-max", Description: "Alibaba Qwen Max"},
{ModelKey: "qwen-long", Description: "Alibaba Qwen Long context"},
{ModelKey: "qwen-vl-max", Description: "Alibaba Qwen-VL Max"},
{ModelKey: "qwen-vl-plus", Description: "Alibaba Qwen-VL Plus"},
{ModelKey: "qwen-vl-ocr", Description: "Alibaba Qwen-VL OCR"},
{ModelKey: "qwen2.5-0.5b-instruct", Description: "Alibaba Qwen2.5 0.5B Instruct"},
{ModelKey: "qwen2.5-1.5b-instruct", Description: "Alibaba Qwen2.5 1.5B Instruct"},
{ModelKey: "qwen2.5-3b-instruct", Description: "Alibaba Qwen2.5 3B Instruct"},
{ModelKey: "qwen2.5-7b-instruct", Description: "Alibaba Qwen2.5 7B Instruct"},
{ModelKey: "qwen2.5-14b-instruct", Description: "Alibaba Qwen2.5 14B Instruct"},
{ModelKey: "qwen2.5-32b-instruct", Description: "Alibaba Qwen2.5 32B Instruct"},
{ModelKey: "qwen2.5-72b-instruct", Description: "Alibaba Qwen2.5 72B Instruct"},
{ModelKey: "qwen2.5-coder-7b-instruct", Description: "Alibaba Qwen2.5 Coder 7B Instruct"},
{ModelKey: "qwen2.5-coder-32b-instruct", Description: "Alibaba Qwen2.5 Coder 32B Instruct"},
{ModelKey: "qwen3-30b-a3b", Description: "Alibaba Qwen3 30B A3B MoE"},
{ModelKey: "qwen3-32b", Description: "Alibaba Qwen3 32B"},
{ModelKey: "qwen3-235b-a22b", Description: "Alibaba Qwen3 235B A22B MoE"},
{ModelKey: "qwen-math-plus", Description: "Alibaba Qwen Math Plus"},
{ModelKey: "qwen-coder-plus", Description: "Alibaba Qwen Coder Plus"},
{ModelKey: "text-embedding-v3", Description: "Alibaba text-embedding-v3"},
{ModelKey: "text-embedding-v4", Description: "Alibaba text-embedding-v4"},
}
}
func baiduErnieSeedModels() []catalogSeedModel {
return []catalogSeedModel{
{ModelKey: "ernie-4.0-turbo-8k", Description: "Baidu ERNIE 4.0 Turbo 8K"},
{ModelKey: "ernie-4.0-8k", Description: "Baidu ERNIE 4.0 8K"},
{ModelKey: "ernie-4.0-turbo-128k", Description: "Baidu ERNIE 4.0 Turbo 128K"},
{ModelKey: "ernie-3.5-8k", Description: "Baidu ERNIE 3.5 8K"},
{ModelKey: "ernie-3.5-128k", Description: "Baidu ERNIE 3.5 128K"},
{ModelKey: "ernie-speed-128k", Description: "Baidu ERNIE Speed 128K"},
{ModelKey: "ernie-lite-8k", Description: "Baidu ERNIE Lite 8K"},
{ModelKey: "ernie-char-8k", Description: "Baidu ERNIE Character 8K"},
{ModelKey: "embedding-v1", Description: "Baidu Wenxin embedding-v1"},
{ModelKey: "tao-8k", Description: "Baidu ERNIE Tao 8K"},
}
}
func xiaomiMimoSeedModels() []catalogSeedModel {
return []catalogSeedModel{
{ModelKey: "mimo-v2.5-pro", Description: "Xiaomi MiMo 2.5 Pro (flagship text)"},
{ModelKey: "mimo-v2-pro", Description: "Xiaomi MiMo 2 Pro"},
{ModelKey: "mimo-v2.5", Description: "Xiaomi MiMo 2.5 (multimodal text)"},
{ModelKey: "mimo-v2-omni", Description: "Xiaomi MiMo 2 Omni (multimodal)"},
{ModelKey: "mimo-v2-flash", Description: "Xiaomi MiMo 2 Flash (fast)"},
}
}
var catalogSeedProviderKeys = []string{
api.ProviderKeyAnthropic,
api.ProviderKeyDeepseek,
api.ProviderKeyGemini,
api.ProviderKeyGroq,
api.ProviderKeyHuggingface,
api.ProviderKeyMistral,
api.ProviderKeyOllama,
api.ProviderKeyVLLM,
api.ProviderKeyOpenAI,
api.ProviderKeyOpenrouter,
api.ProviderKeyXiaomi,
api.ProviderKeyMoonshot,
}
// CatalogSeedDescription returns a known description for modelKey from built-in seed catalogs.
func CatalogSeedDescription(modelKey string) string {
modelKey = strings.TrimSpace(modelKey)
if modelKey == "" {
return ""
}
for _, providerKey := range catalogSeedProviderKeys {
for _, item := range catalogSeedModelsForProvider(providerKey) {
if item.ModelKey == modelKey {
return item.Description
}
}
}
return ""
}
func moonshotKimiSeedModels() []catalogSeedModel {
return []catalogSeedModel{
{ModelKey: "kimi-k2.7-code", Description: "Moonshot Kimi K2.7 Code"},
{ModelKey: "kimi-k2.7-code-highspeed", Description: "Moonshot Kimi K2.7 Code (highspeed)"},
{ModelKey: "kimi-k2.6", Description: "Moonshot Kimi K2.6"},
{ModelKey: "kimi-k2.5", Description: "Moonshot Kimi K2.5"},
{ModelKey: "moonshot-v1-8k", Description: "Moonshot v1 8K"},
{ModelKey: "moonshot-v1-32k", Description: "Moonshot v1 32K"},
{ModelKey: "moonshot-v1-128k", Description: "Moonshot v1 128K"},
{ModelKey: "moonshot-v1-auto", Description: "Moonshot v1 Auto"},
{ModelKey: "moonshot-v1-8k-vision-preview", Description: "Moonshot v1 8K Vision"},
{ModelKey: "moonshot-v1-32k-vision-preview", Description: "Moonshot v1 32K Vision"},
{ModelKey: "moonshot-v1-128k-vision-preview", Description: "Moonshot v1 128K Vision"},
}
}
func zhipuGLMSeedModels() []catalogSeedModel {
return []catalogSeedModel{
{ModelKey: "glm-5.2", Description: "Z.AI GLM-5.2 flagship; 1M context; long-horizon agents"},
{ModelKey: "glm-5.1", Description: "Z.AI GLM-5.1; long-horizon tasks"},
{ModelKey: "glm-5-turbo", Description: "Z.AI GLM-5-Turbo; cost-efficient"},
{ModelKey: "glm-4.7", Description: "Z.AI GLM-4.7; general chat and coding"},
{ModelKey: "glm-4.7-flash", Description: "Z.AI GLM-4.7-Flash; free tier"},
{ModelKey: "glm-4.6", Description: "Z.AI GLM-4.6; 200K context"},
{ModelKey: "glm-5v-turbo", Description: "Z.AI GLM-5V-Turbo; vision"},
}
}