def tool(
function: Callable[..., Any] | None = None,
*,
name: str | None = None,
description: str | None = None,
schema: FunctionParameters | None = None,
sync_to_thread: bool = True,
middleware: Iterable[ToolMiddleware] = (),
) -> FunctionTool | Callable[[Callable[..., Any]], FunctionTool]:
def make_tool(f: Callable[..., Any]) -> FunctionTool:
call_model = build_model(
f,
sync_to_thread=sync_to_thread,
serialize_result=False,
)
return FunctionTool(
call_model,
name=name or f.__name__,
description=description or f.__doc__ or "",
schema=schema
or get_schema(
call_model,
exclude=(CONTEXT_OPTION_NAME,),
),
middleware=middleware,
)
if function:
return make_tool(function)
return make_tool