fix: names

Carlos Alexandro Becker created

Signed-off-by: Carlos Alexandro Becker <caarlos0@users.noreply.github.com>

Change summary

CRUSH.md                                 |   32 
cmd/aihubmix/main.go                     |    3 
internal/names/model.go                  |  429 +++++++++
internal/providers/configs/aihubmix.json | 1189 +------------------------
4 files changed, 536 insertions(+), 1,117 deletions(-)

Detailed changes

CRUSH.md 🔗

@@ -20,6 +20,38 @@
 - JSON: Use `json.MarshalIndent` for pretty output, validate unmarshaling
 - File permissions: Use 0o600 for sensitive config files
 
+## Model Names
+
+The `internal/names` package provides human-readable display names for model IDs. **Only use this package when the provider API does not already provide a good display name.**
+
+Check the API response first:
+- If the API provides a `name` or `display_name` field, use that directly
+- Only use `names.GetDisplayName(modelID)` when you only have a `model_id` field
+
+Examples:
+- ✅ **Use API name**: OpenRouter API has a `name` field → use `model.Name`
+- ✅ **Use names package**: AIHubMix API only has `model_id` → use `names.GetDisplayName(model.ModelID)`
+
+```go
+import "github.com/charmbracelet/catwalk/internal/names"
+
+// Only when API doesn't provide a name:
+model := catwalk.Model{
+    ID:   modelID,
+    Name: names.GetDisplayName(modelID),
+    // ... other fields
+}
+```
+
+The names package uses:
+1. Static mappings for known models (most common models)
+2. Case-insensitive matching
+3. Provider prefix stripping (e.g., "anthropic/claude-sonnet-4" -> matches "claude-sonnet-4")
+4. Levenshtein distance fuzzy matching for unknown models
+5. Smart formatting for completely unknown models (converts "3-5" to "3.5", etc.)
+
+To add new model mappings, edit `internal/names/model.go` and add entries to the `modelNames` map.
+
 ## Adding more provider commands
 
 - Create the `./cmd/{provider-name}/main.go` file

cmd/aihubmix/main.go 🔗

@@ -14,6 +14,7 @@ import (
 	"strings"
 	"time"
 
+	"github.com/charmbracelet/catwalk/internal/names"
 	"github.com/charmbracelet/catwalk/pkg/catwalk"
 )
 
