Skip to content

PydanticInvalidForJsonSchema error is raised when trying to get args for a tool that has a tool runtime parameter #34581

@MElkady

Description

@MElkady

Checked other resources

  • This is a bug, not a usage question.
  • I added a clear and descriptive title that summarizes this issue.
  • I used the GitHub search to find a similar question and didn't find it.
  • I am sure that this is a bug in LangChain rather than my code.
  • The bug is not resolved by updating to the latest stable version of LangChain (or the specific integration package).
  • This is not related to the langchain-community package.
  • I posted a self-contained, minimal, reproducible example. A maintainer can copy it and run it AS IS.

Package (Required)

  • langchain
  • langchain-openai
  • langchain-anthropic
  • langchain-classic
  • langchain-core
  • langchain-cli
  • langchain-model-profiles
  • langchain-tests
  • langchain-text-splitters
  • langchain-chroma
  • langchain-deepseek
  • langchain-exa
  • langchain-fireworks
  • langchain-groq
  • langchain-huggingface
  • langchain-mistralai
  • langchain-nomic
  • langchain-ollama
  • langchain-perplexity
  • langchain-prompty
  • langchain-qdrant
  • langchain-xai
  • Other / not sure / general

Example Code (Python)

from dataclasses import dataclass

from langchain.tools import ToolRuntime, tool


@dataclass
class ExampleToolContext:
    user_id: str
    session_id: str


@tool
async def example_tool(query: str, runtime: ToolRuntime[ExampleToolContext]) -> str:
    """
    This is an example tool that processes a query.

    Args:
        query (str): The query to process.
    """
    print(f"Query: {query}")
    print(f"User ID: {runtime.context.user_id}")
    return "This is an example tool."


if __name__ == "__main__":
    x = example_tool.args
    print(x)

Error Message and Stack Trace (if applicable)

