{"record":{"id":"7e65c32fc839bed2","repo":"agentscope-ai/agentscope","slug":"the-basic-tool-group-is-reserved-for-the-default","errorCode":null,"errorMessage":"The 'basic' tool group is reserved for the default tool group. Don't include 'basic' in the tool_groups argument when you also provide tools, skills or mcps in the constructor.","messagePattern":"The 'basic' tool group is reserved for the default tool group\\. Don't include 'basic' in the tool_groups argument when you also provide tools, skills or mcps in the constructor\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"src/agentscope/tool/_toolkit.py","lineNumber":120,"sourceCode":"                The tool objects that belong to the \"basic\" tool group.\n            skills_or_loaders (`list[str | Skill | SkillLoaderBase] | None`, \\\n            optional):\n                The agent skill directories to be registered in the \"basic\"\n                tool group.\n            mcps (`list[MCPClient] | None`, optional):\n                The mcp clients to be registered in the \"basic\" tool group.\n            tool_groups (`list[ToolGroup] | None`, optional):\n                The tool groups to be registered.\n            meta_tool_response_template (`str`, optional):\n                The template for meta tool responses.\n            skill_instruction_template (`str`):\n                A Jinja2 template for generating the agent skill instruction.\n        \"\"\"\n\n        if tool_groups is not None and any(\n            _.name == \"basic\" for _ in tool_groups\n        ):\n            raise ValueError(\n                \"The 'basic' tool group is reserved for the default tool \"\n                \"group. Don't include 'basic' in the tool_groups argument \"\n                \"when you also provide tools, skills or mcps in the \"\n                \"constructor.\",\n            )\n\n        self.tool_groups = [\n            ToolGroup(\n                name=\"basic\",\n                tools=tools or [],\n                skills_or_loaders=skills_or_loaders or [],\n                mcps=mcps or [],\n            ),\n        ] + (tool_groups or [])\n\n        # Check name conflict for tool groups\n        if len(set(_.name for _ in self.tool_groups)) != len(\n            self.tool_groups,","sourceCodeStart":102,"sourceCodeEnd":138,"githubUrl":"https://github.com/agentscope-ai/agentscope/blob/e90f1c7592896cc95f6e5ee506194f533378247d/src/agentscope/tool/_toolkit.py#L102-L138","documentation":"Toolkit.__init__ rejects a tool_groups list that contains a group named 'basic': that name is reserved for the implicit default group holding constructor-level tools/skills/mcps.","triggerScenarios":"Toolkit(tools=[...], tool_groups=[ToolGroup(name='basic', ...)]) — mixing an explicitly named 'basic' group with top-level tools/skills/mcps.","commonSituations":"Copying an example ToolGroup config and forgetting to rename it; assembling groups dynamically and colliding with the reserved name.","solutions":["Rename your group to something other than 'basic'","Move those tools/skills to the Toolkit constructor's top-level arguments if they belong in the default group"],"exampleFix":"# before\nToolkit(tools=[t], tool_groups=[ToolGroup(name='basic', description='d', skills=[s])])\n# after\nToolkit(tools=[t], skills=[s])","handlingStrategy":"validation","validationCode":"assert not any(g.name == 'basic' for g in tool_groups or [])","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Never name a custom group 'basic'","Generate group names from a namespace to avoid reserved words"],"tags":["toolkit","reserved-name","validation"],"backgroundTag":"reserved-name-conflict","analyzedSha":"e90f1c7592896cc95f6e5ee506194f533378247d","analyzedAt":"2026-08-28T18:24:12.087Z","schemaVersion":2},"datasetVersion":"2026-08-28T21:17:43.275Z"}