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.
Files changed (111) hide show
  1. kimi_code_usage-0.1.4/.github/workflows/ci.yml +42 -0
  2. kimi_code_usage-0.1.4/AGENTS.md +76 -0
  3. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/PKG-INFO +10 -2
  4. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/README.md +9 -1
  5. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/README.zh.md +9 -1
  6. kimi_code_usage-0.1.4/htmlcov/.gitignore +2 -0
  7. kimi_code_usage-0.1.4/htmlcov/class_index.html +281 -0
  8. kimi_code_usage-0.1.4/htmlcov/coverage_html_cb_dd2e7eb5.js +735 -0
  9. kimi_code_usage-0.1.4/htmlcov/favicon_32_cb_c827f16f.png +0 -0
  10. kimi_code_usage-0.1.4/htmlcov/function_index.html +771 -0
  11. kimi_code_usage-0.1.4/htmlcov/index.html +189 -0
  12. kimi_code_usage-0.1.4/htmlcov/keybd_closed_cb_900cfef5.png +0 -0
  13. kimi_code_usage-0.1.4/htmlcov/status.json +1 -0
  14. kimi_code_usage-0.1.4/htmlcov/style_cb_4667309f.css +391 -0
  15. kimi_code_usage-0.1.4/htmlcov/z_581a990e2fe7e610___init___py.html +97 -0
  16. kimi_code_usage-0.1.4/htmlcov/z_581a990e2fe7e610_config_py.html +298 -0
  17. kimi_code_usage-0.1.4/htmlcov/z_581a990e2fe7e610_main_py.html +1202 -0
  18. kimi_code_usage-0.1.4/htmlcov/z_581a990e2fe7e610_mcp_py.html +272 -0
  19. kimi_code_usage-0.1.4/htmlcov/z_aaf3485d2243f1af___init___py.html +203 -0
  20. kimi_code_usage-0.1.4/htmlcov/z_aaf3485d2243f1af_anthropic_py.html +167 -0
  21. kimi_code_usage-0.1.4/htmlcov/z_aaf3485d2243f1af_kimi_py.html +256 -0
  22. kimi_code_usage-0.1.4/htmlcov/z_aaf3485d2243f1af_openai_py.html +173 -0
  23. kimi_code_usage-0.1.4/htmlcov/z_aaf3485d2243f1af_openrouter_py.html +463 -0
  24. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/pyproject.toml +37 -1
  25. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/src/kimi_code_usage/config.py +51 -17
  26. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/src/kimi_code_usage/main.py +453 -48
  27. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/src/kimi_code_usage/mcp.py +72 -3
  28. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/src/kimi_code_usage/providers/__init__.py +48 -15
  29. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/src/kimi_code_usage/providers/anthropic.py +22 -21
  30. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/src/kimi_code_usage/providers/kimi.py +58 -11
  31. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/src/kimi_code_usage/providers/openai.py +5 -3
  32. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/src/kimi_code_usage/providers/openrouter.py +179 -72
  33. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/tests/conftest.py +2 -1
  34. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/tests/test_config.py +99 -29
  35. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/tests/test_main.py +339 -293
  36. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/tests/test_mcp.py +114 -15
  37. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/tests/test_provider_anthropic.py +6 -3
  38. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/tests/test_provider_kimi.py +8 -6
  39. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/tests/test_provider_openai.py +8 -5
  40. kimi_code_usage-0.1.4/tests/test_provider_openrouter.py +647 -0
  41. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/tests/test_providers_init.py +17 -14
  42. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/uv.lock +441 -1
  43. kimi_code_usage-0.1.2/tests/test_provider_openrouter.py +0 -442
  44. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/.claude/settings.local.json +0 -0
  45. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/.env.example +0 -0
  46. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/.gitignore +0 -0
  47. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/docs/kimi-code-usage.md +0 -0
  48. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/docs/superpowers/plans/2026-05-09-pace-indicator.md +0 -0
  49. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/docs/superpowers/plans/2026-05-14-pace-theme-thresholds.md +0 -0
  50. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/docs/superpowers/plans/2026-06-10-multi-llm-quota.md +0 -0
  51. {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
  52. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/docs/superpowers/specs/2026-05-09-pace-indicator-design.md +0 -0
  53. {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
  54. {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
  55. {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
  56. {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
  57. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/kimi_usage.code-workspace +0 -0
  58. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/requirements.txt +0 -0
  59. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/src/kimi_code_usage/__init__.py +0 -0
  60. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/tests/__init__.py +0 -0
  61. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/.claude/settings.local.json +0 -0
  62. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/.github/workflows/ci.yml +0 -0
  63. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/.prettierignore +0 -0
  64. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/.prettierrc.json +0 -0
  65. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/.vscodeignore +0 -0
  66. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/LICENSE +0 -0
  67. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/README.md +0 -0
  68. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/assets/icon.png +0 -0
  69. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/assets/moon.svg +0 -0
  70. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/eslint.config.mjs +0 -0
  71. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/l10n/bundle.l10n.de.json +0 -0
  72. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/l10n/bundle.l10n.en.json +0 -0
  73. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/l10n/bundle.l10n.es.json +0 -0
  74. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/l10n/bundle.l10n.fr.json +0 -0
  75. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/l10n/bundle.l10n.it.json +0 -0
  76. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/l10n/bundle.l10n.ja.json +0 -0
  77. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/l10n/bundle.l10n.ko.json +0 -0
  78. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/l10n/bundle.l10n.pt.json +0 -0
  79. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/l10n/bundle.l10n.ru.json +0 -0
  80. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/l10n/bundle.l10n.zh-cn.json +0 -0
  81. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/package.json +0 -0
  82. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/scripts/copy-assets.ts +0 -0
  83. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/__mocks__/vscode.ts +0 -0
  84. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/api.test.ts +0 -0
  85. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/api.ts +0 -0
  86. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/apiCache.test.ts +0 -0
  87. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/apiCache.ts +0 -0
  88. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/config.test.ts +0 -0
  89. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/config.ts +0 -0
  90. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/extension.test.ts +0 -0
  91. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/extension.ts +0 -0
  92. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/historyPanel.test.ts +0 -0
  93. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/historyPanel.ts +0 -0
  94. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/i18n.test.ts +0 -0
  95. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/i18n.ts +0 -0
  96. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/notifier.test.ts +0 -0
  97. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/notifier.ts +0 -0
  98. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/pace.test.ts +0 -0
  99. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/pace.ts +0 -0
  100. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/predict.test.ts +0 -0
  101. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/predict.ts +0 -0
  102. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/statusBar.test.ts +0 -0
  103. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/statusBar.ts +0 -0
  104. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/storage-unlink.test.ts +0 -0
  105. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/storage.test.ts +0 -0
  106. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/storage.ts +0 -0
  107. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/types.ts +0 -0
  108. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/src/vscode-mock.test.ts +0 -0
  109. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/tsconfig.eslint.json +0 -0
  110. {kimi_code_usage-0.1.2 → kimi_code_usage-0.1.4}/vscode-extension/tsconfig.json +0 -0
  111. {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.2
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
- **Prerequisite:** A [Kimi Coding Plan](https://api.kimi.com/coding/v1) API Key, set as `KIMI_API_KEY` in your environment or `.env` file.
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
- **Prerequisite:** A [Kimi Coding Plan](https://api.kimi.com/coding/v1) API Key, set as `KIMI_API_KEY` in your environment or `.env` file.
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
- **统一前提:** 在环境变量或 `.env` 文件中设置 `KIMI_API_KEY`([Kimi Coding Plan](https://api.kimi.com/coding/v1) API Key)。
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,2 @@
1
+ # Created by coverage.py
2
+ *
@@ -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
+ &nbsp; change column sorting
32
+ </p>
33
+ <p>
34
+ <kbd>[</kbd>
35
+ <kbd>]</kbd>
36
+ &nbsp; prev/next file
37
+ </p>
38
+ <p>
39
+ <kbd>?</kbd> &nbsp; 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">&nbsp;</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">&nbsp;</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">&nbsp;</td>
81
+ <td>0</td>
82
+ <td>0</td>
83
+ <td>0</td>
84
+ <td class="spacer">&nbsp;</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">&nbsp;</td>
91
+ <td>0</td>
92
+ <td>0</td>
93
+ <td>0</td>
94
+ <td class="spacer">&nbsp;</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">&nbsp;</td>
101
+ <td>1</td>
102
+ <td>0</td>
103
+ <td>0</td>
104
+ <td class="spacer">&nbsp;</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">&nbsp;</td>
111
+ <td>70</td>
112
+ <td>0</td>
113
+ <td>0</td>
114
+ <td class="spacer">&nbsp;</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">&nbsp;</td>
121
+ <td>50</td>
122
+ <td>0</td>
123
+ <td>0</td>
124
+ <td class="spacer">&nbsp;</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">&nbsp;</td>
131
+ <td>657</td>
132
+ <td>0</td>
133
+ <td>14</td>
134
+ <td class="spacer">&nbsp;</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">&nbsp;</td>
141
+ <td>121</td>
142
+ <td>0</td>
143
+ <td>0</td>
144
+ <td class="spacer">&nbsp;</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">&nbsp;</td>
151
+ <td>0</td>
152
+ <td>0</td>
153
+ <td>0</td>
154
+ <td class="spacer">&nbsp;</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">&nbsp;</td>
161
+ <td>0</td>
162
+ <td>0</td>
163
+ <td>0</td>
164
+ <td class="spacer">&nbsp;</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">&nbsp;</td>
171
+ <td>0</td>
172
+ <td>0</td>
173
+ <td>0</td>
174
+ <td class="spacer">&nbsp;</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">&nbsp;</td>
181
+ <td>0</td>
182
+ <td>0</td>
183
+ <td>0</td>
184
+ <td class="spacer">&nbsp;</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">&nbsp;</td>
191
+ <td>71</td>
192
+ <td>0</td>
193
+ <td>0</td>
194
+ <td class="spacer">&nbsp;</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">&nbsp;</td>
201
+ <td>19</td>
202
+ <td>0</td>
203
+ <td>0</td>
204
+ <td class="spacer">&nbsp;</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">&nbsp;</td>
211
+ <td>5</td>
212
+ <td>0</td>
213
+ <td>0</td>
214
+ <td class="spacer">&nbsp;</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">&nbsp;</td>
221
+ <td>118</td>
222
+ <td>0</td>
223
+ <td>0</td>
224
+ <td class="spacer">&nbsp;</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">&nbsp;</td>
231
+ <td>42</td>
232
+ <td>0</td>
233
+ <td>0</td>
234
+ <td class="spacer">&nbsp;</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">&nbsp;</td>
241
+ <td>167</td>
242
+ <td>0</td>
243
+ <td>4</td>
244
+ <td class="spacer">&nbsp;</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">&nbsp;</td>
252
+ <td class="spacer">&nbsp;</td>
253
+ <td>1321</td>
254
+ <td>0</td>
255
+ <td>18</td>
256
+ <td class="spacer">&nbsp;</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>