人工智能AI Agent自主智能体桌面应用MCP Clients【免费下载链接】KunLocal-first AI agent workspace for coding, writing, design, research, and automation — one runtime for desktop GUI and TUI.项目地址https://gitcode.com/gh_mirrors/de/Kun点击查看免费下载导读本文以 Kun 仓库中 Provider quota TUI 变更规格 为主体结合 设计文档、提案 与源码实现完整讲解 Kun 如何在独立 TUITerminal UI中展示各模型提供商账户的配额快照余额、用量窗口、重置时间。读完本文你将掌握配额快照如何由共享 Kun runtime 通过GET /v1/provider-quotas只读接口下发、凭据如何被严格限制在服务端、TUI 中/quota与/provider usage命令的路由与键盘操作以及 wide / compact / narrow 三种终端宽度下的自适应渲染机制。适用前提本文描述的行为以当前仓库代码为准。Kun 的 TUI 既可以在桌面应用之外独立运行standalone也可以由桌面启动两者都通过共享的kun serve进程访问配额接口因此本功能不依赖 Electron IPC。一、背景为什么 TUI 需要独立的配额接口Kun 的桌面 GUI 此前已经具备提供商配额面板但它运行在 Electron 主进程中——因为受保护的凭据API Key、OAuth token、cookie绝不能进入渲染进程。而独立 TUI 是kun serve进程的另一个客户端无法调用 Electron IPC因此需要一个由 runtime 自己拥有的只读配额表面quota surface。与此同时Kun 已有的GET /v1/usage端点报告的是线程累计 token 消耗与费用这是会话级概念而提供商账户额度provider account allowance是另一个独立概念。设计文档明确写道The existingGET /v1/usageendpoint reports accumulated thread tokens and cost. Provider account allowance is a separate concept and must have a separate contract and/quotaTUI route.并且仓库架构明确禁止恢复一个基于/usage的 runtime 控制斜杠面板。因此/v1/usage继续报告线程 token 用量/context继续保留为线程 token 用量页面新增GET /v1/provider-quotas/quota路由专门呈现提供商账户额度。相关实现证据TUI 的 usage 报告页在页脚明确提示Provider allowance is shown in /quota见 usage-report.ts。二、运行时契约严格 Zod Schema 与四种状态2.1 契约文件与结构配额快照的 DTO 全部定义在 contracts/provider-quota.ts使用 Zod 的.strict()模式杜绝多余字段混入。核心类型ProviderQuotaEntrySchema的字段如下字段类型说明providerIdstring (1–128)提供商稳定标识providerNamestring (1–120)展示名称presetIdstring可选预置身份如claude-subscriptionstatusenumavailable/unsupported/missing_credentials/errorsourcestring可选数据来源描述如 DeepSeek balance APIdashboardUrlurl可选≤2048跳转到官方控制台的 URLsummarystring可选计划名/摘要如 Z.ai 的 planNamemetrics数组≤500归一化指标localCost对象可选本地 API 参考价估算updatedAtdatetime可选本条刷新时间messagestring可选≤4096经清洗的错误/引导信息单个指标ProviderQuotaMetricSchema包含id、label、unit、used、limit、remaining、usedPercent0–100、resetsAtISO datetime。列表响应ProviderQuotaListResponseSchema为{ entries: Entry[]≤500, refreshedAt: datetime }。2.2 四种状态语义规格spec.md要求每个配置的模型连接都产生一条相互隔离的条目混合结果场景下某几个提供商探测失败不影响其他成功条目展示。ProviderQuotaService.refreshProfile的实现与之对应provider-quota-service-core.tsavailable探测成功返回归一化指标与摘要unsupported无法识别该提供商/主机名消息为 This provider does not expose a supported quota API in this version.missing_credentials未配置 API Key 或官方订阅未登录消息为 Connect a provider credential before refreshing quota.error请求被拒绝、超时、响应过大或解析失败消息经过quotaErrorMessage截断清洗≤4096 字符。三、认证 HTTP 路由GET /v1/provider-quotas3.1 路由挂载与鉴权路由注册在 register-thread-routes.ts处理函数位于 provider-quotas.ts。该路由走 Kun 常规的 bearer token 鉴权管道规格明确要求未授权请求在不启动任何提供商探测的情况下被拒绝。3.2?refresh1手动刷新语义路由处理函数支持一个查询参数// ?refresh1 is the manual GUI refresh path: it bypasses the shared TTL // cache; plain polls reuse cached entries. const forceRefresh new URL(request.url).searchParams.get(refresh) 1 return jsonResponse(await service.list(forceRefresh ? { forceRefresh: true } : undefined))普通请求命中 5 分钟 TTL 缓存适合轮询?refresh1绕过缓存强制探测是手动刷新路径TUI 的r键与 GUI 刷新共用此语义。3.3 客户端方法TUI 客户端在 client-thread-api.ts 中新增了带响应校验的调用providerQuotas() { return this.request(/v1/provider-quotas, ProviderQuotaListResponseSchema) }返回体直接通过ProviderQuotaListResponseSchema校验保证类型安全。四、探测机制canonical 身份 精确主机名规格要求配额探测必须使用稳定的 provider/preset 身份、期望的传输类型transport kind以及精确识别的 API 主机名并且只调用固定的只读端点绝不允许从自定义 Base URL 推导配额 URL。4.1 分类函数classifyProviderQuotaProbe核心分类逻辑在 provider-quota-service-core.ts订阅类提供商按stableIdkind匹配claude-subscriptionagent-sdk、codexhttp、grok-subscriptionhttp、cursor-subscriptioncursor-sdk、antigravity-cli、gemini-cli-apiAPI Key 类提供商按exactHostname(baseUrl)精确匹配exactHostname 用new URL(...).hostname.toLowerCase()解析无法识别的主机名返回null即unsupported不会拼接任何配额 URL。4.2 API Key 类提供商探测端点探测执行在 provider-quota-service-probe.ts 的runProbe/requestJson中全部为固定只读端点提供商主机名判定固定端点解析器DeepSeekapi.deepseek.comhttps://api.deepseek.com/user/balanceparseDeepSeekQuotaOpenRouteropenrouter.aihttps://openrouter.ai/api/v1/credits/api/v1/keyparseOpenRouterQuotaMoonshot 全球api.moonshot.aihttps://api.moonshot.ai/v1/users/me/balanceparseMoonshotQuotaMoonshot 中国api.moonshot.cnhttps://api.moonshot.cn/v1/users/me/balanceparseMoonshotQuotaZ.aiapi.z.aihttps://api.z.ai/api/monitor/usage/quota/limitparseZaiQuotaBigModelopen.bigmodel.cnhttps://open.bigmodel.cn/api/monitor/usage/quota/limitparseZaiQuotaMiniMax 全球api.minimax.io/v1/token_plan/remains、/v1/api/openplatform/coding_plan/remains双端点多退避parseMiniMaxQuotaMiniMax 中国api.minimaxi.com同上parseMiniMaxQuotaOpenAIexactapi.openai.comhttps://api.openai.com/v1/dashboard/billing/credit_grantsparseOpenAiQuotaKimi Codeapi.kimi.com且 stableId 为kimi-codehttps://api.kimi.com/coding/v1/usagesparseKimiCodeQuotaOpenCode Go本地估算opencode.ai且 stableId 为opencode-go本地命令/Web 配额读取opencode-go-local-quota.ts/opencode-go-web-quota.ts其中probeMiniMax实现了主机 × 路径的多重退避provider-quota-service-probe.ts先尝试/v1/token_plan/remains失败再尝试/v1/api/openplatform/coding_plan/remains。4.3 订阅类提供商探测订阅类探测走 provider-subscription-quota-service.ts覆盖规格中列举的 Claude、ChatGPT/Codex、Grok、Cursor、Antigravity、Gemini CLI 六类官方订阅外加 OpenCode GoClaude解析 Claude Code OAuth token调用https://api.anthropic.com/api/oauth/usageCodex解析 Codex CLI 存储的 OAuth 凭据走 gRPC-web 传输遇到 401/403 会内存内刷新 token 后重试一次Grok解析 Grok 登录态走 gRPC-web billing 接口Cursor读取 Cursor.app 会话 cookie调用 usage summary APIAntigravity / Gemini CLI复用 Google CLI OAuth 登录态只读调用配额接口。这些来源全部只读官方客户端凭据Claude Code、Codex CLI、Cursor.app、Antigravity、Gemini CLI不会被配额服务复制或写回design.md 明确Source credentials are never copied or written back by the quota service.。token 刷新仅发生在内存中满足官方 OAuth 契约需要。4.4 解析器与归一化各提供商原始响应由 provider-quota-service-provider-parsers.ts 中的parse*Quota系列解析为统一指标例如parseDeepSeekQuota提取total_balance总余额、topped_up_balance充值余额、granted_balance赠送余额parseOpenRouterQuota计算 Creditstotal_usage/total_credits若 key 接口可用则追加 API key 预算parseZaiQuota依据TOKENS_LIMIT/CREDIT_LIMIT/TIME_LIMIT类型生成 token / credits / requests 指标并用quotaWindowLabel把numberunit转成 1-day、5-hour 等窗口标签parseMiniMaxQuota从model_remains生成每模型的 interval/weekly 窗口指标并对已耗尽的 100% 状态做去噪处理parseKimiCodeQuota生成 weekly 请求配额与 5-hour rate limit 指标parseOpenAiQuota提取 credit grants并取最早未过期 grant 的到期时间作为resetsAt。ProviderQuotaService.list()最终用ProviderQuotaListResponseSchema.parse整体校验后返回任何不合规字段都会被拒绝。五、安全边界凭据永不离开进程规格第三条要求API Key、OAuth token、cookie、官方客户端凭据、原始上游响应体全部留在 Kun 进程内。落地在四个层面DTO 白名单Zod.strict()schema 只允许归一化展示字段requestJson返回的原始 JSON 从不进入响应体错误信息清洗quotaErrorMessage只保留固定文案如 The quota request timed out.、The provider did not authorize quota access for this credential.原始响应体或凭据值绝不外泄订阅探测中凭据解析失败统一抛出ProviderQuotaMissingCredentialError引导用户登录TUI 端二次清洗渲染前所有不可信字符串经过 secret-redaction.ts 的redactSecretText与 TUI 布局层sanitizeTerminalText终端控制字符清洗见 provider-quota.ts传输层代理感知探测通过createProxyFetch(proxyUrl) ?? fetch构造的proxyAwareFetch发起沿用 Kun 的代理配置。5.1 边界约束常量设计文档的风险条目在代码中固化为四个常量provider-quota-service-core.tsexport const QUOTA_TIMEOUT_MS 12_000 // 单请求超时 12 秒 export const MAX_RESPONSE_BYTES 256 * 1024 // 响应体上限 256 KiB export const QUOTA_CONCURRENCY 4 // 最多 4 个探测并发 export const QUOTA_CACHE_TTL_MS 5 * 60_000 // 每提供商缓存 5 分钟readBoundedResponseText会同时检查content-length头声明与实际流式读取字节数超限即报 The provider quota response was too large.防止大响应拖垮 TUI 路由。5.2 缓存、并发与失败保留cachedRefreshProfileprovider-quota-service-core.ts实现了三重保护TTL 缓存5 分钟内重复请求直接返回缓存快照inflight 去重同一提供商的并发调用共享同一个在途 Promise失败保留旧快照刷新返回error时保留上一次成功快照路由/UI 不会被瞬时探测错误卡住。mapWithConcurrency以固定 4 个 worker 并行处理全部 profileprovider-quota-service-probe.ts。六、TUI 路由与命令/quota、/provider usage6.1 命令解析命令解析在 commands.tscase provider: return rest usage || rest quota ? { kind: quota } : { kind: connect } case usage: return { kind: usage-report } case quota: return { kind: quota }即用户输入结果/quota打开 Provider quota 路由/provider usage打开 Provider quota兼容快捷方式/provider quota同样打开 Provider quota裸/provider仍打开模型连接编辑路由connect行为不变/usage仍是线程 token 用量报告不被覆盖/context仍是线程 token 用量页面命令测试在 commands.test.ts 中固化了上述断言。命令面板command palette注册了 Show provider quota 条目slash: quota并提供/pro自动补全提示。6.2 路由生命周期showQuota()在 application-routes.ts 中实现先关闭连接路由、模型路由、usage 路由与子代理路由再创建ProviderQuotaDialog并作为独占 primary route显示随后立即触发component.refresh()加载快照。关闭时closeQuotaRoute隐藏 primary route 并把焦点交还根组件。/context页面线程 token 用量与/quota页面提供商额度互不干扰这正是规格中preserving/contextfor thread token usage的落地。七、TUI 渲染ProviderQuotaDialog详解7.1 页面骨架渲染逻辑位于 tui/provider-quota.ts 的ProviderQuotaDialog完全遵循 Kun 的终端视觉系统pageFrame、sectionLabel、statusGlyph、visualDensity面包屑KUN / Provider quota右上角refreshed HH:MM:SS刷新时钟加载中显示refreshing可滚动时追加起始-结束/总数范围指示描述行Account balances and rate limits from configured providers.页脚滚动可用时显示↑/↓ PgUp/PgDn navigate、r refresh、Esc back。7.2 各状态渲染加载中statusGlyph(running)动画 Loading provider quota…刷新失败但已有快照黄色警示行 Refresh failed 清洗后的错误文案保留旧结果路由保持可用对应规格 Scenario: Refresh fails空结果No model providers are configured.每个提供商分隔线sectionLabel后依次是——标题行语义 glyph 加粗提供商名右侧右对齐显示状态标签available/计划名、sign in required、unsupported、error颜色分别为绿/黄/暗/红available逐条渲染指标行其他状态缩进换行展示清洗后的引导信息如 Connect this provider before refreshing quota.。7.3 指标行与进度条metricLines依据visualDensity(width)分三档渲染widelabel≤28 字符截断 20 格进度条 百分比 数值 重置时间排在同一行compact缩短进度条把数值/重置时间移到缩进第二行narrow第一行只保留label 百分比或数值进度条与数值/重置时间逐行缩进绝不横向溢出对应规格 Scenario: Narrow terminal。进度条为终端原生方块[■■■···]已用部分visual.focus青色剩余visual.muted暗色。数值格式化formatAmount对小数保留 4 位、整数按千分位百分比整数直接显示、非整数保留 1 位。重置时间由resetLabel实时换算为 resets in 5m / 2h 30m / 3d已到点显示 reset due。7.4 本地 API 参考成本localCostProviderQuotaEntry.localCost承载reference_api_estimateUSD估算today与last30Days两个窗口各自包含requests、totalTokens、amount与coveragecomplete/partial/unavailable。TUI 中渲染为 Local API reference value 区块并明确标注API reference estimate, not an actual subscription charge.——这只是一个估算值绝不冒充真实扣费。路由刷新includeLocalCosts: false可跳过该聚合以降低开销。八、键盘交互与导航handleInputtui/provider-quota.ts支持按键行为r/CtrlR手动刷新加载中忽略重复触发Esc/CtrlC关闭路由返回↑/k上滚一行↓/j下滚一行PageUp/PageDown上/下翻一页Home/End跳到首/末行render中pageSize terminalRows - 7maxOffset与offset被钳制在合法范围超出终端行数时页脚显示当前可视范围1-20/45这类指示对应规格 Scenario: Long provider list。组件完全自持垂直偏移量与鼠标滚轮无关符合设计文档mouse-wheel-independent terminal scroll controls are bounded的约定。九、测试与验证体系本变更的测试覆盖相当完整任务清单tasks.md全部完成关键测试文件包括契约与路由provider-quotas.test.ts鉴权、?refresh1、响应校验服务层provider-quota-service.test.ts、provider-quota-service-cache.test.ts缓存 TTL 与失败保留、provider-quota-timeout-isolation.test.ts超时隔离、provider-quota-local-cost.test.ts订阅探测provider-subscription-quota.test.ts、opencode-go-web-quota.test.ts、opencode-go-local-quota.test.tsTUIprovider-quota.test.ts响应式渲染、刷新、导航、空/错误状态、commands.test.ts命令解析。任务清单 5.1/5.2 还专门补充了 Grok gRPC-web 与 Kimi Code 的分类/解析覆盖保持 runtime 与 GUI 的配额分类一致。十、非目标、风险与迁移10.1 非目标design.md 明示本变更不做替换/v1/usage、/context或 GUI 现有 Electron IPC 路径后台轮询、通知、购买入口、持久化配额快照新增交互式 OAuth 流程或导入任意浏览器 cookie向 TUI 客户端发送凭据、cookie、原始响应体或用户自定义配额 URL。10.2 风险应对上游私有端点/官方客户端存储格式可能变化 → 每个解析器/凭据解析器相互隔离、校验期望形状、逐提供商清洗失败并用固定 URL 与 payload 覆盖测试配额探测可能拖慢 TUI 路由 → 4 并发、12 秒超时、256 KiB 上限、立即显示 loading、刷新保持手动系统钥匙串凭据提示可能打扰用户 → 优先配置文件/已配置凭据、限制平台命令、绝不触发登录 UIGUI 与 runtime 探测实现可能漂移 → 先在测试中对齐 DTO 与行为后续可在两套界面稳定后提取共享包。10.3 迁移与回滚该变更是纯增量的已有连接注册表与设置无需任何迁移回滚只需移除路由、客户端方法与命令提供商配置与凭据完全不受影响。总结/quota是 Kun TUI 中一个典型的runtime 所有权 终端原生功能由 ProviderQuotaService 在进程内完成凭据解析与固定端点探测通过严格的 Zod 契约 和GET /v1/provider-quotas路由下发归一化、净化后的快照ProviderQuotaDialog 再以 Kun 既有的终端视觉系统渲染四种状态、进度条、重置时间与本地参考成本并支持三档宽度自适应与全套键盘滚动。开发者只需记住/quota看提供商额度/usage看线程 token 用量r刷新Esc返回——配额探测的复杂性全部被隔离在服务端。赞分享人工智能AI Agent自主智能体桌面应用MCP Clients【免费下载链接】KunLocal-first AI agent workspace for coding, writing, design, research, and automation — one runtime for desktop GUI and TUI.项目地址https://gitcode.com/gh_mirrors/de/Kun点击查看免费下载相关推荐Kun 终端配额面板落地实录从运行时契约到 TUI /quota 路由的完整实现解析Kun 终端配额面板落地实录从运行时契约到 TUI /quota 路由的完整实现解析 Kun 的桌面 GUI 已经能够展示已配置模型的账户余额与限流窗口但独人工智能AI Agent自主智能体桌面应用MCP ClientsKun TUI 提供商配额查询/quota深度解析运行时合约、固定端点探测与终端渲染Kun TUI 提供商配额查询 /quota 深度解析运行时合约、固定端点探测与终端渲染 本文围绕 Kun 开源仓库中 add provider quot人工智能AI Agent自主智能体桌面应用MCP ClientsKun Provider Quota TUI在终端内安全查看各模型厂商余额与用量配额的设计与实践Kun Provider Quota TUI在终端内安全查看各模型厂商余额与用量配额的设计与实践 Kun 桌面 GUI 已能在 Electron 主进程中展示人工智能AI Agent自主智能体桌面应用MCP Clients上一篇微信聊天记录永久保存与智能分析WeChatMsg使用完全指南下一篇终极指南如何使用Arduino-ESP32构建智能物联网设备创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考