@@ -116,17 +116,14 @@ def _read_providers_config() -> dict:
116116# ── Default fallback chains ───────────────────────────────────────────────────
117117
118118# NVIDIA: models are independent — quota on one doesn't block others.
119- # Order matches the validated fast, tool-calling-capable models (and mirrors
120- # providers.json model_tiers / fallback_models). OpenRouter is intentionally
121- # NOT in the chain — its stealth models 404 intermittently ("buga mto").
119+ # Primary is GLM 5.1 on NVIDIA; if quota/rate-limit hits, rotate inside
120+ # NVIDIA first, then leave the provider only after these core models fail.
122121NVIDIA_MODEL_CHAIN = [
123- "z-ai/glm-5.1" , # Primary (sonnet tier)
124- "moonshotai/kimi-k2.6" , # 2nd (opus tier, deep reasoning)
125- "qwen/qwen3.5-397b-a17b" , # 3rd
126- "stepfun-ai/step-3.7-flash" , # 4th (haiku tier, fastest)
122+ "z-ai/glm-5.1" , # Primary — Telegram + agents default
123+ "minimaxai/minimax-m3" , # 2nd
127124]
128125
129- # Provider chain: NVIDIA → Codex (GPT-5.5 OAuth) → Claude nativo
126+ # Provider chain: NVIDIA → OpenRouter (owl-alpha) → Codex (GPT-5.x OAuth) → Claude nativo
130127DEFAULT_PROVIDER_CHAIN = [
131128 {
132129 "provider_id" : "nvidia" ,
@@ -138,6 +135,16 @@ def _read_providers_config() -> dict:
138135 },
139136 "model_chain" : NVIDIA_MODEL_CHAIN ,
140137 },
138+ {
139+ "provider_id" : "openrouter" ,
140+ "cli_command" : "openclaude" ,
141+ "base_url" : "https://openrouter.ai/api/v1" ,
142+ "env_vars" : {
143+ "CLAUDE_CODE_USE_OPENAI" : "1" ,
144+ "OPENAI_BASE_URL" : "https://openrouter.ai/api/v1" ,
145+ },
146+ "model_chain" : ["openrouter/owl-alpha" ],
147+ },
141148 {
142149 "provider_id" : "codex_auth" ,
143150 "cli_command" : "openclaude" ,
@@ -178,26 +185,42 @@ def _build_provider_entry(provider_id: str, providers: dict) -> dict:
178185 prov = providers .get (provider_id , {})
179186 env_vars = {k : v for k , v in prov .get ("env_vars" , {}).items ()
180187 if v and k not in ("OPENAI_API_KEY" , "OPENAI_MODEL" )}
181- model_chain = prov .get ("fallback_models" ,
182- [prov .get ("default_model" ) or prov .get ("env_vars" , {}).get ("OPENAI_MODEL" )])
188+
189+ primary_model = prov .get ("default_model" ) or prov .get ("env_vars" , {}).get ("OPENAI_MODEL" )
190+ model_chain = []
191+ if primary_model :
192+ model_chain .append (primary_model )
193+ for fallback_model in prov .get ("fallback_models" , []):
194+ if fallback_model and fallback_model not in model_chain :
195+ model_chain .append (fallback_model )
196+
197+ if not model_chain and prov .get ("cli_command" ) == "claude" :
198+ model_chain = [None ]
183199
184200 return {
185201 "provider_id" : provider_id ,
186202 "cli_command" : prov .get ("cli_command" , "openclaude" ),
187203 "base_url" : prov .get ("default_base_url" ) or prov .get ("env_vars" , {}).get ("OPENAI_BASE_URL" ),
188204 "env_vars" : env_vars ,
189- "model_chain" : [ m for m in model_chain if m ] ,
205+ "model_chain" : model_chain ,
190206 }
191207
192208
193209def _get_api_key (provider_id : str , config : dict ) -> str :
210+ if provider_id in {"codex_auth" , "anthropic" }:
211+ return ""
212+
194213 prov = config .get ("providers" , {}).get (provider_id , {})
195214 env_vars = prov .get ("env_vars" , {})
196215 for key_name in ("OPENAI_API_KEY" , "NVIDIA_API_KEY" , "GEMINI_API_KEY" ):
197216 val = env_vars .get (key_name , "" )
198217 if val and "****" not in val :
199218 return val
200- return os .environ .get ("OPENAI_API_KEY" , "" )
219+
220+ if provider_id in {"nvidia" , "openrouter" , "openai" , "gemini" }:
221+ return os .environ .get ("OPENAI_API_KEY" , "" )
222+
223+ return ""
201224
202225
203226# ── Attempt record ─────────────────────────────────────────────────────────────
@@ -211,6 +234,7 @@ class FallbackAttempt:
211234 prompt : str
212235 max_turns : int
213236 timeout_seconds : int
237+ agent : str = ""
214238 env_overrides : dict = field (default_factory = dict )
215239 _result : dict | None = field (default = None , repr = False )
216240
@@ -220,6 +244,7 @@ def run(self) -> dict:
220244 prompt = self .prompt ,
221245 max_turns = self .max_turns ,
222246 timeout_seconds = self .timeout_seconds ,
247+ agent = self .agent ,
223248 env_overrides = self .env_overrides ,
224249 )
225250 return self ._result
@@ -254,6 +279,7 @@ def _invoke_cli(
254279 prompt : str ,
255280 max_turns : int ,
256281 timeout_seconds : int ,
282+ agent : str = "" ,
257283 env_overrides : dict | None = None ,
258284) -> dict :
259285 cli_bin = shutil .which (cli_command )
@@ -267,7 +293,10 @@ def _invoke_cli(
267293 }
268294
269295 cmd = [cli_bin , "--print" , "--max-turns" , str (max_turns ),
270- "--dangerously-skip-permissions" , "--output-format" , "json" , "--" , prompt ]
296+ "--dangerously-skip-permissions" , "--output-format" , "json" ]
297+ if agent :
298+ cmd .extend (["--agent" , agent ])
299+ cmd .extend (["--" , prompt ])
271300
272301 run_env = dict (os .environ )
273302 if env_overrides :
@@ -404,6 +433,7 @@ def attempts(
404433 prompt = prompt ,
405434 max_turns = max_turns ,
406435 timeout_seconds = timeout_seconds ,
436+ agent = agent ,
407437 env_overrides = env_overrides ,
408438 )
409439 self ._attempts_log .append (attempt )
0 commit comments