{"repo": "125w5/linux-ops-agent", "files": {"configs/providers.yaml": {"ed8e15362481c52f15514f88fd1eca86b95cfc73": {"t": 1785745215.527576, "n": 1216, "h": "b12cf53aaf5727a1", "c": "providers:\n default: openai\n mock:\n type: mock\n model: mock-diagnosis-v1\n timeout: 5\n max_tokens: 512\n openai:\n type: openai\n model: gpt-4o-mini\n api_key_env: OPENAI_API_KEY\n base_url: https://api.openai.com/v1\n timeout: 30\n max_tokens: 1024\n anthropic:\n type: anthropic\n model: claude-3-5-haiku-latest\n api_key_env: ANTHROPIC_API_KEY\n base_url: https://api.anthropic.com\n timeout: 30\n max_tokens: 1024\n gemini:\n type: openai-compatible\n model: gemini-1.5-flash\n api_key_env: GEMINI_API_KEY\n base_url: https://generativelanguage.googleapis.com/v1beta/openai\n timeout: 30\n max_tokens: 1024\n deepseek:\n type: openai-compatible\n model: deepseekv4\n api_key_env: DEEPSEEK_API_KEY\n base_url: https://api.deepseek.com/v1\n timeout: 30\n max_tokens: 1024\n openai_compatible:\n type: openai-compatible\n model: api-compatible-model\n api_key_env: OPENAI_COMPATIBLE_API_KEY\n base_url: https://api.example.com/v1\n timeout: 30\n max_tokens: 1024\n custom:\n type: openai-compatible\n model: custom-remote-model\n api_key_env: CUSTOM_API_KEY\n base_url: https://api.example.com/v1\n timeout: 30\n max_tokens: 1024\n"}, "3062e6f4d720506f73f87ac04c3c1b248d9e4cf4": {"t": 1785748794.7045596, "n": 1216, "h": "b12cf53aaf5727a1", "c": "providers:\n default: openai\n mock:\n type: mock\n model: mock-diagnosis-v1\n timeout: 5\n max_tokens: 512\n openai:\n type: openai\n model: gpt-4o-mini\n api_key_env: OPENAI_API_KEY\n base_url: https://api.openai.com/v1\n timeout: 30\n max_tokens: 1024\n anthropic:\n type: anthropic\n model: claude-3-5-haiku-latest\n api_key_env: ANTHROPIC_API_KEY\n base_url: https://api.anthropic.com\n timeout: 30\n max_tokens: 1024\n gemini:\n type: openai-compatible\n model: gemini-1.5-flash\n api_key_env: GEMINI_API_KEY\n base_url: https://generativelanguage.googleapis.com/v1beta/openai\n timeout: 30\n max_tokens: 1024\n deepseek:\n type: openai-compatible\n model: deepseekv4\n api_key_env: DEEPSEEK_API_KEY\n base_url: https://api.deepseek.com/v1\n timeout: 30\n max_tokens: 1024\n openai_compatible:\n type: openai-compatible\n model: api-compatible-model\n api_key_env: OPENAI_COMPATIBLE_API_KEY\n base_url: https://api.example.com/v1\n timeout: 30\n max_tokens: 1024\n custom:\n type: openai-compatible\n model: custom-remote-model\n api_key_env: CUSTOM_API_KEY\n base_url: https://api.example.com/v1\n timeout: 30\n max_tokens: 1024\n"}, "90a5dd6c966130e2a8e25ccc8ee380f1970fdc4e": {"t": 1785748795.9138017, "n": 1220, "h": "26276cebf30c7a89", "c": "providers:\n default: openai\n mock:\n type: mock\n model: mock-diagnosis-v1\n timeout: 5\n max_tokens: 512\n openai:\n type: openai\n model: gpt-4o-mini\n api_key_env: OPENAI_API_KEY\n base_url: https://api.openai.com/v1\n timeout: 30\n max_tokens: 1024\n anthropic:\n type: anthropic\n model: claude-3-5-haiku-latest\n api_key_env: ANTHROPIC_API_KEY\n base_url: https://api.anthropic.com\n timeout: 30\n max_tokens: 1024\n gemini:\n type: openai-compatible\n model: gemini-1.5-flash\n api_key_env: GEMINI_API_KEY\n base_url: https://generativelanguage.googleapis.com/v1beta/openai\n timeout: 30\n max_tokens: 1024\n deepseek:\n type: openai-compatible\n model: deepseek-v4-flash\n api_key_env: DEEPSEEK_API_KEY\n base_url: https://api.deepseek.com\n timeout: 30\n max_tokens: 1024\n openai_compatible:\n type: openai-compatible\n model: api-compatible-model\n api_key_env: OPENAI_COMPATIBLE_API_KEY\n base_url: https://api.example.com/v1\n timeout: 30\n max_tokens: 1024\n custom:\n type: openai-compatible\n model: custom-remote-model\n api_key_env: CUSTOM_API_KEY\n base_url: https://api.example.com/v1\n timeout: 30\n max_tokens: 1024\n"}, "299d0205576c6e37cad8898649cf0c215ba61fb6": {"t": 1785748797.0684173, "n": 959, "h": "6ba0949c2dbc2508", "c": "providers:\n default: openai\n mock:\n type: mock\n model: mock-diagnosis-v1\n timeout: 5\n max_tokens: 512\n openai:\n type: openai\n model: gpt-4o-mini\n api_key_env: OPENAI_API_KEY\n base_url: https://api.openai.com/v1\n timeout: 30\n max_tokens: 1024\n anthropic:\n type: anthropic\n model: claude-3-5-haiku-latest\n api_key_env: ANTHROPIC_API_KEY\n base_url: https://api.anthropic.com\n timeout: 30\n max_tokens: 1024\n ollama:\n type: ollama\n model: llama3.2\n base_url: http://localhost:11434\n timeout: 30\n max_tokens: 1024\n deepseek:\n type: openai-compatible\n model: deepseek-chat\n api_key_env: DEEPSEEK_API_KEY\n base_url: https://api.deepseek.com/v1\n timeout: 30\n max_tokens: 1024\n gemini:\n type: openai-compatible\n model: gemini-1.5-flash\n api_key_env: GEMINI_API_KEY\n base_url: https://generativelanguage.googleapis.com/v1beta/openai\n timeout: 30\n max_tokens: 1024\n"}, "e941cc05cdb687172a1854deeddfeb43eaeeb098": {"t": 1785748798.2653725, "n": 574, "h": "e504e5898e0c75b0", "c": "providers:\n default: mock\n mock:\n type: mock\n model: mock-diagnosis-v1\n timeout: 5\n max_tokens: 512\n openai:\n type: openai\n model: gpt-4o-mini\n api_key_env: OPENAI_API_KEY\n base_url: https://api.openai.com/v1\n timeout: 30\n max_tokens: 1024\n anthropic:\n type: anthropic\n model: claude-3-5-haiku-latest\n api_key_env: ANTHROPIC_API_KEY\n base_url: https://api.anthropic.com\n timeout: 30\n max_tokens: 1024\n ollama:\n type: ollama\n model: llama3.2\n base_url: http://localhost:11434\n timeout: 30\n max_tokens: 1024\n"}}, "tests/test_api_config_rpc.py": {"ed8e15362481c52f15514f88fd1eca86b95cfc73": {"t": 1785747513.8859015, "n": 2125, "h": "c627c2a66453519f", "c": "import io\nimport tempfile\nimport unittest\nfrom pathlib import Path\n\nfrom diag.engine.event_stream import EventStream\nfrom diag.engine.methods import EngineMethods\nfrom diag.engine.session_manager import EngineSessionManager\n\n\nclass ApiConfigRpcTests(unittest.TestCase):\n def test_api_config_flow_saves_env_name_not_key(self) -> None:\n with tempfile.TemporaryDirectory() as directory:\n local_path = Path(directory) / \"local.yaml\"\n methods = EngineMethods(EngineSessionManager(), EventStream(lambda _line: None))\n methods._local_path = lambda: local_path # type: ignore[method-assign]\n session = methods.session_start({\"mode\": \"demo\"})\n\n methods.config_api_start({\"session_id\": session[\"session_id\"], \"provider\": \"openai_compatible\"})\n methods.config_api_set_base_url({\"session_id\": session[\"session_id\"], \"base_url\": \"https://api.deepseek.com/v1\"})\n methods.config_api_set_model({\"session_id\": session[\"session_id\"], \"model\": \"deepseek-chat\"})\n methods.config_api_set_api_key_env({\"session_id\": session[\"session_id\"], \"api_key_env\": \"DEEPSEEK_API_KEY\"})\n preview = methods.config_api_preview({\"session_id\": session[\"session_id\"]})\n saved = methods.config_api_save({\"session_id\": session[\"session_id\"]})\n\n content = local_path.read_text(encoding=\"utf-8\")\n self.assertIn(\"DEEPSEEK_API_KEY\", preview[\"yaml\"])\n self.assertIn(\"DEEPSEEK_API_KEY\", content)\n self.assertNotIn(\"sk-\", content)\n self.assertEqual(saved[\"provider\"], \"openai_compatible\")\n\n def test_real_api_key_is_rejected(self) -> None:\n methods = EngineMethods(EngineSessionManager(), EventStream(lambda _line: None))\n session = methods.session_start({\"mode\": \"demo\"})\n methods.config_api_start({\"session_id\": session[\"session_id\"], \"provider\": \"openai\"})\n\n with self.assertRaises(ValueError):\n methods.config_api_set_api_key_env({\"session_id\": session[\"session_id\"], \"api_key_env\": \"sk-real-secret\"})\n\n\nif __name__ == \"__main__\":\n unittest.main()\n"}, "90a5dd6c966130e2a8e25ccc8ee380f1970fdc4e": {"t": 1785748794.6272497, "n": 2125, "h": "c627c2a66453519f", "c": "import io\nimport tempfile\nimport unittest\nfrom pathlib import Path\n\nfrom diag.engine.event_stream import EventStream\nfrom diag.engine.methods import EngineMethods\nfrom diag.engine.session_manager import EngineSessionManager\n\n\nclass ApiConfigRpcTests(unittest.TestCase):\n def test_api_config_flow_saves_env_name_not_key(self) -> None:\n with tempfile.TemporaryDirectory() as directory:\n local_path = Path(directory) / \"local.yaml\"\n methods = EngineMethods(EngineSessionManager(), EventStream(lambda _line: None))\n methods._local_path = lambda: local_path # type: ignore[method-assign]\n session = methods.session_start({\"mode\": \"demo\"})\n\n methods.config_api_start({\"session_id\": session[\"session_id\"], \"provider\": \"openai_compatible\"})\n methods.config_api_set_base_url({\"session_id\": session[\"session_id\"], \"base_url\": \"https://api.deepseek.com/v1\"})\n methods.config_api_set_model({\"session_id\": session[\"session_id\"], \"model\": \"deepseek-chat\"})\n methods.config_api_set_api_key_env({\"session_id\": session[\"session_id\"], \"api_key_env\": \"DEEPSEEK_API_KEY\"})\n preview = methods.config_api_preview({\"session_id\": session[\"session_id\"]})\n saved = methods.config_api_save({\"session_id\": session[\"session_id\"]})\n\n content = local_path.read_text(encoding=\"utf-8\")\n self.assertIn(\"DEEPSEEK_API_KEY\", preview[\"yaml\"])\n self.assertIn(\"DEEPSEEK_API_KEY\", content)\n self.assertNotIn(\"sk-\", content)\n self.assertEqual(saved[\"provider\"], \"openai_compatible\")\n\n def test_real_api_key_is_rejected(self) -> None:\n methods = EngineMethods(EngineSessionManager(), EventStream(lambda _line: None))\n session = methods.session_start({\"mode\": \"demo\"})\n methods.config_api_start({\"session_id\": session[\"session_id\"], \"provider\": \"openai\"})\n\n with self.assertRaises(ValueError):\n methods.config_api_set_api_key_env({\"session_id\": session[\"session_id\"], \"api_key_env\": \"sk-real-secret\"})\n\n\nif __name__ == \"__main__\":\n unittest.main()\n"}, "299d0205576c6e37cad8898649cf0c215ba61fb6": {"t": 1785748795.7042723, "n": 1875, "h": "659b520472b73d4b", "c": "import io\nimport tempfile\nimport unittest\nfrom pathlib import Path\n\nfrom diag.engine.event_stream import EventStream\nfrom diag.engine.methods import EngineMethods\nfrom diag.engine.session_manager import EngineSessionManager\n\n\nclass ApiConfigRpcTests(unittest.TestCase):\n def test_api_config_flow_saves_env_name_not_key(self) -> None:\n with tempfile.TemporaryDirectory() as directory:\n local_path = Path(directory) / \"local.yaml\"\n methods = EngineMethods(EngineSessionManager(), EventStream(lambda _line: None))\n methods._local_path = lambda: local_path # type: ignore[method-assign]\n session = methods.session_start({\"mode\": \"demo\"})\n\n methods.config_api_start({\"session_id\": session[\"session_id\"], \"provider\": \"deepseek\"})\n methods.config_api_set_api_key_env({\"session_id\": session[\"session_id\"], \"api_key_env\": \"DEEPSEEK_API_KEY\"})\n preview = methods.config_api_preview({\"session_id\": session[\"session_id\"]})\n saved = methods.config_api_save({\"session_id\": session[\"session_id\"]})\n\n content = local_path.read_text(encoding=\"utf-8\")\n self.assertIn(\"DEEPSEEK_API_KEY\", preview[\"yaml\"])\n self.assertIn(\"DEEPSEEK_API_KEY\", content)\n self.assertNotIn(\"sk-\", content)\n self.assertEqual(saved[\"provider\"], \"deepseek\")\n\n def test_real_api_key_is_rejected(self) -> None:\n methods = EngineMethods(EngineSessionManager(), EventStream(lambda _line: None))\n session = methods.session_start({\"mode\": \"demo\"})\n methods.config_api_start({\"session_id\": session[\"session_id\"], \"provider\": \"openai\"})\n\n with self.assertRaises(ValueError):\n methods.config_api_set_api_key_env({\"session_id\": session[\"session_id\"], \"api_key_env\": \"sk-real-secret\"})\n\n\nif __name__ == \"__main__\":\n unittest.main()\n"}}}}