@@ -140,7 +141,7 @@ func main() {
 
 		aiHubMixProvider.Models = append(aiHubMixProvider.Models, catwalk.Model{
 			ID:                     model.ModelID,
-			Name:                   model.ModelID,
+			Name:                   names.GetDisplayName(model.ModelID),
 			CostPer1MIn:            parseFloat(model.Pricing.Input),
 			CostPer1MOut:           parseFloat(model.Pricing.Output),
 			CostPer1MInCached:      parseFloat(model.Pricing.CacheWrite),

internal/names/model.go 🔗

@@ -0,0 +1,429 @@
+// Package names provides utilities for generating human-readable model names
+// from model IDs. It uses a combination of static mappings and Levenshtein
+// distance-based fuzzy matching to provide consistent, user-friendly names.
+package names
+
+import (
+	"strings"
+	"unicode"
+)
+
+// modelNames maps model IDs to their human-readable display names.
+var modelNames = map[string]string{
+	// Anthropic
+	"claude-sonnet-4-5-20250929": "Claude Sonnet 4.5",
+	"claude-opus-4-5-20251101":   "Claude Opus 4.5",
+	"claude-3-5-haiku-20241022":  "Claude 3.5 Haiku",
+	"claude-3-5-sonnet-20241022": "Claude 3.5 Sonnet",
+	"claude-3-opus-20240229":     "Claude 3 Opus",
+	"claude-3-haiku-20240307":    "Claude 3 Haiku",
+	"claude-sonnet-4":            "Claude Sonnet 4",
+	"claude-sonnet-4-5":          "Claude Sonnet 4.5",
+	"claude-opus-4":              "Claude Opus 4",
+	"claude-opus-4-5":            "Claude Opus 4.5",
+	"claude-opus-4-5-think":      "Claude Opus 4.5 Think",
+	"claude-sonnet-4-5-20250214": "Claude Sonnet 4.5",
+	"claude-haiku-4-5":           "Claude Haiku 4.5",
+	"claude-3-5-haiku":           "Claude 3.5 Haiku",
+	"claude-3-5-sonnet":          "Claude 3.5 Sonnet",
+	"claude-sonnet-4-0":          "Claude Sonnet 4",
+	"claude-opus-4-0":            "Claude Opus 4",
+	"claude-sonnet-4-5-think":    "Claude Sonnet 4.5 Think",
+	"claude-3-7-sonnet":          "Claude 3.7 Sonnet",
+
+	// OpenAI
+	"gpt-5.2":              "GPT-5.2",
+	"gpt-5.2-codex":        "GPT-5.2 Codex",
+	"gpt-5.1-codex":        "GPT-5.1 Codex",
+	"gpt-5.1":              "GPT-5.1",
+	"gpt-4.1":              "GPT-4.1",
+	"gpt-4.1-mini":         "GPT-4.1 Mini",
+	"gpt-4.1-nano":         "GPT-4.1 Nano",
+	"gpt-4-turbo":          "GPT-4 Turbo",
+	"gpt-4-turbo-preview":  "GPT-4 Turbo Preview",
+	"gpt-4-vision-preview": "GPT-4 Vision",
+	"gpt-3.5-turbo":        "GPT-3.5 Turbo",
+	"gpt-3.5-turbo-16k":    "GPT-3.5 Turbo 16K",
+	"o1-preview":           "O1 Preview",
+	"o1-mini":              "O1 Mini",
+	"o1":                   "O1",
+	"o3":                   "O3",
+	"o3-mini":              "O3 Mini",
+	"o3-pro":               "O3 Pro",
+	"o4-mini":              "O4 Mini",
+	"gpt-5":                "GPT-5",
+	"gpt-5-pro":            "GPT-5 Pro",
+	"gpt-5-mini":           "GPT-5 Mini",
+	"gpt-5-nano":           "GPT-5 Nano",
+	"gpt-5-codex":          "GPT-5 Codex",
+
+	// DeepSeek
+	"deepseek-r1":            "DeepSeek R1",
+	"deepseek-v3":            "DeepSeek V3",
+	"deepseek-v3-fast":       "DeepSeek V3 Fast",
+	"deepseek-v3.1-fast":     "DeepSeek V3.1 Fast",
+	"deepseek-v3.1-terminus": "DeepSeek V3.1 Terminus",
+	"deepseek-v3.1-think":    "DeepSeek V3.1 Think",
+	"deepseek-v3.2":          "DeepSeek V3.2",
+	"deepseek-v3.2-fast":     "DeepSeek V3.2 Fast",
+	"deepseek-v3.2-think":    "DeepSeek V3.2 Think",
+	"deepseek-v3.2-speciale": "DeepSeek V3.2 Speciale",
+	"deepseek-math-v2":       "DeepSeek Math V2",
+	"deepseek-ocr":           "DeepSeek OCR",
+
+	// Microsoft Phi
+	"phi-4-mini-reasoning": "Phi 4 Mini",
+	"phi-4-reasoning":      "Phi 4",
+	"phi-4-mini":           "Phi 4 Mini",
+	"phi-4":                "Phi 4",
+	"phi-3.5-mini":         "Phi 3.5 Mini",
+	"phi-3.5":              "Phi 3.5",
+	"phi-3-mini":           "Phi 3 Mini",
+	"phi-3":                "Phi 3",
+
+	// ByteDance
+	"bytedance-seed/seed-oss-36b-instruct": "ByteDance Seed OSS 36B",
+
+	// Google/Gemini
+	"gemini-3-flash-preview":                 "Gemini 3.0 Flash Preview",
+	"gemini-3-flash-preview-free":            "Gemini 3.0 Flash Preview (Free)",
+	"gemini-2.5-pro":                         "Gemini 2.5 Pro",
+	"gemini-2.5-flash":                       "Gemini 2.5 Flash",
+	"gemini-2.5-flash-lite":                  "Gemini 2.5 Flash Lite",
+	"gemini-2.5-flash-lite-preview-09-2025":  "Gemini 2.5 Flash Lite Preview",
+	"gemini-2.5-flash-preview-09-2025":       "Gemini 2.5 Flash Preview",
+	"gemini-2.5-flash-preview-05-20-nothink": "Gemini 2.5 Flash Preview (No Think)",
+	"gemini-2.5-flash-preview-05-20-search":  "Gemini 2.5 Flash Search",
+	"gemini-2.5-flash-nothink":               "Gemini 2.5 Flash (No Think)",
+	"gemini-2.5-flash-search":                "Gemini 2.5 Flash Search",
+	"gemini-2.5-pro-preview-05-06":           "Gemini 2.5 Pro Preview",
+	"gemini-2.5-pro-preview-06-05":           "Gemini 2.5 Pro Preview",
+	"gemini-2.5-pro-search":                  "Gemini 2.5 Pro Search",
+	"gemini-2.0-pro-exp-02-05":               "Gemini 2.0 Pro",
+	"gemini-2.0-flash-exp":                   "Gemini 2.0 Flash",
+	"gemini-2.0-flash-free":                  "Gemini 2.0 Flash (Free)",
+	"gemini-1.5-pro":                         "Gemini 1.5 Pro",
+	"gemini-1.5-flash":                       "Gemini 1.5 Flash",
+	"gemini-1.5-flash-8b":                    "Gemini 1.5 Flash 8B",
+	"gemini-1.0-pro":                         "Gemini 1.0 Pro",
+
+	// Zhipu AI (GLM)
+	"glm-4.7":       "GLM-4.7",
+	"glm-4.7-flash": "GLM-4.7 Flash",
+	"glm-4.6":       "GLM-4.6",
+	"glm-4.6v":      "GLM-4.6 Vision",
+	"glm-4.5":       "GLM-4.5",
+	"glm-4-flash":   "GLM-4 Flash",
+	"glm-4-plus":    "GLM-4 Plus",
+	"glm-4-air":     "GLM-4 Air",
+
+	// Meta (Llama)
+	"llama-4-maverick":             "Llama 4 Maverick",
+	"llama-4-scout":                "Llama 4 Scout",
+	"llama-3.3-70b-instruct":       "Llama 3.3 70B",
+	"llama-3.2-90b-vision-preview": "Llama 3.2 90B Vision",
+	"llama-3.2-11b-vision-preview": "Llama 3.2 11B Vision",
+	"llama-3.2-3b-instruct":        "Llama 3.2 3B",
+	"llama-3.2-1b-instruct":        "Llama 3.2 1B",
+	"llama-3.1-405b-instruct":      "Llama 3.1 405B",
+	"llama-3.1-70b-instruct":       "Llama 3.1 70B",
+	"llama-3.1-8b-instruct":        "Llama 3.1 8B",
+	"llama-3-70b-instruct":         "Llama 3 70B",
+	"llama-3-8b-instruct":          "Llama 3 8B",
+	"llama-2-70b-chat":             "Llama 2 70B",
+	"llama-2-13b-chat":             "Llama 2 13B",
+	"llama-2-7b-chat":              "Llama 2 7B",
+
+	// Mistral
+	"mistral-large-2411":          "Mistral Large",
+	"mistral-large-3":             "Mistral Large 3",
+	"mistral-large-2402":          "Mistral Large (2024.02)",
+	"mistral-medium-2312":         "Mistral Medium",
+	"mistral-small-2402":          "Mistral Small",
+	"mistral-7b-instruct-v0.3":    "Mistral 7B v0.3",
+	"mixtral-8x7b-instruct-v0.1":  "Mixtral 8x7B",
+	"mixtral-8x22b-instruct-v0.1": "Mixtral 8x22B",
+	"mistral-nemo":                "Mistral Nemo",
+	"codestral-latest":            "Codestral",
+	"codestral-2405":              "Codestral",
+
+	// Cohere
+	"command-r-plus":      "Command R+",
+	"command-r-08-2024":   "Command R",
+	"command-r7b-12-2024": "Command R7B",
+	"command-light":       "Command Light",
+	"command":             "Command",
+
+	// AI21
+	"jamba-large-1.7": "Jamba Large 1.7",
+	"jamba-mini-1.7":  "Jamba Mini 1.7",
+
+	// X.AI (Grok)
+	"grok-4-1-fast-non-reasoning": "Grok 4.1 Fast",
+	"grok-4-1-fast-reasoning":     "Grok 4.1 Fast (Reasoning)",
+	"grok-code-fast-1":            "Grok Code Fast",
+	"grok-2":                      "Grok 2",
+	"grok-2-1212":                 "Grok 2",
+	"grok-1-5":                    "Grok 1.5",
+	"grok-beta":                   "Grok Beta",
+
+	// Alibaba (Qwen)
+	"qwen-2.5-coder-32b-instruct": "Qwen 2.5 Coder 32B",
+	"qwen-2.5-72b-instruct":       "Qwen 2.5 72B",
+	"qwen-2.5-14b-instruct":       "Qwen 2.5 14B",
+	"qwen-2.5-7b-instruct":        "Qwen 2.5 7B",
+	"qwen-2.5-3b-instruct":        "Qwen 2.5 3B",
+	"qwen-2-72b-instruct":         "Qwen 2 72B",
+	"qwen-2-7b-instruct":          "Qwen 2 7B",
+	"qwq-32b-preview":             "Qwen QwQ 32B",
+	"qwq-32b":                     "Qwen QwQ 32B",
+
+	// Baidu (ERNIE)
+	"ernie-5.0-thinking-exp":     "ERNIE 5.0 Thinking",
+	"ernie-5.0-thinking-preview": "ERNIE 5.0 Thinking Preview",
+	"ernie-4.5":                  "ERNIE 4.5",
+	"ernie-4.5-turbo-latest":     "ERNIE 4.5 Turbo",
+	"ernie-4.5-turbo-vl":         "ERNIE 4.5 Turbo Vision",
+	"ernie-x1.1-preview":         "ERNIE X1.1 Preview",
+	"ernie-x1-turbo":             "ERNIE X1 Turbo",
+
+	// Kimi
+	"kimi-for-coding-free":  "Kimi for Coding (Free)",
+	"kimi-k2-thinking":      "Kimi K2 Thinking",
+	"kimi-k2-0905":          "Kimi K2",
+	"kimi-k2-0711":          "Kimi K2 (0711)",
+	"kimi-k2-turbo-preview": "Kimi K2 Turbo Preview",
+
+	// Qwen (Alibaba)
+	"qwen3-vl-235b-a22b-instruct":    "Qwen3 VL 235B",
+	"qwen3-vl-235b-a22b-thinking":    "Qwen3 VL 235B Thinking",
+	"qwen3-vl-30b-a3b-instruct":      "Qwen3 VL 30B",
+	"qwen3-vl-30b-a3b-thinking":      "Qwen3 VL 30B Thinking",
+	"qwen3-vl-plus":                  "Qwen3 VL Plus",
+	"qwen3-max":                      "Qwen3 Max",
+	"qwen3-next-80b-a3b-instruct":    "Qwen3 Next 80B",
+	"qwen3-next-80b-a3b-thinking":    "Qwen3 Next 80B Thinking",
+	"qwen3-235b-a22b-instruct-2507":  "Qwen3 235B",
+	"qwen3-235b-a22b-thinking-2507":  "Qwen3 235B Thinking",
+	"qwen3-235b-a22b":                "Qwen3 235B",
+	"qwen3-coder-30b-a3b-instruct":   "Qwen3 Coder 30B",
+	"qwen3-coder-480b-a35b-instruct": "Qwen3 Coder 480B",
+	"qwen3-coder-flash":              "Qwen3 Coder Flash",
+	"qwen3-coder-plus":               "Qwen3 Coder Plus",
+	"qwen3-coder-plus-2025-07-22":    "Qwen3 Coder Plus",
+
+	// Other
+	"kat-dev":                    "Kat Dev",
+	"jina-deepsearch-v1":         "Jina DeepSearch V1",
+	"mimo-v2-flash-free":         "Mimo V2 Flash (Free)",
+	"gpt-oss-120b":               "GPT OSS 120B",
+	"gpt-oss-20b":                "GPT OSS 20B",
+	"gpt-4o-audio-preview":       "GPT-4o Audio Preview",
+	"gpt-4o-search-preview":      "GPT-4o Search",
+	"gpt-4o-mini-search-preview": "GPT-4o Mini Search",
+	"gpt-4o-2024-11-20":          "GPT-4o",
+	"gpt-4o":                     "GPT-4o",
+	"gpt-4o-mini":                "GPT-4o Mini",
+	"coding-glm-4.6-free":        "Coding GLM 4.6 (Free)",
+	"coding-minimax-m2.1":        "Coding MiniMax M2.1",
+	"coding-minimax-m2":          "Coding MiniMax M2",
+	"coding-minimax-m2-free":     "Coding MiniMax M2 (Free)",
+
+	// OpenRouter-specific mappings (provider/model format)
+	"anthropic/claude-sonnet-4":          "Claude Sonnet 4",
+	"anthropic/claude-sonnet-4.5":        "Claude Sonnet 4.5",
+	"anthropic/claude-3-opus":            "Claude 3 Opus",
+	"anthropic/claude-3.5-haiku":         "Claude 3.5 Haiku",
+	"anthropic/claude-3-haiku":           "Claude 3 Haiku",
+	"openai/gpt-5.2":                     "GPT-5.2",
+	"openai/gpt-5.2-codex":               "GPT-5.2 Codex",
+	"openai/gpt-5":                       "GPT-5",
+	"openai/gpt-4-turbo":                 "GPT-4 Turbo",
+	"openai/gpt-4-turbo-preview":         "GPT-4 Turbo Preview",
+	"openai/gpt-3.5-turbo":               "GPT-3.5 Turbo",
+	"google/gemini-pro-1.5":              "Gemini 1.5 Pro",
+	"google/gemini-flash-1.5":            "Gemini 1.5 Flash",
+	"meta-llama/llama-3.3-70b-instruct":  "Llama 3.3 70B",
+	"meta-llama/llama-3.2-3b-instruct":   "Llama 3.2 3B",
+	"meta-llama/llama-3.1-405b-instruct": "Llama 3.1 405B",
+	"mistralai/mistral-large":            "Mistral Large",
+	"mistralai/mistral-medium":           "Mistral Medium",
+	"mistralai/mistral-small":            "Mistral Small",
+	"qwen/qwen-2.5-72b-instruct":         "Qwen 2.5 72B",
+}
+
+// GetDisplayName returns a human-readable display name for the given model ID.
+// It first checks the static mapping, then attempts to find a close match using
+// Levenshtein distance. If no good match is found, it returns a cleaned-up
+// version of the model ID.
+func GetDisplayName(modelID string) string {
+	// Normalize to lowercase and try exact match first
+	normalized := strings.ToLower(modelID)
+	if name, ok := modelNames[normalized]; ok {
+		return name
+	}
+
+	// Try case-sensitive match
+	if name, ok := modelNames[modelID]; ok {
+		return name
+	}
+
+	// Try without provider prefix (e.g., "anthropic/claude-sonnet-4" -> "claude-sonnet-4")
+	if idx := strings.LastIndex(modelID, "/"); idx != -1 {
+		baseModel := modelID[idx+1:]
+		if name, ok := modelNames[strings.ToLower(baseModel)]; ok {
+			return name
+		}
+		if name, ok := modelNames[baseModel]; ok {
+			return name
+		}
+	}
+
+	// Try fuzzy match with known models
+	if bestMatch := findBestMatch(normalized); bestMatch != "" {
+		return bestMatch
+	}
+
+	// Fall back to formatting the model ID nicely
+	return formatModelName(modelID)
+}
+
+// formatModelName converts a technical model ID to a more readable format.
+// It replaces separators with spaces and capitalizes properly.
+func formatModelName(modelID string) string {
+	// Remove provider prefix if present
+	baseModel := modelID
+	if idx := strings.LastIndex(modelID, "/"); idx != -1 {
+		baseModel = modelID[idx+1:]
+	}
+
+	// Split by common separators
+	separators := []string{"_", "/"}
+
+	// Replace all separators (except dashes which we'll handle special) with spaces
+	result := baseModel
+	for _, sep := range separators {
+		result = strings.ReplaceAll(result, sep, " ")
+	}
+
+	// Convert version patterns like "3-5", "4-5" to "3.5", "4.5"
+	// This handles cases where version numbers use dashes as decimal separators
+	result = convertVersionDashes(result)
+
+	// Now replace remaining dashes with spaces
+	result = strings.ReplaceAll(result, "-", " ")
+
+	// Clean up extra spaces
+	result = strings.Join(strings.Fields(result), " ")
+
+	// Capitalize first letter of each word
+	result = titleCase(result)
+
+	// Handle special cases like "V3" -> "V3" (already capitalized)
+	result = preserveVersionNumbers(result)
+
+	return result
+}
+
+// convertVersionDashes converts dash-separated version numbers to dot-separated.
+// For example: "3-5" -> "3.5", "4-5-haiku" -> "4.5 Haiku"
+func convertVersionDashes(s string) string {
+	// Pattern: digit dash digit -> digit dot digit
+	// Use a simple loop to replace these patterns
+	result := s
+	for i := 0; i < len(result)-2; i++ {
+		// Check if we have "X-Y" pattern where X and Y are digits
+		if result[i] >= '0' && result[i] <= '9' &&
+			result[i+1] == '-' &&
+			result[i+2] >= '0' && result[i+2] <= '9' {
+			// Convert to "X.Y"
+			result = result[:i+1] + "." + result[i+2:]
+		}
+	}
+	return result
+}
+
+// titleCase capitalizes the first letter of each word.
+func titleCase(s string) string {
+	words := strings.Fields(s)
+	for i, word := range words {
+		if len(word) > 0 {
+			words[i] = string(unicode.ToUpper(rune(word[0]))) + word[1:]
+		}
+	}
+	return strings.Join(words, " ")
+}
+
+// preserveVersionNumbers keeps version numbers properly formatted.
+func preserveVersionNumbers(s string) string {
+	// Handle patterns like V3, V3.1, etc.
+	result := strings.ReplaceAll(s, "V ", "V")
+
+	// Fix double spaces that might have been introduced
+	result = strings.Join(strings.Fields(result), " ")
+
+	return result
+}
+
+// findBestMatch uses Levenshtein distance to find the best matching model name.
+func findBestMatch(modelID string) string {
+	const threshold = 4 // Maximum edit distance to consider
+
+	var bestMatch string
+	minDistance := threshold + 1
+
+	for knownID, name := range modelNames {
+		distance := levenshteinDistance(modelID, knownID)
+		if distance < minDistance {
+			minDistance = distance
+			bestMatch = name
+		}
+	}
+
+	if bestMatch != "" && minDistance <= threshold {
+		return bestMatch
+	}
+
+	return ""
+}
+
+// levenshteinDistance computes the edit distance between two strings.
+func levenshteinDistance(a, b string) int {
+	// Optimization: if either string is empty, return the length of the other
+	if len(a) == 0 {
+		return len(b)
+	}
+	if len(b) == 0 {
+		return len(a)
+	}
+
+	// Use a single row to save memory
+	previous := make([]int, len(b)+1)
+
+	// Initialize the first row
+	for j := 0; j <= len(b); j++ {
+		previous[j] = j
+	}
+
+	for i := 1; i <= len(a); i++ {
+		current := make([]int, len(b)+1)
+		current[0] = i
+
+		for j := 1; j <= len(b); j++ {
+			cost := 0
+			if a[i-1] != b[j-1] {
+				cost = 1
+			}
+
+			deletion := previous[j] + 1
+			insertion := current[j-1] + 1
+			substitution := previous[j-1] + cost
+
+			current[j] = min(deletion, min(insertion, substitution))
+		}
+
+		previous = current
+	}
+
+	return previous[len(b)]
+}

internal/providers/configs/aihubmix.json 🔗

@@ -9,7 +9,7 @@
   "models": [
     {
       "id": "AiHubmix-Phi-4-mini-reasoning",
-      "name": "AiHubmix-Phi-4-mini-reasoning",
+      "name": "AiHubmix Phi 4 Mini Reasoning",
       "cost_per_1m_in": 0.12,
       "cost_per_1m_out": 0.12,
       "cost_per_1m_in_cached": 0,
@@ -22,7 +22,7 @@
     },
     {
       "id": "AiHubmix-Phi-4-reasoning",
-      "name": "AiHubmix-Phi-4-reasoning",
+      "name": "AiHubmix Phi 4 Reasoning",
       "cost_per_1m_in": 0.2,
       "cost_per_1m_out": 0.2,
       "cost_per_1m_in_cached": 0,
@@ -39,235 +39,9 @@
       "supports_attachments": false,
       "options": {}
     },
-    {
-      "id": "ByteDance-Seed/Seed-OSS-36B-Instruct",
-      "name": "ByteDance-Seed/Seed-OSS-36B-Instruct",
-      "cost_per_1m_in": 0.2,
-      "cost_per_1m_out": 0.534,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 256000,
-      "default_max_tokens": 32000,
-      "can_reason": false,
-      "supports_attachments": true,
-      "options": {}
-    },
-    {
-      "id": "DeepSeek-OCR",
-      "name": "DeepSeek-OCR",
-      "cost_per_1m_in": 0.02,
-      "cost_per_1m_out": 0.02,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 8000,
-      "default_max_tokens": 800,
-      "can_reason": false,
-      "supports_attachments": true,
-      "options": {}
-    },
-    {
-      "id": "DeepSeek-R1",
-      "name": "DeepSeek-R1",
-      "cost_per_1m_in": 0.4,
-      "cost_per_1m_out": 2,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 1638000,
-      "default_max_tokens": 163800,
-      "can_reason": false,
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "DeepSeek-V3",
-      "name": "DeepSeek-V3",
-      "cost_per_1m_in": 0.272,
-      "cost_per_1m_out": 1.088,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 1638000,
-      "default_max_tokens": 163800,
-      "can_reason": false,
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "DeepSeek-V3-Fast",
-      "name": "DeepSeek-V3-Fast",
-      "cost_per_1m_in": 0.56,
-      "cost_per_1m_out": 2.24,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 32000,
-      "default_max_tokens": 3200,
-      "can_reason": false,
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "DeepSeek-V3.1-Fast",
-      "name": "DeepSeek-V3.1-Fast",
-      "cost_per_1m_in": 1.096,
-      "cost_per_1m_out": 3.288,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 163000,
-      "default_max_tokens": 16300,
-      "can_reason": false,
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "DeepSeek-V3.1-Terminus",
-      "name": "DeepSeek-V3.1-Terminus",
-      "cost_per_1m_in": 0.56,
-      "cost_per_1m_out": 1.68,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 160000,
-      "default_max_tokens": 32000,
-      "can_reason": false,
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "DeepSeek-V3.1-Think",
-      "name": "DeepSeek-V3.1-Think",
-      "cost_per_1m_in": 0.56,
-      "cost_per_1m_out": 1.68,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 128000,
-      "default_max_tokens": 32000,
-      "can_reason": true,
-      "reasoning_levels": [
-        "low",
-        "medium",
-        "high"
-      ],
-      "default_reasoning_effort": "medium",
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "DeepSeek-V3.2-Exp",
-      "name": "DeepSeek-V3.2-Exp",
-      "cost_per_1m_in": 0.274,
-      "cost_per_1m_out": 0.411,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0.0274,
-      "context_window": 163000,
-      "default_max_tokens": 16300,
-      "can_reason": false,
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "DeepSeek-V3.2-Exp-Think",
-      "name": "DeepSeek-V3.2-Exp-Think",
-      "cost_per_1m_in": 0.274,
-      "cost_per_1m_out": 0.411,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0.0274,
-      "context_window": 131000,
-      "default_max_tokens": 64000,
-      "can_reason": true,
-      "reasoning_levels": [
-        "low",
-        "medium",
-        "high"
-      ],
-      "default_reasoning_effort": "medium",
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "ERNIE-X1.1-Preview",
-      "name": "ERNIE-X1.1-Preview",
-      "cost_per_1m_in": 0.136,
-      "cost_per_1m_out": 0.544,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 119000,
-      "default_max_tokens": 11900,
-      "can_reason": true,
-      "reasoning_levels": [
-        "low",
-        "medium",
-        "high"
-      ],
-      "default_reasoning_effort": "medium",
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "Kimi-K2-0905",
-      "name": "Kimi-K2-0905",
-      "cost_per_1m_in": 0.548,
-      "cost_per_1m_out": 2.192,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 262144,
-      "default_max_tokens": 26214,
-      "can_reason": false,
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "Qwen/Qwen2.5-VL-32B-Instruct",
-      "name": "Qwen/Qwen2.5-VL-32B-Instruct",
-      "cost_per_1m_in": 0.24,
-      "cost_per_1m_out": 0.24,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 0,
-      "default_max_tokens": 0,
-      "can_reason": false,
-      "supports_attachments": true,
-      "options": {}
-    },
-    {
-      "id": "Qwen/Qwen2.5-VL-72B-Instruct",
-      "name": "Qwen/Qwen2.5-VL-72B-Instruct",
-      "cost_per_1m_in": 0.5,
-      "cost_per_1m_out": 0.5,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 0,
-      "default_max_tokens": 0,
-      "can_reason": false,
-      "supports_attachments": true,
-      "options": {}
-    },
-    {
-      "id": "ahm-Phi-3-5-vision-instruct",
-      "name": "ahm-Phi-3-5-vision-instruct",
-      "cost_per_1m_in": 0.4,
-      "cost_per_1m_out": 1.6,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 0,
-      "default_max_tokens": 0,
-      "can_reason": false,
-      "supports_attachments": true,
-      "options": {}
-    },
-    {
-      "id": "aihub-Phi-4",
-      "name": "aihub-Phi-4",
-      "cost_per_1m_in": 0.12,
-      "cost_per_1m_out": 0.48,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 16400,
-      "default_max_tokens": 1640,
-      "can_reason": false,
-      "supports_attachments": false,
-      "options": {}
-    },
     {
       "id": "aihub-Phi-4-mini-instruct",
-      "name": "aihub-Phi-4-mini-instruct",
+      "name": "Aihub Phi 4 Mini Instruct",
       "cost_per_1m_in": 0.12,
       "cost_per_1m_out": 0.48,
       "cost_per_1m_in_cached": 0,
@@ -280,7 +54,7 @@
     },
     {
       "id": "aihub-Phi-4-multimodal-instruct",
-      "name": "aihub-Phi-4-multimodal-instruct",
+      "name": "Aihub Phi 4 Multimodal Instruct",
       "cost_per_1m_in": 0.12,
       "cost_per_1m_out": 0.48,
       "cost_per_1m_in_cached": 0,
@@ -292,934 +66,117 @@
       "options": {}
     },
     {
-      "id": "aihubmix-Cohere-command-r",
-      "name": "aihubmix-Cohere-command-r",
-      "cost_per_1m_in": 0.64,
-      "cost_per_1m_out": 1.92,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 0,
-      "default_max_tokens": 0,
-      "can_reason": false,
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "aihubmix-command-r-08-2024",
-      "name": "aihubmix-command-r-08-2024",
+      "id": "ByteDance-Seed/Seed-OSS-36B-Instruct",
+      "name": "ByteDance Seed OSS 36B",
       "cost_per_1m_in": 0.2,
-      "cost_per_1m_out": 0.8,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 0,
-      "default_max_tokens": 0,
-      "can_reason": false,
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "aihubmix-command-r-plus",
-      "name": "aihubmix-command-r-plus",
-      "cost_per_1m_in": 3.84,
-      "cost_per_1m_out": 19.2,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 0,
-      "default_max_tokens": 0,
-      "can_reason": false,
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "aihubmix-command-r-plus-08-2024",
-      "name": "aihubmix-command-r-plus-08-2024",
-      "cost_per_1m_in": 2.8,
-      "cost_per_1m_out": 11.2,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 0,
-      "default_max_tokens": 0,
-      "can_reason": false,
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "aihubmix-router",
-      "name": "aihubmix-router",
-      "cost_per_1m_in": 0.4,
-      "cost_per_1m_out": 1.6,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0.1,
-      "context_window": 0,
-      "default_max_tokens": 0,
-      "can_reason": false,
-      "supports_attachments": true,
-      "options": {}
-    },
-    {
-      "id": "baidu-deepseek-v3.2",
-      "name": "baidu-deepseek-v3.2",
-      "cost_per_1m_in": 0.274,
-      "cost_per_1m_out": 0.411,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 0,
-      "default_max_tokens": 0,
-      "can_reason": false,
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "baidu-deepseek-v3.2-exp",
-      "name": "baidu-deepseek-v3.2-exp",
-      "cost_per_1m_in": 0.274,
-      "cost_per_1m_out": 0.411,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0.0274,
-      "context_window": 0,
-      "default_max_tokens": 0,
-      "can_reason": false,
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "baidu/ERNIE-4.5-300B-A47B",
-      "name": "baidu/ERNIE-4.5-300B-A47B",
-      "cost_per_1m_in": 0.32,
-      "cost_per_1m_out": 1.28,
+      "cost_per_1m_out": 0.534,
       "cost_per_1m_in_cached": 0,
       "cost_per_1m_out_cached": 0,
-      "context_window": 0,
-      "default_max_tokens": 0,
-      "can_reason": false,
-      "supports_attachments": true,
-      "options": {}
-    },
-    {
-      "id": "cc-MiniMax-M2",
-      "name": "cc-MiniMax-M2",
-      "cost_per_1m_in": 0.1,
-      "cost_per_1m_out": 0.1,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 0,
-      "default_max_tokens": 0,
-      "can_reason": false,
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "cc-deepseek-v3.1",
-      "name": "cc-deepseek-v3.1",
-      "cost_per_1m_in": 0.56,
-      "cost_per_1m_out": 1.68,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 0,
-      "default_max_tokens": 0,
-      "can_reason": false,
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "cc-ernie-4.5-300b-a47b",
-      "name": "cc-ernie-4.5-300b-a47b",
-      "cost_per_1m_in": 0.32,
-      "cost_per_1m_out": 1.28,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 0,
-      "default_max_tokens": 0,
-      "can_reason": false,
-      "supports_attachments": true,
-      "options": {}
-    },
-    {
-      "id": "cc-kimi-k2-instruct",
-      "name": "cc-kimi-k2-instruct",
-      "cost_per_1m_in": 1.1,
-      "cost_per_1m_out": 3.3,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 0,
-      "default_max_tokens": 0,
-      "can_reason": false,
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "cc-kimi-k2-instruct-0905",
-      "name": "cc-kimi-k2-instruct-0905",
-      "cost_per_1m_in": 1.1,
-      "cost_per_1m_out": 3.3,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 0,
-      "default_max_tokens": 0,
-      "can_reason": false,
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "cc-minimax-m2",
-      "name": "cc-minimax-m2",
-      "cost_per_1m_in": 0.1,
-      "cost_per_1m_out": 0.1,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 0,
-      "default_max_tokens": 0,
-      "can_reason": false,
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "cc-minimax-m2.1",
-      "name": "cc-minimax-m2.1",
-      "cost_per_1m_in": 0.1,
-      "cost_per_1m_out": 0.1,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 0,
-      "default_max_tokens": 0,
-      "can_reason": false,
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "chatgpt-4o-latest",
-      "name": "chatgpt-4o-latest",
-      "cost_per_1m_in": 5,
-      "cost_per_1m_out": 15,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 0,
-      "default_max_tokens": 0,
-      "can_reason": false,
-      "supports_attachments": true,
-      "options": {}
-    },
-    {
-      "id": "claude-3-5-haiku",
-      "name": "claude-3-5-haiku",
-      "cost_per_1m_in": 1.1,
-      "cost_per_1m_out": 5.5,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 200000,
-      "default_max_tokens": 8192,
-      "can_reason": false,
-      "supports_attachments": true,
-      "options": {}
-    },
-    {
-      "id": "claude-3-5-sonnet",
-      "name": "claude-3-5-sonnet",
-      "cost_per_1m_in": 3.3,
-      "cost_per_1m_out": 16.5,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 200000,
-      "default_max_tokens": 8192,
-      "can_reason": false,
-      "supports_attachments": true,
-      "options": {}
-    },
-    {
-      "id": "claude-3-5-sonnet-20240620",
-      "name": "claude-3-5-sonnet-20240620",
-      "cost_per_1m_in": 3.3,
-      "cost_per_1m_out": 16.5,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 200000,
-      "default_max_tokens": 8192,
-      "can_reason": false,
-      "supports_attachments": true,
-      "options": {}
-    },
-    {
-      "id": "claude-3-7-sonnet",
-      "name": "claude-3-7-sonnet",
-      "cost_per_1m_in": 3.3,
-      "cost_per_1m_out": 16.5,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 200000,
-      "default_max_tokens": 20000,
-      "can_reason": true,
-      "reasoning_levels": [
-        "low",
-        "medium",
-        "high"
-      ],
-      "default_reasoning_effort": "medium",
-      "supports_attachments": true,
-      "options": {}
-    },
-    {
-      "id": "claude-3-haiku-20240229",
-      "name": "claude-3-haiku-20240229",
-      "cost_per_1m_in": 0.275,
-      "cost_per_1m_out": 0.275,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 0,
-      "default_max_tokens": 0,
-      "can_reason": false,
-      "supports_attachments": true,
-      "options": {}
-    },
-    {
-      "id": "claude-3-haiku-20240307",
-      "name": "claude-3-haiku-20240307",
-      "cost_per_1m_in": 0.275,
-      "cost_per_1m_out": 1.375,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 0,
-      "default_max_tokens": 0,
-      "can_reason": false,
-      "supports_attachments": true,
-      "options": {}
-    },
-    {
-      "id": "claude-3-haiku@20240307",
-      "name": "claude-3-haiku@20240307",
-      "cost_per_1m_in": 0.275,
-      "cost_per_1m_out": 1.375,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 0,
-      "default_max_tokens": 0,
-      "can_reason": false,
-      "supports_attachments": true,
-      "options": {}
-    },
-    {
-      "id": "claude-3-sonnet-20240229",
-      "name": "claude-3-sonnet-20240229",
-      "cost_per_1m_in": 3.3,
-      "cost_per_1m_out": 16.5,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 0,
-      "default_max_tokens": 0,
-      "can_reason": false,
-      "supports_attachments": true,
-      "options": {}
-    },
-    {
-      "id": "claude-haiku-4-5",
-      "name": "claude-haiku-4-5",
-      "cost_per_1m_in": 1.1,
-      "cost_per_1m_out": 5.5,
-      "cost_per_1m_in_cached": 1.375,
-      "cost_per_1m_out_cached": 0.11,
-      "context_window": 204800,
-      "default_max_tokens": 20480,
-      "can_reason": true,
-      "reasoning_levels": [
-        "low",
-        "medium",
-        "high"
-      ],
-      "default_reasoning_effort": "medium",
-      "supports_attachments": true,
-      "options": {}
-    },
-    {
-      "id": "claude-opus-4-0",
-      "name": "claude-opus-4-0",
-      "cost_per_1m_in": 16.5,
-      "cost_per_1m_out": 82.5,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 200000,
-      "default_max_tokens": 32000,
-      "can_reason": false,
-      "supports_attachments": true,
-      "options": {}
-    },
-    {
-      "id": "claude-opus-4-1",
-      "name": "claude-opus-4-1",
-      "cost_per_1m_in": 16.5,
-      "cost_per_1m_out": 82.5,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 200000,
-      "default_max_tokens": 32000,
-      "can_reason": true,
-      "reasoning_levels": [
-        "low",
-        "medium",
-        "high"
-      ],
-      "default_reasoning_effort": "medium",
-      "supports_attachments": true,
-      "options": {}
-    },
-    {
-      "id": "claude-opus-4-5",
-      "name": "claude-opus-4-5",
-      "cost_per_1m_in": 5,
-      "cost_per_1m_out": 25,
-      "cost_per_1m_in_cached": 6.25,
-      "cost_per_1m_out_cached": 0.5,
-      "context_window": 200000,
-      "default_max_tokens": 32000,
-      "can_reason": true,
-      "reasoning_levels": [
-        "low",
-        "medium",
-        "high"
-      ],
-      "default_reasoning_effort": "medium",
-      "supports_attachments": true,
-      "options": {}
-    },
-    {
-      "id": "claude-opus-4-5-think",
-      "name": "claude-opus-4-5-think",
-      "cost_per_1m_in": 5,
-      "cost_per_1m_out": 25,
-      "cost_per_1m_in_cached": 6.25,
-      "cost_per_1m_out_cached": 0.5,
-      "context_window": 200000,
-      "default_max_tokens": 32000,
-      "can_reason": true,
-      "reasoning_levels": [
-        "low",
-        "medium",
-        "high"
-      ],
-      "default_reasoning_effort": "medium",
-      "supports_attachments": true,
-      "options": {}
-    },
-    {
-      "id": "claude-sonnet-4-0",
-      "name": "claude-sonnet-4-0",
-      "cost_per_1m_in": 3.3,
-      "cost_per_1m_out": 16.5,
-      "cost_per_1m_in_cached": 4.125,
-      "cost_per_1m_out_cached": 0.33,
-      "context_window": 1000000,
-      "default_max_tokens": 64000,
-      "can_reason": true,
-      "reasoning_levels": [
-        "low",
-        "medium",
-        "high"
-      ],
-      "default_reasoning_effort": "medium",
-      "supports_attachments": true,
-      "options": {}
-    },
-    {
-      "id": "claude-sonnet-4-5",
-      "name": "claude-sonnet-4-5",
-      "cost_per_1m_in": 3.3,
-      "cost_per_1m_out": 16.5,
-      "cost_per_1m_in_cached": 4.125,
-      "cost_per_1m_out_cached": 0.33,
-      "context_window": 1000000,
-      "default_max_tokens": 64000,
-      "can_reason": true,
-      "reasoning_levels": [
-        "low",
-        "medium",
-        "high"
-      ],
-      "default_reasoning_effort": "medium",
-      "supports_attachments": true,
-      "options": {}
-    },
-    {
-      "id": "claude-sonnet-4-5-think",
-      "name": "claude-sonnet-4-5-think",
-      "cost_per_1m_in": 3.3,
-      "cost_per_1m_out": 16.5,
-      "cost_per_1m_in_cached": 4.125,
-      "cost_per_1m_out_cached": 0.33,
-      "context_window": 1000000,
-      "default_max_tokens": 64000,
-      "can_reason": true,
-      "reasoning_levels": [
-        "low",
-        "medium",
-        "high"
-      ],
-      "default_reasoning_effort": "medium",
-      "supports_attachments": true,
-      "options": {}
-    },
-    {
-      "id": "codex-mini-latest",
-      "name": "codex-mini-latest",
-      "cost_per_1m_in": 1.5,
-      "cost_per_1m_out": 6,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0.375,
-      "context_window": 0,
-      "default_max_tokens": 0,
-      "can_reason": false,
-      "supports_attachments": true,
-      "options": {}
-    },
-    {
-      "id": "coding-glm-4.6",
-      "name": "coding-glm-4.6",
-      "cost_per_1m_in": 0.06,
-      "cost_per_1m_out": 0.22,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0.010998,
-      "context_window": 0,
-      "default_max_tokens": 0,
-      "can_reason": true,
-      "reasoning_levels": [
-        "low",
-        "medium",
-        "high"
-      ],
-      "default_reasoning_effort": "medium",
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "coding-glm-4.6-free",
-      "name": "coding-glm-4.6-free",
-      "cost_per_1m_in": 0,
-      "cost_per_1m_out": 0,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 200000,
-      "default_max_tokens": 20000,
-      "can_reason": true,
-      "reasoning_levels": [
-        "low",
-        "medium",
-        "high"
-      ],
-      "default_reasoning_effort": "medium",
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "coding-glm-4.7",
-      "name": "coding-glm-4.7",
-      "cost_per_1m_in": 0.06,
-      "cost_per_1m_out": 0.22,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0.010998,
-      "context_window": 0,
-      "default_max_tokens": 0,
-      "can_reason": true,
-      "reasoning_levels": [
-        "low",
-        "medium",
-        "high"
-      ],
-      "default_reasoning_effort": "medium",
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "coding-glm-4.7-free",
-      "name": "coding-glm-4.7-free",
-      "cost_per_1m_in": 0,
-      "cost_per_1m_out": 0,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 0,
-      "default_max_tokens": 0,
-      "can_reason": true,
-      "reasoning_levels": [
-        "low",
-        "medium",
-        "high"
-      ],
-      "default_reasoning_effort": "medium",
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "coding-minimax-m2",
-      "name": "coding-minimax-m2",
-      "cost_per_1m_in": 0.2,
-      "cost_per_1m_out": 0.2,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 204800,
-      "default_max_tokens": 13100,
-      "can_reason": true,
-      "reasoning_levels": [
-        "low",
-        "medium",
-        "high"
-      ],
-      "default_reasoning_effort": "medium",
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "coding-minimax-m2-free",
-      "name": "coding-minimax-m2-free",
-      "cost_per_1m_in": 0,
-      "cost_per_1m_out": 0,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 204800,
-      "default_max_tokens": 13100,
-      "can_reason": true,
-      "reasoning_levels": [
-        "low",
-        "medium",
-        "high"
-      ],
-      "default_reasoning_effort": "medium",
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "coding-minimax-m2.1",
-      "name": "coding-minimax-m2.1",
-      "cost_per_1m_in": 0.2,
-      "cost_per_1m_out": 0.2,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 204800,
-      "default_max_tokens": 13100,
-      "can_reason": true,
-      "reasoning_levels": [
-        "low",
-        "medium",
-        "high"
-      ],
-      "default_reasoning_effort": "medium",
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "command",
-      "name": "command",
-      "cost_per_1m_in": 1,
-      "cost_per_1m_out": 2,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 0,
-      "default_max_tokens": 0,
-      "can_reason": false,
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "command-a-03-2025",
-      "name": "command-a-03-2025",
-      "cost_per_1m_in": 2.5,
-      "cost_per_1m_out": 10,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 0,
-      "default_max_tokens": 0,
-      "can_reason": false,
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "command-r",
-      "name": "command-r",
-      "cost_per_1m_in": 0.64,
-      "cost_per_1m_out": 1.92,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 0,
-      "default_max_tokens": 0,
-      "can_reason": false,
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "command-r-08-2024",
-      "name": "command-r-08-2024",
-      "cost_per_1m_in": 0.2,
-      "cost_per_1m_out": 0.8,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 0,
-      "default_max_tokens": 0,
-      "can_reason": false,
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "command-r-plus",
-      "name": "command-r-plus",
-      "cost_per_1m_in": 3.84,
-      "cost_per_1m_out": 19.2,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 0,
-      "default_max_tokens": 0,
-      "can_reason": false,
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "command-r-plus-08-2024",
-      "name": "command-r-plus-08-2024",
-      "cost_per_1m_in": 2.8,
-      "cost_per_1m_out": 11.2,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 0,
-      "default_max_tokens": 0,
-      "can_reason": false,
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "deepseek-math-v2",
-      "name": "deepseek-math-v2",
-      "cost_per_1m_in": 0.492,
-      "cost_per_1m_out": 1.968,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0.0984,
-      "context_window": 163000,
-      "default_max_tokens": 16300,
-      "can_reason": true,
-      "reasoning_levels": [
-        "low",
-        "medium",
-        "high"
-      ],
-      "default_reasoning_effort": "medium",
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "deepseek-r1-distill-llama-70b",
-      "name": "deepseek-r1-distill-llama-70b",
-      "cost_per_1m_in": 0.8,
-      "cost_per_1m_out": 1.6,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 0,
-      "default_max_tokens": 0,
-      "can_reason": true,
-      "reasoning_levels": [
-        "low",
-        "medium",
-        "high"
-      ],
-      "default_reasoning_effort": "medium",
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "deepseek-v3.2",
-      "name": "deepseek-v3.2",
-      "cost_per_1m_in": 0.302,
-      "cost_per_1m_out": 0.453,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0.0302,
-      "context_window": 128000,
-      "default_max_tokens": 64000,
-      "can_reason": false,
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "deepseek-v3.2-fast",
-      "name": "deepseek-v3.2-fast",
-      "cost_per_1m_in": 1.096,
-      "cost_per_1m_out": 3.288,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 1.096,
-      "context_window": 128000,
-      "default_max_tokens": 12800,
-      "can_reason": false,
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "deepseek-v3.2-speciale",
-      "name": "deepseek-v3.2-speciale",
-      "cost_per_1m_in": 0.58,
-      "cost_per_1m_out": 1.680028,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0,
-      "context_window": 128000,
-      "default_max_tokens": 12800,
-      "can_reason": true,
-      "reasoning_levels": [
-        "low",
-        "medium",
-        "high"
-      ],
-      "default_reasoning_effort": "medium",
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "deepseek-v3.2-think",
-      "name": "deepseek-v3.2-think",
-      "cost_per_1m_in": 0.302,
-      "cost_per_1m_out": 0.453,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0.0302,
-      "context_window": 128000,
-      "default_max_tokens": 64000,
-      "can_reason": false,
-      "supports_attachments": false,
-      "options": {}
-    },
-    {
-      "id": "doubao-seed-1-6",
-      "name": "doubao-seed-1-6",
-      "cost_per_1m_in": 0.18,
-      "cost_per_1m_out": 1.8,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0.036,
-      "context_window": 256000,
-      "default_max_tokens": 32000,
-      "can_reason": false,
-      "supports_attachments": true,
-      "options": {}
-    },
-    {
-      "id": "doubao-seed-1-6-flash",
-      "name": "doubao-seed-1-6-flash",
-      "cost_per_1m_in": 0.044,
-      "cost_per_1m_out": 0.44,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0.0088,
-      "context_window": 256000,
-      "default_max_tokens": 33000,
-      "can_reason": false,
-      "supports_attachments": true,
-      "options": {}
-    },
-    {
-      "id": "doubao-seed-1-6-lite",
-      "name": "doubao-seed-1-6-lite",
-      "cost_per_1m_in": 0.082,
-      "cost_per_1m_out": 0.656,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0.0164,
-      "context_window": 256000,
-      "default_max_tokens": 32000,
-      "can_reason": false,
-      "supports_attachments": true,
-      "options": {}
-    },
-    {
-      "id": "doubao-seed-1-6-thinking",
-      "name": "doubao-seed-1-6-thinking",
-      "cost_per_1m_in": 0.18,
-      "cost_per_1m_out": 1.8,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0.036,
-      "context_window": 256000,
-      "default_max_tokens": 32000,
-      "can_reason": false,
-      "supports_attachments": true,
-      "options": {}
-    },
-    {
-      "id": "doubao-seed-1-8",
-      "name": "doubao-seed-1-8",
-      "cost_per_1m_in": 0.10959,
-      "cost_per_1m_out": 0.273975,
-      "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0.021918,
-      "context_window": 256000,
-      "default_max_tokens": 64000,
-      "can_reason": true,
-      "reasoning_levels": [
-        "low",
-        "medium",
-        "high"
-      ],
-      "default_reasoning_effort": "medium",
+      "context_window": 256000,
+      "default_max_tokens": 32000,
+      "can_reason": false,
       "supports_attachments": true,
       "options": {}
     },
     {
-      "id": "ernie-4.5",
-      "name": "ernie-4.5",
-      "cost_per_1m_in": 0.068,
-      "cost_per_1m_out": 0.272,
+      "id": "claude-3-5-haiku",
+      "name": "Claude 3.5 Haiku",
+      "cost_per_1m_in": 1.1,
+      "cost_per_1m_out": 5.5,
       "cost_per_1m_in_cached": 0,
       "cost_per_1m_out_cached": 0,
-      "context_window": 160000,
-      "default_max_tokens": 64000,
+      "context_window": 200000,
+      "default_max_tokens": 8192,
       "can_reason": false,
       "supports_attachments": true,
       "options": {}
     },
     {
-      "id": "ernie-4.5-0.3b",
-      "name": "ernie-4.5-0.3b",
-      "cost_per_1m_in": 0.0136,
-      "cost_per_1m_out": 0.0544,
+      "id": "claude-3-5-sonnet",
+      "name": "Claude 3.5 Sonnet",
+      "cost_per_1m_in": 3.3,
+      "cost_per_1m_out": 16.5,
       "cost_per_1m_in_cached": 0,
       "cost_per_1m_out_cached": 0,
-      "context_window": 0,
-      "default_max_tokens": 0,
+      "context_window": 200000,
+      "default_max_tokens": 8192,
       "can_reason": false,
       "supports_attachments": true,
       "options": {}
     },
     {
-      "id": "ernie-4.5-turbo-128k-preview",
-      "name": "ernie-4.5-turbo-128k-preview",
-      "cost_per_1m_in": 0.108,
-      "cost_per_1m_out": 0.432,
+      "id": "claude-3-5-sonnet-20240620",
+      "name": "Claude 3.5 Sonnet",
+      "cost_per_1m_in": 3.3,
+      "cost_per_1m_out": 16.5,
       "cost_per_1m_in_cached": 0,
       "cost_per_1m_out_cached": 0,
-      "context_window": 0,
-      "default_max_tokens": 0,
+      "context_window": 200000,
+      "default_max_tokens": 8192,
       "can_reason": false,
       "supports_attachments": true,
       "options": {}
     },
     {
-      "id": "ernie-4.5-turbo-latest",
-      "name": "ernie-4.5-turbo-latest",
-      "cost_per_1m_in": 0.11,
-      "cost_per_1m_out": 0.44,
+      "id": "claude-3-7-sonnet",
+      "name": "Claude 3.7 Sonnet",
+      "cost_per_1m_in": 3.3,
+      "cost_per_1m_out": 16.5,
       "cost_per_1m_in_cached": 0,
       "cost_per_1m_out_cached": 0,
-      "context_window": 135000,
-      "default_max_tokens": 12000,
-      "can_reason": false,
+      "context_window": 200000,
+      "default_max_tokens": 20000,
+      "can_reason": true,
+      "reasoning_levels": [
+        "low",
+        "medium",
+        "high"
+      ],
+      "default_reasoning_effort": "medium",
       "supports_attachments": true,
       "options": {}
     },
     {
-      "id": "ernie-4.5-turbo-vl",
-      "name": "ernie-4.5-turbo-vl",
-      "cost_per_1m_in": 0.4,
-      "cost_per_1m_out": 1.2,
+      "id": "claude-haiku-4-5",
+      "name": "Claude Haiku 4.5",
+      "cost_per_1m_in": 1.1,
+      "cost_per_1m_out": 5.5,
+      "cost_per_1m_in_cached": 1.375,
+      "cost_per_1m_out_cached": 0.11,
+      "context_window": 204800,
+      "default_max_tokens": 20480,
+      "can_reason": true,
+      "reasoning_levels": [
+        "low",
+        "medium",
+        "high"
+      ],
+      "default_reasoning_effort": "medium",
+      "supports_attachments": true,
+      "options": {}
+    },
+    {
+      "id": "claude-opus-4-0",
+      "name": "Claude Opus 4",
+      "cost_per_1m_in": 16.5,
+      "cost_per_1m_out": 82.5,
       "cost_per_1m_in_cached": 0,
       "cost_per_1m_out_cached": 0,
-      "context_window": 139000,
-      "default_max_tokens": 16000,
+      "context_window": 200000,
+      "default_max_tokens": 32000,
       "can_reason": false,
       "supports_attachments": true,
       "options": {}
     },
     {
-      "id": "ernie-5.0-thinking-exp",
-      "name": "ernie-5.0-thinking-exp",
-      "cost_per_1m_in": 0.82192,
-      "cost_per_1m_out": 3.28768,
+      "id": "claude-opus-4-1",
+      "name": "Claude Opus 4",
+      "cost_per_1m_in": 16.5,
+      "cost_per_1m_out": 82.5,
       "cost_per_1m_in_cached": 0,
-      "cost_per_1m_out_cached": 0.82192,
-      "context_window": 119000,
-      "default_max_tokens": 11900,
+      "cost_per_1m_out_cached": 0,
+      "context_window": 200000,
+      "default_max_tokens": 32000,
       "can_reason": true,
       "reasoning_levels": [
         "low",