Files

1 line
15 KiB
JSON

{"repo": "anthony-0721/bananacoder", "files": {"tests/test_config.py": {"f4877f84a0aab17043a85bb4b1eccb72cb6e1883": {"t": 1785746420.4460719, "n": 4906, "h": "dbfcf34e13a6615d", "c": "import json\nimport pytest\nfrom banana.config.loader import load_config, resolve_env_vars\nfrom banana.config.schema import (\n ProviderConfig,\n ModelPresetConfig,\n MCPServerConfig,\n AgentConfig,\n Config,\n)\n\n\nclass TestProviderConfig:\n def test_minimal_provider(self):\n p = ProviderConfig(api_key=\"sk-xxx\")\n assert p.api_key == \"sk-xxx\"\n assert p.api_base is None\n\n def test_full_provider(self):\n p = ProviderConfig(\n api_key=\"sk-xxx\",\n api_base=\"https://api.deepseek.com/v1\",\n extra_headers={\"X-Custom\": \"value\"},\n extra_body={\"stream\": True},\n )\n assert p.api_base == \"https://api.deepseek.com/v1\"\n assert p.extra_headers == {\"X-Custom\": \"value\"}\n\n\nclass TestModelPresetConfig:\n def test_defaults(self):\n m = ModelPresetConfig(model=\"deepseek-chat\", provider=\"deepseek\")\n assert m.max_tokens == 4096\n assert m.temperature == 0.7\n assert m.context_window_tokens == 128000\n\n def test_to_generation_settings(self):\n m = ModelPresetConfig(\n model=\"deepseek-chat\",\n provider=\"deepseek\",\n temperature=0.3,\n max_tokens=8192,\n reasoning_effort=\"high\",\n )\n gs = m.to_generation_settings()\n assert gs.temperature == 0.3\n assert gs.max_tokens == 8192\n assert gs.reasoning_effort == \"high\"\n\n\nclass TestMCPServerConfig:\n def test_stdio_server(self):\n cfg = MCPServerConfig(\n type=\"stdio\",\n command=\"npx\",\n args=[\"-y\", \"mcp-server\"],\n enabled_tools=[\"*\"],\n )\n assert cfg.type == \"stdio\"\n assert cfg.command == \"npx\"\n\n def test_http_server(self):\n cfg = MCPServerConfig(\n type=\"streamableHttp\",\n url=\"http://localhost:3000/mcp\",\n headers={\"Authorization\": \"Bearer xxx\"},\n enabled_tools=[\"query\"],\n )\n assert cfg.url == \"http://localhost:3000/mcp\"\n assert cfg.enabled_tools == [\"query\"]\n\n\nclass TestConfig:\n def test_minimal_config(self):\n cfg = Config(\n providers={\"deepseek\": ProviderConfig(api_key=\"sk-xxx\")},\n model_presets={\n \"default\": ModelPresetConfig(model=\"deepseek-chat\", provider=\"deepseek\")\n },\n )\n assert cfg.model_presets[\"default\"].model == \"deepseek-chat\"\n\n def test_resolve_preset(self, temp_dir):\n cfg = Config(\n providers={\"deepseek\": ProviderConfig(api_key=\"sk-xxx\")},\n model_presets={\n \"default\": ModelPresetConfig(model=\"deepseek-chat\", provider=\"deepseek\"),\n \"fast\": ModelPresetConfig(model=\"deepseek-chat\", provider=\"deepseek\", max_tokens=1024),\n },\n )\n resolved = cfg.resolve_preset(\"fast\")\n assert resolved.max_tokens == 1024\n\n def test_get_provider_name(self):\n cfg = Config(\n providers={\"deepseek\": ProviderConfig(api_key=\"sk-xxx\")},\n model_presets={\n \"default\": ModelPresetConfig(model=\"deepseek-chat\", provider=\"deepseek\"),\n },\n )\n preset = cfg.model_presets[\"default\"]\n assert cfg.get_provider_name(\"deepseek-chat\", preset=preset) == \"deepseek\"\n\n def test_fallback_models(self):\n cfg = Config(\n providers={\n \"deepseek\": ProviderConfig(api_key=\"sk-xxx\"),\n \"qwen\": ProviderConfig(api_key=\"sk-yyy\", api_base=\"https://dashscope.aliyuncs.com/compatible-mode/v1\"),\n },\n model_presets={\n \"default\": ModelPresetConfig(model=\"deepseek-chat\", provider=\"deepseek\"),\n },\n fallback_models=[\"qwen-plus\"],\n fallback_providers={\"qwen-plus\": \"qwen\"},\n )\n assert cfg.fallback_models == [\"qwen-plus\"]\n\n\nclass TestConfigLoader:\n def test_load_from_path(self, temp_home):\n config_dir = temp_home / \".bananacoder\"\n config_dir.mkdir(parents=True)\n cfg = {\n \"providers\": {\"deepseek\": {\"api_key\": \"sk-xxx\"}},\n \"model_presets\": {\"default\": {\"model\": \"deepseek-chat\", \"provider\": \"deepseek\"}},\n }\n (config_dir / \"config.json\").write_text(json.dumps(cfg))\n\n result = load_config(config_dir / \"config.json\")\n assert result.providers[\"deepseek\"].api_key == \"sk-xxx\"\n\n def test_load_defaults(self):\n result = load_config(None)\n assert isinstance(result, Config)\n\n def test_resolve_env_vars(self):\n import os\n os.environ[\"TEST_KEY\"] = \"env-value\"\n cfg = Config(\n providers={\"test\": ProviderConfig(api_key=\"$TEST_KEY\")},\n model_presets={\"default\": ModelPresetConfig(model=\"m\", provider=\"test\")},\n )\n resolved = resolve_env_vars(cfg)\n assert resolved.providers[\"test\"].api_key == \"env-value\"\n"}, "ca72c8cba6d8df7c8460c201ceb5addbb21d850f": {"t": 1785763852.0262356, "n": 4906, "h": "dbfcf34e13a6615d", "c": "import json\nimport pytest\nfrom banana.config.loader import load_config, resolve_env_vars\nfrom banana.config.schema import (\n ProviderConfig,\n ModelPresetConfig,\n MCPServerConfig,\n AgentConfig,\n Config,\n)\n\n\nclass TestProviderConfig:\n def test_minimal_provider(self):\n p = ProviderConfig(api_key=\"sk-xxx\")\n assert p.api_key == \"sk-xxx\"\n assert p.api_base is None\n\n def test_full_provider(self):\n p = ProviderConfig(\n api_key=\"sk-xxx\",\n api_base=\"https://api.deepseek.com/v1\",\n extra_headers={\"X-Custom\": \"value\"},\n extra_body={\"stream\": True},\n )\n assert p.api_base == \"https://api.deepseek.com/v1\"\n assert p.extra_headers == {\"X-Custom\": \"value\"}\n\n\nclass TestModelPresetConfig:\n def test_defaults(self):\n m = ModelPresetConfig(model=\"deepseek-chat\", provider=\"deepseek\")\n assert m.max_tokens == 4096\n assert m.temperature == 0.7\n assert m.context_window_tokens == 128000\n\n def test_to_generation_settings(self):\n m = ModelPresetConfig(\n model=\"deepseek-chat\",\n provider=\"deepseek\",\n temperature=0.3,\n max_tokens=8192,\n reasoning_effort=\"high\",\n )\n gs = m.to_generation_settings()\n assert gs.temperature == 0.3\n assert gs.max_tokens == 8192\n assert gs.reasoning_effort == \"high\"\n\n\nclass TestMCPServerConfig:\n def test_stdio_server(self):\n cfg = MCPServerConfig(\n type=\"stdio\",\n command=\"npx\",\n args=[\"-y\", \"mcp-server\"],\n enabled_tools=[\"*\"],\n )\n assert cfg.type == \"stdio\"\n assert cfg.command == \"npx\"\n\n def test_http_server(self):\n cfg = MCPServerConfig(\n type=\"streamableHttp\",\n url=\"http://localhost:3000/mcp\",\n headers={\"Authorization\": \"Bearer xxx\"},\n enabled_tools=[\"query\"],\n )\n assert cfg.url == \"http://localhost:3000/mcp\"\n assert cfg.enabled_tools == [\"query\"]\n\n\nclass TestConfig:\n def test_minimal_config(self):\n cfg = Config(\n providers={\"deepseek\": ProviderConfig(api_key=\"sk-xxx\")},\n model_presets={\n \"default\": ModelPresetConfig(model=\"deepseek-chat\", provider=\"deepseek\")\n },\n )\n assert cfg.model_presets[\"default\"].model == \"deepseek-chat\"\n\n def test_resolve_preset(self, temp_dir):\n cfg = Config(\n providers={\"deepseek\": ProviderConfig(api_key=\"sk-xxx\")},\n model_presets={\n \"default\": ModelPresetConfig(model=\"deepseek-chat\", provider=\"deepseek\"),\n \"fast\": ModelPresetConfig(model=\"deepseek-chat\", provider=\"deepseek\", max_tokens=1024),\n },\n )\n resolved = cfg.resolve_preset(\"fast\")\n assert resolved.max_tokens == 1024\n\n def test_get_provider_name(self):\n cfg = Config(\n providers={\"deepseek\": ProviderConfig(api_key=\"sk-xxx\")},\n model_presets={\n \"default\": ModelPresetConfig(model=\"deepseek-chat\", provider=\"deepseek\"),\n },\n )\n preset = cfg.model_presets[\"default\"]\n assert cfg.get_provider_name(\"deepseek-chat\", preset=preset) == \"deepseek\"\n\n def test_fallback_models(self):\n cfg = Config(\n providers={\n \"deepseek\": ProviderConfig(api_key=\"sk-xxx\"),\n \"qwen\": ProviderConfig(api_key=\"sk-yyy\", api_base=\"https://dashscope.aliyuncs.com/compatible-mode/v1\"),\n },\n model_presets={\n \"default\": ModelPresetConfig(model=\"deepseek-chat\", provider=\"deepseek\"),\n },\n fallback_models=[\"qwen-plus\"],\n fallback_providers={\"qwen-plus\": \"qwen\"},\n )\n assert cfg.fallback_models == [\"qwen-plus\"]\n\n\nclass TestConfigLoader:\n def test_load_from_path(self, temp_home):\n config_dir = temp_home / \".bananacoder\"\n config_dir.mkdir(parents=True)\n cfg = {\n \"providers\": {\"deepseek\": {\"api_key\": \"sk-xxx\"}},\n \"model_presets\": {\"default\": {\"model\": \"deepseek-chat\", \"provider\": \"deepseek\"}},\n }\n (config_dir / \"config.json\").write_text(json.dumps(cfg))\n\n result = load_config(config_dir / \"config.json\")\n assert result.providers[\"deepseek\"].api_key == \"sk-xxx\"\n\n def test_load_defaults(self):\n result = load_config(None)\n assert isinstance(result, Config)\n\n def test_resolve_env_vars(self):\n import os\n os.environ[\"TEST_KEY\"] = \"env-value\"\n cfg = Config(\n providers={\"test\": ProviderConfig(api_key=\"$TEST_KEY\")},\n model_presets={\"default\": ModelPresetConfig(model=\"m\", provider=\"test\")},\n )\n resolved = resolve_env_vars(cfg)\n assert resolved.providers[\"test\"].api_key == \"env-value\"\n"}}, "tests/test_provider_openai.py": {"f4877f84a0aab17043a85bb4b1eccb72cb6e1883": {"t": 1785747499.5767787, "n": 2115, "h": "69cba2709f29bc27", "c": "import pytest\nfrom unittest.mock import AsyncMock, MagicMock\nfrom banana.providers.openai_compat import OpenAICompatProvider\n\n\nclass TestOpenAICompatProvider:\n def test_get_default_model(self):\n p = OpenAICompatProvider(api_key=\"sk-xxx\", default_model=\"deepseek-chat\")\n assert p.get_default_model() == \"deepseek-chat\"\n\n @pytest.mark.asyncio\n async def test_chat_text_response(self):\n p = OpenAICompatProvider(api_key=\"sk-xxx\", default_model=\"test-model\")\n mock_choice = MagicMock()\n mock_choice.message.content = \"Hello!\"\n mock_choice.message.tool_calls = None\n mock_choice.finish_reason = \"stop\"\n mock_completion = MagicMock()\n mock_completion.choices = [mock_choice]\n mock_completion.usage.prompt_tokens = 10\n mock_completion.usage.completion_tokens = 5\n p._client.chat.completions.create = AsyncMock(return_value=mock_completion)\n\n resp = await p.chat(messages=[{\"role\": \"user\", \"content\": \"hi\"}])\n assert resp.content == \"Hello!\"\n assert resp.finish_reason == \"stop\"\n assert not resp.has_tool_calls\n\n @pytest.mark.asyncio\n async def test_chat_tool_call_response(self):\n p = OpenAICompatProvider(api_key=\"sk-xxx\", default_model=\"test-model\")\n mock_tc = MagicMock()\n mock_tc.id = \"call_1\"\n mock_tc.function.name = \"bash\"\n mock_tc.function.arguments = '{\"command\": \"ls\"}'\n mock_choice = MagicMock()\n mock_choice.message.content = None\n mock_choice.message.tool_calls = [mock_tc]\n mock_choice.finish_reason = \"tool_calls\"\n mock_completion = MagicMock()\n mock_completion.choices = [mock_choice]\n mock_completion.usage.prompt_tokens = 10\n mock_completion.usage.completion_tokens = 5\n p._client.chat.completions.create = AsyncMock(return_value=mock_completion)\n\n resp = await p.chat(messages=[{\"role\": \"user\", \"content\": \"list files\"}])\n assert resp.has_tool_calls\n assert resp.tool_calls[0].name == \"bash\"\n assert resp.tool_calls[0].arguments == {\"command\": \"ls\"}\n"}, "ca72c8cba6d8df7c8460c201ceb5addbb21d850f": {"t": 1785763852.0369458, "n": 2115, "h": "69cba2709f29bc27", "c": "import pytest\nfrom unittest.mock import AsyncMock, MagicMock\nfrom banana.providers.openai_compat import OpenAICompatProvider\n\n\nclass TestOpenAICompatProvider:\n def test_get_default_model(self):\n p = OpenAICompatProvider(api_key=\"sk-xxx\", default_model=\"deepseek-chat\")\n assert p.get_default_model() == \"deepseek-chat\"\n\n @pytest.mark.asyncio\n async def test_chat_text_response(self):\n p = OpenAICompatProvider(api_key=\"sk-xxx\", default_model=\"test-model\")\n mock_choice = MagicMock()\n mock_choice.message.content = \"Hello!\"\n mock_choice.message.tool_calls = None\n mock_choice.finish_reason = \"stop\"\n mock_completion = MagicMock()\n mock_completion.choices = [mock_choice]\n mock_completion.usage.prompt_tokens = 10\n mock_completion.usage.completion_tokens = 5\n p._client.chat.completions.create = AsyncMock(return_value=mock_completion)\n\n resp = await p.chat(messages=[{\"role\": \"user\", \"content\": \"hi\"}])\n assert resp.content == \"Hello!\"\n assert resp.finish_reason == \"stop\"\n assert not resp.has_tool_calls\n\n @pytest.mark.asyncio\n async def test_chat_tool_call_response(self):\n p = OpenAICompatProvider(api_key=\"sk-xxx\", default_model=\"test-model\")\n mock_tc = MagicMock()\n mock_tc.id = \"call_1\"\n mock_tc.function.name = \"bash\"\n mock_tc.function.arguments = '{\"command\": \"ls\"}'\n mock_choice = MagicMock()\n mock_choice.message.content = None\n mock_choice.message.tool_calls = [mock_tc]\n mock_choice.finish_reason = \"tool_calls\"\n mock_completion = MagicMock()\n mock_completion.choices = [mock_choice]\n mock_completion.usage.prompt_tokens = 10\n mock_completion.usage.completion_tokens = 5\n p._client.chat.completions.create = AsyncMock(return_value=mock_completion)\n\n resp = await p.chat(messages=[{\"role\": \"user\", \"content\": \"list files\"}])\n assert resp.has_tool_calls\n assert resp.tool_calls[0].name == \"bash\"\n assert resp.tool_calls[0].arguments == {\"command\": \"ls\"}\n"}}}}