Android Coding Plan 用量查看工具,支持智谱 GLM / Kimi / MiniMax 多服务商多账户,App 内 + 桌面 Widget。
- 📊 多服务商聚合 — 智谱 GLM(个人版+团队版)、Kimi、MiniMax,一屏查看所有额度
- 📱 桌面 Widget — 单账户详情卡片 + 多账户列表卡片,数据一眼可见
- 🔐 本地加密存储 — API Key 经本地加密,不上传云端
- ⚡ 低频刷新策略 — 手动优先 + 30min 后台 + 前台过期刷新,降低风控风险
- 🎨 品牌化设计 — 冷光蓝青配色、mesh splash、动效系统
- 🔔 额度告警 — 两档系统通知(85% 低额度 / 100% 耗尽)
GlintAPI 让你在手机桌面快速查看 AI Coding Plan 的用量余量。配置服务商 API Key 后,通过 App 或桌面 Widget 即可查看 5 小时/周额度、工具调用额度、重置时间和使用趋势。
| 你想要... | 推荐入口 |
|---|---|
| 先看看产品能做什么 | 产品预览 |
| 快速上手 | 快速开始 |
| 理解系统结构 | 系统架构 和 能力地图 |
| 参与开发 | 开发指南 |
使用 AI Coding Plan 的开发者经常需要确认"5h 窗口/周额度还剩多少",但每次都要打开网页、登录、点好几下。GlintAPI 做了一个 Android App + 桌面小部件,配好 API Key 后,桌面一滑就能看到余量、重置时间、状态;数据本地缓存、离线仍可查看。
| 多服务商 | 桌面 Widget | 本地优先 | 告警与趋势 |
|---|---|---|---|
| GLM 个人/团队版、Kimi、MiniMax,一屏聚合 | 单账户详情 + 多账户列表卡片 | Key 本机加密,不上传云端 | 两档告警、7 天趋势图 |
| 续航主页 | 账户管理 | 设置页 |
|---|---|---|
![]() |
![]() |
![]() |
| 单账户详情 Widget | 多账户列表 Widget |
|---|---|
![]() |
![]() |
GlintAPI 采用分层架构,Provider 隔离让加服务商不动 UI/Widget/缓存:
┌─────────────────────────────────────────────────────────────────┐
│ Android App(单 Activity Compose) │
│ │
│ UI 层 (ui/) Widget 层 (widget/) │
│ ┌───────────────────┐ ┌─────────────────────────┐ │
│ │ MainActivity │ │ QuotaWidgetProvider │ │
│ │ ├ UsageScreen │ │ └ WidgetRenderer │ │
│ │ ├ AccountsScreen │ │ QuotaListWidgetProvider │ │
│ │ └ AddAccountScr │ │ └ QuotaListRemoteViews… │ │
│ └─────────┬─────────┘ │ QuotaRefreshWorker │ │
│ │ UsageViewModel │ (默认仅刷 active) │ │
│ ▼ └────────────┬────────────┘ │
│ 服务层 (services/) ───────────────────────────────────────── │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ ServiceProviderConfig 数据表 + UsageParser 归一化 │ │
│ │ glm() / glmTeam() / kimi() / minimax() │ │
│ │ AccountRepository + AccountStore(加密多账户) │ │
│ │ UsageCache(schemaV2 分键缓存) │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │ │
│ 领域层 (domain/) ── UsageSnapshot/Account/Credential/Window │
└─────────────────────────────────────────────────────────────────┘
│ HTTPS / 低频
▼
各服务商用量查询通路(实验性)
服务商支持
- 智谱 GLM(个人版 + 团队版)—
TOKENS_LIMIT5 小时/周窗口、TIME_LIMIT工具调用额度 - Kimi — Bearer 认证,
limit/remaining绝对值归一化 - MiniMax — 剩余百分比转换,支持 Cookie 鉴权历史版本
- 火山方舟 / ZenMux — 计划中(v2.3+)
数据解析与归一化
- UsageSnapshot 统一模型 —
providerId、windows[]、status、errorCode - WindowKind 枚举 —
FIVE_HOUR(5 小时)、WEEKLY(周)、TOOLS(工具调用) - 百分比归一化 — 各家上游格式统一到
0..100的usedPercent - 错误映射 —
AUTH/NETWORK/NO_PLAN/UPSTREAM_CHANGED统一错误码
多账户管理
- Account 模型 —
accountId、providerId、label、credential、isActive - 加密存储 —
EncryptedSharedPreferences(AES256)Key 加密,Keystore 不可用时安全降级 - 活跃账户切换 — per-account RefreshService,独立节流/退避/失败状态
- 账户重命名 — 自定义标签,区分同服务商多账户
Widget 与刷新
- 单账户详情 Widget — Sparkle 标题 + 服务商品牌色条 + 进度条
- 多账户列表 Widget — ListView 纵向展示 + 品牌色区分 + 无 divider 设计
- WorkManager 后台刷新 — 30min 间隔,默认仅刷 active + skip stop-code 账户
- 前台过期刷新 — App 回前台且距上次成功 ≥15min 时静默刷新
告警与趋势
- 两档系统通知 —
WARN85% 低额度、EXHAUSTED100% 耗尽、RECOVERY恢复通知 - 滞回死区 — 防重复告警,
AlertStateStore记录 armed 状态 - 通知记录 —
NotificationLogStore留存事件流(最多 100 条) - 7 天用量趋势 —
WeeklyTrendCardCanvas 折线 + Y 轴百分比 + 85% 告警线
UI 与品牌
- GlintAPI 品牌 — 冷光蓝青配色(
#3B82F6→#06B6D4)、深夜底#0E1530 - Mesh Splash — 渐变网格 + 闪烁光标动效
- 动效系统 — 刷新旋转、tab 水平 slide、pushed Fade+Scale、数字进度微动效
- 主题跟随 — 浅/深/自动,Widget 深浅色自动适配
- 空态设计 — EmptyState 方案 B(chip + icon + 文案)
- JDK 21(AGP 9.x 要求,系统默认 Java 8 不行)
- Android SDK — compileSdk 36.1 / minSdk 26 / targetSdk 36
- Gradle — 配置阿里云镜像(国内环境)
cd android
JAVA_HOME=/path/to/jdk21 ./gradlew :app:assembleDebug产物:android/app/build/outputs/apk/debug/app-debug.apk
./gradlew :app:testDebugUnitTest注意:host JVM 单测需
org.json:json依赖替代 android.jar 的 org.json stub(已在build.gradle.kts配置)
/g/AndroidSDK/platform-tools/adb devices
/g/AndroidSDK/platform-tools/adb install -r android/app/build/outputs/apk/debug/app-debug.apkGit Bash 下
adb shell带/sdcard等路径要加MSYS_NO_PATHCONV=1(防路径被转成C:/Program Files/Git/...)
| 问题 | 解决方案 |
|---|---|
Google Maven dl.google.com 不通 |
已在 settings.gradle.kts 配置阿里云镜像 |
| JDK 版本过低 | 必须用 JDK 21(AGP 9.x 强制) |
| 单测 RuntimeException | 加 testImplementation("org.json:json:20240303") |
| Git Bash adb 路径转换 | MSYS_NO_PATHCONV=1 adb shell ... |
- 打开 App,点击「开始配置」
- 选择服务商(智谱 GLM / Kimi / MiniMax)
- 选择区域(国内站/国际站,GLM 团队版仅国内站)
- 输入 API Key(GLM 团队版需三件套:Key + orgId + projectId)
- 点击「测试并保存」
安全提示:Key 仅存于本机加密存储,不会上传至开发者服务器
- commit 前:staged 里不能有
.key/.env/ 明文 token - commit 后:
git show --name-status HEAD核对文件列表 - 新增文件多时:
git check-ignore -v <关键新文件>抽查 - push:默认
--force-with-lease,不用裸--force
RemoteViews 不支持裸 <View> — 用了静默失败卡"加载中"。色条用 ImageView + setBackgroundColor。
华为 ROM ProgressBar tint 坑 — setProgressTint/setProgressBackgroundTint 未实现,调了 inflate 失败白屏。解法:进度条颜色只用 XML 静态值。
按 provider-integrator agent 契约:
ServiceProviderConfig加工厂函数(newProvider())UsageParser加parseXxx()函数- 单测验证全链路(URL、认证头、错误映射、解析)
android/app/src/main/java/com/example/myapplication/
├─ MainActivity.kt # 单 Activity + Compose 路由 + 生命周期
├─ GlintSplash.kt # GlintAPI 品牌 splash(mesh 渐变 + 闪烁光标)
├─ domain/
│ └─ Models.kt # UsageSnapshot/Account/Credential/Window
├─ services/
│ ├─ ServiceProviders.kt # ServiceProviderConfig 数据表 + 注册表
│ ├─ UsageParser.kt # parseGlm/parseKimi/parseMiniMax
│ ├─ UsageProvider.kt # HttpExecutor/HttpResponse/Region
│ ├─ OkHttpExecutor.kt # OkHttp 实现
│ ├─ ErrorMapper.kt # 错误映射
│ ├─ AccountStore.kt # 加密多账户存储
│ ├─ AccountRepository.kt # 读 facade(active 选择 + 缓存读取)
│ ├─ UsageCache.kt # schemaV2 缓存
│ ├─ SettingsStore.kt # 非敏感设置
│ └─ UsageRefreshService.kt # per-account 编排
├─ ui/
│ ├─ UsageViewModel.kt # 多账户 ViewModel + notifyWidgets
│ ├─ Navigation.kt # Tab/PushedScreen 枚举
│ ├─ EmptyState.kt # 空态方案B
│ ├─ Snackbar.kt # GlintSnackbar 分级
│ └─ theme/ # Compose 主题(NordVPN 蓝 + GlintAPI 品牌)
└─ widget/
├─ QuotaWidgetProvider.kt # 单账户详情 widget
├─ QuotaListWidgetProvider.kt # 多账户列表 widget
├─ QuotaListRemoteViewsService.kt # 列表 widget RemoteViewsService
└─ QuotaRefreshWorker.kt # WorkManager 后台刷新
| 文档 | 内容 |
|---|---|
| PRODUCT.md | 产品需求(PRD) |
| ARCHITECTURE.md | 架构设计 |
| ROADMAP.md | 路线图(v1.1 → v3.9.0) |
| REVIEW.md | 项目审阅与关键决策 |
本项目为开源学习交流用途,通过用户自己的 API Key 查询各家服务商套餐用量,不收集、不上传、不存储任何凭据至开发者服务器。各用量查询端点均为非公开 / 实验性接口,可能随上游规则变化而失效。本项目不隶属于智谱、月之暗面、MiniMax 等任何服务商。如本项目侵犯了任何服务商权益,请提 issue 联系移除。




