Python: Add documentation for declaration-only tools and middleware ordering (#3774)

* added explanation doctrings

* copilot comments
This commit is contained in:
Giles Odigwe
2026-02-10 12:14:28 -08:00
committed by GitHub
Unverified
parent 84cb09cb68
commit 32ba81e990
2 changed files with 52 additions and 6 deletions
+32 -5
View File
@@ -640,16 +640,25 @@ class FunctionTool(BaseTool, Generic[ArgsT, ReturnT]):
name: The name of the function.
description: A description of the function.
approval_mode: Whether or not approval is required to run this tool.
Default is that approval is required.
Default is that approval is NOT required (``"never_require"``).
max_invocations: The maximum number of times this function can be invoked.
If None, there is no limit. Should be at least 1.
max_invocation_exceptions: The maximum number of exceptions allowed during invocations.
If None, there is no limit. Should be at least 1.
additional_properties: Additional properties to set on the function.
func: The function to wrap.
func: The function to wrap. When ``None``, creates a declaration-only tool
that has no implementation. Declaration-only tools are useful when you want
the agent to reason about tool usage without executing them, or when the
actual implementation exists elsewhere (e.g., client-side rendering).
input_model: The Pydantic model that defines the input parameters for the function.
This can also be a JSON schema dictionary.
If not provided, it will be inferred from the function signature.
If not provided and ``func`` is not ``None``, it will be inferred from
the function signature. When ``func`` is ``None`` and ``input_model`` is
not provided, the tool will use an empty input model (no parameters) in
its JSON schema. For declaration-only tools that should declare
parameters, explicitly provide ``input_model`` (either a Pydantic
``BaseModel`` or a JSON schema dictionary) so the model can reason about
the expected arguments.
**kwargs: Additional keyword arguments.
"""
super().__init__(
@@ -1286,7 +1295,11 @@ def tool(
to bypass automatic inference from the function signature.
Args:
func: The function to decorate.
func: The function to decorate. This parameter enables the decorator to be used
both with and without parentheses: ``@tool`` directly decorates the function,
while ``@tool()`` or ``@tool(name="custom")`` returns a decorator. For
declaration-only tools (no implementation), use :class:`FunctionTool` directly
with ``func=None``—see the example below.
Keyword Args:
name: The name of the function. If not provided, the function's ``__name__``
@@ -1301,7 +1314,7 @@ def tool(
When provided, the schema is used instead of inferring one from the
function's signature. Defaults to ``None`` (infer from signature).
approval_mode: Whether or not approval is required to run this tool.
Default is that approval is required.
Default is that approval is NOT required (``"never_require"``).
max_invocations: The maximum number of times this function can be invoked.
If None, there is no limit, should be at least 1.
max_invocation_exceptions: The maximum number of exceptions allowed during invocations.
@@ -1369,6 +1382,20 @@ def tool(
'''Get weather for a location.'''
return f"Weather in {location}: 22 {unit}"
# Declaration-only tool (no implementation)
# Use FunctionTool directly when you need a tool declaration without
# an executable function. The agent can request this tool, but it won't
# be executed automatically. Useful for testing agent reasoning or when
# the implementation is handled externally (e.g., client-side rendering).
from agent_framework import FunctionTool
declaration_only_tool = FunctionTool(
name="get_current_time",
description="Get the current time in ISO 8601 format.",
func=None, # Explicitly no implementation - makes declaration_only=True
)
"""
def decorator(func: Callable[..., ReturnT | Awaitable[ReturnT]]) -> FunctionTool[Any, ReturnT]: