Skip to content

Commit 4c4b7c2

Browse files
authored
Allow headers override instead of just ua (#1787)
Update the user agent override context var to override headers generally instead of just the ua header. This allows us to pass in rich header info from other OA sdks running alongside Agents SDK.
1 parent 5e1db14 commit 4c4b7c2

File tree

7 files changed

+27
-31
lines changed

7 files changed

+27
-31
lines changed

src/agents/extensions/models/litellm_model.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
from ...logger import logger
4040
from ...model_settings import ModelSettings
4141
from ...models.chatcmpl_converter import Converter
42-
from ...models.chatcmpl_helpers import HEADERS, USER_AGENT_OVERRIDE
42+
from ...models.chatcmpl_helpers import HEADERS, HEADERS_OVERRIDE
4343
from ...models.chatcmpl_stream_handler import ChatCmplStreamHandler
4444
from ...models.fake_id import FAKE_RESPONSES_ID
4545
from ...models.interface import Model, ModelTracing
@@ -385,11 +385,7 @@ def _remove_not_given(self, value: Any) -> Any:
385385
return value
386386

387387
def _merge_headers(self, model_settings: ModelSettings):
388-
merged = {**HEADERS, **(model_settings.extra_headers or {})}
389-
ua_ctx = USER_AGENT_OVERRIDE.get()
390-
if ua_ctx is not None:
391-
merged["User-Agent"] = ua_ctx
392-
return merged
388+
return {**HEADERS, **(model_settings.extra_headers or {}), **(HEADERS_OVERRIDE.get() or {})}
393389

394390

395391
class LitellmConverter:

src/agents/models/chatcmpl_helpers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
_USER_AGENT = f"Agents/Python {__version__}"
1111
HEADERS = {"User-Agent": _USER_AGENT}
1212

13-
USER_AGENT_OVERRIDE: ContextVar[str | None] = ContextVar(
14-
"openai_chatcompletions_user_agent_override", default=None
13+
HEADERS_OVERRIDE: ContextVar[dict[str, str] | None] = ContextVar(
14+
"openai_chatcompletions_headers_override", default=None
1515
)
1616

1717

src/agents/models/openai_chatcompletions.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
from ..usage import Usage
2626
from ..util._json import _to_dump_compatible
2727
from .chatcmpl_converter import Converter
28-
from .chatcmpl_helpers import HEADERS, USER_AGENT_OVERRIDE, ChatCmplHelpers
28+
from .chatcmpl_helpers import HEADERS, HEADERS_OVERRIDE, ChatCmplHelpers
2929
from .chatcmpl_stream_handler import ChatCmplStreamHandler
3030
from .fake_id import FAKE_RESPONSES_ID
3131
from .interface import Model, ModelTracing
@@ -351,8 +351,8 @@ def _get_client(self) -> AsyncOpenAI:
351351
return self._client
352352

353353
def _merge_headers(self, model_settings: ModelSettings):
354-
merged = {**HEADERS, **(model_settings.extra_headers or {})}
355-
ua_ctx = USER_AGENT_OVERRIDE.get()
356-
if ua_ctx is not None:
357-
merged["User-Agent"] = ua_ctx
358-
return merged
354+
return {
355+
**HEADERS,
356+
**(model_settings.extra_headers or {}),
357+
**(HEADERS_OVERRIDE.get() or {}),
358+
}

src/agents/models/openai_responses.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,9 @@
5050
_USER_AGENT = f"Agents/Python {__version__}"
5151
_HEADERS = {"User-Agent": _USER_AGENT}
5252

53-
# Override for the User-Agent header used by the Responses API.
54-
_USER_AGENT_OVERRIDE: ContextVar[str | None] = ContextVar(
55-
"openai_responses_user_agent_override", default=None
53+
# Override headers used by the Responses API.
54+
_HEADERS_OVERRIDE: ContextVar[dict[str, str] | None] = ContextVar(
55+
"openai_responses_headers_override", default=None
5656
)
5757

5858

@@ -334,11 +334,11 @@ def _get_client(self) -> AsyncOpenAI:
334334
return self._client
335335

336336
def _merge_headers(self, model_settings: ModelSettings):
337-
merged = {**_HEADERS, **(model_settings.extra_headers or {})}
338-
ua_ctx = _USER_AGENT_OVERRIDE.get()
339-
if ua_ctx is not None:
340-
merged["User-Agent"] = ua_ctx
341-
return merged
337+
return {
338+
**_HEADERS,
339+
**(model_settings.extra_headers or {}),
340+
**(_HEADERS_OVERRIDE.get() or {}),
341+
}
342342

343343

344344
@dataclass

tests/models/test_litellm_user_agent.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import pytest
66

77
from agents import ModelSettings, ModelTracing, __version__
8-
from agents.models.chatcmpl_helpers import USER_AGENT_OVERRIDE
8+
from agents.models.chatcmpl_helpers import HEADERS_OVERRIDE
99

1010

1111
@pytest.mark.allow_call_model_methods
@@ -65,7 +65,7 @@ async def acompletion(**kwargs):
6565
model = LitellmModel(model="gpt-4")
6666

6767
if override_ua is not None:
68-
token = USER_AGENT_OVERRIDE.set(override_ua)
68+
token = HEADERS_OVERRIDE.set({"User-Agent": override_ua})
6969
else:
7070
token = None
7171
try:
@@ -83,7 +83,7 @@ async def acompletion(**kwargs):
8383
)
8484
finally:
8585
if token is not None:
86-
USER_AGENT_OVERRIDE.reset(token)
86+
HEADERS_OVERRIDE.reset(token)
8787

8888
assert "extra_headers" in called_kwargs
8989
assert called_kwargs["extra_headers"]["User-Agent"] == expected_ua

tests/test_openai_chatcompletions.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
__version__,
3535
generation_span,
3636
)
37-
from agents.models.chatcmpl_helpers import USER_AGENT_OVERRIDE, ChatCmplHelpers
37+
from agents.models.chatcmpl_helpers import HEADERS_OVERRIDE, ChatCmplHelpers
3838
from agents.models.fake_id import FAKE_RESPONSES_ID
3939

4040

@@ -402,7 +402,7 @@ def __init__(self):
402402
model = OpenAIChatCompletionsModel(model="gpt-4", openai_client=DummyChatClient()) # type: ignore
403403

404404
if override_ua is not None:
405-
token = USER_AGENT_OVERRIDE.set(override_ua)
405+
token = HEADERS_OVERRIDE.set({"User-Agent": override_ua})
406406
else:
407407
token = None
408408

@@ -420,7 +420,7 @@ def __init__(self):
420420
)
421421
finally:
422422
if token is not None:
423-
USER_AGENT_OVERRIDE.reset(token)
423+
HEADERS_OVERRIDE.reset(token)
424424

