from types import SimpleNamespace import pytest from astrbot.core.agent.tool import FunctionTool from astrbot.core.provider.func_tool_manager import FunctionToolManager from astrbot.core.star.context import Context from astrbot.core.star.star import StarMetadata, star_registry @pytest.fixture(autouse=True) def restore_star_registry(): original_registry = list(star_registry) star_registry.clear() try: yield finally: star_registry[:] = original_registry def make_context() -> Context: context = Context.__new__(Context) context.provider_manager = SimpleNamespace(llm_tools=FunctionToolManager()) return context def make_tool(name: str, module_path: str) -> FunctionTool: tool = FunctionTool( name=name, description="test tool", parameters={"type": "object", "properties": {}}, ) tool.__module__ = module_path return tool def test_add_llm_tools_resolves_subdirectory_plugin_without_name_prefix(): star_registry.append( StarMetadata( name="Custom Plugin", root_dir_name="custom_plugin", module_path="data.plugins.custom_plugin.main", ) ) context = make_context() tool = make_tool("search", "custom_plugin.tools.search") context.add_llm_tools(tool) assert tool.handler_module_path == "data.plugins.custom_plugin.main" def test_add_llm_tools_uses_registered_non_main_plugin_entrypoint(): star_registry.append( StarMetadata( name="Custom Plugin", module_path="data.plugins.custom_plugin.custom_plugin", ) ) context = make_context() tool = make_tool("search", "custom_plugin.tools.search") context.add_llm_tools(tool) assert tool.handler_module_path == "data.plugins.custom_plugin.custom_plugin" def test_add_llm_tools_resolves_prefixed_subdirectory_tool_from_registry(): star_registry.append( StarMetadata( name="Custom Plugin", root_dir_name="custom_plugin", module_path="data.plugins.custom_plugin.custom_plugin", ) ) context = make_context() tool = make_tool("search", "data.plugins.custom_plugin.tools.search") context.add_llm_tools(tool) assert tool.handler_module_path == "data.plugins.custom_plugin.custom_plugin" def test_add_llm_tools_does_not_treat_unknown_module_as_plugin(): star_registry.append( StarMetadata( name="Custom Plugin", root_dir_name="custom_plugin", module_path="data.plugins.custom_plugin.main", ) ) context = make_context() tool = make_tool("search", "external_package.tools.search") context.add_llm_tools(tool) assert tool.handler_module_path == "external_package.tools.search" def test_add_llm_tools_handles_empty_tool_module_path(): context = make_context() tool = make_tool("search", "") context.add_llm_tools(tool) assert tool.handler_module_path == ""