bep40 commited on
Commit
5738fba
·
verified ·
1 Parent(s): b97c2e3

Upload patch_models.py

Browse files
Files changed (1) hide show
  1. patch_models.py +28 -55
patch_models.py CHANGED
@@ -77,7 +77,7 @@ new_func = '''def _available_models() -> list[dict[str, Any]]:
77
  },
78
  {
79
  "id": "openai/gpt-oss-120b",
80
- "label": "GPT-5.5",
81
  "provider": "openrouter",
82
  "tier": "free",
83
  },
@@ -130,7 +130,7 @@ new_func = '''def _available_models() -> list[dict[str, Any]]:
130
  },
131
  {
132
  "id": "openai/cohere/north-mini-code:free",
133
- "label": "Riverflow V2.5 Pro",
134
  "provider": "openrouter",
135
  "tier": "free",
136
  "recommended": True,
@@ -178,7 +178,7 @@ else:
178
  ' {"id": "openai/openrouter/owl-alpha", "label": "Owl Alpha", "provider": "openrouter", "tier": "free", "recommended": True},\n'
179
  ' {"id": "deepseek-ai/DeepSeek-V4-Pro", "label": "DeepSeek V4 Pro", "provider": "huggingface", "tier": "free", "recommended": True},\n'
180
  ' {"id": "deepseek-ai/DeepSeek-V4-Flash", "label": "DeepSeek V4 Flash", "provider": "huggingface", "tier": "free"},\n'
181
- ' {"id": "openai/gpt-oss-120b", "label": "GPT-5.5", "provider": "openrouter", "tier": "free"},\n'
182
  ' {"id": "Qwen/Qwen3-Coder-Next", "label": "Qwen3 Coder Next", "provider": "huggingface", "tier": "free", "recommended": True},\n'
183
  ' {"id": "google/gemma-3-1b-it", "label": "Gemma 3 1B", "provider": "huggingface", "tier": "free", "recommended": True},\n'
184
  ' {"id": "openai/google/gemini-2.0-flash-001", "label": "Gemini 2.0 Flash", "provider": "openrouter", "tier": "free"},\n'
@@ -186,7 +186,7 @@ else:
186
  ' {"id": "openai/google/gemma-4-9b-it:free", "label": "Gemma 4 9B", "provider": "openrouter", "tier": "free", "recommended": True},\n'
187
  ' {"id": "openai/google/gemma-4-31b-it:free", "label": "Gemma 4 31B", "provider": "openrouter", "tier": "free", "recommended": True},\n'
188
  ' {"id": "openai/tencent/hy3-preview", "label": "Hy3 Preview", "provider": "openrouter", "tier": "paid", "recommended": True},\n'
189
- ' {"id": "openai/cohere/north-mini-code:free", "label": "Riverflow V2.5 Pro", "provider": "openrouter", "tier": "free", "recommended": True},\n'
190
  ' {"id": "openai/nvidia/nemotron-3-super-120b-a12b:free", "label": "Nemotron 3 Super 120B", "provider": "openrouter", "tier": "free"},\n'
191
  ' {"id": "openai/nvidia/nemotron-3-ultra-550b-a55b:free", "label": "Nemotron 3 Ultra 550B", "provider": "openrouter", "tier": "free", "recommended": True},\n'
192
  ' {"id": "openai/poolside/laguna-m.1:free", "label": "Laguna M.1", "provider": "openrouter", "tier": "free", "recommended": True},\n'
@@ -211,8 +211,9 @@ with open(AGENT_FILE, "w") as f:
211
  f.write(content)
212
 
213
  # === Step 2: Patch _resolve_llm_params for OpenRouter routing ===
214
- # IMPORTANT: Keep the "openai/" prefix when sending to OpenRouter!
215
- # LiteLLM needs it to identify the provider as OpenAI-compatible.
 
216
  with open(LLM_PARAMS_FILE) as f:
217
  llm_content = f.read()
218
 
@@ -228,11 +229,12 @@ old_block = """ hf_model = normalized_model
228
  new_block = """ hf_model = normalized_model
229
  api_key = _resolve_hf_router_token(session_hf_token)
230
 
231
- # === PATCH: Route all openai/-prefixed models to OpenRouter ===
232
- # Match ANY model starting with openai/ — all of them go to OpenRouter
233
  if normalized_model.startswith("openai/"):
 
234
  return {
235
- "model": normalized_model,
236
  "api_base": "https://openrouter.ai/api/v1",
237
  "api_key": os.environ.get("OPENROUTER_API_KEY") or api_key or "",
238
  }
@@ -246,55 +248,26 @@ new_block = """ hf_model = normalized_model
246
 
247
  if old_block in llm_content:
248
  llm_content = llm_content.replace(old_block, new_block)
249
- print("OK: Patched _resolve_llm_params (full block replace)")
250
- elif "openai/gpt-oss-120b" in llm_content or "gpt-oss-120b" in llm_content:
251
- print("OK: Already patched with gpt-oss-120b support")
252
  else:
253
- # Try updating just the routing if already patched
254
- idx = llm_content.find("if normalized_model.startswith(")
255
  if idx >= 0:
256
- # Already has some patch — simplify to catch-all openai/ -> OR
257
- if "openrouter" in llm_content[idx:idx+200]:
258
- # Find and replace the OR condition block
259
- or_start = llm_content.find("# === PATCH:", idx)
260
- if or_start >= 0:
261
- or_end = llm_content.find("# === END PATCH", or_start)
262
- if or_end >= 0:
263
- # Find the full OR routing block up to the return
264
- or_block_end = llm_content.find("\n # Don't double-prefix", or_end)
265
- if or_block_end < 0:
266
- or_block_end = llm_content.find("\n params = {", or_end)
267
-
268
- if or_block_end >= 0:
269
- old_or_block = llm_content[or_start:or_block_end]
270
- else:
271
- old_or_block = llm_content[or_start:or_end+15]
272
- else:
273
- old_or_block = llm_content[idx:llm_content.find("params = {", idx)]
274
- else:
275
- old_or_block = llm_content[idx:llm_content.find("params = {", idx)]
276
-
277
- new_or_block = ''' # === PATCH: Route all openai/-prefixed models to OpenRouter ===
278
- # Match ANY model starting with openai/ — all of them go to OpenRouter
279
- if normalized_model.startswith("openai/"):
280
- return {
281
- "model": normalized_model,
282
- "api_base": "https://openrouter.ai/api/v1",
283
- "api_key": os.environ.get("OPENROUTER_API_KEY") or api_key or "",
284
- }
285
- # === END PATCH ===
286
-
287
- params = {'''
288
 
289
- if old_or_block != new_or_block:
290
- llm_content = llm_content.replace(old_or_block, new_or_block)
291
- print("OK: Simplified OR routing to catch-all openai/ prefix")
292
  else:
293
- print("OK: Routing already up to date")
294
- else:
295
- print("FAIL: No existing OR patch found!")
296
- import sys
297
- sys.exit(1)
298
  else:
299
  print("FAIL: Could not find routing condition!")
300
  import sys
@@ -310,4 +283,4 @@ except SyntaxError as e:
310
  with open(LLM_PARAMS_FILE, "w") as f:
311
  f.write(llm_content)
312
 
313
- print("OK: Backend patched - All openai/-prefixed models route to OpenRouter")
 
77
  },
78
  {
79
  "id": "openai/gpt-oss-120b",
80
+ "label": "gpt-oss-120b",
81
  "provider": "openrouter",
82
  "tier": "free",
83
  },
 
130
  },
131
  {
132
  "id": "openai/cohere/north-mini-code:free",
133
+ "label": "north-mini-code:free",
134
  "provider": "openrouter",
135
  "tier": "free",
136
  "recommended": True,
 
178
  ' {"id": "openai/openrouter/owl-alpha", "label": "Owl Alpha", "provider": "openrouter", "tier": "free", "recommended": True},\n'
179
  ' {"id": "deepseek-ai/DeepSeek-V4-Pro", "label": "DeepSeek V4 Pro", "provider": "huggingface", "tier": "free", "recommended": True},\n'
180
  ' {"id": "deepseek-ai/DeepSeek-V4-Flash", "label": "DeepSeek V4 Flash", "provider": "huggingface", "tier": "free"},\n'
181
+ ' {"id": "openai/gpt-oss-120b", "label": "gpt-oss-120b", "provider": "openrouter", "tier": "free"},\n'
182
  ' {"id": "Qwen/Qwen3-Coder-Next", "label": "Qwen3 Coder Next", "provider": "huggingface", "tier": "free", "recommended": True},\n'
183
  ' {"id": "google/gemma-3-1b-it", "label": "Gemma 3 1B", "provider": "huggingface", "tier": "free", "recommended": True},\n'
184
  ' {"id": "openai/google/gemini-2.0-flash-001", "label": "Gemini 2.0 Flash", "provider": "openrouter", "tier": "free"},\n'
 
186
  ' {"id": "openai/google/gemma-4-9b-it:free", "label": "Gemma 4 9B", "provider": "openrouter", "tier": "free", "recommended": True},\n'
187
  ' {"id": "openai/google/gemma-4-31b-it:free", "label": "Gemma 4 31B", "provider": "openrouter", "tier": "free", "recommended": True},\n'
188
  ' {"id": "openai/tencent/hy3-preview", "label": "Hy3 Preview", "provider": "openrouter", "tier": "paid", "recommended": True},\n'
189
+ ' {"id": "openai/cohere/north-mini-code:free", "label": "north-mini-code:free", "provider": "openrouter", "tier": "free", "recommended": True},\n'
190
  ' {"id": "openai/nvidia/nemotron-3-super-120b-a12b:free", "label": "Nemotron 3 Super 120B", "provider": "openrouter", "tier": "free"},\n'
191
  ' {"id": "openai/nvidia/nemotron-3-ultra-550b-a55b:free", "label": "Nemotron 3 Ultra 550B", "provider": "openrouter", "tier": "free", "recommended": True},\n'
192
  ' {"id": "openai/poolside/laguna-m.1:free", "label": "Laguna M.1", "provider": "openrouter", "tier": "free", "recommended": True},\n'
 
211
  f.write(content)
212
 
213
  # === Step 2: Patch _resolve_llm_params for OpenRouter routing ===
214
+ # IMPORTANT: Strip the "openai/" prefix before sending to OpenRouter!
215
+ # The "openai/" prefix is needed by LiteLLM for provider detection,
216
+ # but OpenRouter expects bare model slugs like "openrouter/owl-alpha".
217
  with open(LLM_PARAMS_FILE) as f:
218
  llm_content = f.read()
219
 
 
229
  new_block = """ hf_model = normalized_model
230
  api_key = _resolve_hf_router_token(session_hf_token)
231
 
232
+ # === PATCH: Route openai/-prefixed models to OpenRouter ===
233
+ # Strip the "openai/" prefix — OpenRouter expects bare slugs like "openrouter/owl-alpha"
234
  if normalized_model.startswith("openai/"):
235
+ actual_model = normalized_model[len("openai/"):]
236
  return {
237
+ "model": actual_model,
238
  "api_base": "https://openrouter.ai/api/v1",
239
  "api_key": os.environ.get("OPENROUTER_API_KEY") or api_key or "",
240
  }
 
248
 
249
  if old_block in llm_content:
250
  llm_content = llm_content.replace(old_block, new_block)
251
+ print("OK: Patched _resolve_llm_params (strips openai/ prefix)")
 
 
252
  else:
253
+ # Already patched — update the OR routing to strip the prefix
254
+ idx = llm_content.find("if normalized_model.startswith(\"openai/\"):")
255
  if idx >= 0:
256
+ # Find the return block
257
+ return_start = llm_content.find('"model":', idx)
258
+ if return_start >= 0:
259
+ line_start = llm_content.rfind('\n', 0, return_start) + 1
260
+ line_end = llm_content.find('\n', line_start)
261
+ old_model_line = llm_content[line_start:line_end]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
262
 
263
+ # Check if it already strips prefix
264
+ if "normalized_model[len" in old_model_line or "actual_model" in old_model_line:
265
+ print("OK: Already strips openai/ prefix")
266
  else:
267
+ # Replace the model line to strip prefix
268
+ new_model_line = ' "model": normalized_model[len("openai/"):],'
269
+ llm_content = llm_content.replace(old_model_line, new_model_line)
270
+ print("OK: Fixed to strip openai/ prefix before sending to OpenRouter")
 
271
  else:
272
  print("FAIL: Could not find routing condition!")
273
  import sys
 
283
  with open(LLM_PARAMS_FILE, "w") as f:
284
  f.write(llm_content)
285
 
286
+ print("OK: Backend patched - 16 models, OR strips openai/ prefix, GPT-5.5→gpt-oss-120b, Riverflow→north-mini-code:free")