@astroheep/pi-quota (英语)
Pi的契约配额状态: Codex, Kimi, OpenCode Go和DeepSeek在框外工作;新Api,Sub2API和YesCode使用明确的提供方绑定.
pi install npm:@astrosheep/pi-quota
安装或更改设置后重新装入 Pi 。 使用 /usage 以持续、无上下文的方式提供拥有配额数据的提供者的快照,包括目前的数据。 使用 /usage --all 检查供应商错误。 自动页脚投票从不添加聊天项目 .
显示什么
| 仁爱 | 页脚 | /usage |
|---|---|---|
| 已知使用期限 | 5h [▆] 72% ↺ 2h15m | 水平栏、剩余百分比、重置、可用的确切数额 |
| 钱包 | Bal $12.34 | 与限额和开支分开 |
| 数额限制,没有规定期限 | Key quota [▇] $85.00 | 剩余百分比加上准确的剩余/使用/上限 |
| 无限制限制 | Key quota ∞ | 无限制,没有假钱或百分比 |
| 开支 | 未显示 | 今天的费用;终生时间保留在数据中,没有显示 |
百分比总是意味着 剩余,没有使用。 未知为 [?] ?; 过期的重设为 ↺ due 并隐藏 Stale 百分比,直到下一个成功查询。 钱包余额永远不会变成百分比 。 历史开支不是配额.
页脚显示每个平衡,然后按适配器顺序限制,默认上限为2个——设置 quotaUsage.footerWindows 改为正整数或 "all" ——然后是 +N 对于它没有显示的限制,只针对目前的提供者。 共同限制比范围限制更可取,因此范围限制可以算入 +N。 。 。 . /usage 查询所有已配置的支持提供者,并显示按提供者分组的每个余额、限制和“今日”开支条目;它不打开模式,也不向模型发送信息。 捕捉时快照仍被冻结 瞬间查询失败(网络,超时,速率限制或服务出错)将最后一个成功值保存在页脚中. 一个暗淡 ? 仅出现过一次该快照至少5分钟,并在成功刷新后消失。 没有缓存数据的失败, 或者 auth/ config/schema 错误, 则显示错误 . /usage --all 仍然报告查询失败.
配置提供者
在全局中添加约束 ~/.pi/agent/settings.json 下级 quotaUsage (不是项目设置):
{
"quotaUsage": {
"providers": {
"my-sub2api": { "adapter": "sub2api" },
"my-new-api": { "adapter": "new-api", "quotaPerUnit": 500000, "currency": "USD" },
"deepseek": { "adapter": "deepseek" },
"opencode-go-2": { "adapter": "opencode-go" },
"yes-vg": { "adapter": "yescode", "username": "[email protected]", "password": "..." },
"my-script": { "adapter": "exec", "command": ["my-quota-cli", "--json"], "label": "My Script" },
"my-alias": { "adapter": "alias", "of": "my-sub2api" }
}
}
}
使用 准确的 Pi 提供者 ID. 询问内置的提供者和明确绑定的提供者;明确装订用相同的ID取代内置的适配器。 未知的密钥或适配器选项被拒绝 。 API 密钥出自 Pi 的提供者 auth,端点出自提供者所注册的模型; 不要将模型 API 密钥放入 quotaUsage。 。 。 .
| 适配器 | 终点 | 结果 |
|---|---|---|
sub2api | {baseUrl}/usage | 钱包、密钥配额、费率窗口或订阅日/周/月窗口; API-key Today/Lifetime 实际支出 |
new-api | 账户 PAT /api/user/self,返回键入式计费/端点 | 账户余额+终生支出;密钥限制(无限或无限),没有发明续作 |
deepseek | 公务 /user/balance | 所有报告的货币余额;无发明支出 |
opencode-go | 公务 https://opencode.ai/zen/go/v1/usage | 5h/1w/30d 窗口,与内置窗口相同 opencode-go 适配器 |
yescode | co.yes.vg 登录 会话 /api/v1/auth/profile + 键 /api/v1/user/balance | 单独订户/现收现付余额加范围订户限额 |
exec | 运行 command 作为 argv(无外壳), 将 stdout 当作一个 QuotaSnapshot 贾森 | 不论指挥报告如何; fetchedAt 由适配器盖章,绝不由命令盖章 |
alias | 无终点——出席大会的代表 of 约束(内置或明示) | 共享目标账户的配额; 一行折叠 /usage |
捆绑 opencode-go 到第二个 OpenCode Go 账户: 注册为自己的 Pi 提供者 models.json 拥有自己的 apiKey (例如:. opencode-go-2然后把身份证绑在这里 内置 opencode-go 绑定是隐含的,不需要输入; 保留的ID openai-codex, (中文(简体) ), kimi-coding 财务报告和审定财务报表 opencode-go 不能反弹.
Sub2API 不接受额外的设置;它保存了部署子路径. 仅限利率的密钥不需要暴露出顶级货币(汇率为美元)。 未知的速率窗口持续时间和无效限制失败, 而不是发明出 1d 窗口 。 未加上限的订阅时间省略。 每周重播时使用所报内容 weekly_window_start 加上7天;每日/月重播仍然未知,因为这个端点没有提供相应的锚或服务器时区. 它的仪表板 /api/v1/usage 是一个单独的, JWT 认证的相接请求日志; 适配器使用 API 键 /v1/usage 换句话说.
对于新阿皮, quotaPerUnit 默认为 500000, (中文(简体) ), currency 改为 USD可选添加 dashboardAccessToken (控制台系统访问符)和 dashboardUserId (一些老叉子要求的正数ID)给供应商. 这个PAT是 仅限 设置中可选保密 。 账号端点优先;出错会回溯到按键本地计费和符号使用路径. 没有 PAT, API 键不能读取仪表板账户配额 。 有限的关键报告只有当 total_granted (b) 其限值保留了精确的用入/保留在 amounts.limit: null 和一个未知的百分比。 它永远不会变成钱包. unlimited_quota 和遗产账单的无限 哨兵变成无限 限制而不是无限的平衡 设置和服务器出错机构的值从未被登录 .
对于YesCode, username 是账户电子邮件和 password 账户密码; 两者都留在全局 settings.json,这是这个适配器的取舍。 YesCode 拒绝账户端点上的 API 密钥( “ 需要用户会话或 JWT ”) , 因此适配器日志通过 /api/v1/auth/login,将发行的cookie/JWT缓存到内存~23小时,并在认证失败时重新登录一次。 模型 cr_ 密钥从不发送到账户的端点; 它只将提供者钉入到官员身上 co.yes.vg 源代码。 订阅和现收现付余额仍然分开;只有在账户实际设有这些上限时,才列出每日/每周限额。 仅保留明确报告的下一次重置; last_*_reset 没有确定未来的时间表.
Exec 在没有 shell 的情况下运行配置的 argv, 并将 stdout 描述为 JSON 对象, 并需要 balances, (中文(简体) ), limits 财务报告和审定财务报表 spending 数组——每个适配器产生的相同的计划,由控制器执行. 这是一个 断开查询/执行合同迁移页:1 windows, (中文(简体) ), balance, (中文(简体) ), allowance 财务报告和审定财务报表 spend 字段被拒绝,而不是转换. fetchedAt 由适配器盖章; 命令的值被忽略。 控制器将每个查询(10s default)绑定,在超时时杀死了孩子;非零出局,无法读取的JSON和超过256KB的输出会成为出错,命令输出永远不会被登录. 这孩子继承了皮的环境,所以在阴道中保守秘密,而不是在 quotaUsage。 。 。 .
将第二个提供者ID绑定在同一账户: "of" 名称真正的绑定,它可以是内置的或明确的适配器。 其别名从不自问——关于别名的会话显示目标在页脚上的配额,在目标的身份和证书下被询问,以及 /usage 将别名折叠到目标单行中,并随同折叠后的会话针(和 ). 异想天开 of 目标没有配置的别名显然失效而不是消失.
认证配额 URL 必须使用 HTTPS, 但本地部署的 HTTP 回放除外 。 URL用户信息,查询字符串,片段和HTTP重定向被拒绝;证书从不跟随重定向. 固定的官方终点拒绝自定义起源. 没有浏览器 cookie 刮取或认证发现 .
建筑
Pi model/auth → adapter → QuotaSnapshot → controller → footer / /usage / state event
src/query/: 协议特定解析,认证解析,安全URL,被绑定的GET客户端,状态验证和控制器. 没有Pi/TUI进口.src/config.ts:严格的全球供应商约束.src/bar/:纯紧凑渲染和持续多供应商聊天卡.src/extension.ts财务报告和审定财务报表src/index.ts: Pi生命周期和Auth桥.
QuotaSnapshot 保留三个独立的概念: balances (自有钱), limits (定期和非定期津贴) spending (已报告支出,不一定是钱包借项或限制消费)。 Pi 提供者只选择/宾入适配器;模型没有添加推断出的所有者/账户图. 自定义适配器可以传递到 createQuotaExtension({ adapters: [...] }); 见 examples/custom-provider.ts. 提供者的别名永远不会被推断出来.
扩展会公布结构状态( O) : quota-bar:state:v2 并保存使用卡 quota-bar:usage:v2;旧的合同事件/卡不迁移。 使用 createQuotaExtension({ footer: false }) 在不使用此扩展页脚的情况下消耗它。 正常的查询会被节制,可以被取消,超时被限制,出错后被后退. /usage 强制查询每个已配置的辅助提供者,然后从默认视图中省略失败的结果。 切换提供者立即丢弃旧页脚值 .
快照计划
以下所有类型均以下列出口命名: @astrosheep/pi-quota/query数字 :
interface Balance {
id: string;
label: string;
currency: string;
remaining: number;
}
interface LimitAmounts {
unit: string;
limit: number | null;
used: number;
remaining: number;
}
interface UsageLimit {
id: string;
label: string;
scope?: string;
remainingPercent: number | null;
resetAt: number | null;
durationSeconds?: number;
amounts?: LimitAmounts;
unlimited?: true;
}
interface Spending {
id: string;
label: string;
currency: string;
amount: number;
period: 'today' | 'lifetime';
}
interface QuotaSnapshot {
balances: Balance[];
limits: UsageLimit[];
spending: Spending[];
fetchedAt: number;
}
- 所有三个阵列都需要,每个阵列最多有64个条目。 只花费快照是有效的;全空快照不是有效的.
- ID是非空白的,无控制字符串,最多64个字符,独一无二 每一类别它们是不透明的,保存得非常准确,从未从持续时间中衍生出来:
5h不同身份证的限制仍然不同。 标签/镜片/单元为终端安全进行消毒,被修剪并被限定为64个字符;空白值被拒. - 货币是三字母大写代码. 平衡是有限的,包括零债务和负债务。 它们不能是无限的.
- 百分比是2004年的限值
[0, 100]永远 剩余· ;null意为未知. 准确数额和提供者百分比在四舍五入或具体提供者核算后无需商定.limit非阴性或null(上限未报告);used(a) 非负性;remaining有限且可能是负数。 金额单位可以是货币或计数,例如:tokens编号 :requests;计数格式不为钱. - 无限制的使用
unlimited: true, (中文(简体) ),remainingPercent: null,没有amounts。未知的盖 (amounts.limit: null已经 没有 意思是无限的. fetchedAt财务报告和审定财务报表resetAt(一) 为划时代的毫秒;resetAt阳性或null提供的期限必须是正数。 时间/重置时间不明,不能证明没有续约. 没有假定固定/滚动分类或未来重设时间表.- 支出数额是有限的,不是负数.
today表示 提供者定义的天数,没有推断出时区。 两个时期都保留在快照中,但页脚省略了支出和/usage只显示今天.
例如,执行命令可以发出此命令( 无) fetchedAt 所需:
{
"balances": [{ "id": "wallet", "label": "Balance", "currency": "USD", "remaining": 12.34 }],
"limits": [{
"id": "requests", "label": "Requests", "remainingPercent": 80, "resetAt": null,
"amounts": { "unit": "requests", "limit": 100, "used": 20, "remaining": 80 }
}],
"spending": [{ "id": "today", "label": "Reported spend", "currency": "USD", "amount": 2.5, "period": "today" }]
}
独立查询层
非 Pi 消费者( 桥口、 插件、 脚本) 可以导入查询层, 而无需拉入 Pi 扩展名或其对等依赖性 :
import {
AdapterRegistry, codexAdapter, createJsonClient, createPostJsonClient,
} from '@astrosheep/pi-quota/query';
const registry = new AdapterRegistry([codexAdapter]);
const snapshot = await registry.get('openai-codex')!.query({
provider: 'openai-codex',
signal: AbortSignal.timeout(10_000),
now: () => Date.now(),
getAuth: myAuthResolver, // you supply credentials
getJson: createJsonClient(),
postJson: createPostJsonClient(),
});
子路径导出每个适配器, 注册/ 控制器, 选项校验器, HTTP/ exec pypution, 以及所有查询类型 。 同伴依赖是可选择的,因此仅为查询层安装就保持了光线.
发展
需要节点22.18和相容的Pi安装.
npm install --ignore-scripts
npm test
npm run typecheck
npm run build
npm run demo