425425
assert "extra_headers" in called_kwargs
426426
assert called_kwargs["extra_headers"]["User-Agent"] == expected_ua

tests/test_openai_responses.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from openai.types.responses import ResponseCompletedEvent
77

88
from agents import ModelSettings, ModelTracing, __version__
9-
from agents.models.openai_responses import _USER_AGENT_OVERRIDE as RESP_UA, OpenAIResponsesModel
9+
from agents.models.openai_responses import _HEADERS_OVERRIDE as RESP_HEADERS, OpenAIResponsesModel
1010
from tests.fake_model import get_response_obj
1111

1212

@@ -41,7 +41,7 @@ def __init__(self):
4141
model = OpenAIResponsesModel(model="gpt-4", openai_client=DummyResponsesClient()) # type: ignore
4242

4343
if override_ua is not None:
44-
token = RESP_UA.set(override_ua)
44+
token = RESP_HEADERS.set({"User-Agent": override_ua})
4545
else:
4646
token = None
4747

@@ -59,7 +59,7 @@ def __init__(self):
5959
pass
6060
finally:
6161
if token is not None:
62-
RESP_UA.reset(token)
62+
RESP_HEADERS.reset(token)
6363

6464
assert "extra_headers" in called_kwargs
6565
assert called_kwargs["extra_headers"]["User-Agent"] == expected_ua

0 commit comments

Comments
 (0)