pydantic-ai-slim 0.6.0__tar.gz → 0.6.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of pydantic-ai-slim might be problematic. Click here for more details.

Files changed (100) hide show
  1. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/PKG-INFO +4 -4
  2. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/models/__init__.py +15 -6
  3. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/models/bedrock.py +24 -6
  4. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/profiles/__init__.py +9 -1
  5. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/profiles/amazon.py +1 -2
  6. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/profiles/meta.py +1 -2
  7. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/profiles/qwen.py +1 -2
  8. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/providers/bedrock.py +4 -3
  9. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pyproject.toml +1 -1
  10. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/.gitignore +0 -0
  11. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/LICENSE +0 -0
  12. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/README.md +0 -0
  13. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/__init__.py +0 -0
  14. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/__main__.py +0 -0
  15. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/_a2a.py +0 -0
  16. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/_agent_graph.py +0 -0
  17. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/_cli.py +0 -0
  18. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/_function_schema.py +0 -0
  19. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/_griffe.py +0 -0
  20. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/_mcp.py +0 -0
  21. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/_output.py +0 -0
  22. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/_parts_manager.py +0 -0
  23. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/_run_context.py +0 -0
  24. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/_system_prompt.py +0 -0
  25. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/_thinking_part.py +0 -0
  26. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/_tool_manager.py +0 -0
  27. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/_utils.py +0 -0
  28. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/ag_ui.py +0 -0
  29. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/agent.py +0 -0
  30. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/common_tools/__init__.py +0 -0
  31. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/common_tools/duckduckgo.py +0 -0
  32. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/common_tools/tavily.py +0 -0
  33. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/direct.py +0 -0
  34. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/exceptions.py +0 -0
  35. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/ext/__init__.py +0 -0
  36. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/ext/aci.py +0 -0
  37. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/ext/langchain.py +0 -0
  38. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/format_prompt.py +0 -0
  39. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/mcp.py +0 -0
  40. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/messages.py +0 -0
  41. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/models/anthropic.py +0 -0
  42. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/models/cohere.py +0 -0
  43. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/models/fallback.py +0 -0
  44. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/models/function.py +0 -0
  45. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/models/gemini.py +0 -0
  46. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/models/google.py +0 -0
  47. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/models/groq.py +0 -0
  48. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/models/huggingface.py +0 -0
  49. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/models/instrumented.py +0 -0
  50. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/models/mcp_sampling.py +0 -0
  51. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/models/mistral.py +0 -0
  52. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/models/openai.py +0 -0
  53. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/models/test.py +0 -0
  54. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/models/wrapper.py +0 -0
  55. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/output.py +0 -0
  56. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/profiles/_json_schema.py +0 -0
  57. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/profiles/anthropic.py +0 -0
  58. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/profiles/cohere.py +0 -0
  59. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/profiles/deepseek.py +0 -0
  60. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/profiles/google.py +0 -0
  61. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/profiles/grok.py +0 -0
  62. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/profiles/mistral.py +0 -0
  63. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/profiles/moonshotai.py +0 -0
  64. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/profiles/openai.py +0 -0
  65. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/providers/__init__.py +0 -0
  66. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/providers/anthropic.py +0 -0
  67. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/providers/azure.py +0 -0
  68. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/providers/cohere.py +0 -0
  69. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/providers/deepseek.py +0 -0
  70. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/providers/fireworks.py +0 -0
  71. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/providers/github.py +0 -0
  72. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/providers/google.py +0 -0
  73. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/providers/google_gla.py +0 -0
  74. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/providers/google_vertex.py +0 -0
  75. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/providers/grok.py +0 -0
  76. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/providers/groq.py +0 -0
  77. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/providers/heroku.py +0 -0
  78. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/providers/huggingface.py +0 -0
  79. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/providers/mistral.py +0 -0
  80. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/providers/moonshotai.py +0 -0
  81. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/providers/openai.py +0 -0
  82. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/providers/openrouter.py +0 -0
  83. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/providers/together.py +0 -0
  84. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/providers/vercel.py +0 -0
  85. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/py.typed +0 -0
  86. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/result.py +0 -0
  87. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/retries.py +0 -0
  88. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/settings.py +0 -0
  89. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/tools.py +0 -0
  90. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/toolsets/__init__.py +0 -0
  91. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/toolsets/abstract.py +0 -0
  92. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/toolsets/combined.py +0 -0
  93. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/toolsets/deferred.py +0 -0
  94. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/toolsets/filtered.py +0 -0
  95. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/toolsets/function.py +0 -0
  96. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/toolsets/prefixed.py +0 -0
  97. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/toolsets/prepared.py +0 -0
  98. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/toolsets/renamed.py +0 -0
  99. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/toolsets/wrapper.py +0 -0
  100. {pydantic_ai_slim-0.6.0 → pydantic_ai_slim-0.6.1}/pydantic_ai/usage.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pydantic-ai-slim
