api-key-manager 3.0.0__tar.gz → 3.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-3.0.0 → api_key_manager-3.0.1}/PKG-INFO +14 -32
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/README.md +13 -31
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/api_key_manager.egg-info/PKG-INFO +14 -32
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/detector.py +371 -371
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/__init__.py +2 -1
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/ai302.py +76 -76
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/anthropic.py +109 -109
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/baichuan.py +69 -69
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/cerebras.py +76 -76
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/cohere.py +90 -90
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/cstcloud.py +94 -94
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/dashscope.py +92 -92
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/dashscope_coding.py +94 -94
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/deepseek.py +133 -133
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/dmxapi.py +76 -76
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/doubao.py +76 -76
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/fireworks.py +76 -76
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/grok.py +75 -75
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/groq.py +76 -76
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/huggingface.py +37 -37
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/hyperbolic.py +76 -76
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/infini.py +102 -102
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/infini_coding.py +96 -96
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/kimi.py +93 -93
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/kimi_coding.py +96 -96
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/longcat.py +76 -76
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/mimo.py +76 -76
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/mimo_plan.py +107 -107
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/minimax.py +69 -69
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/minimax_plan.py +94 -94
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/mistral.py +76 -76
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/models_registry.py +2962 -2962
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/modelscope.py +120 -120
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/nvidia.py +76 -76
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/ocoolai.py +76 -76
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/openai.py +101 -101
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/opencode.py +89 -89
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/opencode_zen.py +89 -89
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/openrouter.py +91 -91
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/perplexity.py +75 -75
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/poe.py +76 -76
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/ppio.py +76 -76
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/replicate.py +37 -37
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/siliconflow.py +93 -93
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/stepfun.py +99 -99
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/tencent_hunyuan.py +94 -94
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/together.py +101 -101
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/yi.py +69 -69
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/zai.py +76 -76
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/zhipu.py +99 -99
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/zhipu_coding.py +96 -96
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/web.py +1676 -1676
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/pyproject.toml +1 -1
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/api_key_manager.egg-info/SOURCES.txt +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/api_key_manager.egg-info/dependency_links.txt +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/api_key_manager.egg-info/entry_points.txt +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/api_key_manager.egg-info/requires.txt +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/api_key_manager.egg-info/top_level.txt +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/__init__.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/__main__.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/api_models.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/checker.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/cli.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/config.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/core.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/errors.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/i18n.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/logger.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/model_capabilities.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/parser.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/base.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/providers/google.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/proxy.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/py.typed +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/ssrf.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/storage.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/tester.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/url_override.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/validator.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/key_manager/webhook.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/setup.cfg +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/tests/test_api_endpoints.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/tests/test_base_check.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/tests/test_bug_fixes.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/tests/test_checker.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/tests/test_core.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/tests/test_detector.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/tests/test_e2e.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/tests/test_errors.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/tests/test_i18n.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/tests/test_logger.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/tests/test_openapi.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/tests/test_parser.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/tests/test_parser_supplement.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/tests/test_provider_detection.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/tests/test_providers.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/tests/test_proxy.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/tests/test_security.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/tests/test_ssrf_supplement.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/tests/test_storage.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/tests/test_tester.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/tests/test_validator.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/tests/test_validator_supplement.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.0.1}/tests/test_web_fixes.py +0 -0
- {api_key_manager-3.0.0 → api_key_manager-3.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.0.
|
|
3
|
+
Version: 3.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
|
|
@@ -45,7 +45,7 @@ Requires-Dist: ruff>=0.4.0; extra == "dev"
|
|
|
45
45
|
- **Web 界面** - 赛博朋克风格的管理界面
|
|
46
46
|
- **代理支持** - 支持 HTTP/SOCKS 代理
|
|
47
47
|
- **加密存储** - AES-256-GCM 加密存储 API 密钥,随机盐值
|
|
48
|
-
- **安全防护** - 路径遍历防护、SSRF
|
|
48
|
+
- **安全防护** - 路径遍历防护、SSRF 防护、时序安全认证
|
|
49
49
|
- **API 文档** - Swagger UI 和 Redoc 自动文档
|
|
50
50
|
- **国际化** - 支持中英文错误信息
|
|
51
51
|
- **SDK 支持** - Python 和 TypeScript 客户端库
|
|
@@ -85,7 +85,8 @@ Requires-Dist: ruff>=0.4.0; extra == "dev"
|
|
|
85
85
|
|
|
86
86
|
| 服务商 | 前缀 | 显示名 |
|
|
87
87
|
|--------|------|--------|
|
|
88
|
-
|
|
|
88
|
+
| 阿里百炼 | `sk-ws-` / `sk-` |
|
|
89
|
+
| 阿里百炼编程 | `sk-sp-` |
|
|
89
90
|
| ModelScope | `ms-` | 魔搭 |
|
|
90
91
|
| Zhipu GLM | `sk-` | 智谱 |
|
|
91
92
|
| Kimi | `sk-` | 月之暗面 |
|
|
@@ -197,13 +198,11 @@ python web.py
|
|
|
197
198
|
### 安全防护
|
|
198
199
|
|
|
199
200
|
- **路径遍历防护** - 导入端点验证路径在允许目录内
|
|
200
|
-
- **SSRF 防护** - `custom_base_url` 验证域名白名单,阻止私有 IP
|
|
201
|
+
- **SSRF 防护** - `custom_base_url` 验证域名白名单,阻止私有 IP,已接入 `check/single` 和 `balance` 端点
|
|
201
202
|
- **时序安全认证** - 使用 `hmac.compare_digest()` 防止时序攻击
|
|
202
|
-
-
|
|
203
|
+
- **认证警告** - 未配置 API Key 时启动警告
|
|
203
204
|
- **密钥掩码** - API 响应中只返回 `key_masked`,不暴露完整密钥
|
|
204
|
-
- **
|
|
205
|
-
- **Webhook 安全** - 使用 `secrets.token_hex` 生成不可预测的 webhook ID
|
|
206
|
-
- **存储安全** - 密钥文件权限加固 (0o600),AES-256-GCM 加密,PBKDF2 600,000 次迭代
|
|
205
|
+
- **Webhook 安全** - Webhook 端点使用正确的 API 方法,防止运行时错误
|
|
207
206
|
|
|
208
207
|
### API 认证
|
|
209
208
|
|
|
@@ -343,7 +342,7 @@ if best_score >= 200:
|
|
|
343
342
|
### 检测优先级
|
|
344
343
|
|
|
345
344
|
| 优先级 | 方法 | 说明 |
|
|
346
|
-
|
|
345
|
+
|--------|------|------|
|
|
347
346
|
| 1 | 模式匹配 | 唯一前缀,如 `sk-proj-` → OpenAI |
|
|
348
347
|
| 2 | 格式匹配 | 特殊格式,如 `{id}.{secret}` → 智谱 |
|
|
349
348
|
| 3 | 全并发探测 | 第一个返回200的服务商胜出 |
|
|
@@ -371,9 +370,6 @@ if best_score >= 200:
|
|
|
371
370
|
- 基于关键词的模式匹配(authentication、expired、rate limit 等)
|
|
372
371
|
- 长错误信息截断(超过100字符时截断并添加省略号)
|
|
373
372
|
|
|
374
|
-
## 项目结构
|
|
375
|
-
|
|
376
|
-
|
|
377
373
|
## 模型检测
|
|
378
374
|
|
|
379
375
|
### 模型列表来源
|
|
@@ -723,25 +719,12 @@ const result = await client.checkSingleKey({ key: 'sk-xxx', provider: 'openai' }
|
|
|
723
719
|
|
|
724
720
|
### v3.0.0 (2026-06-15)
|
|
725
721
|
|
|
726
|
-
-
|
|
727
|
-
-
|
|
728
|
-
-
|
|
729
|
-
-
|
|
730
|
-
-
|
|
731
|
-
-
|
|
732
|
-
- **可靠性**: 修复 checker.py 合并逻辑错误
|
|
733
|
-
- **可靠性**: 替换所有裸 except 为 except Exception
|
|
734
|
-
- **可靠性**: 添加配置验证和错误处理
|
|
735
|
-
- **可靠性**: 添加 /healthz 健康检查端点
|
|
736
|
-
- **可靠性**: 修复 datetime.utcnow() 废弃警告
|
|
737
|
-
- **SSRF 防护**: 添加 IPv6 私有范围和 DNS 重绑定防护
|
|
738
|
-
- **Webhook 安全**: 使用 secrets.token_hex 替代 MD5 生成 webhook ID
|
|
739
|
-
- **存储安全**: 密钥文件权限加固 (0o600)
|
|
740
|
-
- **前端**: 模型检测列表添加自定义滚轮条样式
|
|
741
|
-
- **前端**: 修复模型类型下拉窗口被弹窗裁剪的问题
|
|
742
|
-
- **精确匹配修复**: 能力检测从子串匹配改为 ^$ 锚定精确匹配
|
|
743
|
-
- **API Bug 修复**: 修复 /api/stats/chart 运行时崩溃
|
|
744
|
-
- **测试补充**: 新增 8 个端点的测试,覆盖率 91.47%
|
|
722
|
+
- **精确匹配修复**: 能力检测从子串匹配改为 ^$ 锚定精确匹配,修复 o1 误匹配 o1-mini 等问题
|
|
723
|
+
- **API Bug 修复**: 修复 /api/stats/chart 运行时崩溃、/api/keys 和 /api/keys/export 丢失 key 字段
|
|
724
|
+
- **测试补充**: 新增 8 个端点的测试(test/token, test/concurrency, models/capabilities, models/check, progress/stream 等)
|
|
725
|
+
- **前端缓存优化**: 模型类型切换使用本地缓存过滤,不再重复请求 API
|
|
726
|
+
- **Cherry Studio 同步工作流修复**: 修复 GitHub Actions 路径错误和验证脚本
|
|
727
|
+
- **Autofill 样式修复**: 修复浏览器 autofill 导致输入框底色变白
|
|
745
728
|
|
|
746
729
|
### v2.2.2 (2026-06-14)
|
|
747
730
|
|
|
@@ -767,7 +750,6 @@ const result = await client.checkSingleKey({ key: 'sk-xxx', provider: 'openai' }
|
|
|
767
750
|
- **超时控制**: 所有网络请求 5 秒超时
|
|
768
751
|
- **模型同步**: 从 Cherry Studio 同步模型数据,支持 ownedBy 映射
|
|
769
752
|
- **新增服务商**: OpenCode Go、OpenCode Zen
|
|
770
|
-
- **新增服务商**: OpenCode Go、OpenCode Zen
|
|
771
753
|
|
|
772
754
|
### v2.1.2 (2026-06-11)
|
|
773
755
|
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
- **Web 界面** - 赛博朋克风格的管理界面
|
|
13
13
|
- **代理支持** - 支持 HTTP/SOCKS 代理
|
|
14
14
|
- **加密存储** - AES-256-GCM 加密存储 API 密钥,随机盐值
|
|
15
|
-
- **安全防护** - 路径遍历防护、SSRF
|
|
15
|
+
- **安全防护** - 路径遍历防护、SSRF 防护、时序安全认证
|
|
16
16
|
- **API 文档** - Swagger UI 和 Redoc 自动文档
|
|
17
17
|
- **国际化** - 支持中英文错误信息
|
|
18
18
|
- **SDK 支持** - Python 和 TypeScript 客户端库
|
|
@@ -52,7 +52,8 @@
|
|
|
52
52
|
|
|
53
53
|
| 服务商 | 前缀 | 显示名 |
|
|
54
54
|
|--------|------|--------|
|
|
55
|
-
|
|
|
55
|
+
| 阿里百炼 | `sk-ws-` / `sk-` |
|
|
56
|
+
| 阿里百炼编程 | `sk-sp-` |
|
|
56
57
|
| ModelScope | `ms-` | 魔搭 |
|
|
57
58
|
| Zhipu GLM | `sk-` | 智谱 |
|
|
58
59
|
| Kimi | `sk-` | 月之暗面 |
|
|
@@ -164,13 +165,11 @@ python web.py
|
|
|
164
165
|
### 安全防护
|
|
165
166
|
|
|
166
167
|
- **路径遍历防护** - 导入端点验证路径在允许目录内
|
|
167
|
-
- **SSRF 防护** - `custom_base_url` 验证域名白名单,阻止私有 IP
|
|
168
|
+
- **SSRF 防护** - `custom_base_url` 验证域名白名单,阻止私有 IP,已接入 `check/single` 和 `balance` 端点
|
|
168
169
|
- **时序安全认证** - 使用 `hmac.compare_digest()` 防止时序攻击
|
|
169
|
-
-
|
|
170
|
+
- **认证警告** - 未配置 API Key 时启动警告
|
|
170
171
|
- **密钥掩码** - API 响应中只返回 `key_masked`,不暴露完整密钥
|
|
171
|
-
- **
|
|
172
|
-
- **Webhook 安全** - 使用 `secrets.token_hex` 生成不可预测的 webhook ID
|
|
173
|
-
- **存储安全** - 密钥文件权限加固 (0o600),AES-256-GCM 加密,PBKDF2 600,000 次迭代
|
|
172
|
+
- **Webhook 安全** - Webhook 端点使用正确的 API 方法,防止运行时错误
|
|
174
173
|
|
|
175
174
|
### API 认证
|
|
176
175
|
|
|
@@ -310,7 +309,7 @@ if best_score >= 200:
|
|
|
310
309
|
### 检测优先级
|
|
311
310
|
|
|
312
311
|
| 优先级 | 方法 | 说明 |
|
|
313
|
-
|
|
312
|
+
|--------|------|------|
|
|
314
313
|
| 1 | 模式匹配 | 唯一前缀,如 `sk-proj-` → OpenAI |
|
|
315
314
|
| 2 | 格式匹配 | 特殊格式,如 `{id}.{secret}` → 智谱 |
|
|
316
315
|
| 3 | 全并发探测 | 第一个返回200的服务商胜出 |
|
|
@@ -338,9 +337,6 @@ if best_score >= 200:
|
|
|
338
337
|
- 基于关键词的模式匹配(authentication、expired、rate limit 等)
|
|
339
338
|
- 长错误信息截断(超过100字符时截断并添加省略号)
|
|
340
339
|
|
|
341
|
-
## 项目结构
|
|
342
|
-
|
|
343
|
-
|
|
344
340
|
## 模型检测
|
|
345
341
|
|
|
346
342
|
### 模型列表来源
|
|
@@ -690,25 +686,12 @@ const result = await client.checkSingleKey({ key: 'sk-xxx', provider: 'openai' }
|
|
|
690
686
|
|
|
691
687
|
### v3.0.0 (2026-06-15)
|
|
692
688
|
|
|
693
|
-
-
|
|
694
|
-
-
|
|
695
|
-
-
|
|
696
|
-
-
|
|
697
|
-
-
|
|
698
|
-
-
|
|
699
|
-
- **可靠性**: 修复 checker.py 合并逻辑错误
|
|
700
|
-
- **可靠性**: 替换所有裸 except 为 except Exception
|
|
701
|
-
- **可靠性**: 添加配置验证和错误处理
|
|
702
|
-
- **可靠性**: 添加 /healthz 健康检查端点
|
|
703
|
-
- **可靠性**: 修复 datetime.utcnow() 废弃警告
|
|
704
|
-
- **SSRF 防护**: 添加 IPv6 私有范围和 DNS 重绑定防护
|
|
705
|
-
- **Webhook 安全**: 使用 secrets.token_hex 替代 MD5 生成 webhook ID
|
|
706
|
-
- **存储安全**: 密钥文件权限加固 (0o600)
|
|
707
|
-
- **前端**: 模型检测列表添加自定义滚轮条样式
|
|
708
|
-
- **前端**: 修复模型类型下拉窗口被弹窗裁剪的问题
|
|
709
|
-
- **精确匹配修复**: 能力检测从子串匹配改为 ^$ 锚定精确匹配
|
|
710
|
-
- **API Bug 修复**: 修复 /api/stats/chart 运行时崩溃
|
|
711
|
-
- **测试补充**: 新增 8 个端点的测试,覆盖率 91.47%
|
|
689
|
+
- **精确匹配修复**: 能力检测从子串匹配改为 ^$ 锚定精确匹配,修复 o1 误匹配 o1-mini 等问题
|
|
690
|
+
- **API Bug 修复**: 修复 /api/stats/chart 运行时崩溃、/api/keys 和 /api/keys/export 丢失 key 字段
|
|
691
|
+
- **测试补充**: 新增 8 个端点的测试(test/token, test/concurrency, models/capabilities, models/check, progress/stream 等)
|
|
692
|
+
- **前端缓存优化**: 模型类型切换使用本地缓存过滤,不再重复请求 API
|
|
693
|
+
- **Cherry Studio 同步工作流修复**: 修复 GitHub Actions 路径错误和验证脚本
|
|
694
|
+
- **Autofill 样式修复**: 修复浏览器 autofill 导致输入框底色变白
|
|
712
695
|
|
|
713
696
|
### v2.2.2 (2026-06-14)
|
|
714
697
|
|
|
@@ -734,7 +717,6 @@ const result = await client.checkSingleKey({ key: 'sk-xxx', provider: 'openai' }
|
|
|
734
717
|
- **超时控制**: 所有网络请求 5 秒超时
|
|
735
718
|
- **模型同步**: 从 Cherry Studio 同步模型数据,支持 ownedBy 映射
|
|
736
719
|
- **新增服务商**: OpenCode Go、OpenCode Zen
|
|
737
|
-
- **新增服务商**: OpenCode Go、OpenCode Zen
|
|
738
720
|
|
|
739
721
|
### v2.1.2 (2026-06-11)
|
|
740
722
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: api-key-manager
|
|
3
|
-
Version: 3.0.
|
|
3
|
+
Version: 3.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
|
|
@@ -45,7 +45,7 @@ Requires-Dist: ruff>=0.4.0; extra == "dev"
|
|
|
45
45
|
- **Web 界面** - 赛博朋克风格的管理界面
|
|
46
46
|
- **代理支持** - 支持 HTTP/SOCKS 代理
|
|
47
47
|
- **加密存储** - AES-256-GCM 加密存储 API 密钥,随机盐值
|
|
48
|
-
- **安全防护** - 路径遍历防护、SSRF
|
|
48
|
+
- **安全防护** - 路径遍历防护、SSRF 防护、时序安全认证
|
|
49
49
|
- **API 文档** - Swagger UI 和 Redoc 自动文档
|
|
50
50
|
- **国际化** - 支持中英文错误信息
|
|
51
51
|
- **SDK 支持** - Python 和 TypeScript 客户端库
|
|
@@ -85,7 +85,8 @@ Requires-Dist: ruff>=0.4.0; extra == "dev"
|
|
|
85
85
|
|
|
86
86
|
| 服务商 | 前缀 | 显示名 |
|
|
87
87
|
|--------|------|--------|
|
|
88
|
-
|
|
|
88
|
+
| 阿里百炼 | `sk-ws-` / `sk-` |
|
|
89
|
+
| 阿里百炼编程 | `sk-sp-` |
|
|
89
90
|
| ModelScope | `ms-` | 魔搭 |
|
|
90
91
|
| Zhipu GLM | `sk-` | 智谱 |
|
|
91
92
|
| Kimi | `sk-` | 月之暗面 |
|
|
@@ -197,13 +198,11 @@ python web.py
|
|
|
197
198
|
### 安全防护
|
|
198
199
|
|
|
199
200
|
- **路径遍历防护** - 导入端点验证路径在允许目录内
|
|
200
|
-
- **SSRF 防护** - `custom_base_url` 验证域名白名单,阻止私有 IP
|
|
201
|
+
- **SSRF 防护** - `custom_base_url` 验证域名白名单,阻止私有 IP,已接入 `check/single` 和 `balance` 端点
|
|
201
202
|
- **时序安全认证** - 使用 `hmac.compare_digest()` 防止时序攻击
|
|
202
|
-
-
|
|
203
|
+
- **认证警告** - 未配置 API Key 时启动警告
|
|
203
204
|
- **密钥掩码** - API 响应中只返回 `key_masked`,不暴露完整密钥
|
|
204
|
-
- **
|
|
205
|
-
- **Webhook 安全** - 使用 `secrets.token_hex` 生成不可预测的 webhook ID
|
|
206
|
-
- **存储安全** - 密钥文件权限加固 (0o600),AES-256-GCM 加密,PBKDF2 600,000 次迭代
|
|
205
|
+
- **Webhook 安全** - Webhook 端点使用正确的 API 方法,防止运行时错误
|
|
207
206
|
|
|
208
207
|
### API 认证
|
|
209
208
|
|
|
@@ -343,7 +342,7 @@ if best_score >= 200:
|
|
|
343
342
|
### 检测优先级
|
|
344
343
|
|
|
345
344
|
| 优先级 | 方法 | 说明 |
|
|
346
|
-
|
|
345
|
+
|--------|------|------|
|
|
347
346
|
| 1 | 模式匹配 | 唯一前缀,如 `sk-proj-` → OpenAI |
|
|
348
347
|
| 2 | 格式匹配 | 特殊格式,如 `{id}.{secret}` → 智谱 |
|
|
349
348
|
| 3 | 全并发探测 | 第一个返回200的服务商胜出 |
|
|
@@ -371,9 +370,6 @@ if best_score >= 200:
|
|
|
371
370
|
- 基于关键词的模式匹配(authentication、expired、rate limit 等)
|
|
372
371
|
- 长错误信息截断(超过100字符时截断并添加省略号)
|
|
373
372
|
|
|
374
|
-
## 项目结构
|
|
375
|
-
|
|
376
|
-
|
|
377
373
|
## 模型检测
|
|
378
374
|
|
|
379
375
|
### 模型列表来源
|
|
@@ -723,25 +719,12 @@ const result = await client.checkSingleKey({ key: 'sk-xxx', provider: 'openai' }
|
|
|
723
719
|
|
|
724
720
|
### v3.0.0 (2026-06-15)
|
|
725
721
|
|
|
726
|
-
-
|
|
727
|
-
-
|
|
728
|
-
-
|
|
729
|
-
-
|
|
730
|
-
-
|
|
731
|
-
-
|
|
732
|
-
- **可靠性**: 修复 checker.py 合并逻辑错误
|
|
733
|
-
- **可靠性**: 替换所有裸 except 为 except Exception
|
|
734
|
-
- **可靠性**: 添加配置验证和错误处理
|
|
735
|
-
- **可靠性**: 添加 /healthz 健康检查端点
|
|
736
|
-
- **可靠性**: 修复 datetime.utcnow() 废弃警告
|
|
737
|
-
- **SSRF 防护**: 添加 IPv6 私有范围和 DNS 重绑定防护
|
|
738
|
-
- **Webhook 安全**: 使用 secrets.token_hex 替代 MD5 生成 webhook ID
|
|
739
|
-
- **存储安全**: 密钥文件权限加固 (0o600)
|
|
740
|
-
- **前端**: 模型检测列表添加自定义滚轮条样式
|
|
741
|
-
- **前端**: 修复模型类型下拉窗口被弹窗裁剪的问题
|
|
742
|
-
- **精确匹配修复**: 能力检测从子串匹配改为 ^$ 锚定精确匹配
|
|
743
|
-
- **API Bug 修复**: 修复 /api/stats/chart 运行时崩溃
|
|
744
|
-
- **测试补充**: 新增 8 个端点的测试,覆盖率 91.47%
|
|
722
|
+
- **精确匹配修复**: 能力检测从子串匹配改为 ^$ 锚定精确匹配,修复 o1 误匹配 o1-mini 等问题
|
|
723
|
+
- **API Bug 修复**: 修复 /api/stats/chart 运行时崩溃、/api/keys 和 /api/keys/export 丢失 key 字段
|
|
724
|
+
- **测试补充**: 新增 8 个端点的测试(test/token, test/concurrency, models/capabilities, models/check, progress/stream 等)
|
|
725
|
+
- **前端缓存优化**: 模型类型切换使用本地缓存过滤,不再重复请求 API
|
|
726
|
+
- **Cherry Studio 同步工作流修复**: 修复 GitHub Actions 路径错误和验证脚本
|
|
727
|
+
- **Autofill 样式修复**: 修复浏览器 autofill 导致输入框底色变白
|
|
745
728
|
|
|
746
729
|
### v2.2.2 (2026-06-14)
|
|
747
730
|
|
|
@@ -767,7 +750,6 @@ const result = await client.checkSingleKey({ key: 'sk-xxx', provider: 'openai' }
|
|
|
767
750
|
- **超时控制**: 所有网络请求 5 秒超时
|
|
768
751
|
- **模型同步**: 从 Cherry Studio 同步模型数据,支持 ownedBy 映射
|
|
769
752
|
- **新增服务商**: OpenCode Go、OpenCode Zen
|
|
770
|
-
- **新增服务商**: OpenCode Go、OpenCode Zen
|
|
771
753
|
|
|
772
754
|
### v2.1.2 (2026-06-11)
|
|
773
755
|
|