{"record":{"id":"87e18417b2f19b4f","repo":"ComposioHQ/composio","slug":"schema-is-unsatisfiable-json-schema-false","errorCode":null,"errorMessage":"schema is unsatisfiable (JSON Schema `false`)","messagePattern":"schema is unsatisfiable \\(JSON Schema `false`\\)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/composio/utils/schema_converter.py","lineNumber":52,"sourceCode":"from pydantic import (\n    create_model as create_pydantic_model,\n)\nfrom pydantic_core import core_schema\n\nfrom composio.utils.logging import get as get_logger\n\nlogger = get_logger(__name__)\n\n_MISSING = object()\n_EXPLICIT_DEFAULT_FIELDS_ATTRIBUTE = \"__composio_explicit_default_fields__\"\n\n\nclass _UnsatisfiableSchema:\n    \"\"\"Pydantic type for JSON schemas that reject every value.\"\"\"\n\n    @staticmethod\n    def _reject(_value: t.Any) -> t.NoReturn:\n        raise ValueError(\"schema is unsatisfiable (JSON Schema `false`)\")\n\n    @classmethod\n    def __get_pydantic_core_schema__(\n        cls,\n        _source_type: t.Any,\n        _handler: t.Any,\n    ) -> core_schema.CoreSchema:\n        return core_schema.no_info_plain_validator_function(cls._reject)\n\n    @classmethod\n    def __get_pydantic_json_schema__(\n        cls,\n        _core_schema: core_schema.CoreSchema,\n        _handler: t.Any,\n    ) -> t.Dict[str, t.Any]:\n        return {\"not\": {}}\n\n","sourceCodeStart":34,"sourceCodeEnd":70,"githubUrl":"https://github.com/ComposioHQ/composio/blob/64b1b85502b1beeb2379e6c9e8bf1104504fa637/python/composio/utils/schema_converter.py#L34-L70","documentation":"Raised when a JSON Schema contains the boolean schema `false` (which accepts no value at all) and something then attempts to validate a value against the converted Pydantic model. schema_converter.py models `false` with a _UnsatisfiableSchema Pydantic type whose validator always raises ValueError, so any validated input fails. It usually indicates the upstream tool/action schema was authored incorrectly or transformed into `false` during conversion.","triggerScenarios":"Calling .validate(value) (or Pydantic validation) on a converted model whose schema (or a subschema reached via $ref/anyOf items) is literally boolean false. Happens when a tool definition contains \"type\": false, an unreachable anyOf/oneOf branch collapsed to false, or a properties entry set to false.","commonSituations":"Backend-generated tool schemas with a `false` placeholder for disabled parameters; hand-written OpenAPI specs using bare `false` for \"no value allowed\"; schema transformations that reduce impossible constraints to false; version drift after a generated client bump introducing false schemas.","solutions":["Inspect the tool's input schema (print the raw schema from the API) and locate the boolean `false` node — fix or remove it at the source (tool definition or OpenAPI spec)","If the false schema is nested via $ref, fix the referenced definition so it is a real object schema","Guard model construction: skip tools whose converted model is _UnsatisfiableSchema instead of validating inputs","Report/regenerate the tool schema if it comes from Composio's backend (generated client pin may need a bump)"],"exampleFix":"// before (schema fragment)\n{\"properties\": {\"disabled_opt\": false}}\n// after\n{\"properties\": {\"disabled_opt\": {\"type\": \"string\"}}}","handlingStrategy":"validation","validationCode":"def is_satisfiable(schema) -> bool:\n    if schema is False:\n        return False\n    if isinstance(schema, dict):\n        return all(is_satisfiable(v) for v in schema.values())\n    if isinstance(schema, list):\n        return all(is_satisfiable(i) for i in schema)\n    return True\nassert is_satisfiable(tool_input_schema)","typeGuard":"from composio.utils.schema_converter import _UnsatisfiableSchema\n\ndef is_unsatisfiable_model(model) -> bool:\n    return model is _UnsatisfiableSchema","tryCatchPattern":"try:\n    model.validate(args)\nexcept ValueError as e:\n    if \"unsatisfiable\" in str(e):\n        skip_tool(tool)  # schema bug, not caller error","preventionTips":["Sanitize incoming tool schemas for boolean `false` nodes before conversion","Skip and report tools whose converted model is the unsatisfiable type","Pin generated client versions after verifying schemas convert cleanly"],"tags":["json-schema","pydantic","schema-conversion","validation"],"backgroundTag":"json-schema-validation-failed","analyzedSha":"64b1b85502b1beeb2379e6c9e8bf1104504fa637","analyzedAt":"2026-08-28T15:39:33.623Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}