{"record":{"id":"26bbf2353d97ca58","repo":"BerriAI/litellm","slug":"tool-function-must-be-a-dictionary","errorCode":null,"errorMessage":"Tool `function` must be a dictionary","messagePattern":"Tool `function` must be a dictionary","errorType":"validation","errorClass":"OCIError","httpStatus":400,"severity":"error","filePath":"litellm/llms/oci/chat/generic.py","lineNumber":226,"sourceCode":"\n# ---------------------------------------------------------------------------\n# Tool definition adaptation\n# ---------------------------------------------------------------------------\n\n\ndef adapt_tool_definition_to_oci_standard(tools: list[dict], vendor: OCIVendors) -> list[OCIToolDefinition]:\n    \"\"\"Convert OpenAI-format tool definitions to OCI GENERIC format.\n\n    Resolves ``$ref``/``$defs`` and ``anyOf`` that the OCI endpoint rejects.\n    \"\"\"\n    new_tools: Final = []\n    for tool in tools:\n        if tool[\"type\"] != \"function\":\n            raise OCIError(status_code=400, message=\"OCI only supports function tools\")\n\n        tool_function = tool.get(\"function\")\n        if not isinstance(tool_function, dict):\n            raise OCIError(status_code=400, message=\"Tool `function` must be a dictionary\")\n\n        raw_params = tool_function.get(\"parameters\", {})\n        resolved_params = sanitize_oci_schema(resolve_oci_schema_anyof(resolve_oci_schema_refs(raw_params)))\n\n        new_tools.append(\n            OCIToolDefinition(\n                type=\"FUNCTION\",\n                name=tool_function.get(\"name\"),\n                description=tool_function.get(\"description\", \"\"),\n                parameters=resolved_params,\n            )\n        )\n\n    return new_tools\n\n\ndef _normalize_oci_finish_reason(raw: str | None) -> str | None:\n    \"\"\"Map an OCI-specific finish reason to its OpenAI-standard equivalent.","sourceCodeStart":208,"sourceCodeEnd":244,"githubUrl":"https://github.com/BerriAI/litellm/blob/6c2dcb801bf2b75c18f1bb24140e7cf57465cc4d/litellm/llms/oci/chat/generic.py#L208-L244","documentation":"Error \"Tool `function` must be a dictionary\" thrown in BerriAI/litellm.","triggerScenarios":"Thrown at litellm/llms/oci/chat/generic.py:226 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Pass tool 'function' as a dictionary."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"6c2dcb801bf2b75c18f1bb24140e7cf57465cc4d","analyzedAt":"2026-08-15T07:12:03.035Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}