君の星辰 AI · 模型提供程序
把 君の星辰 中转站(OpenAI 兼容网关)的数百个模型接入 VS Code 的 Copilot Chat,
让它出现在模型选择器里,并且可以像 GPT‑4o / Claude 那样用于 Ask / Edit / Agent 模式。
本扩展通过 VS Code 官方稳定 API vscode.lm.registerLanguageModelChatProvider
contributes.languageModelChatProviders 实现,不是"外挂",无需改动 Copilot 本身。
功能
| 能力 |
说明 |
| 模型选择器集成 |
在 Copilot Chat 的模型下拉里出现"君の星辰"分组 |
| 按分组过滤模型 |
只列出你指定的计费分组下的模型(选择器与看板口径一致) |
| Agent 模式 |
支持 OpenAI 风格 function calling,可用内置工具(读写文件、跑终端等) |
| MCP 工具 |
MCP 工具名会自动转义以符合 OpenAI 的[a-zA-Z0-9_-]{1,64} 约束,并在返回时还原 |
| 流式输出 |
手写 SSE 解析,逐字上屏;服务端忽略stream 时自动降级为非流式 |
| 断线续写 |
流被中途掍断时,自动把已输出内容回填并让模型接着写 |
| 上下文自动裁剪 |
历史超出模型上下文时丢弃较早部分,保证工具调用与结果成对删除 |
| 参数自动降级 |
服务端因max_tokens 等参数报 400 时,自动去掉该参数重试 |
| 双接口 |
/v1/chat/completions 与 /v1/responses(Codex 专用)自动切换 |
| 代理 |
HTTP CONNECT +SOCKS5;自动探测系统代理 / 环境变量 / VS Code http.proxy |
| 图片输入 |
粘贴/拖入图片时按image_url 的 data URL 上传(需模型支持) |
| 思维链 |
DeepSeek / GLM / Kimi 等返回的reasoning_content 可选择性显示 |
| 模型管理 |
可视化控制显示/隐藏、重命名、上下文长度与工具/图片能力 |
| 多账号 |
同时配置多枚密钥(不同分组/线路),模型合并展示、按模型自动路由 |
| 余额与价格 |
状态栏实时显示余额,悬停弹出看板(余额、会话消耗、可用分组、模型单价、用量预测) |
| 用量预测 |
每小时采样「累计已用」,估算剩余额度还能用几天(最小单位为天) |
| 用量统计 |
记录请求次数与 token(stream_options.include_usage,不支持时自动降级) |
| 模型自动发现 |
启动时调用/v1/models 拉取账号可用模型,并缓存 6 小时 |
| 429 / 5xx 重试 |
GET 请求带指数退避重试 |
快速开始
安装依赖并编译:
npm install
npm run compile
打包成 .vsix 并安装:
npm run package
code --install-extension xingchen-ai-copilot-0.3.6.vsix
或者直接在 VS Code 里按 F5 启动「扩展开发宿主」调试。
配置 API 密钥:
- 命令面板(
Ctrl+Shift+P)运行 君の星辰: 设置 API 密钥,粘贴 sk- 开头的密钥;
- 也可以点右下角状态栏的 君の星辰 打开管理面板。
打开 Copilot Chat,在模型下拉里选择 君の星辰 → 某个模型,开始对话或切到 Agent 模式。
自测
npm test # 离线,不需要网络与密钥
tools/selftest.js(18 项):用本地模拟的 New API 网关验证客户端——SSE 跨包分片、工具调用增量、
流中错误、非流式降级、401/400 映射、503 重试、取消、HTTP 代理回退、SOCKS5 握手与转发、
用量预测的线性外推与边界。
tools/wiretest.js(28 项):验证协议层——消息转换(工具调用/图片)、上下文裁剪、
工具名转义与还原、工具名分片累积、Responses 事件解析、请求体构造、
billing_expr 解析(分档 / 时段两种形状)、定价换算、金额格式化。
真机联调(需要密钥):
| 命令 |
作用 |
npm run test:live |
端到端打真网关:模型列表 / 流式对话 / 工具调用 / 工具结果回传 / 计费 / 定价 //v1/responses |
npm run test:group |
验证分组过滤:直接 newXingchenProvider,打印选择器与面板实际会收到的模型,并做三项校验 |
npm run test:price |
验证实际单价链路:请求 → 结算 → 持久化 |
npm run inspect |
打印/v1/models、/api/user/groups、/api/pricing、/api/status |
npm run pricecard |
按当前分组算出各模型四项价格,用于跟站点「模型广场」对账 |
联网脚本需要 XC_KEY(必需)与 XC_PROXY(本机必须走代理)。
全部脚本的详细说明见 tools/README.md(不随插件发布,仓库里有)。
设置项
| 设置 |
默认值 |
说明 |
xingchen.baseUrl |
https://ai.centos.hk/v1 |
API 地址;也可用https://api.centos.hk/v1(EO 加速)、https://frapi.centos.hk/v1(三网优化) |
xingchen.modelListMode |
auto |
auto 从服务器拉取;preset 只用内置清单 |
xingchen.excludeModels |
一串通配符 |
从选择器中隐藏生图/视频/语音模型 |
xingchen.models |
[] |
覆盖/追加模型元数据(上下文长度、是否支持工具等) |
xingchen.overrideMaxOutputTokens |
8192 |
实际请求发送的最大输出 token(0 = 不发送,由服务端决定) |
xingchen.maxTokensParam |
max_tokens |
可改为max_completion_tokens(部分新模型要求) |
xingchen.temperature / xingchen.topP |
-1 |
-1 表示不发送 |
xingchen.reasoningMode |
ignore |
设为text 可把思维链当普通文本输出 |
xingchen.extraBody |
{} |
合并进请求体的额外字段 |
xingchen.extraHeaders |
{} |
附加 HTTP 头 |
xingchen.connectTimeoutMs / xingchen.idleTimeoutMs |
10000 / 300000 |
建连超时(TCP/TLS 握手) / 连上之后的静默容忍(等响应头与流空闲,站点上游 prefill 常要 7~50 秒) |
xingchen.proxy |
自动 |
HTTP/SOCKS5 代理,例如socks5://127.0.0.1:7897;留空自动探测,填 none 关闭 |
xingchen.proxyProtocol |
auto |
隧道协议:按地址判断 / 强制http / 强制 socks5 |
xingchen.apiStyle |
auto |
接口风格:chat / responses,auto 失败会自动回退 |
xingchen.group |
空 |
计费分组名。填了以后:① 用该分组的倍率换算准确单价;②把模型列表限定在这个分组内(选择器与看板都生效)。可用「选择计费分组」命令从站点定价表里选 |
xingchen.autoTrimContext |
true |
超出上下文时自动裁剪较早历史 |
xingchen.resumeOnInterruption |
true |
流式输出断开时自动续写 |
xingchen.autoDegradeOnParamError |
true |
参数被拒时自动去掉重试 |
xingchen.statusBar |
true |
状态栏显示入口与余额 |
xingchen.balanceRefreshMinutes |
3 |
余额与模型的自动刷新间隔(分钟) |
xingchen.currencySymbol |
¥ |
金额货币符号 |
xingchen.noProxy |
自动 |
不走代理的主机,逗号分隔 |
xingchen.rejectUnauthorized |
true |
是否校验 TLS 证书 |
xingchen.maxRetries |
2 |
GET 请求重试次数 |
xingchen.debug |
false |
输出详细日志(含请求体,可能包含代码内容) |
命令
| 命令 |
说明 |
| 君の星辰: 管理面板 |
所有操作的入口(也能点状态栏图标,或Ctrl+Alt+X) |
| 君の星辰: 设置 API 密钥 / 清除 |
密钥保存在 VS Code 的 SecretStorage 中,不写入 settings.json |
| 君の星辰: 管理账号(多密钥) |
增删改账号,含导出 / 导入配置(跨电脑迁移) |
| 君の星辰: 导出账号配置(迁移到其它电脑) |
把账号与密钥打包成一段文本,可复制或存文件 |
| 君の星辰: 导入账号配置(从其它电脑迁移) |
粘贴或读取导出文本,恢复账号与密钥 |
| 君の星辰: 测试连接 |
计时并验证密钥,返回模型数量、线路与使用的代理(Ctrl+Alt+T) |
| 君の星辰: 切换线路 |
主线路 / EO 加速 / 三网优化 / 自定义 |
| 君の星辰: 代理与线路测速 |
实测直连 / HTTP 代理 / SOCKS5 的耗时,可一键应用最快方案 |
| 君の星辰: 刷新模型列表 |
立即重新拉取/v1/models |
| 君の星辰: 管理模型 |
可视化控制显示 / 隐藏 / 重命名 / 上下文长度 / 工具与图片能力 |
| 君の星辰: 查看模型清单 |
列出模型及四项单价(输入 / 补全 / 缓存读 / 缓存写),可直接搜价格 |
| 君の星辰: 查看用量统计 |
累计请求数与 token 消耗,可重置 |
| 君の星辰: 查看账户余额 |
调用 OpenAI 兼容计费接口 |
| 君の星辰: 刷新余额 |
立即刷新状态栏上的余额 |
| 君の星辰: 设置刷新频率 |
余额与模型的自动刷新间隔(1 / 2 / 3 / 5 / 10 / 15 / 30 / 60 分钟或自定义) |
| 君の星辰: 选择计费分组 |
指定你的密钥所属分组;选定后模型列表也会跟着过滤 |
| 君の星辰: 打开官网 / 打开控制台 |
浏览器打开 ai.centos.hk 与站点控制台 |
| 君の星辰: 打开扩展设置 |
直接跳到本扩展的设置页 |
| 君の星辰: 显示日志 |
打开输出面板的输出通道「君の星辰 AI」 |
| 君の星辰: 复制诊断信息 |
把版本、线路、代理、密钥状态与最近错误一键复制到剪贴板 |
多账号(多密钥)
同一个账号分组能用的模型是固定的(例如 Codex/GPT 分组只有 5 个)。配置多枚属于不同分组的密钥,就能在模型选择器里同时看到所有分组的模型。
用命令 君の星辰: 管理账号(或管理面板 →「管理账号」):
- 添加账号:填名称 → 可选独立接口地址 → 粘贴密钥
- 每个账号可以单独设置接口地址(留空则沿用全局
xingchen.baseUrl)
- 支持重命名、停用/启用、删除、单独测试连接
行为说明:
- 模型会合并展示;同名模型会自动加后缀
(账号名) 区分,并在 detail 里显示所属账号
- 调用时按模型自动路由到对应账号的密钥与地址,无需手动切换
- 各账号的余额会在悬停面板里分别列出(同一站点的多枚令牌只会显示一次)
- 密钥存在 VS Code 的 SecretStorage 中,不会写进 settings.json;
xingchen.accounts 只保存名称与地址
xingchen.accounts 为空时,自动使用单个默认账号(兼容升级前的配置)
在另一台电脑上使用同一份密钥
密钥是每台电脑各存一份的:VS Code 的 Settings Sync 只同步 settings.json,不同步 SecretStorage,这是微软刻意的设计。所以换电脑有两条路:
- 手输一次:在新电脑上执行「君の星辰: 设置 API 密钥」,粘同一串
sk- 即可(同一个密钥可以同时在多台电脑使用,扩展没有任何机器绑定)
- 配置搬家(多账号时更省事):
- 旧电脑:「君の星辰: 导出账号配置」→ 设置口令(留空则不加密)→ 复制到剪贴板或存成
.txt
- 新电脑:「君の星辰: 导入账号配置」→ 从剪贴板 / 文件读取 → 输口令 → 选「合并」或「覆盖」
导出格式:XCA1.<Base64>(未加密,谁拿到都能读出密钥)或 XCA1E.<密文>(口令加密,AES-256-GCM + scrypt)。加密强度取决于口令,请勿把未加密的文本发到公开场合。
「合并」会跳过已存在的密钥;「覆盖」会先删除本机现有账号与密钥,操作前有二次确认。
状态栏信息面板
状态栏右侧会实时显示当前余额(如 ✨ 君の星辰 ¥9.77),鼠标悬停会弹出看板:
### ✨ 君の星辰 🏠 官网 🎫 管理面板
────────────────────────────────────────
### 💰 剩余 ¥9.77 总额度 ¥10.00 累计已用 ¥0.22 更新于 07:31:07
🔄 立即刷新 ⏱️ 每 3 分钟
📅 按最近 12 小时的消耗速度,剩余额度还能用约 18 天 日均 ¥0.53
────────────────────────────────────────
#### 📊 本次会话 📈 用量详情
#### 🔑 账号(1/1) 👤 管理账号 ← 表格:账号 | 密钥 | 可用分组 | 模型
#### 🌐 连接 🔀 切换线路 ⚡ 测速
#### 🧠 可用模型(分组「codex测试」 ×0.08 · 5 个) 🔢 计费分组 🔃 重新拉取
要点:
- 余额:
剩余 = 总额度 − 累计已用。注意计费接口返回的 hard_limit_usd 是总额度而不是剩余
- 刷新频率可配(
xingchen.balanceRefreshMinutes,默认 3 分钟);每次对话结束后还会自动补一次
- 用量预测:每小时采样一次「累计已用」,按
剩余 ÷ 日均 估算还能用几天(单位为天)
- 可用分组:按「模型集」聚簇,每簇只列一个代表,同模型集的兄弟分组放在分隔条下方
- 模型表:列为
模型 | 挂牌 | 实际 | 已用;实测过的模型用加粗显示余额差值实算的单价,
没实测过的用 ≈ 显示折算值
计费与价格
站点的价格体系比 new-api 文档写的复杂,以下是 2026-09 用真实请求逐条定标得到的结论
(定标脚本:tools/pricingcalib.js、tools/pricecard.js):
| 结论 |
说明 |
| 1 美元 = 1,000,000 quota |
站点/api/status 声明的 quota_per_unit = 500000,但实测扣费恰好是它的一半,按文档算会整体偏大一倍 |
分层计费要用 billing_expr |
billing_mode = tiered_expr 的模型,卡片上那个「模型倍率 × 补全倍率」是装饰性的,真正计费用表达式(如 p*5 + c*30)。用错会差 7.5~15 倍 |
billing_expr 有两种形状 |
①分档:len <= 272000 ? tier("standard", …) : tier("long_context", …);②时段:(tier("base", …)) * (hour(…) >= 22 \|\| hour(…) < 8 ? 0.5 : 1) |
| 存在夜间折扣 |
形状②里的? 0.5 : 1 表示 22:00–08:00 打五折,面板显示的是白天基准价(跟站点卡片一致) |
| prompt 缓存很便宜 |
cr 系数通常是 c 的 1/10。重复发同样的长 prompt 时,「实际」会明显低于「挂牌」——这是正常的 |
单价换算(USD/1M = 系数 × 分组倍率):
- 按量:输入 =
model_ratio × group_ratio,输出 = × completion_ratio,缓存读 = × cache_ratio
- 分层:从
billing_expr 的 p / c / cr / cc 系数取
- 按次:
model_price × group_ratio
拿站点「模型广场」的卡片对账:npm run pricecard(需要把 XC_GROUP 设成卡片上写的分组)。
实测 gpt-5.6-sol / deepseek-v4-flash-0731 / deepseek-v4.1-flash 三项全部逐位吻合。
常见问题
Q:模型选择器里看不到"君の星辰"?
A:确认 Copilot Chat 已安装并登录;运行"测试连接"确认密钥可用;然后 Ctrl+Shift+P → Developer: Reload Window。
Q:提示「连接超时」,但浏览器/其他工具能访问 ai.centos.hk?
A:先看提示里的那个毫秒数:
等待 … 响应超时:连接是好的,只是站点的上游 prefill 太慢。真机实测 2 万 token 输入要 14~57 秒
(看模型心情),把 xingchen.idleTimeoutMs 调大(默认 5 分钟)或调小 xingchen.maxPromptTokens。
连接 … 超时(10000ms):建连阶段就没过。Node 不会读取 Windows 的"系统代理",本扩展已内置自动探测
(环境变量 → VS Code http.proxy → Windows 系统代理注册表)。
若仍失败,手动指定:"xingchen.proxy": "http://127.0.0.1:7897"(换成你自己的代理端口);
反过来说,如果你的代理是 TUN / 系统路由模式(进程里看不到端口),请显式写 "xingchen.proxy": "none",
免得插件自己又建一层隧道。
国内直接连不上 ai.centos.hk 是常态,必须走代理(或 TUN 模式)。
Q:报 403 "无权访问"?
A:君の星辰有「仅限 Codex / Claude Code 使用」的分组(如 gpt-pro)。这类分组不能走 /v1/chat/completions。
请换用通用分组(DeepSeek / Qwen / GLM / Kimi / MiniMax 等),或在 xingchen.extraHeaders 里尝试
{"originator": "codex_cli_rs"}。
Q:报 401?
A:密钥失效或被禁用,重新在控制台复制令牌。
Q:上下文长度显示不准?
A:元数据按模型名前缀推断。用 xingchen.models 精确指定:
{
"xingchen.models": [
{ "id": "gpt-5.5", "maxInputTokens": 400000, "maxOutputTokens": 128000, "toolCalling": true }
]
}
Q:为什么不用 fetch?
A:扩展里直接使用 Node 原生 http/https,规避 undici 在某些中转站上出现的
terminated: TypeError 连接被中断问题。
目录结构
src/
extension.ts 激活入口,注册提供程序与命令
provider.ts LanguageModelChatProvider 实现(模型列表、分组过滤、余额与用量、纠错重试)
wire.ts 协议层:消息转换、上下文裁剪、请求体构造、流式响应解析
pricing.ts 站点定价解析(含 billing_expr 两种形状)与单价换算
client.ts HTTP/SSE 客户端(node:http/https,直连优先 + 自动回退代理)
proxy.ts HTTP CONNECT 与 SOCKS5 隧道、系统代理探测
models.ts 模型元数据推断与内置清单
config.ts 设置读取与规范化
commands.ts 命令、悬停看板、模型与账号管理 UI、测速
logger.ts 输出面板日志
images/
icon.png 扩展图标(由 tools/make-icon.js 生成)
docs/
账号表预览.html 看板 UI 的设计稿(不随插件发布)
tools/ 全部自测与调试脚本(说明见 tools/README.md,不随插件发布)
第三方说明与数据流向
- 本扩展是第三方项目,与 Microsoft、GitHub、GitHub Copilot 官方均无隶属或背书关系;"Copilot Chat" 仅用于说明所对接的 VS Code 功能。
- 扩展本身不收集任何遥测数据。你在 Copilot Chat 中产生的对话内容、图片与工具调用结果,会经由你配置的 API 密钥发送到你所填写的服务地址(默认
https://ai.centos.hk)以获取模型回复。
- API 密钥保存在 VS Code 的 SecretStorage 中,不会写入设置文件或日志。
- 使用前请自行确认所填服务地址的隐私政策与合规性;不使用时可随时禁用或卸载本扩展。
许可
MIT