
人工智能AI 应用AI Agent交互助手MCP Clients本地部署【免费下载链接】CodePilotA multi-model AI agent desktop client — connect any AI provider, extend with MCP skills, control from your phone. Built with Electron Next.js.项目地址https://gitcode.com/gh_mirrors/co0dep/CodePilot点击查看免费下载TokenDance 授权实际创建的是普通 API Key因此 CodePilot 将其接入收敛为一条原有服务商连接而非凭空新增一种订阅身份。本文以 产品思考、技术交接 与 执行计划 为主线结合 tokendance.ts、tokendance-auth.ts、tokendance-fetch.ts 等源码实现完整讲解单一添加入口如何按 Runtime 选择协议、实时模型目录如何按supported_protocols筛选并默认启用六款精选模型、PKCE 授权与一次性授权码如何落地、以及余额不足 / Key 失效 / 周期额度用尽三种恢复场景的差异化引导。读完你既能完成 TokenDance 的接入与排障也能理解多协议服务商接入时服务商级兼容 ≠ 模型级兼容的边界设计。一、设计主线授权后仍是一条普通服务商连接用户希望在 CodePilot 中使用 TokenDance同时保留统一的授权、归因和恢复体验。核心取舍是TokenDance 授权实际创建 API Key因此接入必须落到原有服务商连接体系避免凭空增加一种订阅身份或另一套聊天数据。由此衍生出三条硬性约束重新授权只替换原连接的 Key原连接的 ID、Key、base URL 与持久化 protocol 不变用户原来的模型配置和聊天继续保留把功能补齐变成数据迁移是明确要避免的。同一 Key 可以调用多种协议但模型可用协议并不相同服务商整体支持多个 Runtime不代表旗下每个模型都具有相同能力。用户反馈说明为 Claude Code 再添加一次连接会造成不必要的困惑因此添加入口收敛为一条。展示收敛全部目录模型会淹没常用选择因此默认只启用用户指定的六款精选模型其余模型可在管理页手动启用。该思路在 provider-catalog.ts 中有直接体现TokenDance 通过([openai-compatible, anthropic] as const).map(...)生成两个 preset——tokendance与tokendance-anthropic两者共用品牌图标iconKey: tokendance且defaultModels: []即预设不静态写入模型模型能力完全交给后续的实时目录发现与协议筛选。二、入口与数据流一个入口三种 Runtime按协议分流2.1 单一添加入口与双 preset 策略Settings → Providers → 添加服务只有一个 TokenDance 入口。具体分流规则tokendance连接在Native / Codex使用 OpenAI Chat Completions在Claude Code使用 Anthropic Messages仅当模型声明支持旧tokendance-anthropicpreset 保留供历史连接编辑 / 重授权但不再出现在添加菜单。从 provider-catalog.ts 可见两个 preset 的 base URL 分别为https://tokendance.space/gateway/v1OpenAI 兼容与https://tokendance.space/gatewayAnthropicauthStyle: api_keybillingModel: pay_as_you_go并在 notes 中明确标注Claude Code requires model support for Anthropic Messages; Kimi K3 currently works with Native/Codex only.2.2 公共契约与传输层tokendance.ts 是可供客户端导入的公共契约集中定义了三类常量固定 URL 与归因TOKENDANCE_ORIGIN https://tokendance.space、TOKENDANCE_APP_URL https://www.codepilot.sh/协议筛选parseTokenDanceModels(body, protocol)按supported_protocols字段过滤Anthropic 协议要求anthropic:messagesOpenAI 兼容要求openai:chat-completions缺失协议字段属于 schema 错误直接抛错不能当成合法空目录恢复标记TOKENDANCE_RECOVERY_ERRORS与tokenDanceRecoveryMessage(response)见第七节。isTokenDanceBaseUrl是识别精确官方地址的守卫要求 origin 精确等于TOKENDANCE_ORIGIN、无用户名密码、无 query/hash且 pathname 去尾斜杠后为/gateway或/gateway/v1。它被 model-discovery.ts 与 runtime-compat.ts 等调用方复用是只有精确官方地址才走 TokenDance 快照逻辑的依据。2.3 受限 fetch 包装与归因覆盖tokendance-fetch.ts 的createTokenDanceFetch对请求施加三重限制精确路径白名单仅允许/gateway/v1/models、/gateway/v1/chat/completions、/gateway/v1/messages、/gateway/v1/messages/count_tokens四个路径且 origin 精确匹配禁止重定向redirect: error强制归因无论调用方传什么统一覆盖X-App-URL为https://www.codepilot.sh/覆盖任意大小写保证应用归因头不可被伪造或遗漏。Native 与 Codex 的真实 AI SDK / compat transport共用这一包装成功 SSE 字节直接转发不二次解析。当响应非 2xx 且携带已知恢复头时包装层将上游响应体替换为统一的{ type: error, error: { type: authentication_error, message } }结构——两种 SDK 协议都理解error.message从而把恢复文案送入既有分类 / 本地化路径。2.4 Claude Code 子进程的环境与转发Claude Code 侧由 provider-resolver.ts 组装子进程环境使用ANTHROPIC_AUTH_TOKEN注入 TokenDance Key同时清空ANTHROPIC_API_KEY并关闭非必要流量base URL 指向本机http://127.0.0.1:${PORT}/api/tokendance/gateway见provider-resolver.ts中?http://127.0.0.1:${process.env.PORT || 3000}/api/tokendance/gateway的拼装该路由仅转发 Messages / count_tokens 到固定上游请求认证来自子进程路由本身不读取其他服务商 Key未显式映射的 Sonnet / Opus / Haiku 与 small helper 角色在本轮 env 中回退到已选模型避免请求内置 Claude ID显式角色配置保持优先且不写回用户配置。三、模型发现与精选实时目录 精确 ID 投影3.1 无 Key 的公开目录读取model-discovery.ts 的discoverModels在isTokenDanceBaseUrl(baseUrl)时走专用分支以https://tokendance.space/gateway/v1/models为端点、使用tokenDanceFetch受限包装读取不携带用户 Key再经parseTokenDanceModels按当前连接的协议过滤。也就是说公开目录只证明协议声明不证明账号 entitlement、工具能力或生成成功——这是贯穿全篇的边界原则。3.2 六款精选与推荐策略catalog-recommend.ts 的isRecommendedModel对 TokenDance 走精确 ID 匹配分支if (preset?.key tokendance || preset?.key tokendance-anthropic) { return (TOKENDANCE_FEATURED_MODEL_IDS as readonly string[]).includes(modelId); }TOKENDANCE_FEATURED_MODEL_IDS在 tokendance.ts 中定义为六个精确上游 ID非模糊家族匹配模型 ID2026-09-05 协议快照可用 Runtimeglm-5.3anthropic:messages Chat CompletionsNative / Codex / Claude Codekimi-k3仅openai:chat-completions仅 Native / Codexminimax-m3anthropic:messages三 Runtimedeepseek-v4-flashanthropic:messages三 Runtimedeepseek-v4-proanthropic:messages三 Runtimeglm-5.3-flashanthropic:messages三 Runtime名单精确匹配实时目录其他发现项隐藏用户仍可手动启用。手动隐藏、启用和编辑优先于系统推荐刷新 apply 受enable_source门控manual_enabled/manual_hidden/user_edited的行永远不会被系统翻转这也是 执行计划 中授权后所有模型不可见问题的修复要点——TokenDance 协议筛选结果直接作为默认启用集合而非依赖白名单或 Claude 命名。3.3 Runtime 兼容性的模型级投影getModelCompatTier 体现了Provider 标签说多协议、Models 筛选按每个模型判断的语义收尾Provider 层getProviderCompat对 TokenDance且 base URL 精确官方返回claude_code_experimentalUI 标签为多协议 · 按模型支持模型层只有 base URL 是 TokenDance 精确官方地址时才用TOKENDANCE_ANTHROPIC_MODEL_IDS2026-09-05 官方supported_protocols快照投影——命中者给claude_code_experimental未命中者给codepilot_only。未知模型不宣称支持 Claude CodeKimi K3 不会因为 Provider 整体支持 Claude 而被归入 Claude 组选择器、路由验证、resolver 和子 Agent 共用同一规则见 chat-message-route.ts、claude-client.ts 等调用方。快照是有来源、有日期的静态事实后续新增 Anthropic 模型需更新快照当前不会随目录刷新自动增加 Claude 能力。实时能力缓存与漂移 / 失效行为登记为技术债见 tech-debt-tracker.md #91。3.4 协议声明 ≠ 通用聊天能力目录中声明openai:chat-completions的 TTS 等媒体模型也会被发现协议筛选只排除未声明该连接聊天协议的模型但既不在六款精选中默认隐藏之外也不证明适合通用聊天——用户手动启用时仍需核实用途。catalog-recommend.ts的通用黑名单image / embedding / audio / tts / rerank / preview / free 等模式同样对 TokenDance 生效。四、授权与凭据PKCE 一次性授权码 加密落盘4.1 授权流程tokendance-auth.ts 实现进程级单个 pending flow挂在globalThis上以抵抗 HMR核心参数PKCE S256verifier 为 48 字节随机数base64url 编码后 64 字符code_challenge sha256(verifier)浏览器回调监听 OS 分配的127.0.0.1随机端口随机 state32 字节放进callback_urlquery回调校验 method / path / state / Origin / flow ownership 全部通过后才兑换一次性授权码模式浏览器无法回到本机时用户把 TokenDance 页面给出的一次性 code 粘回 CodePilot该模式不携带 callback_url且这只是一次性授权码不是粘贴长期 Key两种方式固定携带app_url与key_nameCodepilot参数源码见startTokenDanceAuth中url.searchParams.set(...)段。4.2 状态接口与生命周期POST /api/tokendance/auth接受start/complete/cancelGET ?flowId…仅返回status/expiresAt/providerId不暴露任何凭据关闭、取消、重启授权或10 分钟到期LIFETIME 10 * 60_000都会使旧结果失效兑换20 秒超时、禁止重定向、不自动重试——因为一次丢失的响应可能已消耗该 code重试反而破坏幂等全程不回显上游错误正文、Key、code、verifier若远端已创建但本地未保存的 Key客户端不能声称本地取消 远端撤销需用户去 TokenDance 后台检查并删除。4.3 凭据存储与重授权Key 通过createProvider/updateProvider走现有AES-GCM Provider secret 存储没有新 schema、access token、refresh token 或明文 setting。重授权路径targetId分支会先验证原连接仍存在、identity 已解析、api_key与旧 Key 未变化然后仅替换原行的 Key保留 provider ID、模型配置和会话。互斥保护授权 pending 时禁止并行手动保存避免点了两次创建两份连接的意外单元测试与 E2E 均验证了已填 Key 时授权期间无法重复保存。五、连接测试HTTP 200 不算有效 Key公开目录接口不需要 Key 也会返回 200因此 testTokenDanceConnection 明确不能把目录读取的成功当成连接成功先按当前协议从目录取第一个真实模型 IDparseTokenDanceModels(...).ids[0]再向对应网关路径发一个max_tokens: 32、stream: false的小生成请求可能产生少量用量仅当该生成请求成功响应时才显示连接成功失败时优先透出恢复头对应的本地化文案。六、失败恢复三种问题三种动作只在非 2xx 响应按TokenDance-Recovery-Action处理TOKENDANCE_RECOVERY_ERRORS见 tokendance.ts定义如下映射上游恢复头用户动作本地凭据处置top_up_balance到 TokenDance 充值后重试保留仍有效reauthorize_api_key编辑原连接重新授权或替换 Key不自动删除api_key_quota等待周期重置或编辑原连接授权新 Key保留缺失 / 未知沿用标准协议错误保留三条关键原则余额不足、Key 失效和周期额度用尽是三种不同问题Claude 通用错误分类会把余额 / 额度折叠成鉴权失败TokenDance 的精确恢复标记在普通模式匹配前保留为具体 userMessage并提供充值 / 编辑连接动作不擅自删除可能仍有效的 Keyreauthorize_api_key与api_key_quota都保留本地凭据避免让余额不足的用户反复重新授权充值由用户在 TokenDance 完成本轮不自动创建支付订单、不默认充值金额、没有代用户付款或自动购买的功能。稳定标记经过 Native / Codex / Claude 三条错误路径三处现有 SSE / 持久化消息渲染统一映射中英文localizeModelSelectionError按当前 locale 返回。七、验证、测试与已知边界7.1 测试覆盖定向单测unit/tokendance.test.ts目录协议 / 漂移、exact-host / redirect / 归因、真实 AI SDK 与 Codex proxy wire、Claude SSE 转发、恢复分类、本地 PKCE 回调、加密落盘、取消竞态、原连接重授权以及多协议标签 Kimi 反例 adapter family的语义收尾隔离 Dev E2Ee2e/tokendance-integration.spec.ts设置入口、真实本地授权 start / status / cancel、授权链接参数、手动 Key 保存、单一添加入口、非空发现后的真实 model feed、同一连接在三个 Runtime 的选择器含 Kimi K3 在 Claude Code 不可选全量回归CODEX_DISABLED1 npm test5542 pass / 1 skip / 0 failv0.67.15 提交门禁ESLint 与 docs drift 检查通过。7.2 未验证边界明确不冒充用户已确认真实 TokenDance 授权成功但开发侧未执行真实账号生成、计费、工具调用和 packaged macOS / Windows 授权 smoke——公开模型目录成功读取不是这些 smoke 的替代产品方分润价目 API 需要专用产品方 Key当前未提供因此未查询或展示分润价格图像、语音、支付与原生 Responses 特性属于后续产品范围不能仅把更多 endpoint 加进现有 allowlist当前 Codex 沿用现有代理转换。7.3 品牌图标品牌图标为public/provider-icons/tokendance.svg官网原始 SVG来源与日期记录在同目录 README.md由共享ProviderBrandIcon渲染两个 preset 与名称 / 精确网关 URL 解析统一指向tokendance图标覆盖添加菜单、已连接服务与 Composer。八、发布与后续TokenDance 接入随v0.67.15正式发布详见 执行计划 的 Shipped 状态包内存在性核验确认最终安装包包含 auth / gateway 编译路由及官方 SVG。后续已知工作包括实时协议能力缓存明确失效与漂移行为、产品方分润价格接入以及真实生成 / 计费 / packaged smoke 的补齐。一句话总结TokenDance 的接入本质是把多协议服务商安全地折叠进 CodePilot 既有的单连接模型——授权只换 Key、入口只有一条、目录按协议筛选、默认六款精选、恢复按头部分流而服务商支持多 Runtime与每个模型都具备相同能力始终是两回事。赞分享人工智能AI 应用AI Agent交互助手MCP Clients本地部署【免费下载链接】CodePilotA multi-model AI agent desktop client — connect any AI provider, extend with MCP skills, control from your phone. Built with Electron Next.js.项目地址https://gitcode.com/gh_mirrors/co0dep/CodePilot点击查看免费下载相关推荐CodePilot 接入 TokenDance多协议网关、PKCE 授权与失效恢复实战解析CodePilot 接入 TokenDance多协议网关、PKCE 授权与失效恢复实战解析 TokenDance 是一个聚合多家模型服务的多协议网关Code人工智能AI 应用AI Agent交互助手MCP Clients本地部署连接真实宿主用同一条命令将 MCP 服务器接入 Claude Desktop、Claude Code、Cursor 与 VS Code连接真实宿主用同一条命令将 MCP 服务器接入 Claude Desktop、Claude Code、Cursor 与 VS Code 宿主host 是人工智能MCP 服务MCP Clients连接真实 Host用 python-sdk 将 MCP 服务器接入 Claude Desktop、Claude Code、Cursor 与 VS Code连接真实 Host用 python sdk 将 MCP 服务器接入 Claude Desktop、Claude Code、Cursor 与 VS Code 本人工智能MCP 服务MCP Clients上一篇FHEVM 加密类型体系详解FHE 库 ebool 与 euint 系列加密整数完全指南下一篇CookLikeHOC 清炒莴笋片配方拆解克重参数、双油煸香与大火爆炒的标准化复刻指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考