api-key-manager 4.3.0__tar.gz → 5.0.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/PKG-INFO +46 -254
  2. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/README.md +42 -253
  3. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/api_key_manager.egg-info/PKG-INFO +46 -254
  4. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/api_key_manager.egg-info/requires.txt +9 -0
  5. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/__init__.py +2 -2
  6. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/config.py +23 -0
  7. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/logger.py +18 -6
  8. api_key_manager-5.0.2/key_manager/model_capabilities.py +205 -0
  9. api_key_manager-5.0.2/key_manager/providers/models_registry.py +1653 -0
  10. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/storage.py +56 -6
  11. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/web/_app.py +25 -12
  12. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/web/middleware.py +16 -11
  13. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/web/routes/balance.py +2 -2
  14. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/web/routes/check.py +6 -6
  15. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/web/routes/keys.py +8 -8
  16. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/web/routes/misc.py +4 -4
  17. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/web/routes/models.py +0 -8
  18. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/web/routes/test.py +3 -3
  19. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/pyproject.toml +4 -1
  20. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/tests/test_bug_fixes.py +36 -0
  21. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/tests/test_logger.py +19 -0
  22. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/tests/test_routes_misc.py +18 -10
  23. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/tests/test_routes_models.py +0 -60
  24. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/tests/test_storage.py +32 -4
  25. api_key_manager-4.3.0/key_manager/model_capabilities.py +0 -412
  26. api_key_manager-4.3.0/key_manager/providers/models_registry.py +0 -2962
  27. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/LICENSE +0 -0
  28. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/api_key_manager.egg-info/SOURCES.txt +0 -0
  29. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/api_key_manager.egg-info/dependency_links.txt +0 -0
  30. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/api_key_manager.egg-info/entry_points.txt +0 -0
  31. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/api_key_manager.egg-info/top_level.txt +0 -0
  32. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/__main__.py +0 -0
  33. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/api_models.py +0 -0
  34. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/checker.py +0 -0
  35. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/cli.py +0 -0
  36. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/core.py +0 -0
  37. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/detector.py +0 -0
  38. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/errors.py +0 -0
  39. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/i18n.py +0 -0
  40. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/parser.py +0 -0
  41. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/__init__.py +0 -0
  42. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/ai302.py +0 -0
  43. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/anthropic.py +0 -0
  44. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/baichuan.py +0 -0
  45. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/base.py +0 -0
  46. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/cerebras.py +0 -0
  47. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/cohere.py +0 -0
  48. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/config_providers.py +0 -0
  49. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/cstcloud.py +0 -0
  50. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/dashscope.py +0 -0
  51. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/dashscope_coding.py +0 -0
  52. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/deepseek.py +0 -0
  53. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/dmxapi.py +0 -0
  54. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/doubao.py +0 -0
  55. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/fireworks.py +0 -0
  56. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/google.py +0 -0
  57. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/grok.py +0 -0
  58. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/groq.py +0 -0
  59. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/huggingface.py +0 -0
  60. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/hyperbolic.py +0 -0
  61. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/infini.py +0 -0
  62. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/infini_coding.py +0 -0
  63. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/kimi.py +0 -0
  64. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/kimi_coding.py +0 -0
  65. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/longcat.py +0 -0
  66. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/mimo.py +0 -0
  67. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/mimo_plan.py +0 -0
  68. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/minimax.py +0 -0
  69. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/minimax_plan.py +0 -0
  70. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/mistral.py +0 -0
  71. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/modelscope.py +0 -0
  72. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/nvidia.py +0 -0
  73. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/ocoolai.py +0 -0
  74. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/openai.py +0 -0
  75. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/opencode.py +0 -0
  76. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/opencode_zen.py +0 -0
  77. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/openrouter.py +0 -0
  78. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/perplexity.py +0 -0
  79. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/poe.py +0 -0
  80. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/ppio.py +0 -0
  81. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/replicate.py +0 -0
  82. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/siliconflow.py +0 -0
  83. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/stepfun.py +0 -0
  84. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/tencent_hunyuan.py +0 -0
  85. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/together.py +0 -0
  86. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/yi.py +0 -0
  87. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/zai.py +0 -0
  88. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/zhipu.py +0 -0
  89. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/providers/zhipu_coding.py +0 -0
  90. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/proxy.py +0 -0
  91. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/py.typed +0 -0
  92. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/ssrf.py +0 -0
  93. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/tester.py +0 -0
  94. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/url_override.py +0 -0
  95. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/validator.py +0 -0
  96. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/web/__init__.py +0 -0
  97. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/web/progress.py +0 -0
  98. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/web/routes/__init__.py +0 -0
  99. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/web/routes/providers.py +0 -0
  100. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/web/routes/stats.py +0 -0
  101. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/web/utils.py +0 -0
  102. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/key_manager/webhook.py +0 -0
  103. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/setup.cfg +0 -0
  104. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/tests/test_api_endpoints.py +0 -0
  105. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/tests/test_base_check.py +0 -0
  106. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/tests/test_checker.py +0 -0
  107. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/tests/test_core.py +0 -0
  108. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/tests/test_deepseek_balance.py +0 -0
  109. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/tests/test_detector_unit.py +0 -0
  110. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/tests/test_e2e.py +0 -0
  111. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/tests/test_errors.py +0 -0
  112. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/tests/test_i18n.py +0 -0
  113. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/tests/test_openapi.py +0 -0
  114. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/tests/test_parser.py +0 -0
  115. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/tests/test_provider_detection.py +0 -0
  116. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/tests/test_provider_refactoring.py +0 -0
  117. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/tests/test_providers.py +0 -0
  118. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/tests/test_proxy.py +0 -0
  119. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/tests/test_routes_check.py +0 -0
  120. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/tests/test_routes_providers.py +0 -0
  121. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/tests/test_routes_test.py +0 -0
  122. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/tests/test_security.py +0 -0
  123. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/tests/test_tester.py +0 -0
  124. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/tests/test_token_limit_fast.py +0 -0
  125. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/tests/test_v320_changes.py +0 -0
  126. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/tests/test_validator.py +0 -0
  127. {api_key_manager-4.3.0 → api_key_manager-5.0.2}/tests/test_webhook.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: api-key-manager
