diff --git a/pydantic_ai_slim/pydantic_ai/_pydantic.py b/pydantic_ai_slim/pydantic_ai/_pydantic.py index 8f5f0ee73..f43935746 100644 --- a/pydantic_ai_slim/pydantic_ai/_pydantic.py +++ b/pydantic_ai_slim/pydantic_ai/_pydantic.py @@ -76,8 +76,15 @@ def function_schema( # noqa: C901 description, field_descriptions = doc_descriptions(function, sig, docstring_format=docstring_format) if require_parameter_descriptions: - if len(field_descriptions) != len(sig.parameters): + if takes_ctx: + parameters_without_ctx = set( + name for name in sig.parameters if not _is_call_ctx(sig.parameters[name].annotation) + ) + missing_params = parameters_without_ctx - set(field_descriptions) + else: missing_params = set(sig.parameters) - set(field_descriptions) + + if missing_params: errors.append(f'Missing parameter descriptions for {", ".join(missing_params)}') for index, (name, p) in enumerate(sig.parameters.items()): diff --git a/tests/test_tools.py b/tests/test_tools.py index 887274a83..2ea7e4e5b 100644 --- a/tests/test_tools.py +++ b/tests/test_tools.py @@ -785,6 +785,20 @@ def test_enforce_parameter_descriptions() -> None: assert all(err_part in error_reason for err_part in error_parts) +def test_enforce_parameter_descriptions_noraise() -> None: + async def complete_parameter_descriptions_docstring(ctx: RunContext, foo: int) -> str: # pragma: no cover + """Describes function ops, but missing ctx description and contains non-existent parameter description. + + :param foo: The foo thing. + :param bar: The bar thing. + """ + return f'{foo}' + + agent = Agent(FunctionModel(get_json_schema)) + + agent.tool(require_parameter_descriptions=True)(complete_parameter_descriptions_docstring) + + def test_json_schema_required_parameters(set_event_loop: None): agent = Agent(FunctionModel(get_json_schema))