{"record":{"id":"10d1b4933aac5479","repo":"OpenBMB/ChatDev","slug":"tool-name-spec-name-conflicts-with-a-built-in","errorCode":null,"errorMessage":"Tool name '{spec.name}' conflicts with a built-in skill tool","messagePattern":"Tool name '(.+?)' conflicts with a built-in skill tool","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"runtime/node/executor/agent_executor.py","lineNumber":304,"sourceCode":"                )\n\n        if not parts:\n            return None\n        return \"\\n\\n\".join(part for part in parts if part)\n\n    def _merge_skill_tool_specs(\n        self,\n        tool_specs: List[ToolSpec],\n        skill_manager: AgentSkillManager | None,\n    ) -> List[ToolSpec]:\n        if skill_manager is None:\n            return tool_specs\n\n        merged = list(tool_specs)\n        existing_names = {spec.name for spec in merged}\n        for spec in skill_manager.build_tool_specs():\n            if spec.name in existing_names:\n                raise ValueError(f\"Tool name '{spec.name}' conflicts with a built-in skill tool\")\n            existing_names.add(spec.name)\n            merged.append(spec)\n        return merged\n\n    def _build_agent_invoker(\n        self,\n        provider: ModelProvider,\n        client: Any,\n        base_call_options: Dict[str, Any],\n        default_tool_specs: List[ToolSpec],\n        node: Node,\n    ) -> Callable[[List[Message]], Message]:\n        \"\"\"Create a callable that other components can use to invoke the model.\"\"\"\n\n        def invoke(\n            conversation: List[Message],\n            *,\n            tools: Optional[List[ToolSpec]] = None,","sourceCodeStart":286,"sourceCodeEnd":322,"githubUrl":"https://github.com/OpenBMB/ChatDev/blob/4fb2db0ea90375ce1059f44fe03ffbd191a7a169/runtime/node/executor/agent_executor.py#L286-L322","documentation":"Raised when merging skill tool specs into the agent's tool list: a skill-provided tool has the same name as one of the built-in/baseline tools already present. The executor refuses duplicate tool names because the model would have ambiguous tool targets.","triggerScenarios":"Calling the agent executor with tool_specs containing a tool named 'activate_skill' or 'read_skill_file' (or any name AgentSkillManager.build_tool_specs() also returns) while Agent Skills are enabled for the node.","commonSituations":"Custom tool list built by a user that happens to include a tool named like a skill tool; upgrading to a runtime version that newly enables Agent Skills; copy-pasting tool names from skill docs into your own tool registry.","solutions":["Rename your custom tool so it does not collide with names returned by AgentSkillManager.build_tool_specs() (e.g. 'activate_skill', 'read_skill_file')","Filter your tool_specs against skill_manager.build_tool_specs() names before passing them in","Disable Agent Skills for the node if you intend to provide your own tools with those names"],"exampleFix":"# before\ntools = [{\"name\": \"activate_skill\", ...}]  # collides\n\n# after\ntools = [{\"name\": \"my_activate_skill\", ...}]","handlingStrategy":"validation","validationCode":"skill_names = {s.name for s in skill_manager.build_tool_specs()}\nassert not ({t['name'] for t in tool_specs} & skill_names), 'name collision'","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Namespace custom tool names with a prefix","Assert tool-name uniqueness against skill specs before executing the node"],"tags":["tools","skills","name-conflict","agent-executor"],"backgroundTag":"duplicate-name-conflict","analyzedSha":"4fb2db0ea90375ce1059f44fe03ffbd191a7a169","analyzedAt":"2026-08-27T14:35:29.622Z","schemaVersion":2},"datasetVersion":"2026-08-27T19:17:21.184Z"}