3
- Version: 4.3.0
3
+ Version: 5.0.2
4
4
  Summary: Batch manage API keys for 45+ AI providers with CLI and Web interfaces
5
5
  Author: Townrain
6
6
  License: MIT
@@ -28,6 +28,9 @@ Requires-Dist: python-multipart>=0.0.9
28
28
  Requires-Dist: cryptography>=42.0.0
29
29
  Requires-Dist: jinja2>=3.0.0
30
30
  Requires-Dist: pydantic>=2.0.0
31
+ Requires-Dist: pywebview>=5.0; platform_system == "Windows"
32
+ Requires-Dist: pywebview>=5.0; platform_system == "Darwin"
33
+ Requires-Dist: pywebview>=5.0; platform_system == "Linux"
31
34
  Provides-Extra: dev
32
35
  Requires-Dist: pytest>=8.0.0; extra == "dev"
33
36
  Requires-Dist: pytest-asyncio>=0.23.0; extra == "dev"
@@ -35,9 +38,13 @@ Requires-Dist: pytest-cov>=5.0.0; extra == "dev"
35
38
  Requires-Dist: ruff>=0.4.0; extra == "dev"
36
39
  Dynamic: license-file
37
40
 
41
+ [![PyPI version](https://img.shields.io/pypi/v/api-key-manager)](https://pypi.org/project/api-key-manager/)
42
+
43
+ [English](README_EN.md) | 中文
44
+
38
45
  # API Key Manager
39
46
 
40
- 批量管理 45+ AI 服务商 API 密钥的 Python 工具,支持 CLIWeb 两种界面。
47
+ 批量管理 45+ AI 服务商 API 密钥的 Python 工具,支持 CLIWeb 和桌面三种界面。
41
48
 
42
49
  ## 功能特性
43
50
 
@@ -55,8 +62,24 @@ Dynamic: license-file
55
62
  - **API 文档** - Swagger UI 和 Redoc 自动文档
56
63
  - **国际化** - 支持中英文错误信息
57
64
  - **SDK 支持** - Python 和 TypeScript 客户端库
65
+ - **桌面应用** - 单 exe 便携安装,React 前端 + pywebview 桌面窗口
58
66
  - **Webhook 通知** - 事件驱动的 Webhook 通知系统
59
67
 
68
+ ## 快速开始
69
+
70
+ ### 桌面应用(v5.0.2)
71
+
72
+ 从 [Releases](https://github.com/Townrain/API-Key-Manager/releases) 下载 `KeyHub-Setup.exe`,选择任意目录安装即可。首次启动自动生成配置文件,所有数据保持在安装目录内。
73
+
74
+ ### CLI / Web
75
+
76
+ ```bash
77
+ pip install api-key-manager
78
+ python web.py
79
+ ```
80
+
81
+ 详细文档见下方。
82
+
60
83
  ## 系统架构
61
84
 
62
85
  ![系统架构流程图](docs/images/flowchart.png)
@@ -187,7 +210,12 @@ curl -X DELETE http://localhost:18001/api/providers/my-llm
187
210
  ### 安装
188
211
 
189
212
  ```bash
190
- # 克隆项目
213
+ # 从 PyPI 安装(推荐)
214
+ pip install api-key-manager
215
+ ```
216
+
217
+ ```bash
218
+ # 或从源码安装(开发模式)
191
219
  git clone https://github.com/Townrain/API-Key-Manager.git
192
220
  cd key
193
221
 
@@ -568,7 +596,7 @@ async def detect_provider(client, key: str, suspected_provider: str = None) -> s
568
596
 
569
597
  ### 模型列表来源
570
598
 
571
- 系统从 Cherry Studio 同步模型数据,生成 `models_registry.py` 文件,包含每个服务商的静态模型列表:
599
+ 系统从 OpenCode [models.dev](https://models.dev) 同步模型数据,生成 `models_registry.py` 文件(中国区服务商保留 Cherry Studio 数据):
572
600
 
573
601
  ```python
574
602
  PROVIDER_MODELS = {
@@ -621,17 +649,19 @@ for i in range(0, len(models), batch_size):
621
649
 
622
650
  系统支持按类型筛选模型:
623
651
 
624
- | 类型 | 说明 | 筛选方法 |
625
- |------|------|----------|
626
- | 视觉模型 | 支持图像输入 | `is_vision_model()` |
627
- | 工具模型 | 支持函数调用 | `is_tool_model()` |
628
- | 推理模型 | 支持思维链 | `is_reasoning_model()` |
629
- | 联网模型 | 支持网络搜索 | `is_websearch_model()` |
630
- | 免费模型 | 免费额度 | `is_free_model()` |
631
- | 嵌入模型 | 文本嵌入 | `is_embedding_model()` |
632
- | 重排模型 | 搜索重排 | `is_rerank_model()` |
652
+ | 类型 | 说明 | 筛选方法 | 数据来源 |
653
+ |------|------|----------|----------|
654
+ | 视觉模型 | 支持图像输入 | `is_vision_model()` | models.dev |
655
+ | 工具模型 | 支持函数调用 | `is_tool_model()` | models.dev |
656
+ | 推理模型 | 支持思维链 | `is_reasoning_model()` | models.dev |
657
+
658
+ 能力数据(vision / tooluse / reasoning)从 [models.dev](https://models.dev/api.json) 同步,基于显式布尔字段,存储在 `data/model_capabilities.json` 中。
659
+
660
+ ### 模型能力说明
633
661
 
634
- 能力数据从 Cherry Studio 同步,存储在 `data/model_capabilities.json` 中。
662
+ > **v4.4**: 能力检测从 Cherry Studio 正则迁移到 [OpenCode models.dev](https://models.dev) 显式字段。
663
+ > 仅保留三个可靠能力:**vision**(`modalities.input`)、**tooluse**(`tool_call`)、**reasoning**(`reasoning`)。
664
+ > 新增 `scripts/extract_from_opencode.py`,CI `.github/workflows/sync-opencode-models.yml` 每日自动同步。
635
665
 
636
666
  ## 项目结构
637
667
  ```
@@ -970,7 +1000,7 @@ const result = await client.checkSingle({ key: 'sk-xxx', provider: 'openai' });
970
1000
 
971
1001
  ### 5. 模型列表的时效性
972
1002
 
973
- 模型列表从 Cherry Studio 同步,每日更新一次。新发布的模型可能需要等待同步后才能被检测到。
1003
+ 模型列表从 [models.dev](https://models.dev) 同步,每日更新一次。新发布的模型可能需要等待同步后才能被检测到。
974
1004
 
975
1005
  ## 预期的设计决策(安全审查说明)
976
1006
 
@@ -1052,246 +1082,8 @@ def _load_keys_data(config_override: dict | None = None) -> dict:
1052
1082
 
1053
1083
  ## 更新日志
1054
1084
 
1085
+ 详见 [CHANGELOG.md](CHANGELOG.md)
1055
1086
 
1056
- ### v4.3.0 (2026-06-24)
1057
-
1058
- - **测试覆盖率大幅提升**: 覆盖率从 79.15% 提升至 92.09%,新增 167 个测试
1059
- - `detector.py`: 60% → 96% — 检测逻辑全覆盖,防止 v4.2.1 类 bug 回归
1060
- - `web/routes/test.py`: 41% → 99% — 测试路由全覆盖
1061
- - `web/routes/providers.py`: 37% → 100% — 提供商 CRUD 全覆盖
1062
- - `web/routes/misc.py`: 53% → 100% — Webhook/日志/签名报告全覆盖
1063
- - `web/routes/models.py`: 72% → 97% — 模型端点全覆盖
1064
- - `web/routes/check.py`: 74% → 97% — 验证端点全覆盖
1065
-
1066
- - **新增测试文件**:
1067
- - `test_detector_unit.py` (31 tests) — 检测逻辑单元测试,覆盖 7 条核心路径
1068
- - `test_routes_test.py` (48 tests) — 测试路由端点测试
1069
- - `test_routes_providers.py` (32 tests) — 提供商 CRUD 路由测试
1070
- - `test_routes_misc.py` (26 tests) — Webhook/日志/签名报告路由测试
1071
- - `test_routes_models.py` (34 tests) — 模型列表/能力/SSE 路由测试
1072
- - `test_routes_check.py` (23 tests) — 验证/SSRF/自动保存路由测试
1073
-
1074
- - **检测逻辑回归测试**:
1075
- - 锁定 `detect_provider()` 全部 7 条分支路径
1076
- - 覆盖 v4.2.1 修复的两个 bug(格式匹配跳过验证、多候选直接返回)
1077
- - 覆盖 402 余额不足识别、签名匹配阈值、超时处理等边界情况
1078
-
1079
- - **Bug 修复**:
1080
- - 修复 `test_tester.py` 中 `test_run_test_progress_callback` 缺失 `test_config` fixture 参数
1081
-
1082
-
1083
- ### v4.2.1 (2026-06-23)
1084
-
1085
- - **检测逻辑修复**:
1086
- - 修复格式匹配跳过验证的BUG:当有多个候选者时,不再直接返回,而是继续进行并发探测验证
1087
- - 修复变量命名误导:`is_valid` 重命名为 `got_models`
1088
- - 清理死代码:删除不可达的500分加分逻辑
1089
-
1090
- - **删除/复制API认证修复**:
1091
- - 修复 `deleteKey()` 和 `copyKey()` 使用原生 `fetch()` 导致认证失败的问题
1092
- - 改为使用 `safeFetch()` 自动携带 Authorization header
1093
-
1094
- ### v4.2.0 (2026-06-23)
1095
-
1096
- - **统一认证系统**: 复用加密密钥作为API认证token
1097
- - 新增 `derive_api_token()` 函数,从加密密钥派生API token
1098
- - 使用独立的 salt(`key-manager-api-auth-token-v1`)避免与存储加密交叉
1099
- - PBKDF2HMAC 600K迭代,32字节token,缓存机制
1100
- - 修改 `auth_middleware()` 自动fallback到派生token
1101
- - 扩展认证白名单,静态文件不需要认证
1102
-
1103
- - **前端自动携带token**: 无需手动配置
1104
- - 在 `templates/index.html` 的 `<head>` 中注入 `window.__API_TOKEN__`
1105
- - 修改 `safeFetch()` 自动添加 `Authorization: Bearer <token>` 头
1106
- - 修改 `models.js` 的SSE请求也携带token
1107
- - 在 `state.js` 中添加 `apiToken` 字段
1108
-
1109
- - **单个密钥删除功能**:
1110
- - 新增 `POST /api/keys/delete` API端点
1111
- - 前端添加删除按钮(垃圾桶图标)
1112
- - 使用项目标准的 `showConfirm` 确认框
1113
-
1114
- - **自动保存检测密钥**:
1115
- - 检测密钥后自动保存到注册表
1116
- - 更新密钥状态和检测记录
1117
-
1118
- - **复制完整密钥功能**:
1119
- - 新增 `POST /api/keys/get-full-key` API端点
1120
- - 前端点击密钥可复制完整密钥
1121
-
1122
- - **测试验证**:
1123
- - 全量测试通过:687 passed, 1 skipped
1124
- - 覆盖率:75.72%(超过 60% 要求)
1125
- - 新增 5 个 `derive_api_token()` 单元测试
1126
-
1127
- - **可选加密开关**: 支持明文存储,便于本地开发
1128
- - 新增 `storage.encrypted` 配置项(默认 `true`)
1129
- - 设置 `encrypted: false` 可关闭加密,以明文 JSON 存储密钥
1130
- - `load()` 自动检测文件格式,兼容已有加密/明文文件
1131
- - 修复 `_load_keys_data()` 解密失败时抛出异常而非返回空字典(H1 修复)
1132
-
1133
- ### v4.1.0 (2026-06-22)
1134
-
1135
- - **Web 模块技术债务优化**:
1136
- - 修复 `middleware.py` 中的死代码(`now - 300.0` 表达式未使用)
1137
- - 提取 `build_chat_url()` 工具函数,消除 3 处重复的 Chat URL 构造逻辑
1138
- - 提取 `resolve_provider()` 工具函数,消除 5 处重复的提供商检测+验证模式
1139
- - 修复 `keys.py` 中弃用的 `datetime.utcnow()`,改用 `datetime.now(timezone.utc)`
1140
- - 为所有静默异常块添加 `logger.debug()` 日志记录
1141
- - 将内联导入(`import re as _re`、`import time as _time`)移至模块顶部
1142
- - 统一 `test.py` 模型端点的错误响应格式,使用 `ErrorResponse` 替代原始 dict
1143
- - 删除 `_app.py` 中的重复注释
1144
- - 代码行数减少 ~110 行,新增 `web/utils.py` 共享工具模块
1145
-
1146
- - **操作日志清理功能**:
1147
- - 新增 `DELETE /api/logs` API 端点,支持清理当天或指定日期的主日志
1148
- - 新增 `ProjectLogger.clear_main_log()` 方法
1149
-
1150
- - **测试验证**:
1151
- - 全量测试通过:682 passed, 1 skipped
1152
- - 覆盖率:78.40%(超过 60% 要求)
1153
-
1154
- - **前端清理优化**:
1155
- - CSS: 添加缺失的 `--neon-cyan-dim` 变量,新增 `.btn-sm` `.btn-danger` `.url-input` `.toolbar-divider` 工具类
1156
- - CSS: Confirm 模态框和添加服务商表单的内联样式提取为 CSS 类
1157
- - CSS: 签名报告样式拆分到 `components/signature-report.css`
1158
- - CSS: 内联 `style=` 从 71 减少到 39,`onfocus`/`onblur` 从 10 减少到 0
1159
- - JS: 提取 `selectCustomOption`、`toggleCustomSelect`、`toggleLogs` 到 `ui-helpers.js`
1160
- - JS: 新增 `clearLogs()` 函数,带确认对话框
1161
- - HTML: `index.html` 从 531 行精简到 508 行
1162
-
1163
- ### v4.0.0 (2026-06-21)
1164
-
1165
- - **前端模块化重构**: 将单体 `index.html` (4725行) 重构为模块化结构:
1166
- - CSS 拆分: 5个主题文件 + 7个组件文件
1167
- - `tokens.css` — CSS 变量
1168
- - `base.css` — 基础样式、布局、响应式
1169
- - `components.css` — 组件入口 (@import)
1170
- - `components/` — 7个独立组件 (button, form, card, table, stat, nav, overlay)
1171
- - `modals.css` — 模态框样式
1172
- - `animations.css` — 动画和过渡
1173
- - JS 模块化: 12个ES模块
1174
- - `state.js` — 全局状态管理
1175
- - `utils.js` — 纯工具函数
1176
- - `api/` — 9个API模块 (client, stats, keys, check, test, balance, models, providers, misc)
1177
- - UI模块: toast, progress, confirm, keys-table, providers, batch, modals, model-detect
1178
- - `init.js` — 入口点和事件绑定
1179
- - `index.html` 精简至 467行
1180
- - **API模块拆分**: 按后端路由结构拆分前端API模块:
1181
- - `api/client.js` — 通用fetch逻辑 (safeFetch)
1182
- - `api/index.js` — 重新导出所有函数
1183
- - 每个路由模块对应独立文件
1184
- - **静态文件服务**: 添加 `StaticFiles` 中间件
1185
- - **错误处理增强**: loadKeys/loadStats 添加 try-catch 错误处理
1186
- - **ES模块修复**: 修复 State 对象只读绑定问题
1187
-
1188
- - **Web模块重构**: 将单体 `web.py` (2094行) 重构为模块化包结构:
1189
- - `web/_app.py` — 应用入口 (239行)
1190
- - `web/middleware.py` — 中间件和错误处理器
1191
- - `web/progress.py` — ProgressTracker和SSE辅助
1192
- - `web/routes/` — 8个路由模块 (keys, check, test, balance, models, providers, stats, misc)
1193
- - **测试套件重构**:
1194
- - 合并补充测试文件 (test_parser_supplement, test_validator_supplement, test_ssrf_supplement)
1195
- - 删除重复测试文件 (test_web_fixes)
1196
- - 修复 mock 路径以匹配新的 web 模块结构
1197
- - 提取共享 fixtures 和帮助函数到 conftest.py
1198
- - 移除冗余 @pytest.mark.asyncio 装饰器
1199
- - 修复速率限制中间件的测试隔离问题
1200
- - **代码去重**: 消除 `api_check_single` 中的重复模型检查逻辑
1201
- - **调试系统清理**: 移除 `sys.path.insert` hack,使用干净的可选导入模式
1202
- - **重复路由修复**: 合并重复的 `GET /api/providers` 路由
1203
- - **日志显示修复**: 修复日志显示为 `[object Object]` 的问题
1204
- - **可扩展性**: 在 `routes/__init__.py` 中添加新路由、中间件和错误处理器的扩展指南
1205
-
1206
- - **提供商系统重构**:
1207
- - 删除 `check_model` 属性,改为先从 API 获取模型列表再测试
1208
- - 删除所有提供商中的冗余方法(build_headers, get_models, test_token_limit, test_concurrency, _probe, check_real)
1209
- - 标准提供商从 ~77 行减少到 ~5-8 行
1210
- - 总共减少 ~2,400 行冗余代码
1211
- - 添加 `chat_endpoint` 属性,自动从 `check_endpoint` 推导 chat completions 端点
1212
-
1213
- - **检测逻辑修复**:
1214
- - 修复检测逻辑不再因为 `/v1/models` 返回 200 就立即返回提供商
1215
- - `/v1/models` 只用于获取模型列表,不能判断提供商
1216
- - `/chat/completions` 返回 200 才能判断提供商
1217
- - 添加前缀匹配逻辑,支持共享前缀(如 `sk-`)的提供商检测
1218
- - 免费模型对检测非常重要,检测逻辑会测试所有模型包括免费模型
1219
-
1220
- - **文档更新**:
1221
- - 更新 README.md 的"提供商智能检测"部分,添加详细的检测流程说明
1222
- - 更新 docs/DEVELOPMENT.md 的"检测系统"部分
1223
- - 更新 docs/PROVIDER_REFACTORING_PLAN.md,添加"检测逻辑详解"部分
1224
- - 在 detector.py 中添加详细注释,说明 `/v1/models` 和 `/chat/completions` 的区别
1225
-
1226
- - **Bug 修复与改进**:
1227
- - 修复 SDK 文档方法名与实际不符(`get_keys()` → `keys()` 等)
1228
- - 修复删除密钥时报错 "No passphrase found",新增自动生成加密密钥功能
1229
- - 修复签名验证报告端点 404 错误,改为动态生成报告
1230
- - 修复添加自定义服务商按钮缺失,新增前端 UI
1231
- ### v3.2.0 (2026-06-19)
1232
-
1233
- - **模型检测按模型测试**: 支持在模型检测模态框中直接测试Token限制和并发能力
1234
- - **提供商管理UI**: 添加前端UI用于添加/管理自定义提供商
1235
- - **移除check_model**: 从ProviderBase中移除check_model属性,提供商必须从API获取模型
1236
- - **并发测试API改进**: 改进错误处理,提供详细错误信息
1237
- - **提供商Token测试修复**: 修复提供商使用错误模型或错误API端点的问题
1238
- - **余额API修复**: 修复支持余额查询的服务商的余额检测
1239
-
1240
-
1241
- ### v3.1.0 (2026-06-19)
1242
-
1243
- - **提供商自动发现**: 使用pkgutil自动发现替代47个显式导入
1244
- - **提供商元数据属性**: 所有提供商声明display_name、key_prefixes等类属性
1245
- - **默认实现**: test_token_limit、test_concurrency等方法现在是具体方法
1246
- - **YAML配置支持**: 可在config.yaml中定义自定义提供商
1247
- - **提供商Web API**: 添加/api/providers CRUD端点
1248
- - **代码精简**: 39个标准提供商从~100行减少到~15行
1249
-
1250
-
1251
- ### v3.0.0 (2026-06-15)
1252
-
1253
- - **精确匹配修复**: 能力检测从子串匹配改为 ^$ 锚定精确匹配,修复 o1 误匹配 o1-mini 等问题
1254
- - **API Bug 修复**: 修复 /api/stats/chart 运行时崩溃、/api/keys 和 /api/keys/export 丢失 key 字段
1255
- - **测试补充**: 新增 8 个端点的测试(test/token, test/concurrency, models/capabilities, models/check, progress/stream 等)
1256
- - **前端缓存优化**: 模型类型切换使用本地缓存过滤,不再重复请求 API
1257
- - **Cherry Studio 同步工作流修复**: 修复 GitHub Actions 路径错误和验证脚本
1258
- - **Autofill 样式修复**: 修复浏览器 autofill 导致输入框底色变白
1259
-
1260
- ### v2.2.2 (2026-06-14)
1261
-
1262
- - **模型检测二级窗口**: 新增模型检测弹窗,支持搜索、类型筛选、全选、批量检测
1263
- - **模型类型图标**: 显示模型能力图标(视觉/推理/联网/工具/嵌入/重排/免费)
1264
- - **模型能力数据更新**: 从 Cherry Studio 同步最新模型能力数据(3184 条记录)
1265
- - **检测逻辑优化**: DeepSeek 欠费密钥正确识别,不再误判为其他服务商
1266
- - **指定模型检测**: 自动检测服务商时也支持指定模型检测
1267
-
1268
- ### v2.2.1 (2026-06-14)
1269
-
1270
- - **检测逻辑修复**: 自动识别后必须调用 check() 验证 key 有效性
1271
- - **签名匹配修复**: 状态码不再硬编码 401,使用实际状态码
1272
- - **不可靠服务商**: ppio、nvidia、modelscope 不参与加分
1273
- - **模型选择器**: 新增模型下拉框,支持选择具体模型检测
1274
- - **Cherry Studio 同步**: 修复 ownedBy 映射(alibaba→dashscope 等)
1275
- - **测试补充**: 新增 test_parser_supplement、test_ssrf_supplement、test_validator_supplement
1276
- ### v2.2.0 (2026-06-14)
1277
-
1278
- - **检测逻辑重构**: 添加三步检测逻辑(/v1/models → 并发测试)
1279
- - **URL 修复**: 从 check_endpoint 提取版本路径,修复 OpenCode 等服务商 404 问题
1280
- - **并发优化**: /v1/models 和 chat/completions 都并发调用
1281
- - **超时控制**: 所有网络请求 5 秒超时
1282
- - **模型同步**: 从 Cherry Studio 同步模型数据,支持 ownedBy 映射
1283
- - **新增服务商**: OpenCode Go、OpenCode Zen
1284
-
1285
- ### v2.1.2 (2026-06-11)
1286
-
1287
- - **Bug 修复**: 修复 `KeyManager.detect_provider()` 调用异步函数未 await 的问题
1288
- - **测试扩展**: 提供商合约测试扩展至全部 44 个服务商
1289
- - **测试新增**: 新增 `test_proxy.py`、`test_logger.py`、`test_tester.py`、`test_core.py`
1290
- - **覆盖率提升**: 测试覆盖率从 74% 提升至 88%
1291
-
1292
- ### v2.1.1
1293
-
1294
- - 初始发布版本
1295
1087
 
1296
1088
  ## 许可证
1297
1089