3
- Version: 0.6.0
3
+ Version: 0.6.1
4
4
  Summary: Agent Framework / shim to use Pydantic with LLMs, slim package
5
5
  Author-email: Samuel Colvin <samuel@pydantic.dev>, Marcelo Trylesinski <marcelotryle@gmail.com>, David Montague <david@pydantic.dev>, Alex Hall <alex@pydantic.dev>, Douwe Maan <douwe@pydantic.dev>
6
6
  License-Expression: MIT
@@ -30,7 +30,7 @@ Requires-Dist: exceptiongroup; python_version < '3.11'
30
30
  Requires-Dist: griffe>=1.3.2
31
31
  Requires-Dist: httpx>=0.27
32
32
  Requires-Dist: opentelemetry-api>=1.28.0
33
- Requires-Dist: pydantic-graph==0.6.0
33
+ Requires-Dist: pydantic-graph==0.6.1
34
34
  Requires-Dist: pydantic>=2.10
35
35
  Requires-Dist: typing-inspection>=0.4.0
36
36
  Provides-Extra: a2a
@@ -41,7 +41,7 @@ Requires-Dist: starlette>=0.45.3; extra == 'ag-ui'
41
41
  Provides-Extra: anthropic
42
42
  Requires-Dist: anthropic>=0.61.0; extra == 'anthropic'
43
43
  Provides-Extra: bedrock
44
- Requires-Dist: boto3>=1.37.24; extra == 'bedrock'
44
+ Requires-Dist: boto3>=1.39.0; extra == 'bedrock'
45
45
  Provides-Extra: cli
46
46
  Requires-Dist: argcomplete>=3.5.0; extra == 'cli'
47
47
  Requires-Dist: prompt-toolkit>=3; extra == 'cli'
@@ -51,7 +51,7 @@ Requires-Dist: cohere>=5.16.0; (platform_system != 'Emscripten') and extra == 'c
51
51
  Provides-Extra: duckduckgo
52
52
  Requires-Dist: ddgs>=9.0.0; extra == 'duckduckgo'
53
53
  Provides-Extra: evals
54
- Requires-Dist: pydantic-evals==0.6.0; extra == 'evals'
54
+ Requires-Dist: pydantic-evals==0.6.1; extra == 'evals'
55
55
  Provides-Extra: google
56
56
  Requires-Dist: google-genai>=1.28.0; extra == 'google'
57
57
  Provides-Extra: groq
