diff --git a/internal/auth/qoder/api.go b/internal/auth/qoder/api.go index aa6e0522..f27131bf 100644 --- a/internal/auth/qoder/api.go +++ b/internal/auth/qoder/api.go @@ -40,12 +40,13 @@ var ModelMap = map[string]string{ "efficient": "efficient", "lite": "lite", // Frontier models — pin a specific backing model - "qmodel": "qmodel", // Qwen 3.6 Plus - "dmodel": "dmodel", // DeepSeek V4 Pro - "dfmodel": "dfmodel", // DeepSeek V4 Flash - "gm51model": "gm51model", // GLM 5.1 - "kmodel": "kmodel", // Kimi K2.6 - "mmodel": "mmodel", // MiniMax M2.7 + "qmodel": "qmodel", // Qwen3.7 Plus + "qmodel_latest": "qmodel_latest", // Qwen3.7 Max (latest) + "dmodel": "dmodel", // DeepSeek V4 Pro + "dfmodel": "dfmodel", // DeepSeek V4 Flash + "gm51model": "gm51model", // GLM 5.1 + "kmodel": "kmodel", // Kimi K2.6 + "mmodel": "mmodel", // MiniMax M3 } // doRefreshToken performs a token refresh and persists the result to authFilePath. diff --git a/internal/registry/models/models.json b/internal/registry/models/models.json index 1a02a23a..708ba086 100644 --- a/internal/registry/models/models.json +++ b/internal/registry/models/models.json @@ -2151,7 +2151,6 @@ ] } } - ], "xai": [ { @@ -2287,8 +2286,11 @@ "type": "qoder", "display_name": "Qoder Auto", "description": "Qoder Auto — automatically selects the best model for your prompt", - "context_length": 131072, - "max_completion_tokens": 65536 + "context_length": 180000, + "supported_input_modalities": [ + "TEXT", + "IMAGE" + ] }, { "id": "qoder/ultimate", @@ -2298,13 +2300,23 @@ "type": "qoder", "display_name": "Qoder Ultimate", "description": "Qoder Ultimate — highest quality tier", - "context_length": 131072, - "max_completion_tokens": 65536, + "context_length": 180000, + "supported_input_modalities": [ + "TEXT", + "IMAGE" + ], "thinking": { "min": 1024, "max": 32000, "zero_allowed": true, - "dynamic_allowed": true + "dynamic_allowed": true, + "levels": [ + "low", + "medium", + "high", + "max", + "xhigh" + ] } }, { @@ -2315,13 +2327,23 @@ "type": "qoder", "display_name": "Qoder Performance", "description": "Qoder Performance — balanced quality and speed", - "context_length": 131072, - "max_completion_tokens": 32768, + "context_length": 272000, + "supported_input_modalities": [ + "TEXT", + "IMAGE" + ], "thinking": { "min": 1024, "max": 32000, "zero_allowed": true, - "dynamic_allowed": true + "dynamic_allowed": true, + "levels": [ + "low", + "medium", + "high", + "max", + "xhigh" + ] } }, { @@ -2332,8 +2354,11 @@ "type": "qoder", "display_name": "Qoder Efficient", "description": "Qoder Efficient — cost-efficient tier", - "context_length": 131072, - "max_completion_tokens": 16384 + "context_length": 180000, + "supported_input_modalities": [ + "TEXT", + "IMAGE" + ] }, { "id": "qoder/lite", @@ -2343,8 +2368,7 @@ "type": "qoder", "display_name": "Qoder Lite", "description": "Qoder Lite — fastest and most affordable tier", - "context_length": 131072, - "max_completion_tokens": 16384 + "context_length": 180000 }, { "id": "qoder/qmodel", @@ -2352,10 +2376,27 @@ "created": 1767196800, "owned_by": "qoder", "type": "qoder", - "display_name": "Qwen 3.6 Plus (Qoder)", - "description": "Qoder frontier — Qwen 3.6 Plus", - "context_length": 131072, - "max_completion_tokens": 32768 + "display_name": "Qwen3.7 Plus (Qoder)", + "description": "Qoder frontier — Qwen3.7 Plus", + "context_length": 180000, + "supported_input_modalities": [ + "TEXT", + "IMAGE" + ] + }, + { + "id": "qoder/qmodel_latest", + "object": "model", + "created": 1767196800, + "owned_by": "qoder", + "type": "qoder", + "display_name": "Qwen3.7 Max (Qoder)", + "description": "Qoder frontier — Qwen3.7 Max (latest Qwen)", + "context_length": 180000, + "supported_input_modalities": [ + "TEXT", + "IMAGE" + ] }, { "id": "qoder/dmodel", @@ -2365,13 +2406,20 @@ "type": "qoder", "display_name": "DeepSeek V4 Pro (Qoder)", "description": "Qoder frontier — DeepSeek V4 Pro", - "context_length": 131072, - "max_completion_tokens": 65536, + "context_length": 180000, + "supported_input_modalities": [ + "TEXT", + "IMAGE" + ], "thinking": { "min": 1024, "max": 32000, "zero_allowed": true, - "dynamic_allowed": true + "dynamic_allowed": true, + "levels": [ + "high", + "max" + ] } }, { @@ -2382,8 +2430,21 @@ "type": "qoder", "display_name": "DeepSeek V4 Flash (Qoder)", "description": "Qoder frontier — DeepSeek V4 Flash", - "context_length": 131072, - "max_completion_tokens": 16384 + "context_length": 180000, + "supported_input_modalities": [ + "TEXT", + "IMAGE" + ], + "thinking": { + "min": 1024, + "max": 32000, + "zero_allowed": true, + "dynamic_allowed": true, + "levels": [ + "high", + "max" + ] + } }, { "id": "qoder/gm51model", @@ -2393,13 +2454,20 @@ "type": "qoder", "display_name": "GLM 5.1 (Qoder)", "description": "Qoder frontier — GLM 5.1", - "context_length": 131072, - "max_completion_tokens": 32768, + "context_length": 180000, + "supported_input_modalities": [ + "TEXT", + "IMAGE" + ], "thinking": { "min": 1024, "max": 32000, "zero_allowed": true, - "dynamic_allowed": true + "dynamic_allowed": true, + "levels": [ + "high", + "max" + ] } }, { @@ -2410,14 +2478,11 @@ "type": "qoder", "display_name": "Kimi K2.6 (Qoder)", "description": "Qoder frontier — Kimi K2.6", - "context_length": 131072, - "max_completion_tokens": 32768, - "thinking": { - "min": 1024, - "max": 32000, - "zero_allowed": true, - "dynamic_allowed": true - } + "context_length": 256000, + "supported_input_modalities": [ + "TEXT", + "IMAGE" + ] }, { "id": "qoder/mmodel", @@ -2425,10 +2490,13 @@ "created": 1767196800, "owned_by": "qoder", "type": "qoder", - "display_name": "MiniMax M2.7 (Qoder)", - "description": "Qoder frontier — MiniMax M2.7", - "context_length": 131072, - "max_completion_tokens": 65536 + "display_name": "MiniMax M3 (Qoder)", + "description": "Qoder frontier — MiniMax M3", + "context_length": 180000, + "supported_input_modalities": [ + "TEXT", + "IMAGE" + ] } ] -} \ No newline at end of file +} diff --git a/internal/runtime/executor/qoder_executor.go b/internal/runtime/executor/qoder_executor.go index 53d3fb4a..f3f6f8e4 100644 --- a/internal/runtime/executor/qoder_executor.go +++ b/internal/runtime/executor/qoder_executor.go @@ -76,7 +76,8 @@ func (e *QoderExecutor) ExecuteStream(ctx context.Context, authRecord *cliproxya qoderModel := strings.TrimPrefix(model, "qoder/") if mapped, ok := qoderauth.ModelMap[qoderModel]; ok { qoderModel = mapped - } else { + } else if _, cached := storage.GetModelConfig(qoderModel); !cached { + // Not in static map and not in dynamic model cache — reject early. return nil, fmt.Errorf("unsupported qoder model: %q (received %q)", qoderModel, model) }