Spaces:
Running
Running
Upload patch_models.py
Browse files- patch_models.py +67 -22
patch_models.py
CHANGED
|
@@ -102,9 +102,9 @@ new_func = '''def _available_models() -> list[dict[str, Any]]:
|
|
| 102 |
"tier": "free",
|
| 103 |
},
|
| 104 |
{
|
| 105 |
-
"id": "deepseek/deepseek-v4-flash",
|
| 106 |
"label": "DeepSeek V4 Flash (OR)",
|
| 107 |
-
"provider": "
|
| 108 |
"tier": "free",
|
| 109 |
},
|
| 110 |
{
|
|
@@ -122,14 +122,14 @@ new_func = '''def _available_models() -> list[dict[str, Any]]:
|
|
| 122 |
"recommended": True,
|
| 123 |
},
|
| 124 |
{
|
| 125 |
-
"id": "tencent/hy3-preview",
|
| 126 |
"label": "Hy3 Preview",
|
| 127 |
"provider": "openrouter",
|
| 128 |
"tier": "free",
|
| 129 |
"recommended": True,
|
| 130 |
},
|
| 131 |
{
|
| 132 |
-
"id": "cohere/north-mini-code:free",
|
| 133 |
"label": "Riverflow V2.5 Pro",
|
| 134 |
"provider": "openrouter",
|
| 135 |
"tier": "free",
|
|
@@ -182,11 +182,11 @@ else:
|
|
| 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'
|
| 185 |
-
' {"id": "deepseek/deepseek-v4-flash", "label": "DeepSeek V4 Flash (OR)", "provider": "
|
| 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": "tencent/hy3-preview", "label": "Hy3 Preview", "provider": "openrouter", "tier": "free", "recommended": True},\n'
|
| 189 |
-
' {"id": "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'
|
|
@@ -216,6 +216,7 @@ with open(AGENT_FILE, "w") as f:
|
|
| 216 |
with open(LLM_PARAMS_FILE) as f:
|
| 217 |
llm_content = f.read()
|
| 218 |
|
|
|
|
| 219 |
old_block = """ hf_model = normalized_model
|
| 220 |
api_key = _resolve_hf_router_token(session_hf_token)
|
| 221 |
params = {
|
|
@@ -230,7 +231,7 @@ new_block = """ hf_model = normalized_model
|
|
| 230 |
# === PATCH: Route models to OpenRouter via LiteLLM ===
|
| 231 |
# Models with openai/<provider>/ prefix go to OpenRouter.
|
| 232 |
# Keep the "openai/" prefix — LiteLLM needs it for provider detection.
|
| 233 |
-
_or_prefixes = ("openai/google/", "openai/deepseek/", "openai/nvidia/", "openai/poolside/", "openai/sourceful/", "openai/openrouter/")
|
| 234 |
if normalized_model.startswith(_or_prefixes):
|
| 235 |
return {
|
| 236 |
"model": normalized_model,
|
|
@@ -239,32 +240,76 @@ new_block = """ hf_model = normalized_model
|
|
| 239 |
}
|
| 240 |
# === END PATCH ===
|
| 241 |
|
| 242 |
-
|
| 243 |
-
|
| 244 |
-
|
| 245 |
-
|
| 246 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 247 |
|
| 248 |
if old_block in llm_content:
|
| 249 |
llm_content = llm_content.replace(old_block, new_block)
|
| 250 |
-
print("OK: Patched _resolve_llm_params")
|
| 251 |
-
elif "openai/
|
| 252 |
-
print("OK: Already patched")
|
| 253 |
else:
|
| 254 |
-
|
|
|
|
|
|
|
| 255 |
if idx >= 0:
|
| 256 |
-
|
| 257 |
-
|
| 258 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 259 |
|
| 260 |
try:
|
| 261 |
ast.parse(llm_content)
|
| 262 |
print("OK: llm_params.py syntax OK")
|
| 263 |
except SyntaxError as e:
|
| 264 |
-
print(f"FAIL: Syntax error: {e}")
|
| 265 |
raise
|
| 266 |
|
| 267 |
with open(LLM_PARAMS_FILE, "w") as f:
|
| 268 |
f.write(llm_content)
|
| 269 |
|
| 270 |
-
print("OK: Backend patched - 16 models,
|
|
|
|
| 102 |
"tier": "free",
|
| 103 |
},
|
| 104 |
{
|
| 105 |
+
"id": "openai/deepseek/deepseek-v4-flash:free",
|
| 106 |
"label": "DeepSeek V4 Flash (OR)",
|
| 107 |
+
"provider": "openrouter",
|
| 108 |
"tier": "free",
|
| 109 |
},
|
| 110 |
{
|
|
|
|
| 122 |
"recommended": True,
|
| 123 |
},
|
| 124 |
{
|
| 125 |
+
"id": "openai/tencent/hy3-preview:free",
|
| 126 |
"label": "Hy3 Preview",
|
| 127 |
"provider": "openrouter",
|
| 128 |
"tier": "free",
|
| 129 |
"recommended": True,
|
| 130 |
},
|
| 131 |
{
|
| 132 |
+
"id": "openai/cohere/north-mini-code:free",
|
| 133 |
"label": "Riverflow V2.5 Pro",
|
| 134 |
"provider": "openrouter",
|
| 135 |
"tier": "free",
|
|
|
|
| 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'
|
| 185 |
+
' {"id": "openai/deepseek/deepseek-v4-flash:free", "label": "DeepSeek V4 Flash (OR)", "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:free", "label": "Hy3 Preview", "provider": "openrouter", "tier": "free", "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'
|
|
|
|
| 216 |
with open(LLM_PARAMS_FILE) as f:
|
| 217 |
llm_content = f.read()
|
| 218 |
|
| 219 |
+
# First, try to replace the full block (original version)
|
| 220 |
old_block = """ hf_model = normalized_model
|
| 221 |
api_key = _resolve_hf_router_token(session_hf_token)
|
| 222 |
params = {
|
|
|
|
| 231 |
# === PATCH: Route models to OpenRouter via LiteLLM ===
|
| 232 |
# Models with openai/<provider>/ prefix go to OpenRouter.
|
| 233 |
# Keep the "openai/" prefix — LiteLLM needs it for provider detection.
|
| 234 |
+
_or_prefixes = ("openai/google/", "openai/deepseek/", "openai/nvidia/", "openai/poolside/", "openai/sourceful/", "openai/tencent/", "openai/cohere/", "openai/openrouter/")
|
| 235 |
if normalized_model.startswith(_or_prefixes):
|
| 236 |
return {
|
| 237 |
"model": normalized_model,
|
|
|
|
| 240 |
}
|
| 241 |
# === END PATCH ===
|
| 242 |
|
| 243 |
+
# Don't double-prefix: if model already starts with openai/, use as-is for HF Router
|
| 244 |
+
if normalized_model.startswith("openai/"):
|
| 245 |
+
params = {
|
| 246 |
+
"model": normalized_model,
|
| 247 |
+
"api_base": HF_ROUTER_BASE_URL,
|
| 248 |
+
"api_key": api_key,
|
| 249 |
+
}
|
| 250 |
+
else:
|
| 251 |
+
params = {
|
| 252 |
+
"model": f"openai/{hf_model}",
|
| 253 |
+
"api_base": HF_ROUTER_BASE_URL,
|
| 254 |
+
"api_key": api_key,
|
| 255 |
+
}"""
|
| 256 |
|
| 257 |
if old_block in llm_content:
|
| 258 |
llm_content = llm_content.replace(old_block, new_block)
|
| 259 |
+
print("OK: Patched _resolve_llm_params (full block replace)")
|
| 260 |
+
elif "openai/tencent/" in llm_content:
|
| 261 |
+
print("OK: Already patched with tencent/cohere prefixes")
|
| 262 |
else:
|
| 263 |
+
# Try updating just the _or_prefixes tuple if already patched
|
| 264 |
+
# First check if already patched
|
| 265 |
+
idx = llm_content.find('_or_prefixes = (')
|
| 266 |
if idx >= 0:
|
| 267 |
+
# Already has the OR patch, need to update prefixes
|
| 268 |
+
old_prefixes = llm_content[idx:llm_content.find(')', idx)+1]
|
| 269 |
+
new_prefixes = '_or_prefixes = ("openai/google/", "openai/deepseek/", "openai/nvidia/", "openai/poolside/", "openai/sourceful/", "openai/tencent/", "openai/cohere/", "openai/openrouter/")'
|
| 270 |
+
if old_prefixes != new_prefixes:
|
| 271 |
+
llm_content = llm_content.replace(old_prefixes, new_prefixes)
|
| 272 |
+
print("OK: Updated _or_prefixes to include tencent + cohere")
|
| 273 |
+
else:
|
| 274 |
+
print("OK: _or_prefixes already up to date")
|
| 275 |
+
|
| 276 |
+
# Also fix the HF Router routing to handle openai/ prefix properly
|
| 277 |
+
old_hf_route = ''' params = {
|
| 278 |
+
"model": f"openai/{hf_model}",
|
| 279 |
+
"api_base": HF_ROUTER_BASE_URL,
|
| 280 |
+
"api_key": api_key,
|
| 281 |
+
}'''
|
| 282 |
+
new_hf_route = ''' # Don't double-prefix: if model already starts with openai/, use as-is for HF Router
|
| 283 |
+
if normalized_model.startswith("openai/"):
|
| 284 |
+
params = {
|
| 285 |
+
"model": normalized_model,
|
| 286 |
+
"api_base": HF_ROUTER_BASE_URL,
|
| 287 |
+
"api_key": api_key,
|
| 288 |
+
}
|
| 289 |
+
else:
|
| 290 |
+
params = {
|
| 291 |
+
"model": f"openai/{hf_model}",
|
| 292 |
+
"api_base": HF_ROUTER_BASE_URL,
|
| 293 |
+
"api_key": api_key,
|
| 294 |
+
}'''
|
| 295 |
+
if old_hf_route in llm_content:
|
| 296 |
+
llm_content = llm_content.replace(old_hf_route, new_hf_route)
|
| 297 |
+
print("OK: Fixed HF Router routing to avoid double openai/ prefix")
|
| 298 |
+
else:
|
| 299 |
+
print("OK: HF Router routing already handles openai/ prefix")
|
| 300 |
+
else:
|
| 301 |
+
print("FAIL: Could not find _or_prefixes or original block!")
|
| 302 |
+
import sys
|
| 303 |
+
sys.exit(1)
|
| 304 |
|
| 305 |
try:
|
| 306 |
ast.parse(llm_content)
|
| 307 |
print("OK: llm_params.py syntax OK")
|
| 308 |
except SyntaxError as e:
|
| 309 |
+
print(f"FAIL: Syntax error in llm_params.py: {e}")
|
| 310 |
raise
|
| 311 |
|
| 312 |
with open(LLM_PARAMS_FILE, "w") as f:
|
| 313 |
f.write(llm_content)
|
| 314 |
|
| 315 |
+
print("OK: Backend patched - 16 models, OR routing with tencent/cohere, HF Router fix for openai/ prefix")
|