Skip to content

Commit 01c550c

Browse files
authored
chore: Fix inconsistent docs example output and fix variable name (#2248)
1 parent 431ec33 commit 01c550c

File tree

2 files changed

+13
-9
lines changed

2 files changed

+13
-9
lines changed

docs/toolsets.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,7 @@ It is is a no-op by default, but enables some useful abilities:
341341
You can subclass `WrapperToolset` to change the wrapped toolset's tool execution behavior by overriding the [`call_tool()`][pydantic_ai.toolsets.AbstractToolset.call_tool] method.
342342

343343
```python {title="logging_toolset.py" requires="function_toolset.py,combined_toolset.py,renamed_toolset.py,prepared_toolset.py"}
344+
import asyncio
344345
from typing_extensions import Any
345346

346347
from prepared_toolset import prepared_toolset
@@ -356,6 +357,8 @@ class LoggingToolset(WrapperToolset):
356357
async def call_tool(self, name: str, tool_args: dict[str, Any], ctx: RunContext, tool: ToolsetTool) -> Any:
357358
LOG.append(f'Calling tool {name!r} with args: {tool_args!r}')
358359
try:
360+
await asyncio.sleep(0.1 * len(LOG)) # (1)!
361+
359362
result = await super().call_tool(name, tool_args, ctx, tool)
360363
LOG.append(f'Finished calling tool {name!r} with result: {result!r}')
361364
except Exception as e:
@@ -367,7 +370,7 @@ class LoggingToolset(WrapperToolset):
367370

368371
logging_toolset = LoggingToolset(prepared_toolset)
369372

370-
agent = Agent(TestModel(), toolsets=[logging_toolset]) # (1)!
373+
agent = Agent(TestModel(), toolsets=[logging_toolset]) # (2)!
371374
result = agent.run_sync('Call all the tools')
372375
print(LOG)
373376
"""
@@ -384,7 +387,8 @@ print(LOG)
384387
"""
385388
```
386389

387-
1. We use [`TestModel`][pydantic_ai.models.test.TestModel] here as it will automatically call each tool.
390+
1. All docs examples are tested in CI and their their output is verified, so we need `LOG` to always have the same order whenever this code is run. Since the tools could finish in any order, we sleep an increasing amount of time based on which number tool call we are to ensure that they finish (and log) in the same order they were called in.
391+
2. We use [`TestModel`][pydantic_ai.models.test.TestModel] here as it will automatically call each tool.
388392

389393
_(This example is complete, it can be run "as is")_
390394

pydantic_ai_slim/pydantic_ai/result.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ class AgentStream(Generic[AgentDepsT, OutputDataT]):
4949
_output_validators: list[OutputValidator[AgentDepsT, OutputDataT]]
5050
_run_ctx: RunContext[AgentDepsT]
5151
_usage_limits: UsageLimits | None
52-
_toolset: ToolManager[AgentDepsT]
52+
_tool_manager: ToolManager[AgentDepsT]
5353

5454
_agent_stream_iterator: AsyncIterator[AgentStreamEvent] | None = field(default=None, init=False)
5555
_final_result_event: FinalResultEvent | None = field(default=None, init=False)
@@ -111,8 +111,8 @@ async def _validate_response(
111111
raise exceptions.UnexpectedModelBehavior( # pragma: no cover
112112
f'Invalid response, unable to find tool call for {output_tool_name!r}'
113113
)
114-
return await self._toolset.handle_call(tool_call, allow_partial=allow_partial)
115-
elif deferred_tool_calls := self._toolset.get_deferred_tool_calls(message.parts):
114+
return await self._tool_manager.handle_call(tool_call, allow_partial=allow_partial)
115+
elif deferred_tool_calls := self._tool_manager.get_deferred_tool_calls(message.parts):
116116
if not self._output_schema.allows_deferred_tool_calls:
117117
raise exceptions.UserError( # pragma: no cover
118118
'A deferred tool call was present, but `DeferredToolCalls` is not among output types. To resolve this, add `DeferredToolCalls` to the list of output types for this agent.'
@@ -154,7 +154,7 @@ def _get_final_result_event(e: _messages.ModelResponseStreamEvent) -> _messages.
154154
): # pragma: no branch
155155
return _messages.FinalResultEvent(tool_name=None, tool_call_id=None)
156156
elif isinstance(new_part, _messages.ToolCallPart) and (
157-
tool_def := self._toolset.get_tool_def(new_part.tool_name)
157+
tool_def := self._tool_manager.get_tool_def(new_part.tool_name)
158158
):
159159
if tool_def.kind == 'output':
160160
return _messages.FinalResultEvent(
@@ -196,7 +196,7 @@ class StreamedRunResult(Generic[AgentDepsT, OutputDataT]):
196196
_output_validators: list[OutputValidator[AgentDepsT, OutputDataT]]
197197
_output_tool_name: str | None
198198
_on_complete: Callable[[], Awaitable[None]]
199-
_toolset: ToolManager[AgentDepsT]
199+
_tool_manager: ToolManager[AgentDepsT]
200200

201201
_initial_run_ctx_usage: Usage = field(init=False)
202202
is_complete: bool = field(default=False, init=False)
@@ -443,8 +443,8 @@ async def validate_structured_output(
443443
raise exceptions.UnexpectedModelBehavior( # pragma: no cover
444444
f'Invalid response, unable to find tool call for {self._output_tool_name!r}'
445445
)
446-
return await self._toolset.handle_call(tool_call, allow_partial=allow_partial)
447-
elif deferred_tool_calls := self._toolset.get_deferred_tool_calls(message.parts):
446+
return await self._tool_manager.handle_call(tool_call, allow_partial=allow_partial)
447+
elif deferred_tool_calls := self._tool_manager.get_deferred_tool_calls(message.parts):
448448
if not self._output_schema.allows_deferred_tool_calls:
449449
raise exceptions.UserError(
450450
'A deferred tool call was present, but `DeferredToolCalls` is not among output types. To resolve this, add `DeferredToolCalls` to the list of output types for this agent.'

0 commit comments

Comments
 (0)