{"record":{"id":"fcca7e88eaded4e6","repo":"microsoft/autogen","slug":"unsupported-tool-type-type-tool-fcca7e","errorCode":null,"errorMessage":"Unsupported tool type: {type(tool)}","messagePattern":"Unsupported tool type: (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/packages/autogen-ext/src/autogen_ext/agents/openai/_openai_assistant_agent.py","lineNumber":288,"sourceCode":"        for tool in tools:\n            if isinstance(tool, str):\n                if tool == \"code_interpreter\":\n                    converted_tools.append(CodeInterpreterToolParam(type=\"code_interpreter\"))\n                elif tool == \"file_search\":\n                    converted_tools.append(FileSearchToolParam(type=\"file_search\"))\n            elif isinstance(tool, Tool):\n                self._original_tools.append(tool)\n                converted_tools.append(_convert_tool_to_function_param(tool))\n            elif callable(tool):\n                if hasattr(tool, \"__doc__\") and tool.__doc__ is not None:\n                    description = tool.__doc__\n                else:\n                    description = \"\"\n                function_tool = FunctionTool(tool, description=description)\n                self._original_tools.append(function_tool)\n                converted_tools.append(_convert_tool_to_function_param(function_tool))\n            else:\n                raise ValueError(f\"Unsupported tool type: {type(tool)}\")\n\n        self._client = client\n        self._assistant: Optional[\"Assistant\"] = None\n        self._thread: Optional[\"Thread\"] = None\n        self._init_thread_id = thread_id\n        self._model = model\n        self._instructions = instructions\n        self._api_tools = converted_tools\n        self._assistant_id = assistant_id\n        self._metadata = metadata\n        self._response_format = response_format\n        self._temperature = temperature\n        self._tool_resources = tool_resources\n        self._top_p = top_p\n        self._vector_store_id: Optional[str] = None\n        self._uploaded_file_ids: List[str] = []\n\n        # Variables to track initial state","sourceCodeStart":270,"sourceCodeEnd":306,"githubUrl":"https://github.com/microsoft/autogen/blob/027ecf0a379bcc1d09956d46d12d44a3ad9cee14/python/packages/autogen-ext/src/autogen_ext/agents/openai/_openai_assistant_agent.py#L270-L306","documentation":"OpenAIAssistantAgent's constructor accepts three tool shapes: strings (tool names), autogen Tool instances, and plain callables (auto-wrapped into FunctionTool using __doc__ as description). Its else branch raises ValueError for anything else. Unlike OpenAIAgent (error 642), dicts are NOT accepted here — tool configuration is Tool/callable based.","triggerScenarios":"Passing tools=[{\"type\": \"code_interpreter\", \"container\": ...}] (Responses-API dicts — accepted by OpenAIAgent but not here); passing an arbitrary object, a class (not an instance), or None.","commonSituations":"Porting a tools list between OpenAIAgent and OpenAIAssistantAgent without adapting the shape; passing OpenAI SDK dict payloads; passing a Tool subclass class object instead of an instantiated Tool.","solutions":["Use Tool instances: tools=[FunctionTool(my_func, description=\"...\")].","Use plain callables with useful __doc__ strings: tools=[get_weather] — they are wrapped into FunctionTool automatically.","Use strings only for named built-ins the Assistants API supports.","If you need OpenAI dict-configured built-in tools (code_interpreter, file_search), construct OpenAIAssistantAgent with those via the documented tool-resource options or switch to OpenAIAgent which accepts tool dicts."],"exampleFix":"# before\nagent = OpenAIAssistantAgent(\n    name=\"a\", instructions=\"...\", model=\"gpt-4o\", client=async_client,\n    tools=[{\"type\": \"file_search\", \"vector_store_ids\": [\"vs_1\"]}],\n)\n\n# after\nfrom autogen_core.tools import FunctionTool\nagent = OpenAIAssistantAgent(\n    name=\"a\", instructions=\"...\", model=\"gpt-4o\", client=async_client,\n    tools=[FunctionTool(get_weather, description=\"Get weather for a city\")],\n)","handlingStrategy":"type-guard","validationCode":"from autogen_core.tools import Tool\nfrom typing import Callable\n\ndef is_assistant_tool(t: object) -> bool:\n    return isinstance(t, (str, Tool)) or callable(t)","typeGuard":"from autogen_core.tools import Tool\n\ndef is_assistant_tool(t: object) -> bool:\n    return isinstance(t, str) or isinstance(t, Tool) or callable(t)","tryCatchPattern":null,"preventionTips":["Assistant agent tools: str | Tool | callable — never dicts.","Give callables a __doc__; it becomes the tool description.","Instantiate Tool subclasses — passing the class itself is not callable in the right way."],"tags":["openai","assistants-api","tools","validation"],"backgroundTag":null,"analyzedSha":"027ecf0a379bcc1d09956d46d12d44a3ad9cee14","analyzedAt":"2026-08-15T03:38:00.719Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}