kimi-code-usage 0.1.2__tar.gz → 0.1.4__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.
- kimi_code_usage-0.1.4/.github/workflows/ci.yml +42 -0
- kimi_code_usage-0.1.4/AGENTS.md +76 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/PKG-INFO +10 -2
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/README.md +9 -1
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/README.zh.md +9 -1
- kimi_code_usage-0.1.4/htmlcov/.gitignore +2 -0
- kimi_code_usage-0.1.4/htmlcov/class_index.html +281 -0
- kimi_code_usage-0.1.4/htmlcov/coverage_html_cb_dd2e7eb5.js +735 -0
- kimi_code_usage-0.1.4/htmlcov/favicon_32_cb_c827f16f.png +0 -0
- kimi_code_usage-0.1.4/htmlcov/function_index.html +771 -0
- kimi_code_usage-0.1.4/htmlcov/index.html +189 -0
- kimi_code_usage-0.1.4/htmlcov/keybd_closed_cb_900cfef5.png +0 -0
- kimi_code_usage-0.1.4/htmlcov/status.json +1 -0
- kimi_code_usage-0.1.4/htmlcov/style_cb_4667309f.css +391 -0
- kimi_code_usage-0.1.4/htmlcov/z_581a990e2fe7e610___init___py.html +97 -0
- kimi_code_usage-0.1.4/htmlcov/z_581a990e2fe7e610_config_py.html +298 -0
- kimi_code_usage-0.1.4/htmlcov/z_581a990e2fe7e610_main_py.html +1202 -0
- kimi_code_usage-0.1.4/htmlcov/z_581a990e2fe7e610_mcp_py.html +272 -0
- kimi_code_usage-0.1.4/htmlcov/z_aaf3485d2243f1af___init___py.html +203 -0
- kimi_code_usage-0.1.4/htmlcov/z_aaf3485d2243f1af_anthropic_py.html +167 -0
- kimi_code_usage-0.1.4/htmlcov/z_aaf3485d2243f1af_kimi_py.html +256 -0
- kimi_code_usage-0.1.4/htmlcov/z_aaf3485d2243f1af_openai_py.html +173 -0
- kimi_code_usage-0.1.4/htmlcov/z_aaf3485d2243f1af_openrouter_py.html +463 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/pyproject.toml +37 -1
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/src/kimi_code_usage/config.py +51 -17
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/src/kimi_code_usage/main.py +453 -48
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/src/kimi_code_usage/mcp.py +72 -3
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/src/kimi_code_usage/providers/__init__.py +48 -15
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/src/kimi_code_usage/providers/anthropic.py +22 -21
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/src/kimi_code_usage/providers/kimi.py +58 -11
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/src/kimi_code_usage/providers/openai.py +5 -3
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/src/kimi_code_usage/providers/openrouter.py +179 -72
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/tests/conftest.py +2 -1
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/tests/test_config.py +99 -29
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/tests/test_main.py +339 -293
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/tests/test_mcp.py +114 -15
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/tests/test_provider_anthropic.py +6 -3
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/tests/test_provider_kimi.py +8 -6
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/tests/test_provider_openai.py +8 -5
- kimi_code_usage-0.1.4/tests/test_provider_openrouter.py +647 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/tests/test_providers_init.py +17 -14
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/uv.lock +441 -1
- kimi_code_usage-0.1.2/tests/test_provider_openrouter.py +0 -442
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/.claude/settings.local.json +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/.env.example +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/.gitignore +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/docs/kimi-code-usage.md +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/docs/superpowers/plans/2026-05-09-pace-indicator.md +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/docs/superpowers/plans/2026-05-14-pace-theme-thresholds.md +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/docs/superpowers/plans/2026-06-10-multi-llm-quota.md +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/docs/superpowers/plans/2026-06-10-vscode-extension-ts-strictness.md +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/docs/superpowers/specs/2026-05-09-pace-indicator-design.md +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/docs/superpowers/specs/2026-05-14-pace-theme-thresholds-design.md +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/docs/superpowers/specs/2026-06-10-multi-llm-quota-design.md +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/docs/superpowers/specs/2026-06-10-vscode-extension-multi-provider-design.md +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/docs/superpowers/specs/2026-06-10-vscode-extension-ts-refactor-design.md +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/kimi_usage.code-workspace +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/requirements.txt +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/src/kimi_code_usage/__init__.py +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/tests/__init__.py +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/.claude/settings.local.json +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/.github/workflows/ci.yml +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/.prettierignore +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/.prettierrc.json +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/.vscodeignore +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/LICENSE +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/README.md +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/assets/icon.png +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/assets/moon.svg +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/eslint.config.mjs +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/l10n/bundle.l10n.de.json +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/l10n/bundle.l10n.en.json +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/l10n/bundle.l10n.es.json +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/l10n/bundle.l10n.fr.json +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/l10n/bundle.l10n.it.json +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/l10n/bundle.l10n.ja.json +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/l10n/bundle.l10n.ko.json +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/l10n/bundle.l10n.pt.json +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/l10n/bundle.l10n.ru.json +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/l10n/bundle.l10n.zh-cn.json +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/package.json +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/scripts/copy-assets.ts +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/__mocks__/vscode.ts +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/api.test.ts +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/api.ts +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/apiCache.test.ts +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/apiCache.ts +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/config.test.ts +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/config.ts +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/extension.test.ts +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/extension.ts +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/historyPanel.test.ts +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/historyPanel.ts +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/i18n.test.ts +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/i18n.ts +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/notifier.test.ts +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/notifier.ts +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/pace.test.ts +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/pace.ts +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/predict.test.ts +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/predict.ts +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/statusBar.test.ts +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/statusBar.ts +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/storage-unlink.test.ts +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/storage.test.ts +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/storage.ts +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/types.ts +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/vscode-mock.test.ts +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/tsconfig.eslint.json +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/tsconfig.json +0 -0
- {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/vitest.config.ts +0 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
test:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
timeout-minutes: 10
|
|
13
|
+
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v4
|
|
16
|
+
|
|
17
|
+
- name: Install uv
|
|
18
|
+
uses: astral-sh/setup-uv@v5
|
|
19
|
+
|
|
20
|
+
- name: Set up Python
|
|
21
|
+
run: uv python install 3.12
|
|
22
|
+
|
|
23
|
+
- name: Install dependencies
|
|
24
|
+
run: uv sync --dev
|
|
25
|
+
|
|
26
|
+
- name: Run ruff check
|
|
27
|
+
run: uv run ruff check src/
|
|
28
|
+
|
|
29
|
+
- name: Run mypy
|
|
30
|
+
run: uv run mypy src/ || true
|
|
31
|
+
- name: Run security scan (bandit)
|
|
32
|
+
run: uv tool run bandit -r src/ || true
|
|
33
|
+
|
|
34
|
+
- name: Run dependency audit
|
|
35
|
+
run: uv audit || true
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
- name: Run tests with coverage
|
|
39
|
+
run: uv run pytest --cov --cov-report=term-missing tests/
|
|
40
|
+
|
|
41
|
+
- name: Enforce coverage threshold
|
|
42
|
+
run: uv run coverage report
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Agent 协作指南
|
|
2
|
+
|
|
3
|
+
本文件记录本项目的开发流程、发布经验和常见陷阱,供后续 AI/人类协作者参考。
|
|
4
|
+
|
|
5
|
+
## 发布流程(Release Checklist)
|
|
6
|
+
|
|
7
|
+
### 1. 前置条件
|
|
8
|
+
|
|
9
|
+
- 所有变更已合并到 `main`
|
|
10
|
+
- 测试全部通过且覆盖率达到预期
|
|
11
|
+
- `pyproject.toml` 中的版本号已更新
|
|
12
|
+
|
|
13
|
+
### 2. 版本号与标签
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
rtk git add pyproject.toml
|
|
17
|
+
rtk git commit -m "chore: bump version to X.Y.Z
|
|
18
|
+
|
|
19
|
+
chore: 将版本号提升至 X.Y.Z"
|
|
20
|
+
rtk git tag vX.Y.Z
|
|
21
|
+
rtk git push origin main --tags
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### 3. 构建与发布
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
# 清理旧版本构建产物
|
|
28
|
+
rm -f dist/kimi_code_usage-*
|
|
29
|
+
|
|
30
|
+
# 构建 sdist 和 wheel
|
|
31
|
+
uv build
|
|
32
|
+
|
|
33
|
+
# 发布到 PyPI
|
|
34
|
+
# 注意:uv publish 不会自动读取 ~/.pypirc,需要通过环境变量传入凭据
|
|
35
|
+
UV_PUBLISH_USERNAME=__token__ UV_PUBLISH_PASSWORD=<your-pypi-token> uv publish dist/*
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### 4. 验证
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
uv run -- python -c "import urllib.request, json; print(json.load(urllib.request.urlopen('https://pypi.org/pypi/kimi-code-usage/json'))['info']['version'])"
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## 已知陷阱
|
|
45
|
+
|
|
46
|
+
### uv publish 不读取 ~/.pypirc
|
|
47
|
+
|
|
48
|
+
`uv publish` 当前版本不会自动读取 `~/.pypirc` 中的用户名/密码配置。即使 `~/.pypirc` 已正确配置,也必须通过以下方式之一提供凭据:
|
|
49
|
+
|
|
50
|
+
- 环境变量:`UV_PUBLISH_USERNAME` 和 `UV_PUBLISH_PASSWORD`
|
|
51
|
+
- 命令行参数:`--username` 和 `--password`
|
|
52
|
+
|
|
53
|
+
### dist/ 目录残留旧版本
|
|
54
|
+
|
|
55
|
+
`uv build` 不会自动清理 `dist/` 中的旧文件。如果目录中存在旧版本(如 `0.1.2`)的 wheel/tar.gz,`uv publish dist/*` 会尝试上传这些旧文件并导致冲突。发布前务必清理:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
rm -f dist/kimi_code_usage-*
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### 版本号与 git tag 必须一致
|
|
62
|
+
|
|
63
|
+
PyPI 包版本来自 `pyproject.toml`,git tag 用于标记代码状态。两者应保持一致(如 `v0.1.3` 对应 `version = "0.1.3"`)。
|
|
64
|
+
|
|
65
|
+
## 测试与覆盖率
|
|
66
|
+
|
|
67
|
+
- 运行全部测试:`uv run pytest`
|
|
68
|
+
- 带覆盖率检查:`uv run pytest --cov=kimi_code_usage --cov-report=term-missing`
|
|
69
|
+
- 目标覆盖率:100%
|
|
70
|
+
|
|
71
|
+
## Git 工作流
|
|
72
|
+
|
|
73
|
+
- 使用 `git-feature` skill 创建功能分支
|
|
74
|
+
- 按文件粒度提交,遵循 conventional commits
|
|
75
|
+
- 通过 PR 合并到 `main`
|
|
76
|
+
- 合并后删除本地和远程 feature 分支
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kimi-code-usage
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.4
|
|
4
4
|
Summary: A curated Kimi Coding Plan usage monitor with aesthetic CLI and MCP server.
|
|
5
5
|
Project-URL: Homepage, https://github.com/Golden0Voyager/kimi-code-usage
|
|
6
6
|
Project-URL: Repository, https://github.com/Golden0Voyager/kimi-code-usage
|
|
@@ -40,7 +40,15 @@ Description-Content-Type: text/markdown
|
|
|
40
40
|
|
|
41
41
|
In the era of "Vibecoding," transparency of resources is a prerequisite for flow. **Kimi Code Usage** is a meticulously crafted toolchain — three components, one soul.
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
> **⚠️ 重要:API Key 类型说明**
|
|
44
|
+
>
|
|
45
|
+
> 本工具查询的是 **Kimi Code 平台(Coding Plan 会员)** 的用量数据。你需要的是 **Kimi Code 控制台** 创建的 API Key(格式 `sk-kimi-xxx`),
|
|
46
|
+
> **不是** Kimi 开放平台(platform.kimi.com)的 API Key(格式 `sk-xxx`)。两种 Key 不互通。
|
|
47
|
+
>
|
|
48
|
+
> 获取方式:登录 Kimi Code 控制台 → 创建 API Key → 设置环境变量 `KIMI_API_KEY`。
|
|
49
|
+
> 详见 [Kimi Code 文档](https://www.kimi.com/code/docs/)。
|
|
50
|
+
|
|
51
|
+
**Prerequisite:** A [Kimi Coding Plan](https://api.kimi.com/coding/v1) API Key (`sk-kimi-xxx`), set as `KIMI_API_KEY` in your environment or `.env` file.
|
|
44
52
|
|
|
45
53
|
---
|
|
46
54
|
|
|
@@ -22,7 +22,15 @@
|
|
|
22
22
|
|
|
23
23
|
In the era of "Vibecoding," transparency of resources is a prerequisite for flow. **Kimi Code Usage** is a meticulously crafted toolchain — three components, one soul.
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
> **⚠️ 重要:API Key 类型说明**
|
|
26
|
+
>
|
|
27
|
+
> 本工具查询的是 **Kimi Code 平台(Coding Plan 会员)** 的用量数据。你需要的是 **Kimi Code 控制台** 创建的 API Key(格式 `sk-kimi-xxx`),
|
|
28
|
+
> **不是** Kimi 开放平台(platform.kimi.com)的 API Key(格式 `sk-xxx`)。两种 Key 不互通。
|
|
29
|
+
>
|
|
30
|
+
> 获取方式:登录 Kimi Code 控制台 → 创建 API Key → 设置环境变量 `KIMI_API_KEY`。
|
|
31
|
+
> 详见 [Kimi Code 文档](https://www.kimi.com/code/docs/)。
|
|
32
|
+
|
|
33
|
+
**Prerequisite:** A [Kimi Coding Plan](https://api.kimi.com/coding/v1) API Key (`sk-kimi-xxx`), set as `KIMI_API_KEY` in your environment or `.env` file.
|
|
26
34
|
|
|
27
35
|
---
|
|
28
36
|
|
|
@@ -22,7 +22,15 @@
|
|
|
22
22
|
|
|
23
23
|
在"直觉编程"时代,资源的透明度是进入心流状态的前提。**Kimi Code Usage** 是一套精心打磨的工具链 — 三种形态,一个灵魂。
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
> **⚠️ 重要:API Key 类型说明**
|
|
26
|
+
>
|
|
27
|
+
> 本工具查询的是 **Kimi Code 平台(Coding Plan 会员)** 的用量数据。你需要的是 **Kimi Code 控制台** 创建的 API Key(格式 `sk-kimi-xxx`),
|
|
28
|
+
> **不是** Kimi 开放平台(platform.kimi.com)的 API Key(格式 `sk-xxx`)。两种 Key 不互通。
|
|
29
|
+
>
|
|
30
|
+
> 获取方式:登录 Kimi Code 控制台 → 创建 API Key → 设置环境变量 `KIMI_API_KEY`。
|
|
31
|
+
> 详见 [Kimi Code 文档](https://www.kimi.com/code/docs/)。
|
|
32
|
+
|
|
33
|
+
**统一前提:** 在环境变量或 `.env` 文件中设置 `KIMI_API_KEY`([Kimi Coding Plan](https://api.kimi.com/coding/v1) API Key,格式 `sk-kimi-xxx`)。
|
|
26
34
|
|
|
27
35
|
---
|
|
28
36
|
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
5
|
+
<title>Coverage report</title>
|
|
6
|
+
<link rel="icon" sizes="32x32" href="favicon_32_cb_c827f16f.png">
|
|
7
|
+
<link rel="stylesheet" href="style_cb_4667309f.css" type="text/css">
|
|
8
|
+
<script src="coverage_html_cb_dd2e7eb5.js" defer></script>
|
|
9
|
+
</head>
|
|
10
|
+
<body class="indexfile">
|
|
11
|
+
<header>
|
|
12
|
+
<div class="content">
|
|
13
|
+
<h1>Coverage report:
|
|
14
|
+
<span class="pc_cov">100%</span>
|
|
15
|
+
</h1>
|
|
16
|
+
<aside id="help_panel_wrapper">
|
|
17
|
+
<input id="help_panel_state" type="checkbox">
|
|
18
|
+
<label for="help_panel_state">
|
|
19
|
+
<img id="keyboard_icon" src="keybd_closed_cb_900cfef5.png" alt="Show/hide keyboard shortcuts">
|
|
20
|
+
</label>
|
|
21
|
+
<div id="help_panel">
|
|
22
|
+
<p class="legend">Shortcuts on this page</p>
|
|
23
|
+
<div class="keyhelp">
|
|
24
|
+
<p>
|
|
25
|
+
<kbd>f</kbd>
|
|
26
|
+
<kbd>n</kbd>
|
|
27
|
+
<kbd>s</kbd>
|
|
28
|
+
<kbd>m</kbd>
|
|
29
|
+
<kbd>x</kbd>
|
|
30
|
+
<kbd>c</kbd>
|
|
31
|
+
change column sorting
|
|
32
|
+
</p>
|
|
33
|
+
<p>
|
|
34
|
+
<kbd>[</kbd>
|
|
35
|
+
<kbd>]</kbd>
|
|
36
|
+
prev/next file
|
|
37
|
+
</p>
|
|
38
|
+
<p>
|
|
39
|
+
<kbd>?</kbd> show/hide this help
|
|
40
|
+
</p>
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
</aside>
|
|
44
|
+
<form id="filter_container">
|
|
45
|
+
<input id="filter" type="text" value="" placeholder="filter...">
|
|
46
|
+
<div>
|
|
47
|
+
<input id="hide100" type="checkbox" >
|
|
48
|
+
<label for="hide100">hide covered</label>
|
|
49
|
+
</div>
|
|
50
|
+
</form>
|
|
51
|
+
<h2>
|
|
52
|
+
<a class="button" href="index.html">Files</a>
|
|
53
|
+
<a class="button" href="function_index.html">Functions</a>
|
|
54
|
+
<a class="button current">Classes</a>
|
|
55
|
+
</h2>
|
|
56
|
+
<p class="text">
|
|
57
|
+
<a class="nav" href="https://coverage.readthedocs.io/en/7.14.1">coverage.py v7.14.1</a>,
|
|
58
|
+
created at 2026-06-20 20:05 +0800
|
|
59
|
+
</p>
|
|
60
|
+
</div>
|
|
61
|
+
</header>
|
|
62
|
+
<main id="index">
|
|
63
|
+
<table class="index" data-sortable>
|
|
64
|
+
<thead>
|
|
65
|
+
<tr class="tablehead" title="Click to sort">
|
|
66
|
+
<th id="file" class="name" aria-sort="none" data-shortcut="f">File<span class="arrows"></span></th>
|
|
67
|
+
<th id="region" class="name" aria-sort="none" data-default-sort-order="ascending" data-shortcut="n">class<span class="arrows"></span></th>
|
|
68
|
+
<th class="spacer"> </th>
|
|
69
|
+
<th id="statements" aria-sort="none" data-default-sort-order="descending" data-shortcut="s">statements<span class="arrows"></span></th>
|
|
70
|
+
<th id="missing" aria-sort="none" data-default-sort-order="descending" data-shortcut="m">missing<span class="arrows"></span></th>
|
|
71
|
+
<th id="excluded" aria-sort="none" data-default-sort-order="descending" data-shortcut="x">excluded<span class="arrows"></span></th>
|
|
72
|
+
<th class="spacer"> </th>
|
|
73
|
+
<th id="coverage" aria-sort="none" data-shortcut="c">coverage<span class="arrows"></span></th>
|
|
74
|
+
</tr>
|
|
75
|
+
</thead>
|
|
76
|
+
<tbody>
|
|
77
|
+
<tr class="region">
|
|
78
|
+
<td class="name"><a href="z_581a990e2fe7e610___init___py.html">src<span class="sep">/</span>kimi_code_usage<span class="sep">/</span>__init__.py</a></td>
|
|
79
|
+
<td class="name"><a href="z_581a990e2fe7e610___init___py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
|
|
80
|
+
<td class="spacer"> </td>
|
|
81
|
+
<td>0</td>
|
|
82
|
+
<td>0</td>
|
|
83
|
+
<td>0</td>
|
|
84
|
+
<td class="spacer"> </td>
|
|
85
|
+
<td data-ratio="0 0">100%</td>
|
|
86
|
+
</tr>
|
|
87
|
+
<tr class="region">
|
|
88
|
+
<td class="name"><a href="z_581a990e2fe7e610_config_py.html#t9">src<span class="sep">/</span>kimi_code_usage<span class="sep">/</span>config.py</a></td>
|
|
89
|
+
<td class="name"><a href="z_581a990e2fe7e610_config_py.html#t9"><data value='ProviderConfig'>ProviderConfig</data></a></td>
|
|
90
|
+
<td class="spacer"> </td>
|
|
91
|
+
<td>0</td>
|
|
92
|
+
<td>0</td>
|
|
93
|
+
<td>0</td>
|
|
94
|
+
<td class="spacer"> </td>
|
|
95
|
+
<td data-ratio="0 0">100%</td>
|
|
96
|
+
</tr>
|
|
97
|
+
<tr class="region">
|
|
98
|
+
<td class="name"><a href="z_581a990e2fe7e610_config_py.html#t16">src<span class="sep">/</span>kimi_code_usage<span class="sep">/</span>config.py</a></td>
|
|
99
|
+
<td class="name"><a href="z_581a990e2fe7e610_config_py.html#t16"><data value='AppConfig'>AppConfig</data></a></td>
|
|
100
|
+
<td class="spacer"> </td>
|
|
101
|
+
<td>1</td>
|
|
102
|
+
<td>0</td>
|
|
103
|
+
<td>0</td>
|
|
104
|
+
<td class="spacer"> </td>
|
|
105
|
+
<td data-ratio="1 1">100%</td>
|
|
106
|
+
</tr>
|
|
107
|
+
<tr class="region">
|
|
108
|
+
<td class="name"><a href="z_581a990e2fe7e610_config_py.html#t31">src<span class="sep">/</span>kimi_code_usage<span class="sep">/</span>config.py</a></td>
|
|
109
|
+
<td class="name"><a href="z_581a990e2fe7e610_config_py.html#t31"><data value='ConfigResolver'>ConfigResolver</data></a></td>
|
|
110
|
+
<td class="spacer"> </td>
|
|
111
|
+
<td>70</td>
|
|
112
|
+
<td>0</td>
|
|
113
|
+
<td>0</td>
|
|
114
|
+
<td class="spacer"> </td>
|
|
115
|
+
<td data-ratio="70 70">100%</td>
|
|
116
|
+
</tr>
|
|
117
|
+
<tr class="region">
|
|
118
|
+
<td class="name"><a href="z_581a990e2fe7e610_config_py.html">src<span class="sep">/</span>kimi_code_usage<span class="sep">/</span>config.py</a></td>
|
|
119
|
+
<td class="name"><a href="z_581a990e2fe7e610_config_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
|
|
120
|
+
<td class="spacer"> </td>
|
|
121
|
+
<td>50</td>
|
|
122
|
+
<td>0</td>
|
|
123
|
+
<td>0</td>
|
|
124
|
+
<td class="spacer"> </td>
|
|
125
|
+
<td data-ratio="50 50">100%</td>
|
|
126
|
+
</tr>
|
|
127
|
+
<tr class="region">
|
|
128
|
+
<td class="name"><a href="z_581a990e2fe7e610_main_py.html">src<span class="sep">/</span>kimi_code_usage<span class="sep">/</span>main.py</a></td>
|
|
129
|
+
<td class="name"><a href="z_581a990e2fe7e610_main_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
|
|
130
|
+
<td class="spacer"> </td>
|
|
131
|
+
<td>657</td>
|
|
132
|
+
<td>0</td>
|
|
133
|
+
<td>14</td>
|
|
134
|
+
<td class="spacer"> </td>
|
|
135
|
+
<td data-ratio="657 657">100%</td>
|
|
136
|
+
</tr>
|
|
137
|
+
<tr class="region">
|
|
138
|
+
<td class="name"><a href="z_581a990e2fe7e610_mcp_py.html">src<span class="sep">/</span>kimi_code_usage<span class="sep">/</span>mcp.py</a></td>
|
|
139
|
+
<td class="name"><a href="z_581a990e2fe7e610_mcp_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
|
|
140
|
+
<td class="spacer"> </td>
|
|
141
|
+
<td>121</td>
|
|
142
|
+
<td>0</td>
|
|
143
|
+
<td>0</td>
|
|
144
|
+
<td class="spacer"> </td>
|
|
145
|
+
<td data-ratio="121 121">100%</td>
|
|
146
|
+
</tr>
|
|
147
|
+
<tr class="region">
|
|
148
|
+
<td class="name"><a href="z_aaf3485d2243f1af___init___py.html#t8">src<span class="sep">/</span>kimi_code_usage<span class="sep">/</span>providers<span class="sep">/</span>__init__.py</a></td>
|
|
149
|
+
<td class="name"><a href="z_aaf3485d2243f1af___init___py.html#t8"><data value='ModelUsage'>ModelUsage</data></a></td>
|
|
150
|
+
<td class="spacer"> </td>
|
|
151
|
+
<td>0</td>
|
|
152
|
+
<td>0</td>
|
|
153
|
+
<td>0</td>
|
|
154
|
+
<td class="spacer"> </td>
|
|
155
|
+
<td data-ratio="0 0">100%</td>
|
|
156
|
+
</tr>
|
|
157
|
+
<tr class="region">
|
|
158
|
+
<td class="name"><a href="z_aaf3485d2243f1af___init___py.html#t18">src<span class="sep">/</span>kimi_code_usage<span class="sep">/</span>providers<span class="sep">/</span>__init__.py</a></td>
|
|
159
|
+
<td class="name"><a href="z_aaf3485d2243f1af___init___py.html#t18"><data value='DailyUsage'>DailyUsage</data></a></td>
|
|
160
|
+
<td class="spacer"> </td>
|
|
161
|
+
<td>0</td>
|
|
162
|
+
<td>0</td>
|
|
163
|
+
<td>0</td>
|
|
164
|
+
<td class="spacer"> </td>
|
|
165
|
+
<td data-ratio="0 0">100%</td>
|
|
166
|
+
</tr>
|
|
167
|
+
<tr class="region">
|
|
168
|
+
<td class="name"><a href="z_aaf3485d2243f1af___init___py.html#t25">src<span class="sep">/</span>kimi_code_usage<span class="sep">/</span>providers<span class="sep">/</span>__init__.py</a></td>
|
|
169
|
+
<td class="name"><a href="z_aaf3485d2243f1af___init___py.html#t25"><data value='ActivityTotals'>ActivityTotals</data></a></td>
|
|
170
|
+
<td class="spacer"> </td>
|
|
171
|
+
<td>0</td>
|
|
172
|
+
<td>0</td>
|
|
173
|
+
<td>0</td>
|
|
174
|
+
<td class="spacer"> </td>
|
|
175
|
+
<td data-ratio="0 0">100%</td>
|
|
176
|
+
</tr>
|
|
177
|
+
<tr class="region">
|
|
178
|
+
<td class="name"><a href="z_aaf3485d2243f1af___init___py.html#t34">src<span class="sep">/</span>kimi_code_usage<span class="sep">/</span>providers<span class="sep">/</span>__init__.py</a></td>
|
|
179
|
+
<td class="name"><a href="z_aaf3485d2243f1af___init___py.html#t34"><data value='ProviderUsage'>ProviderUsage</data></a></td>
|
|
180
|
+
<td class="spacer"> </td>
|
|
181
|
+
<td>0</td>
|
|
182
|
+
<td>0</td>
|
|
183
|
+
<td>0</td>
|
|
184
|
+
<td class="spacer"> </td>
|
|
185
|
+
<td data-ratio="0 0">100%</td>
|
|
186
|
+
</tr>
|
|
187
|
+
<tr class="region">
|
|
188
|
+
<td class="name"><a href="z_aaf3485d2243f1af___init___py.html">src<span class="sep">/</span>kimi_code_usage<span class="sep">/</span>providers<span class="sep">/</span>__init__.py</a></td>
|
|
189
|
+
<td class="name"><a href="z_aaf3485d2243f1af___init___py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
|
|
190
|
+
<td class="spacer"> </td>
|
|
191
|
+
<td>71</td>
|
|
192
|
+
<td>0</td>
|
|
193
|
+
<td>0</td>
|
|
194
|
+
<td class="spacer"> </td>
|
|
195
|
+
<td data-ratio="71 71">100%</td>
|
|
196
|
+
</tr>
|
|
197
|
+
<tr class="region">
|
|
198
|
+
<td class="name"><a href="z_aaf3485d2243f1af_anthropic_py.html">src<span class="sep">/</span>kimi_code_usage<span class="sep">/</span>providers<span class="sep">/</span>anthropic.py</a></td>
|
|
199
|
+
<td class="name"><a href="z_aaf3485d2243f1af_anthropic_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
|
|
200
|
+
<td class="spacer"> </td>
|
|
201
|
+
<td>19</td>
|
|
202
|
+
<td>0</td>
|
|
203
|
+
<td>0</td>
|
|
204
|
+
<td class="spacer"> </td>
|
|
205
|
+
<td data-ratio="19 19">100%</td>
|
|
206
|
+
</tr>
|
|
207
|
+
<tr class="region">
|
|
208
|
+
<td class="name"><a href="z_aaf3485d2243f1af_kimi_py.html#t67">src<span class="sep">/</span>kimi_code_usage<span class="sep">/</span>providers<span class="sep">/</span>kimi.py</a></td>
|
|
209
|
+
<td class="name"><a href="z_aaf3485d2243f1af_kimi_py.html#t67"><data value='KimiRow'>KimiRow</data></a></td>
|
|
210
|
+
<td class="spacer"> </td>
|
|
211
|
+
<td>5</td>
|
|
212
|
+
<td>0</td>
|
|
213
|
+
<td>0</td>
|
|
214
|
+
<td class="spacer"> </td>
|
|
215
|
+
<td data-ratio="5 5">100%</td>
|
|
216
|
+
</tr>
|
|
217
|
+
<tr class="region">
|
|
218
|
+
<td class="name"><a href="z_aaf3485d2243f1af_kimi_py.html">src<span class="sep">/</span>kimi_code_usage<span class="sep">/</span>providers<span class="sep">/</span>kimi.py</a></td>
|
|
219
|
+
<td class="name"><a href="z_aaf3485d2243f1af_kimi_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
|
|
220
|
+
<td class="spacer"> </td>
|
|
221
|
+
<td>118</td>
|
|
222
|
+
<td>0</td>
|
|
223
|
+
<td>0</td>
|
|
224
|
+
<td class="spacer"> </td>
|
|
225
|
+
<td data-ratio="118 118">100%</td>
|
|
226
|
+
</tr>
|
|
227
|
+
<tr class="region">
|
|
228
|
+
<td class="name"><a href="z_aaf3485d2243f1af_openai_py.html">src<span class="sep">/</span>kimi_code_usage<span class="sep">/</span>providers<span class="sep">/</span>openai.py</a></td>
|
|
229
|
+
<td class="name"><a href="z_aaf3485d2243f1af_openai_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
|
|
230
|
+
<td class="spacer"> </td>
|
|
231
|
+
<td>42</td>
|
|
232
|
+
<td>0</td>
|
|
233
|
+
<td>0</td>
|
|
234
|
+
<td class="spacer"> </td>
|
|
235
|
+
<td data-ratio="42 42">100%</td>
|
|
236
|
+
</tr>
|
|
237
|
+
<tr class="region">
|
|
238
|
+
<td class="name"><a href="z_aaf3485d2243f1af_openrouter_py.html">src<span class="sep">/</span>kimi_code_usage<span class="sep">/</span>providers<span class="sep">/</span>openrouter.py</a></td>
|
|
239
|
+
<td class="name"><a href="z_aaf3485d2243f1af_openrouter_py.html"><data value=''><span class='no-noun'>(no class)</span></data></a></td>
|
|
240
|
+
<td class="spacer"> </td>
|
|
241
|
+
<td>167</td>
|
|
242
|
+
<td>0</td>
|
|
243
|
+
<td>4</td>
|
|
244
|
+
<td class="spacer"> </td>
|
|
245
|
+
<td data-ratio="167 167">100%</td>
|
|
246
|
+
</tr>
|
|
247
|
+
</tbody>
|
|
248
|
+
<tfoot>
|
|
249
|
+
<tr class="total">
|
|
250
|
+
<td class="name">Total</td>
|
|
251
|
+
<td class="name"> </td>
|
|
252
|
+
<td class="spacer"> </td>
|
|
253
|
+
<td>1321</td>
|
|
254
|
+
<td>0</td>
|
|
255
|
+
<td>18</td>
|
|
256
|
+
<td class="spacer"> </td>
|
|
257
|
+
<td data-ratio="1321 1321">100%</td>
|
|
258
|
+
</tr>
|
|
259
|
+
</tfoot>
|
|
260
|
+
</table>
|
|
261
|
+
<p id="no_rows">
|
|
262
|
+
No items found using the specified filter.
|
|
263
|
+
</p>
|
|
264
|
+
</main>
|
|
265
|
+
<footer>
|
|
266
|
+
<div class="content">
|
|
267
|
+
<p>
|
|
268
|
+
<a class="nav" href="https://coverage.readthedocs.io/en/7.14.1">coverage.py v7.14.1</a>,
|
|
269
|
+
created at 2026-06-20 20:05 +0800
|
|
270
|
+
</p>
|
|
271
|
+
</div>
|
|
272
|
+
<aside class="hidden">
|
|
273
|
+
<a id="prevFileLink" class="nav" href=""></a>
|
|
274
|
+
<a id="nextFileLink" class="nav" href=""></a>
|
|
275
|
+
<button type="button" class="button_prev_file" data-shortcut="["></button>
|
|
276
|
+
<button type="button" class="button_next_file" data-shortcut="]"></button>
|
|
277
|
+
<button type="button" class="button_show_hide_help" data-shortcut="?"></button>
|
|
278
|
+
</aside>
|
|
279
|
+
</footer>
|
|
280
|
+
</body>
|
|
281
|
+
</html>
|