Traceback (most recent call last):
  File "/Codes/langchain_tool_issue/main.py", line 26, in <module>
    x = example_tool.args
        ^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/langchain_core/tools/base.py", line 570, in args
    json_schema = input_schema.model_json_schema()
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/pydantic/main.py", line 576, in model_json_schema
    return model_json_schema(
           ^^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/pydantic/json_schema.py", line 2548, in model_json_schema
    return schema_generator_instance.generate(cls.__pydantic_core_schema__, mode=mode)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/pydantic/json_schema.py", line 415, in generate
    json_schema: JsonSchemaValue = self.generate_inner(schema)
                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/pydantic/json_schema.py", line 578, in generate_inner
    json_schema = current_handler(schema)
                  ^^^^^^^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/pydantic/_internal/_schema_generation_shared.py", line 37, in __call__
    return self.handler(core_schema)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/pydantic/json_schema.py", line 556, in new_handler_func
    json_schema = js_modify_function(schema_or_field, current_handler)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/pydantic/main.py", line 852, in __get_pydantic_json_schema__
    return handler(core_schema)
           ^^^^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/pydantic/_internal/_schema_generation_shared.py", line 37, in __call__
    return self.handler(core_schema)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/pydantic/json_schema.py", line 511, in handler_func
    json_schema = generate_for_schema_type(schema_or_field)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/pydantic/json_schema.py", line 1604, in model_schema
    json_schema = self.generate_inner(schema['schema'])
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/pydantic/json_schema.py", line 578, in generate_inner
    json_schema = current_handler(schema)
                  ^^^^^^^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/pydantic/_internal/_schema_generation_shared.py", line 37, in __call__
    return self.handler(core_schema)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/pydantic/json_schema.py", line 511, in handler_func
    json_schema = generate_for_schema_type(schema_or_field)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/pydantic/json_schema.py", line 1717, in model_fields_schema
    json_schema = self._named_required_fields_schema(named_required_fields)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/pydantic/json_schema.py", line 1508, in _named_required_fields_schema
    field_json_schema = self.generate_inner(field).copy()
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/pydantic/json_schema.py", line 578, in generate_inner
    json_schema = current_handler(schema)
                  ^^^^^^^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/pydantic/_internal/_schema_generation_shared.py", line 37, in __call__
    return self.handler(core_schema)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/pydantic/json_schema.py", line 511, in handler_func
    json_schema = generate_for_schema_type(schema_or_field)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/pydantic/json_schema.py", line 1576, in model_field_schema
    return self.generate_inner(schema['schema'])
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/pydantic/json_schema.py", line 578, in generate_inner
    json_schema = current_handler(schema)
                  ^^^^^^^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/pydantic/_internal/_schema_generation_shared.py", line 37, in __call__
    return self.handler(core_schema)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/pydantic/json_schema.py", line 511, in handler_func
    json_schema = generate_for_schema_type(schema_or_field)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/pydantic/json_schema.py", line 1806, in dataclass_schema
    json_schema = self.generate_inner(schema['schema']).copy()
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/pydantic/json_schema.py", line 578, in generate_inner
    json_schema = current_handler(schema)
                  ^^^^^^^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/pydantic/_internal/_schema_generation_shared.py", line 37, in __call__
    return self.handler(core_schema)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/pydantic/json_schema.py", line 511, in handler_func
    json_schema = generate_for_schema_type(schema_or_field)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/pydantic/json_schema.py", line 1789, in dataclass_args_schema
    return self._named_required_fields_schema(named_required_fields)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/pydantic/json_schema.py", line 1508, in _named_required_fields_schema
    field_json_schema = self.generate_inner(field).copy()
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/pydantic/json_schema.py", line 578, in generate_inner
    json_schema = current_handler(schema)
                  ^^^^^^^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/pydantic/_internal/_schema_generation_shared.py", line 37, in __call__
    return self.handler(core_schema)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/pydantic/json_schema.py", line 511, in handler_func
    json_schema = generate_for_schema_type(schema_or_field)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/pydantic/json_schema.py", line 1565, in dataclass_field_schema
    return self.generate_inner(schema['schema'])
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/pydantic/json_schema.py", line 578, in generate_inner
    json_schema = current_handler(schema)
                  ^^^^^^^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/pydantic/_internal/_schema_generation_shared.py", line 37, in __call__
    return self.handler(core_schema)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/pydantic/json_schema.py", line 511, in handler_func
    json_schema = generate_for_schema_type(schema_or_field)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/pydantic/json_schema.py", line 948, in callable_schema
    return self.handle_invalid_for_json_schema(schema, 'core_schema.CallableSchema')
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Codes/langchain_tool_issue/.venv/lib/python3.12/site-packages/pydantic/json_schema.py", line 2442, in handle_invalid_for_json_schema
    raise PydanticInvalidForJsonSchema(f'Cannot generate a JsonSchema for {error_info}')
pydantic.errors.PydanticInvalidForJsonSchema: Cannot generate a JsonSchema for core_schema.CallableSchema

For further information visit https://errors.pydantic.dev/2.12/u/invalid-for-json-schema

Description

When a tool have a ToolRuntime as a parameter, calling args on that tool throws an exception

System Info

System Information

OS: Darwin
OS Version: Darwin Kernel Version 25.1.0: Mon Oct 20 19:32:41 PDT 2025; root:xnu-12377.41.6~2/RELEASE_ARM64_T6000
Python Version: 3.12.11 (main, Sep 15 2025, 09:16:09) [Clang 17.0.0 (clang-1700.0.13.5)]

Package Information

langchain_core: 1.2.5
langchain: 1.2.0
langsmith: 0.5.2
langgraph_sdk: 0.3.1

Optional packages not installed

langserve

Other Dependencies

httpx: 0.28.1
jsonpatch: 1.33
langgraph: 1.0.5
orjson: 3.11.5
packaging: 25.0
pydantic: 2.12.5
pyyaml: 6.0.3
requests: 2.32.5
requests-toolbelt: 1.0.0
tenacity: 9.1.2
typing-extensions: 4.15.0
uuid-utils: 0.12.0
zstandard: 0.25.0

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugRelated to a bug, vulnerability, unexpected error with an existing featurelangchain`langchain` package issues & PRs

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions