| @@ -2242,8 +2242,22 @@ | ||
| 2242 | 2242 | |
| 2243 | 2243 | /** |
| 2244 | 2244 | * Call the configured content model |
| 2245 | 2245 | */ |
| 2246 | + /** | |
| 2247 | + * Provider slugs (MxChat_Model_Catalog keys) that call_content_model() can | |
| 2248 | + * dispatch to. MUST mirror the if/elseif chain below — the Content Model | |
| 2249 | + * picker derives its provider set from this list (plan ccb751), so a | |
| 2250 | + * provider added to the dispatch without updating this is never offered, | |
| 2251 | + * and one added here without dispatch support would break generation. | |
| 2252 | + * OpenRouter and the custom OpenAI-compatible provider are absent on | |
| 2253 | + * purpose: their pseudo-model ids would fall through to the OpenAI default | |
| 2254 | + * branch with the wrong key and endpoint. | |
| 2255 | + */ | |
| 2256 | + public static function supported_content_providers() { | |
| 2257 | + return array('openai', 'claude', 'gemini', 'xai', 'deepseek'); | |
| 2258 | + } | |
| 2259 | + | |
| 2246 | 2260 | private function call_content_model($system_prompt, $messages, $max_tokens = 4096) { |
| 2247 | 2261 | $options = get_option('mxchat_options', array()); |
| 2248 | 2262 | $model = $options['content_model'] ?? $options['model'] ?? 'gpt-5.6-sol'; |
| 2249 | 2263 | |
| @@ -2270,13 +2284,14 @@ | ||
| 2270 | 2284 | * used only when the core model catalog is unavailable. Byte-identical to the |
| 2271 | 2285 | * old inline if/elseif at the call site. |
| 2272 | 2286 | */ |
| 2273 | 2287 | private function mxchat_cg_reasoning_effort_fallback($model) { |
| 2274 | - if (strpos($model, 'gpt-5') !== 0) return null; | |
| 2288 | + if (strpos($model, 'gpt-5') !== 0 && strpos($model, 'gpt-6') !== 0) return null; // gpt-6 too (plan 45c22d) | |
| 2275 | 2289 | if ($model === 'gpt-5.2' || $model === 'gpt-5.1-chat-latest') return null; |
| 2276 | 2290 | if ($model === 'gpt-5.1-2025-11-13') return 'low'; |
| 2277 | 2291 | if ($model === 'gpt-5.5') return 'low'; |
| 2278 | 2292 | if ($model === 'gpt-5.4') return 'low'; |
| 2293 | + if (in_array($model, array('gpt-6-astra', 'gpt-6-sol', 'gpt-6-luna'), true)) return 'low'; // plan 45c22d | |
| 2279 | 2294 | if (in_array($model, array('gpt-5.6-sol', 'gpt-5.6-terra', 'gpt-5.6-luna'), true)) return 'low'; |
| 2280 | 2295 | return 'minimal'; |
| 2281 | 2296 | } |
| 2282 | 2297 | |
| @@ -2297,9 +2312,9 @@ | ||
| 2297 | 2312 | // GPT-5.x models require max_completion_tokens and only support temperature=1. |
| 2298 | 2313 | // Token key, temperature gate, and reasoning_effort are sourced from the |
| 2299 | 2314 | // core model catalog (plan-dcb71c); frozen fallbacks preserve exact |
| 2300 | 2315 | // pre-dcb71c behavior if the catalog class is unavailable. |
| 2301 | - $is_gpt5 = strpos($model, 'gpt-5') === 0; | |
| 2316 | + $is_gpt5 = strpos($model, 'gpt-5') === 0 || strpos($model, 'gpt-6') === 0; // gpt-6 too (plan 45c22d) | |
| 2302 | 2317 | $catalog = class_exists('MxChat_Model_Catalog'); |
| 2303 | 2318 | $token_key = ($catalog && method_exists('MxChat_Model_Catalog', 'openai_token_param')) |
| 2304 | 2319 | ? MxChat_Model_Catalog::openai_token_param($model) |
| 2305 | 2320 | : ($is_gpt5 ? 'max_completion_tokens' : 'max_tokens'); |