Skip to content

Commit ba55836

Browse files
max2maclaude
andcommitted
Add default_headers support to LLM configuration
Enable custom HTTP headers in OpenAI-compatible API client to support API gateways that use non-standard authentication. Headers support environment variable resolution via ${VAR} syntax. Changes: - Add default_headers field to LLMModelConfig - Resolve environment variables in header values during post-init - Pass default_headers to OpenAI client when present - Include default_headers in shared config propagation Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 65cbbe8 commit ba55836

2 files changed

Lines changed: 19 additions & 7 deletions

File tree

openevolve/config.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ class LLMModelConfig:
5555
api_base: str = None
5656
api_key: Optional[str] = None
5757
name: str = None
58+
default_headers: Optional[Dict[str, str]] = None
5859

5960
# Custom LLM client
6061
init_client: Optional[Callable] = None
@@ -84,8 +85,14 @@ class LLMModelConfig:
8485
_manual_queue_dir: Optional[str] = None
8586

8687
def __post_init__(self):
87-
"""Post-initialization to resolve ${VAR} env var references in api_key"""
88+
"""Post-initialization to resolve ${VAR} env var references in api_key and headers"""
8889
self.api_key = _resolve_env_var(self.api_key)
90+
# Resolve environment variables in default_headers values
91+
if self.default_headers:
92+
resolved_headers = {}
93+
for key, value in self.default_headers.items():
94+
resolved_headers[key] = _resolve_env_var(value) if isinstance(value, str) else value
95+
self.default_headers = resolved_headers
8996

9097

9198
@dataclass
@@ -170,6 +177,7 @@ def __post_init__(self):
170177
shared_config = {
171178
"api_base": self.api_base,
172179
"api_key": self.api_key,
180+
"default_headers": self.default_headers,
173181
"temperature": self.temperature,
174182
"top_p": self.top_p,
175183
"max_tokens": self.max_tokens,

openevolve/llm/openai.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ def __init__(
6161
self.retry_delay = model_cfg.retry_delay
6262
self.api_base = model_cfg.api_base
6363
self.api_key = model_cfg.api_key
64+
self.default_headers = getattr(model_cfg, "default_headers", None)
6465
self.random_seed = getattr(model_cfg, "random_seed", None)
6566
self.reasoning_effort = getattr(model_cfg, "reasoning_effort", None)
6667

@@ -82,12 +83,15 @@ def __init__(
8283
# Set up API client (normal mode)
8384
# OpenAI client requires max_retries to be int, not None
8485
max_retries = self.retries if self.retries is not None else 0
85-
self.client = openai.OpenAI(
86-
api_key=self.api_key,
87-
base_url=self.api_base,
88-
timeout=self.timeout,
89-
max_retries=max_retries,
90-
)
86+
client_kwargs = {
87+
"api_key": self.api_key,
88+
"base_url": self.api_base,
89+
"timeout": self.timeout,
90+
"max_retries": max_retries,
91+
}
92+
if self.default_headers:
93+
client_kwargs["default_headers"] = self.default_headers
94+
self.client = openai.OpenAI(**client_kwargs)
9195

9296
# Only log unique models to reduce duplication
9397
if not hasattr(logger, "_initialized_models"):

0 commit comments

Comments
 (0)