@@ -217,6 +217,9 @@ KnownModelName = TypeAliasType(
217
217
  'heroku:claude-3-7-sonnet',
218
218
  'heroku:claude-4-sonnet',
219
219
  'heroku:claude-3-haiku',
220
+ 'heroku:gpt-oss-120b',
221
+ 'heroku:nova-lite',
222
+ 'heroku:nova-pro',
220
223
  'huggingface:Qwen/QwQ-32B',
221
224
  'huggingface:Qwen/Qwen2.5-72B-Instruct',
222
225
  'huggingface:Qwen/Qwen3-235B-A22B',
@@ -790,12 +793,18 @@ def get_user_agent() -> str:
790
793
  def _customize_tool_def(transformer: type[JsonSchemaTransformer], t: ToolDefinition):
791
794
  schema_transformer = transformer(t.parameters_json_schema, strict=t.strict)
792
795
  parameters_json_schema = schema_transformer.walk()
793
- if t.strict is None:
794
- t = replace(t, strict=schema_transformer.is_strict_compatible)
795
- return replace(t, parameters_json_schema=parameters_json_schema)
796
+ return replace(
797
+ t,
798
+ parameters_json_schema=parameters_json_schema,
799
+ strict=schema_transformer.is_strict_compatible if t.strict is None else t.strict,
800
+ )
796
801
 
797
802
 
798
803
  def _customize_output_object(transformer: type[JsonSchemaTransformer], o: OutputObjectDefinition):
799
- schema_transformer = transformer(o.json_schema, strict=True)
800
- son_schema = schema_transformer.walk()
801
- return replace(o, json_schema=son_schema)
804
+ schema_transformer = transformer(o.json_schema, strict=o.strict)
805
+ json_schema = schema_transformer.walk()
806
+ return replace(
807
+ o,
808
+ json_schema=json_schema,
809
+ strict=schema_transformer.is_strict_compatible if o.strict is None else o.strict,
810
+ )
@@ -59,6 +59,8 @@ if TYPE_CHECKING:
59
59
  MessageUnionTypeDef,
60
60
  PerformanceConfigurationTypeDef,
61
61
  PromptVariableValuesTypeDef,
62
+ ReasoningContentBlockOutputTypeDef,
63
+ ReasoningTextBlockTypeDef,
62
64
  SystemContentBlockTypeDef,
63
65
  ToolChoiceTypeDef,
64
66
  ToolConfigurationTypeDef,
@@ -276,9 +278,10 @@ class BedrockConverseModel(Model):
276
278
  if reasoning_content := item.get('reasoningContent'):
277
279
  reasoning_text = reasoning_content.get('reasoningText')
278
280
  if reasoning_text: # pragma: no branch
279
- thinking_part = ThinkingPart(content=reasoning_text['text'])
280
- if reasoning_signature := reasoning_text.get('signature'):
281
- thinking_part.signature = reasoning_signature
281
+ thinking_part = ThinkingPart(
282
+ content=reasoning_text['text'],
283
+ signature=reasoning_text.get('signature'),
284
+ )
282
285
  items.append(thinking_part)
283
286
  if text := item.get('text'):
284
287
  items.append(TextPart(content=text))
@@ -462,8 +465,19 @@ class BedrockConverseModel(Model):
462
465
  if isinstance(item, TextPart):
463
466
  content.append({'text': item.content})
464
467
  elif isinstance(item, ThinkingPart):
465
- # NOTE: We don't pass the thinking part to Bedrock since it raises an error.
466
- pass
468
+ if BedrockModelProfile.from_profile(self.profile).bedrock_send_back_thinking_parts:
469
+ reasoning_text: ReasoningTextBlockTypeDef = {
470
+ 'text': item.content,
471
+ }
472
+ if item.signature:
473
+ reasoning_text['signature'] = item.signature
474
+ reasoning_content: ReasoningContentBlockOutputTypeDef = {
475
+ 'reasoningText': reasoning_text,
476
+ }
477
+ content.append({'reasoningContent': reasoning_content})
478
+ else:
479
+ # NOTE: We don't pass the thinking part to Bedrock for models other than Claude since it raises an error.
480
+ pass
467
481
  else:
468
482
  assert isinstance(item, ToolCallPart)
469
483
  content.append(self._map_tool_call(item))
@@ -610,7 +624,11 @@ class BedrockStreamedResponse(StreamedResponse):
610
624
  delta = chunk['contentBlockDelta']['delta']
611
625
  if 'reasoningContent' in delta:
612
626
  if text := delta['reasoningContent'].get('text'):
613
- yield self._parts_manager.handle_thinking_delta(vendor_part_id=index, content=text)
627
+ yield self._parts_manager.handle_thinking_delta(
628
+ vendor_part_id=index,
629
+ content=text,
630
+ signature=delta['reasoningContent'].get('signature'),
631
+ )
614
632
  else: # pragma: no cover
615
633
  warnings.warn(
616
634
  f'Only text reasoning content is supported yet, but you got {delta["reasoningContent"]}. '
@@ -7,7 +7,15 @@ from typing import Callable, Union
7
7
  from typing_extensions import Self
8
8
 
9
9
  from ..output import StructuredOutputMode
10
- from ._json_schema import JsonSchemaTransformer
10
+ from ._json_schema import InlineDefsJsonSchemaTransformer, JsonSchemaTransformer
11
+
12
+ __all__ = [
13
+ 'ModelProfile',
14
+ 'ModelProfileSpec',
15
+ 'DEFAULT_PROFILE',
16
+ 'InlineDefsJsonSchemaTransformer',
17
+ 'JsonSchemaTransformer',
18
+ ]
11
19
 
12
20
 
13
21
  @dataclass
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations as _annotations
2
2
 
3
- from . import ModelProfile
4
- from ._json_schema import InlineDefsJsonSchemaTransformer
3
+ from . import InlineDefsJsonSchemaTransformer, ModelProfile
5
4
 
6
5
 
7
6
  def amazon_model_profile(model_name: str) -> ModelProfile | None:
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations as _annotations
2
2
 
3
- from . import ModelProfile
4
- from ._json_schema import InlineDefsJsonSchemaTransformer
3
+ from . import InlineDefsJsonSchemaTransformer, ModelProfile
5
4
 
6
5
 
7
6
  def meta_model_profile(model_name: str) -> ModelProfile | None:
@@ -1,7 +1,6 @@
1
1
  from __future__ import annotations as _annotations
2
2
 
3
- from . import ModelProfile
4
- from ._json_schema import InlineDefsJsonSchemaTransformer
3
+ from . import InlineDefsJsonSchemaTransformer, ModelProfile
5
4
 
6
5
 
7
6
  def qwen_model_profile(model_name: str) -> ModelProfile | None:
@@ -36,6 +36,7 @@ class BedrockModelProfile(ModelProfile):
36
36
 
37
37
  bedrock_supports_tool_choice: bool = True
38
38
  bedrock_tool_result_format: Literal['text', 'json'] = 'text'
39
+ bedrock_send_back_thinking_parts: bool = False
39
40
 
40
41
 
41
42
  class BedrockProvider(Provider[BaseClient]):
@@ -55,9 +56,9 @@ class BedrockProvider(Provider[BaseClient]):
55
56
 
56
57
  def model_profile(self, model_name: str) -> ModelProfile | None:
57
58
  provider_to_profile: dict[str, Callable[[str], ModelProfile | None]] = {
58
- 'anthropic': lambda model_name: BedrockModelProfile(bedrock_supports_tool_choice=False).update(
59
- anthropic_model_profile(model_name)
60
- ),
59
+ 'anthropic': lambda model_name: BedrockModelProfile(
60
+ bedrock_supports_tool_choice=False, bedrock_send_back_thinking_parts=True
61
+ ).update(anthropic_model_profile(model_name)),
61
62
  'mistral': lambda model_name: BedrockModelProfile(bedrock_tool_result_format='json').update(
62
63
  mistral_model_profile(model_name)
63
64
  ),
@@ -69,7 +69,7 @@ google = ["google-genai>=1.28.0"]
69
69
  anthropic = ["anthropic>=0.61.0"]
70
70
  groq = ["groq>=0.19.0"]
71
71
  mistral = ["mistralai>=1.9.2"]
72
- bedrock = ["boto3>=1.37.24"]
72
+ bedrock = ["boto3>=1.39.0"]
73
73
  huggingface = ["huggingface-hub[inference]>=0.33.5"]
74
74
  # Tools
75
75
  duckduckgo = ["ddgs>=9.0.0"]