agentscope-ai/agentscope · error · ValueError

Invalid input_schema: {self.tool.input_schema}.

Error message

Invalid input_schema: {self.tool.input_schema}. 

What it means

ToolMetadata's __post_init__ validates that a tool's input_schema, if provided, is a JSON-Schema object of type 'object' with a dict 'properties' entry — the shape OpenAI-style function-calling APIs require. Anything else (missing 'type', non-dict, wrong type value) is rejected.

Source

Thrown at src/agentscope/tool/_types.py:52

    """The base model used to extend the JSON schema of the original tool
    function, so that we can dynamically adjust the tool function."""

    # Tools management fields
    group: str | Literal["basic"] = "basic"
    """The belonging group of the tool function"""
    original_name: str | None = field(default=None)
    """The original name of the tool function when it has been renamed."""

    def __post_init__(self) -> None:
        """Validate the registered tool function after initialization."""
        # validate schema
        if self.tool.input_schema is not None:
            if not (
                isinstance(self.tool.input_schema, dict)
                and self.tool.input_schema.get("type") == "object"
                and isinstance(self.tool.input_schema.get("properties"), dict)
            ):
                raise ValueError(
                    f"Invalid input_schema: {self.tool.input_schema}. ",
                )

    def get_tool_schema(
        self,
        extended_model: Type[BaseModel] | None = None,
    ) -> dict:
        """Get the JSON schema of the tool function via the following steps:

        1. Remove preset_kwargs from the JSON schema, since they are not
        exposed to the agent.
        2. If extended_model is provided, merge its schema with the
        current function schema.

        Args:
            extended_model (`Type[BaseModel] | None`, optional):
                The dynamic BaseModel used to extend the original function. If
                provided, the given BaseModel will be merged into the original

View on GitHub (pinned to e90f1c7592)

Solutions

  1. Make the schema a dict literal like {'type': 'object', 'properties': {...}}
  2. If generating from pydantic, use Model.model_json_schema() and ensure the top level is an object schema (it normally is)
  3. Pass None instead of {} if the tool takes no arguments

Example fix

# before
tool = Tool(name='t', input_schema='{"type": "object"}')  # string, not dict
# after
tool = Tool(name='t', input_schema={'type': 'object', 'properties': {'x': {'type': 'string'}}})
Defensive patterns

Strategy: validation

Validate before calling

def is_valid_tool_schema(s) -> bool:
    return s is None or (isinstance(s, dict) and s.get('type') == 'object' and isinstance(s.get('properties'), dict))

assert is_valid_tool_schema(schema)

Type guard

def is_valid_tool_schema(s) -> bool:
    return s is None or (isinstance(s, dict) and s.get('type') == 'object' and isinstance(s.get('properties'), dict))

Prevention

When it happens

Trigger: Setting tool input_schema to a non-dict, a schema without {'type': 'object'}, or where 'properties' is not a dict — e.g. passing a pydantic model's model_json_schema() result whose top level is not an object schema, or a list/JSON string.

Common situations: Hand-writing schemas and omitting 'type': 'object'; passing a JSON string instead of a parsed dict; wrapping the schema in {'parameters': ...} or {'schema': ...} by mistake; schema versions that emit 'properties' differently.

Understand the failure class

Background: Schema validation failed / invalid input schema: payload rejected because its shape doesn't match the expected schema — this error's family across 28 libraries.

Related errors


AI-assisted analysis of agentscope-ai/agentscope@e90f1c7592 (2026-08-28). Data as JSON: /api/errors/97bee79ae3579114. Report an issue: GitHub.