bep40 commited on
Commit
9edbd2e
·
verified ·
1 Parent(s): e841723

Add llm_params patch for OpenRouter support + fix Dockerfile to apply it

Browse files
Files changed (1) hide show
  1. patches/openrouter_patch.py +93 -0
patches/openrouter_patch.py ADDED
@@ -0,0 +1,93 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Patch: Add OpenRouter support to _resolve_llm_params.
2
+
3
+ If model_name doesn't match anthropic/, openai/, bedrock/, or local prefixes,
4
+ AND OPENROUTER_API_KEY is set, route through OpenRouter instead of HF Router.
5
+ """
6
+ import os
7
+
8
+ def patch_resolve_llm_params():
9
+ """Monkey-patch _resolve_llm_params to support OpenRouter."""
10
+ from agent.core import llm_params as lp
11
+
12
+ _original = lp._resolve_llm_params
13
+
14
+ def _patched(model_name, session_hf_token=None, reasoning_effort=None, strict=False):
15
+ # If model starts with known prefixes, use original logic
16
+ if model_name.startswith(("anthropic/", "openai/", "bedrock/")):
17
+ # Check if we should redirect openai/ to OpenRouter
18
+ if model_name.startswith("openai/") and os.environ.get("OPENROUTER_API_KEY"):
19
+ api_base = os.environ.get("OPENAI_API_BASE", "https://openrouter.ai/api/v1")
20
+ # Strip openai/ prefix - send raw model name to OpenRouter
21
+ raw_model = model_name[len("openai/"):]
22
+ params = {
23
+ "model": f"openai/{raw_model}",
24
+ "api_base": api_base,
25
+ "api_key": os.environ["OPENROUTER_API_KEY"],
26
+ }
27
+ if reasoning_effort:
28
+ params["reasoning_effort"] = reasoning_effort
29
+ return params
30
+ return _original(model_name, session_hf_token, reasoning_effort, strict)
31
+
32
+ # Check for OpenRouter
33
+ openrouter_key = os.environ.get("OPENROUTER_API_KEY") or os.environ.get("OPENAI_API_KEY")
34
+ openrouter_base = os.environ.get("OPENAI_API_BASE", "https://openrouter.ai/api/v1")
35
+
36
+ if openrouter_key and "openrouter" in openrouter_base:
37
+ # Route through OpenRouter
38
+ params = {
39
+ "model": f"openai/{model_name}",
40
+ "api_base": openrouter_base,
41
+ "api_key": openrouter_key,
42
+ }
43
+ return params
44
+
45
+ # Fallback to original (HF Router)
46
+ return _original(model_name, session_hf_token, reasoning_effort, strict)
47
+
48
+ lp._resolve_llm_params = _patched
49
+
50
+
51
+ def patch_available_models():
52
+ """Patch available models list in agent routes."""
53
+ try:
54
+ from backend.routes import agent as agent_routes
55
+
56
+ models = [
57
+ {
58
+ "id": "deepseek/deepseek-chat-v3-0324",
59
+ "label": "DeepSeek V3",
60
+ "provider": "openrouter",
61
+ "tier": "free",
62
+ "recommended": True,
63
+ },
64
+ {
65
+ "id": "google/gemini-2.0-flash-001",
66
+ "label": "Gemini 2.0 Flash",
67
+ "provider": "openrouter",
68
+ "tier": "free",
69
+ },
70
+ {
71
+ "id": "qwen/qwen3-30b-a3b",
72
+ "label": "Qwen3 30B",
73
+ "provider": "openrouter",
74
+ "tier": "free",
75
+ },
76
+ {
77
+ "id": "anthropic/claude-sonnet-4",
78
+ "label": "Claude Sonnet 4",
79
+ "provider": "openrouter",
80
+ "tier": "pro",
81
+ },
82
+ ]
83
+ agent_routes.AVAILABLE_MODELS = models
84
+ agent_routes.PREMIUM_MODEL_IDS = {"anthropic/claude-sonnet-4", "anthropic/claude-opus-4"}
85
+ agent_routes.DEFAULT_FREE_MODEL_ID = "deepseek/deepseek-chat-v3-0324"
86
+ except Exception as e:
87
+ print(f"[patch] Could not patch available_models: {e}")
88
+
89
+
90
+ def apply_all_patches():
91
+ patch_resolve_llm_params()
92
+ patch_available_models()
93
+ print("[patch] ✅ OpenRouter patches applied")