diff --git a/AGENTS.md b/AGENTS.md index fb1ac4b..57ca605 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -2,9 +2,9 @@ ## 项目概述 -Android(Jetpack Compose + Kotlin)APP,统一查询 DeepSeek、OpenCode Go、CommandCode Go、Codex / ChatGPT Plus 的余额/配额。 +Android(Jetpack Compose + Kotlin)APP,统一查询 DeepSeek、OpenCode Go、CommandCode Go、Codex / ChatGPT Plus、Ollama Pro 的余额/配额。 DeepSeek 走 REST API,OpenCode Go 通过 OkHttp 抓取 dashboard HTML 解析 SSR hydration 数据。 -CommandCode Go 走 JSON API 抓取用量数据,Codex / ChatGPT Plus 通过 auth.json 刷新 token 后查询 wham 用量。APP 名为「雨晴Token」(粉色调品牌),配套桌面小组件。 +CommandCode Go 走 JSON API 抓取用量数据,Codex / ChatGPT Plus 通过 auth.json 刷新 token 后查询 wham 用量。Ollama Pro 通过 Cookie 抓取 settings 页 HTML 解析用量百分比。APP 名为「雨晴Token」(粉色调品牌),配套桌面小组件。 ## 技术栈 @@ -24,6 +24,7 @@ CommandCode Go 走 JSON API 抓取用量数据,Codex / ChatGPT Plus 通过 aut - ✅ OpenCode Go — OkHttp 抓 dashboard HTML,解析 `rollingUsage`/`weeklyUsage`/`monthlyUsage` - ✅ CommandCode Go — JSON API 抓取用量数据,`CommandCodeUsageRepository` 解析(workspaceId = `"commandcode"`) - ✅ Codex / ChatGPT Plus — 粘贴完整 auth.json(含 refresh_token),调 `chatgpt.com/backend-api/wham/usage`;token 过期前 60 分钟自动刷新 +- ✅ Ollama Pro — Cookie 认证,OkHttp 抓 `ollama.com/settings` HTML,正则解析 plan/session(5h)/weekly 百分比 + `data-time` 重置时间 + `data-model` 模型级请求次数;无官方 API(ollama/ollama#12532) - ✅ 文案统一:所有服务标签均使用中文("每周"统一代替 "weekly"/"Weekly"/"weekly") - ❌ OpenCode Zen / 小米 MiMo — 未实现 @@ -39,7 +40,7 @@ CommandCode Go 走 JSON API 抓取用量数据,Codex / ChatGPT Plus 通过 aut **凭据回显红线**: > ⚠️ `CredentialEditViewModel.load()` 首次加载已有凭据时,需针对每种 `Credential` 子类显式编写回显分支。 -> 当前覆盖:`ApiKeyCredential`(API Key 输入框)、`SessionCredential`(Cookie 输入框)、`CodexCredential`(auth.json 输入框)。 +> 当前覆盖:`ApiKeyCredential`(API Key 输入框)、`SessionCredential`(Cookie 输入框 / `ollamaCookie` 字段)、`CodexCredential`(auth.json 输入框)。 > 新增凭据类型(如 OpenCode Zen / MiMo)时必须同步添加对应的 `load()` 回显分支,否则用户保存后看不到已存内容。 **ViewModel 加载机制红线**: @@ -60,7 +61,7 @@ CommandCode Go 走 JSON API 抓取用量数据,Codex / ChatGPT Plus 通过 aut **首页布局**: > Dashboard 使用 `PullToRefreshBox` → `Column` + `verticalScroll`(非 `LazyColumn`)。 -> 页面仅 7 个 item,`LazyColumn` 的 dispose/recompose 会导致用量卡片的 `LaunchedEffect` 反复触发,产生卡顿。 +> 页面仅 8 个 item,`LazyColumn` 的 dispose/recompose 会导致用量卡片的 `LaunchedEffect` 反复触发,产生卡顿。 > > **自适应断点**:容器宽度 > 600dp 时卡片双列(`BoxWithConstraints`),≤600dp 时单列。 > OCGO / CCGO 服务余额卡底部均提供「查看用量详情」入口,未配置凭据时不显示。 @@ -110,7 +111,7 @@ Expanded(平板,≥840dp): **桌面小组件(Widget)**: - 显示当前选中服务的用量+DeepSeek 余额 -- 支持三服务切换:OCGO / CCGO / Codex(右上角 ↻ 按钮旁的切换按钮循环切换) +- 支持四服务切换:OCGO / CCGO / Codex / Ollama(右上角 ↻ 按钮旁的切换按钮循环切换) - 右上角 ↻ 手动刷新按钮(后台广播 → `WidgetRefreshReceiver` → EntryPoints 获取 `RefreshBalanceUseCase`) - 刷新逻辑:只刷新当前选中服务 + DeepSeek,不再串行刷全部服务;25s 超时保护;`isRefreshing` 互斥锁防连续点击 - 点击刷新后立即更新 Widget 右上角时间为"刷新中..."(`showRefreshing()`),再后台请求网络 @@ -149,6 +150,7 @@ DashboardViewModel.refresh() → RefreshBalanceUseCase(service) → DeepSeekRepository.fetchBalance() / OpenCodeGoRepository.fetchBalance() → CommandCodeGoRepository.fetchBalance() / CodexRepository.fetchBalance() + → OllamaRepository.fetchBalance() → BalanceCache.put(service, result) → OpenCodeGoWidgetProvider.notifyDataChanged(context) @@ -169,7 +171,7 @@ CCGO 清除按钮(详情页顶栏): Widget 刷新按钮: ↻ → PendingIntent.getBroadcast() → WidgetRefreshReceiver - → EntryPoints → RefreshBalanceUseCase(DEEPSEEK + OPENCODE_GO) + → EntryPoints → RefreshBalanceUseCase(selectedService + DEEPSEEK) → notifyDataChanged() MIUI 曝光刷新(用户划到负一屏/桌面): diff --git a/README.md b/README.md index beb8512..8186ae8 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [![Release](https://github.com/CATMIAOZHI/Rainytoken/actions/workflows/release.yml/badge.svg)](https://github.com/CATMIAOZHI/Rainytoken/actions) [![Version](https://img.shields.io/github/v/release/CATMIAOZHI/Rainytoken?color=ff85a2)](https://github.com/CATMIAOZHI/Rainytoken/releases) -Android AI 余额与用量查询 APP —— 统一查看 DeepSeek、OpenCode Go、CommandCode Go 的余额与用量配额。粉色调品牌 UI,配套桌面小组件。 +Android AI 余额与用量查询 APP —— 统一查看 DeepSeek、OpenCode Go、CommandCode Go、Codex / ChatGPT Plus、Ollama Pro 的余额与用量配额。粉色调品牌 UI,配套桌面小组件。 🐱 雨晴Token — AI Balance & Usage Quota Query | the Rainy Family tools. --- @@ -34,7 +34,7 @@ Android AI 余额与用量查询 APP —— 统一查看 DeepSeek、OpenCode Go | 📋 **详细数据** | 原始记录分页浏览,支持时间 + 模型筛选,点击查看完整字段 | | 🔍 **多粒度筛选** | 5小时 / 12小时(10分钟桶) / 24小时 / 今天 / 昨天 / 最近7天 / 当月 / 自定义日·月·范围 | | 🏷️ **模型筛选** | 多选 / 单选 / 全选,动态图例自适应换行 | -| 📱 **桌面小组件** | 不打开 APP 也能看用量;支持三服务切换(OCGO/CCGO/Codex)+ DeepSeek 余额;可拖入负一屏;划到即自动刷新(MIUI 曝光刷新) | +| 📱 **桌面小组件** | 不打开 APP 也能看用量;支持四服务切换(OCGO/CCGO/Codex/Ollama)+ DeepSeek 余额;可拖入负一屏;划到即自动刷新(MIUI 曝光刷新) | | 🔄 **自动同步** | 首页下拉自动同步用量;无缓存时启动自动全量同步;CCGO 详情页支持手动清除并重新同步 | | 🌙 **深色模式** | 全局自适应 — App 内文字/图标/背景自动切换,小组件独立适配暗色布局 | | ➕ **一键添桌面** | APP 内点 + 直接添加小组件,不用去系统列表翻 | @@ -47,7 +47,7 @@ Android AI 余额与用量查询 APP —— 统一查看 DeepSeek、OpenCode Go 前往 [Releases](https://github.com/CATMIAOZHI/Rainytoken/releases) 下载最新 APK。 -> ⚠️ 需要配置 DeepSeek API Key、OpenCode Go 登录凭据、CommandCode Go API Key 或 Codex auth.json 才能拉取数据。 +> ⚠️ 需要配置 DeepSeek API Key、OpenCode Go 登录凭据、CommandCode Go API Key、Codex auth.json 或 Ollama Pro Cookie 才能拉取数据。 --- @@ -76,8 +76,8 @@ Android AI 余额与用量查询 APP —— 统一查看 DeepSeek、OpenCode Go │ │ │ │ ┌────────────────────▼─────────────────────────┐ │ │ │ Repository + Network │ │ -│ │ DeepSeekApi(Retrofit)· OpenCodeGo 网页抓取 │ -│ │ · OpenCodeUsageRepository · CommandCodeUsageRepository · CodexRepository(OkHttp 调 chatgpt.com)│ │ +│ │ DeepSeekApi(Retrofit)· OpenCodeGo 网页抓取 +│ │ · OpenCodeUsageRepository · CommandCodeUsageRepository · CodexRepository · OllamaRepository(OkHttp)│ │ │ └────────────────────┬────────────────────────┘ │ │ │ │ │ ┌────────────────────▼─────────────────────────┐ │ @@ -100,7 +100,7 @@ Rainytoken/ │ │ ├── cache/ # BalanceCache(DataStore) │ │ ├── local/ # UsageCache(DataStore + 内存缓存)、UsageRecord、ChartBucket │ │ ├── remote/ # DeepSeekApi(Retrofit)+ OpenCodeGo 抓取 + UsageRepository -│ │ └── repository/ # DeepSeek / OpenCodeGo / CommandCode / Codex / Credential Repository +│ │ └── repository/ # DeepSeek / OpenCodeGo / CommandCode / Codex / Ollama / Credential Repository │ ├── domain/ │ │ ├── model/ # ServiceBalance、Credential 等 │ │ ├── service/ # ServiceType 枚举 @@ -161,7 +161,7 @@ chmod +x ./setup_android_env.sh | `com.squareup.retrofit2:retrofit` | DeepSeek REST API | | `com.squareup.okhttp3:okhttp` | OpenCode Go 网页抓取 | | `org.jetbrains.kotlinx:kotlinx-serialization-json` | JSON 序列化 | -| `org.jsoup:jsoup` | HTML 解析(SSR hydration 数据提取) | +| `org.jsoup:jsoup` | HTML 解析(已引入但实际未使用,HTML 解析全用正则) | | `androidx.datastore:datastore-preferences` | 本地缓存 | | `com.google.dagger:hilt-android` | 依赖注入 | | `com.google.devtools.ksp:symbol-processing-api` | KSP 注解处理 |