api-key-manager 4.3.0__tar.gz → 5.0.1__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.
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/PKG-INFO +46 -254
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/README.md +42 -253
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/api_key_manager.egg-info/PKG-INFO +46 -254
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/api_key_manager.egg-info/requires.txt +9 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/__init__.py +2 -2
- api_key_manager-5.0.1/key_manager/model_capabilities.py +205 -0
- api_key_manager-5.0.1/key_manager/providers/models_registry.py +1653 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/web/_app.py +2 -2
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/web/routes/models.py +0 -8
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/pyproject.toml +4 -1
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/tests/test_routes_models.py +0 -60
- api_key_manager-4.3.0/key_manager/model_capabilities.py +0 -412
- api_key_manager-4.3.0/key_manager/providers/models_registry.py +0 -2962
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/LICENSE +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/api_key_manager.egg-info/SOURCES.txt +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/api_key_manager.egg-info/dependency_links.txt +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/api_key_manager.egg-info/entry_points.txt +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/api_key_manager.egg-info/top_level.txt +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/__main__.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/api_models.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/checker.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/cli.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/config.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/core.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/detector.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/errors.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/i18n.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/logger.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/parser.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/__init__.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/ai302.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/anthropic.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/baichuan.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/base.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/cerebras.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/cohere.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/config_providers.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/cstcloud.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/dashscope.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/dashscope_coding.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/deepseek.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/dmxapi.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/doubao.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/fireworks.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/google.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/grok.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/groq.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/huggingface.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/hyperbolic.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/infini.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/infini_coding.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/kimi.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/kimi_coding.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/longcat.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/mimo.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/mimo_plan.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/minimax.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/minimax_plan.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/mistral.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/modelscope.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/nvidia.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/ocoolai.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/openai.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/opencode.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/opencode_zen.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/openrouter.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/perplexity.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/poe.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/ppio.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/replicate.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/siliconflow.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/stepfun.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/tencent_hunyuan.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/together.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/yi.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/zai.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/zhipu.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/providers/zhipu_coding.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/proxy.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/py.typed +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/ssrf.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/storage.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/tester.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/url_override.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/validator.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/web/__init__.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/web/middleware.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/web/progress.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/web/routes/__init__.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/web/routes/balance.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/web/routes/check.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/web/routes/keys.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/web/routes/misc.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/web/routes/providers.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/web/routes/stats.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/web/routes/test.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/web/utils.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/key_manager/webhook.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/setup.cfg +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/tests/test_api_endpoints.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/tests/test_base_check.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/tests/test_bug_fixes.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/tests/test_checker.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/tests/test_core.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/tests/test_deepseek_balance.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/tests/test_detector_unit.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/tests/test_e2e.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/tests/test_errors.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/tests/test_i18n.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/tests/test_logger.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/tests/test_openapi.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/tests/test_parser.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/tests/test_provider_detection.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/tests/test_provider_refactoring.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/tests/test_providers.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/tests/test_proxy.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/tests/test_routes_check.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/tests/test_routes_misc.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/tests/test_routes_providers.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/tests/test_routes_test.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/tests/test_security.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/tests/test_storage.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/tests/test_tester.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/tests/test_token_limit_fast.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/tests/test_v320_changes.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/tests/test_validator.py +0 -0
- {api_key_manager-4.3.0 → api_key_manager-5.0.1}/tests/test_webhook.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: api-key-manager
|
|
3
|
-
Version:
|
|
3
|
+
Version: 5.0.1
|
|
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
|
+
[](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 工具,支持 CLI
|
|
47
|
+
批量管理 45+ AI 服务商 API 密钥的 Python 工具,支持 CLI、Web 和桌面三种界面。
|
|
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
|
+
- **桌面应用** - Tauri v2.5 原生桌面应用(v5.0.0 新增),Windows / macOS / Linux
|
|
58
66
|
- **Webhook 通知** - 事件驱动的 Webhook 通知系统
|
|
59
67
|
|
|
68
|
+
## 快速开始
|
|
69
|
+
|
|
70
|
+
### 桌面应用(v5.0.0)
|
|
71
|
+
|
|
72
|
+
从 [Releases](https://github.com/Townrain/API-Key-Manager/releases) 下载对应平台的安装包,解压后运行 `keyhub-desktop.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
|

|
|
@@ -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
|
-
系统从
|
|
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
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
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
|
-
|
|
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
|
-
模型列表从
|
|
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
|
|