{"record":{"id":"6aab1227ab327d21","repo":"microsoft/semantic-kernel","slug":"payload-can-t-be-built-dynamically-due-to-the-miss","errorCode":null,"errorMessage":"Payload can't be built dynamically due to the missing payload metadata.","messagePattern":"Payload can't be built dynamically due to the missing payload metadata\\.","errorType":"exception","errorClass":"FunctionExecutionException","httpStatus":null,"severity":"error","filePath":"python/semantic_kernel/connectors/openapi_plugin/openapi_runner.py","lineNumber":73,"sourceCode":"\n    def build_full_url(self, base_url, query_string):\n        \"\"\"Build the full URL.\"\"\"\n        url_parts = list(urlparse(base_url))\n        url_parts[4] = query_string\n        return urlunparse(url_parts)\n\n    def build_operation_url(\n        self, operation: RestApiOperation, arguments: KernelArguments, server_url_override=None, api_host_url=None\n    ):\n        \"\"\"Build the operation URL.\"\"\"\n        url = operation.build_operation_url(arguments, server_url_override, api_host_url)\n        return self.build_full_url(url, operation.build_query_string(arguments))\n\n    def build_json_payload(self, payload_metadata: RestApiPayload, arguments: dict[str, Any]) -> tuple[str, str]:\n        \"\"\"Build the JSON payload.\"\"\"\n        if self.enable_dynamic_payload:\n            if payload_metadata is None:\n                raise FunctionExecutionException(\n                    \"Payload can't be built dynamically due to the missing payload metadata.\"\n                )\n\n            payload = self.build_json_object(payload_metadata.properties, arguments)\n            content = json.dumps(payload)\n            return content, payload_metadata.media_type\n\n        argument = arguments.get(self.payload_argument_name)\n        if not isinstance(argument, str):\n            raise FunctionExecutionException(f\"No payload is provided by the argument '{self.payload_argument_name}'.\")\n\n        return argument, argument\n\n    def build_json_object(self, properties, arguments, property_namespace=None):\n        \"\"\"Build the JSON payload object.\"\"\"\n        result = {}\n\n        for property_metadata in properties:","sourceCodeStart":55,"sourceCodeEnd":91,"githubUrl":"https://github.com/microsoft/semantic-kernel/blob/c028a0c7dc4f0814cdcbaba9d998f187a41197bf/python/semantic_kernel/connectors/openapi_plugin/openapi_runner.py#L55-L91","documentation":"`OpenApiRunner.build_json_payload` builds a JSON body dynamically only when `enable_dynamic_payload` is True. In that mode it requires non-null `payload_metadata`; if the operation has no payload metadata (e.g. the request body could not be parsed into a `RestApiPayload`), it raises `FunctionExecutionException`.","triggerScenarios":"Calling an operation that has a request body with `enable_dynamic_payload=True`, but the parser could not build `RestApiPayload` metadata for it (often because the media type was unsupported — see 1492 — so payload metadata is `None`).","commonSituations":"Enabling dynamic payload building globally but invoking an operation whose body uses an unsupported media type; mixing JSON and XML endpoints under one plugin with dynamic payload on; operations whose request body was skipped during parsing.","solutions":["Disable `enable_dynamic_payload` for that operation and pass the raw body string via `payload_argument_name`.","Fix the spec so the operation's request body has a supported media type (so payload metadata is built).","Exclude the operation from registration if it cannot conform.","Confirm the operation actually has a request body in the parsed metadata before invoking with dynamic payload."],"exampleFix":"# before\nrunner = OpenApiRunner(parsed_openapi_document=spec, enable_dynamic_payload=True)\nawait runner.run_operation(op_without_payload_metadata, args, options)  # raises 1496\n\n# after\nrunner = OpenApiRunner(parsed_openapi_document=spec, enable_dynamic_payload=False)\nargs[runner.payload_argument_name] = json.dumps({\"a\": 1})\nawait runner.run_operation(op, args, options)","handlingStrategy":"type-guard","validationCode":"def can_build_dynamically(runner, operation) -> bool:\n    return bool(runner.enable_dynamic_payload and operation.payload is not None)\n\n# before invoking with dynamic payload\nassert can_build_dynamically(runner, op), (\n    f\"{op.id} has no payload metadata; disable dynamic payload or pass a body string\"\n)","typeGuard":"def has_payload_metadata(operation) -> bool:\n    return getattr(operation, \"payload\", None) is not None","tryCatchPattern":"from semantic_kernel.exceptions import FunctionExecutionException\n\ntry:\n    await runner.run_operation(op, args, options)\nexcept FunctionExecutionException as e:\n    if \"missing payload metadata\" in str(e):\n        # fall back to passing a raw body string\n        args[runner.payload_argument_name] = json.dumps(body_dict)\n        await runner.run_operation(op, args, options)\n    else:\n        raise","preventionTips":["Check `operation.payload` is not None before dynamic invocation.","Ensure spec request bodies use supported media types.","Provide a non-dynamic fallback path for unsupported bodies.","Exclude operations with unparsable bodies from registration."],"tags":["openapi-plugin","payload","runtime","semantic-kernel"],"backgroundTag":null,"analyzedSha":"c028a0c7dc4f0814cdcbaba9d998f187a41197bf","analyzedAt":"2026-08-13T13:48:05.040Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}