Skip to content

Commit fbe5ea1

Browse files
authored
Add PydanticAI User-Agent header (#1425)
1 parent a5a078e commit fbe5ea1

File tree

5 files changed

+28
-3
lines changed

5 files changed

+28
-3
lines changed

pydantic_ai_slim/pydantic_ai/models/anthropic.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,14 @@
3131
from ..providers import Provider, infer_provider
3232
from ..settings import ModelSettings
3333
from ..tools import ToolDefinition
34-
from . import Model, ModelRequestParameters, StreamedResponse, cached_async_http_client, check_allow_model_requests
34+
from . import (
35+
Model,
36+
ModelRequestParameters,
37+
StreamedResponse,
38+
cached_async_http_client,
39+
check_allow_model_requests,
40+
get_user_agent,
41+
)
3542

3643
try:
3744
from anthropic import NOT_GIVEN, APIStatusError, AsyncAnthropic, AsyncStream
@@ -231,6 +238,7 @@ async def _messages_create(
231238
top_p=model_settings.get('top_p', NOT_GIVEN),
232239
timeout=model_settings.get('timeout', NOT_GIVEN),
233240
metadata=model_settings.get('anthropic_metadata', NOT_GIVEN),
241+
extra_headers={'User-Agent': get_user_agent()},
234242
)
235243
except APIStatusError as e:
236244
if (status_code := e.status_code) >= 400:

pydantic_ai_slim/pydantic_ai/models/groq.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
from ..providers import Provider, infer_provider
3232
from ..settings import ModelSettings
3333
from ..tools import ToolDefinition
34-
from . import Model, ModelRequestParameters, StreamedResponse, check_allow_model_requests
34+
from . import Model, ModelRequestParameters, StreamedResponse, check_allow_model_requests, get_user_agent
3535

3636
try:
3737
from groq import NOT_GIVEN, APIStatusError, AsyncGroq, AsyncStream
@@ -218,6 +218,7 @@ async def _completions_create(
218218
presence_penalty=model_settings.get('presence_penalty', NOT_GIVEN),
219219
frequency_penalty=model_settings.get('frequency_penalty', NOT_GIVEN),
220220
logit_bias=model_settings.get('logit_bias', NOT_GIVEN),
221+
extra_headers={'User-Agent': get_user_agent()},
221222
)
222223
except APIStatusError as e:
223224
if (status_code := e.status_code) >= 400:

pydantic_ai_slim/pydantic_ai/models/mistral.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
ModelRequestParameters,
4040
StreamedResponse,
4141
check_allow_model_requests,
42+
get_user_agent,
4243
)
4344

4445
try:
@@ -200,6 +201,7 @@ async def _completions_create(
200201
timeout_ms=self._get_timeout_ms(model_settings.get('timeout')),
201202
random_seed=model_settings.get('seed', UNSET),
202203
stop=model_settings.get('stop_sequences', None),
204+
http_headers={'User-Agent': get_user_agent()},
203205
)
204206
except SDKError as e:
205207
if (status_code := e.status_code) >= 400:
@@ -238,6 +240,7 @@ async def _stream_completions_create(
238240
presence_penalty=model_settings.get('presence_penalty'),
239241
frequency_penalty=model_settings.get('frequency_penalty'),
240242
stop=model_settings.get('stop_sequences', None),
243+
http_headers={'User-Agent': get_user_agent()},
241244
)
242245

243246
elif model_request_parameters.result_tools:
@@ -251,6 +254,7 @@ async def _stream_completions_create(
251254
messages=mistral_messages,
252255
response_format={'type': 'json_object'},
253256
stream=True,
257+
http_headers={'User-Agent': get_user_agent()},
254258
)
255259

256260
else:
@@ -259,6 +263,7 @@ async def _stream_completions_create(
259263
model=str(self._model_name),
260264
messages=mistral_messages,
261265
stream=True,
266+
http_headers={'User-Agent': get_user_agent()},
262267
)
263268
assert response, 'A unexpected empty response from Mistral.'
264269
return response

pydantic_ai_slim/pydantic_ai/models/openai.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
StreamedResponse,
4040
cached_async_http_client,
4141
check_allow_model_requests,
42+
get_user_agent,
4243
)
4344

4445
try:
@@ -282,6 +283,7 @@ async def _completions_create(
282283
logit_bias=model_settings.get('logit_bias', NOT_GIVEN),
283284
reasoning_effort=model_settings.get('openai_reasoning_effort', NOT_GIVEN),
284285
user=model_settings.get('openai_user', NOT_GIVEN),
286+
extra_headers={'User-Agent': get_user_agent()},
285287
)
286288
except APIStatusError as e:
287289
if (status_code := e.status_code) >= 400:
@@ -613,6 +615,7 @@ async def _responses_create(
613615
timeout=model_settings.get('timeout', NOT_GIVEN),
614616
reasoning=reasoning,
615617
user=model_settings.get('openai_user', NOT_GIVEN),
618+
extra_headers={'User-Agent': get_user_agent()},
616619
)
617620
except APIStatusError as e:
618621
if (status_code := e.status_code) >= 400:

tests/models/test_openai.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,12 @@ async def test_request_simple_success(allow_model_requests: None):
170170
]
171171
)
172172
assert get_mock_chat_completion_kwargs(mock_client) == [
173-
{'messages': [{'content': 'hello', 'role': 'user'}], 'model': 'gpt-4o', 'n': 1},
173+
{
174+
'messages': [{'content': 'hello', 'role': 'user'}],
175+
'model': 'gpt-4o',
176+
'n': 1,
177+
'extra_headers': {'User-Agent': IsStr(regex=r'pydantic-ai\/.*')},
178+
},
174179
{
175180
'messages': [
176181
{'content': 'hello', 'role': 'user'},
@@ -179,6 +184,7 @@ async def test_request_simple_success(allow_model_requests: None):
179184
],
180185
'model': 'gpt-4o',
181186
'n': 1,
187+
'extra_headers': {'User-Agent': IsStr(regex=r'pydantic-ai\/.*')},
182188
},
183189
]
184190

@@ -551,6 +557,7 @@ async def test_system_prompt_role(
551557
],
552558
'model': 'gpt-4o',
553559
'n': 1,
560+
'extra_headers': {'User-Agent': IsStr(regex=r'pydantic-ai\/.*')},
554561
}
555562
]
556563

@@ -626,6 +633,7 @@ async def test_image_url_input(allow_model_requests: None):
626633
}
627634
],
628635
'n': 1,
636+
'extra_headers': {'User-Agent': IsStr(regex=r'pydantic-ai\/.*')},
629637
}
630638
]
631639
)

0 commit comments

Comments
 (0)