"""LLM 模块测试""" from __future__ import annotations import pytest from minenasai.llm.base import Message, Provider, ToolCall, ToolDefinition class TestProvider: """Provider 枚举测试""" def test_is_overseas(self): """测试境外服务识别""" assert Provider.ANTHROPIC.is_overseas is True assert Provider.OPENAI.is_overseas is True assert Provider.GEMINI.is_overseas is True assert Provider.DEEPSEEK.is_overseas is False assert Provider.ZHIPU.is_overseas is False assert Provider.MINIMAX.is_overseas is False assert Provider.MOONSHOT.is_overseas is False def test_display_name(self): """测试显示名称""" assert "Claude" in Provider.ANTHROPIC.display_name assert "GPT" in Provider.OPENAI.display_name assert "DeepSeek" in Provider.DEEPSEEK.display_name assert "GLM" in Provider.ZHIPU.display_name assert "Kimi" in Provider.MOONSHOT.display_name class TestMessage: """消息测试""" def test_basic_message(self): """测试基本消息""" msg = Message(role="user", content="Hello") assert msg.role == "user" assert msg.content == "Hello" assert msg.tool_calls is None def test_message_with_tool_call(self): """测试带工具调用的消息""" tool_call = ToolCall( id="tc_123", name="read_file", arguments={"path": "/test.txt"}, ) msg = Message( role="assistant", content="Let me read that file.", tool_calls=[tool_call], ) assert len(msg.tool_calls) == 1 assert msg.tool_calls[0].name == "read_file" class TestToolDefinition: """工具定义测试""" def test_tool_definition(self): """测试工具定义""" tool = ToolDefinition( name="read_file", description="Read a file", parameters={ "type": "object", "properties": { "path": {"type": "string"}, }, "required": ["path"], }, ) assert tool.name == "read_file" assert "path" in tool.parameters["properties"] class TestClientImports: """客户端导入测试""" def test_import_all_clients(self): """测试导入所有客户端""" from minenasai.llm.clients import ( AnthropicClient, DeepSeekClient, GeminiClient, MiniMaxClient, MoonshotClient, OpenAICompatClient, ZhipuClient, ) assert AnthropicClient.provider == Provider.ANTHROPIC assert OpenAICompatClient.provider == Provider.OPENAI assert DeepSeekClient.provider == Provider.DEEPSEEK assert ZhipuClient.provider == Provider.ZHIPU assert MiniMaxClient.provider == Provider.MINIMAX assert MoonshotClient.provider == Provider.MOONSHOT assert GeminiClient.provider == Provider.GEMINI def test_client_models(self): """测试客户端模型列表""" from minenasai.llm.clients import ( AnthropicClient, DeepSeekClient, ZhipuClient, ) assert "claude-sonnet-4-20250514" in AnthropicClient.MODELS assert "deepseek-chat" in DeepSeekClient.MODELS assert "glm-4-plus" in ZhipuClient.MODELS class TestLLMManager: """LLM 管理器测试""" def test_import_manager(self): """测试导入管理器""" from minenasai.llm import LLMManager, get_llm_manager manager = get_llm_manager() assert isinstance(manager, LLMManager) def test_no_api_keys(self): """测试无 API Key 时的行为""" from minenasai.llm import LLMManager manager = LLMManager() manager.initialize() # 没有配置 API Key,应该没有可用的提供商 providers = manager.get_available_providers() # 可能为空,取决于环境变量 assert isinstance(providers, list)