Spaces:
Running
Running
Upload patch_models.py
Browse files- 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": "
|
| 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": "
|
| 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": "
|
| 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": "
|
| 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:
|
| 215 |
-
#
|
|
|
|
| 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
|
| 232 |
-
#
|
| 233 |
if normalized_model.startswith("openai/"):
|
|
|
|
| 234 |
return {
|
| 235 |
-
"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 (
|
| 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 |
-
#
|
| 254 |
-
idx = llm_content.find("if normalized_model.startswith(")
|
| 255 |
if idx >= 0:
|
| 256 |
-
#
|
| 257 |
-
|
| 258 |
-
|
| 259 |
-
|
| 260 |
-
|
| 261 |
-
|
| 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
|
| 290 |
-
|
| 291 |
-
print("OK:
|
| 292 |
else:
|
| 293 |
-
|
| 294 |
-
|
| 295 |
-
|
| 296 |
-
|
| 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 -
|
|
|
|
| 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")
|