dorphalsig commited on
Commit
8da3765
·
1 Parent(s): 88b3b41

Add Anthropic url overrides via ANTHROPIC_TARGET_URL env var and --anthropic-api-url flag

Browse files
headroom/cli/proxy.py CHANGED
@@ -94,6 +94,11 @@ from .main import main
94
  default="openai",
95
  help="Provider for any-llm backend: openai, mistral, groq, ollama, etc. (default: openai)",
96
  )
 
 
 
 
 
97
  @click.option(
98
  "--openai-api-url",
99
  default=None,
@@ -149,6 +154,7 @@ def proxy(
149
  no_learn: bool,
150
  backend: str,
151
  anyllm_provider: str,
 
152
  openai_api_url: str | None,
153
  gemini_api_url: str | None,
154
  region: str,
@@ -181,6 +187,7 @@ def proxy(
181
  raise SystemExit(1) from None
182
 
183
  # Resolve API URL overrides: CLI flag > env var > None
 
184
  effective_openai_api_url = openai_api_url or os.environ.get("OPENAI_TARGET_API_URL")
185
  effective_gemini_api_url = gemini_api_url or os.environ.get("GEMINI_TARGET_API_URL")
186
 
@@ -200,6 +207,7 @@ def proxy(
200
  config = ProxyConfig(
201
  host=host,
202
  port=port,
 
203
  openai_api_url=effective_openai_api_url,
204
  gemini_api_url=effective_gemini_api_url,
205
  mode=effective_mode,
 
94
  default="openai",
95
  help="Provider for any-llm backend: openai, mistral, groq, ollama, etc. (default: openai)",
96
  )
97
+ @click.option(
98
+ "--anthropic-api-url",
99
+ default=None,
100
+ help="Custom Anthropic API URL for passthrough endpoints (env: ANTHROPIC_TARGET_API_URL)",
101
+ )
102
  @click.option(
103
  "--openai-api-url",
104
  default=None,
 
154
  no_learn: bool,
155
  backend: str,
156
  anyllm_provider: str,
157
+ anthropic_api_url: str | None,
158
  openai_api_url: str | None,
159
  gemini_api_url: str | None,
160
  region: str,
 
187
  raise SystemExit(1) from None
188
 
189
  # Resolve API URL overrides: CLI flag > env var > None
190
+ effective_anthropic_api_url = anthropic_api_url or os.environ.get("ANTHROPIC_TARGET_API_URL")
191
  effective_openai_api_url = openai_api_url or os.environ.get("OPENAI_TARGET_API_URL")
192
  effective_gemini_api_url = gemini_api_url or os.environ.get("GEMINI_TARGET_API_URL")
193
 
 
207
  config = ProxyConfig(
208
  host=host,
209
  port=port,
210
+ anthropic_api_url=effective_anthropic_api_url,
211
  openai_api_url=effective_openai_api_url,
212
  gemini_api_url=effective_gemini_api_url,
213
  mode=effective_mode,
headroom/proxy/server.py CHANGED
@@ -685,6 +685,7 @@ class ProxyConfig:
685
  # Server
686
  host: str = "127.0.0.1"
687
  port: int = 8787
 
688
  openai_api_url: str | None = None # Custom OpenAI API URL override
689
  gemini_api_url: str | None = None # Custom Gemini API URL override
690
 
@@ -1688,6 +1689,14 @@ class HeadroomProxy:
1688
  def __init__(self, config: ProxyConfig):
1689
  self.config = config
1690
 
 
 
 
 
 
 
 
 
1691
  # Override OPENAI_API_URL with config if set
1692
  # Strip trailing /v1 or /v1/ to avoid double-path (e.g., .../v1/v1/models)
1693
  if config.openai_api_url:
 
685
  # Server
686
  host: str = "127.0.0.1"
687
  port: int = 8787
688
+ anthropic_api_url: str | None = None # Custom Anthropic API URL override
689
  openai_api_url: str | None = None # Custom OpenAI API URL override
690
  gemini_api_url: str | None = None # Custom Gemini API URL override
691
 
 
1689
  def __init__(self, config: ProxyConfig):
1690
  self.config = config
1691
 
1692
+ # Override ANTHROPIC_API_URL with config if set
1693
+ # Strip trailing /v1 or /v1/ to avoid double-path (e.g., .../v1/v1/models)
1694
+ if config.anthropic_api_url:
1695
+ url = config.anthropic_api_url.rstrip("/")
1696
+ if url.endswith("/v1"):
1697
+ url = url[:-3]
1698
+ HeadroomProxy.ANTHROPIC_API_URL = url
1699
+
1700
  # Override OPENAI_API_URL with config if set
1701
  # Strip trailing /v1 or /v1/ to avoid double-path (e.g., .../v1/v1/models)
1702
  if config.openai_api_url: