GCMP - 提供多个国内原生大模型提供商支持的扩展English | 中文 通过集成国内主流原生大模型提供商,为开发者提供更加丰富、更适合本土需求的 AI 编程助手选择。 目前已内置支持 智谱AI、MiniMax、MoonshotAI、DeepSeek、阿里云百炼、火山方舟、腾讯云、Xiaomi MiMo、百度千帆、阶跃星辰、蚂蚁百灵、讯飞星辰、LongCat 等原生大模型提供商。 此外,扩展支持 OpenAI Chat Completions、OpenAI Responses、Anthropic Messages 和 Gemini GenerateContent 接口,可通过 Compatible Provider 自定义接入提供对应兼容接口的第三方云服务模型。OpenAI Responses 模型还可按需启用实验性 WebSocket 传输,默认仍使用 HTTP 流式请求。 🚀 快速开始1. 安装扩展前置要求:VS Code 1.138.0 或更高版本。 在VS Code扩展市场搜索 可选代码补全:按需安装独立的 FIM / NES 扩展。 2. 开始使用
3. 配置 VS Code 后台实用模型与 GCMP 辅助模型(推荐)VS Code 在后台使用模型执行标题生成、提交信息创建、搜索、意图检测等实用任务。GCMP 不会覆盖 VS Code 或其他插件的默认设置。辅助模型未完整配置且未启用跟随主模型时,启动引导会提示手动配置 Copilot Harness 暂未完整支持,建议使用默认的 Local Agent。仅在相关全局偏好未设置时显示引导,也可通过「设置辅助偏好」手动调整。
展开查看各参数详细说明
🤖 内置的AI大模型提供商
智谱AI - ZhipuAI
MiniMax
MoonshotAI
DeepSeek
阿里云百炼 - AliDashScope
火山方舟 - Volcengine
腾讯云 - Tencent
Xiaomi MiMo
百度千帆 - Baidu Qianfan
阶跃星辰 - StepFun
蚂蚁百灵 - Ant Ling蚂蚁集团开源的 MoE 架构大语言模型家族,采用 Anthropic 模式接入。
讯飞星辰 - XunFei Astron科大讯飞旗下大模型服务平台,采用 Anthropic SDK 模式接入,支持双套餐密钥管理。
LongCat - LongCatLongCat API 开放平台的 Agentic 模型,采用 Anthropic SDK 模式接入。
CLI 编程工具 API 提供商
OpenCode
Hyper - Charm Hyper
ClinePass - Cline 官方推出的模型订阅服务
CommandCode - 主打开放模型的编程 CLI 与模型订阅服务
OAuth 认证编程助手提供商
Codex CLI - OpenAI CodexOpenAI 官方编程助手 Codex 的命令行工具,支持通过
Grok Build - xAI Grok BuildxAI 官方 Grok Build 编程助手命令行工具,支持通过
⚙️ 高级配置GCMP 支持通过 VS Code 设置来自定义AI模型的行为参数,让您获得更个性化的AI助手体验。
展开查看高级配置说明通用模型参数 及 额外支持功能 配置
提供商级别重试配置覆盖通过
合并优先级(字段级合并,每个字段独立回退):
特殊语义:
提供商级别限流配置(limit)通过
合并优先级(与 retry 一致,字段级合并):
跨实例行为:多个本地 VS Code 窗口共享 Leader 权威限流桶(窗口间自动选举),维度以 Leader 本机配置为准,配置修改即时生效;Leader 不可用时自动降级为单窗口本地桶并每 60 秒探测恢复,恢复后自动回到跨实例严格模式;窗口关闭或断线时,其排队请求与持有的配额会被自动回收,不会阻塞其他窗口。Remote(SSH/WSL/容器等)窗口统一使用兼容模式,不参与 Leader 选举、心跳或交接,不启用 IPC 和文件协调通道;各窗口使用本地限流桶,在当前宿主启动时生成当天 Token 统计,并独立执行统计、余额和模型/CLI 元数据的周期刷新及过期日志清理,周期任务仍遵守用户活动、缓存过期和保留天数设置;不影响本地窗口的 Leader,状态栏显示“兼容模式”。
状态栏余额警告阈值余额型状态栏默认在可用余额不高于
调试与 HAR 录制
代理与系统证书配置
提供商配置覆盖GCMP 支持通过会参与设置同步的 支持范围因提供商类型而异:
已知/自定义/compatible 提供商不支持 配置优先级:
配置示例:
🔌 Compatible 自定义模型支持GCMP 提供 Compatible Provider,支持 OpenAI Chat Completions / Responses、Anthropic Messages 和 Gemini GenerateContent 接口。通过
展开查看自定义模型配置说明自定义模型内置已知提供商ID及显示名称列表
配置示例:
|
| 额度名称 | 可用余额 | 单位 |
|---|---|---|
| 现金钱包 | 88.5 | CNY |
| 月度套餐 | 750 | 次 |
| 加油包 | 150 | 次 |
| 联网搜索 | 30 | 次 |
钱包还会显示充值 80、赠送 8.5 的明细。不同单位的额度分别展示,不会把它们累加成一个总额,也不会为每个额度项单独请求接口。
数组路径:拆分、求和与索引的区别
拆分范围由 arrayPath 或 balance 的路径决定;计算字段也会检查其操作数路径。paid、granted 与 displayName 跟随同一个额度上下文解析,不独立决定拆分范围。
假设 data.packages 包含两个元素,其 remaining 分别为 10 和 20:
| 写法 | 结果 |
|---|---|
balance: "data.packages[].remaining" |
拆分为两项:10、20 |
balance: "data.packages.remaining" |
途经数组自动拆分为两项 |
balance: "data.packages[*].remaining" |
对数组求和,只产生一项:30 |
balance: "data.packages[0].remaining" |
只选第一项:10 |
balance: "data.packages.0.remaining" |
与 [0] 相同,只选第一项 |
arrayPath: "data.packages",balance: "remaining" |
明确遍历数组,分别得到两项 |
arrayPath 不是必填项。它适合明确指定某个数组,并将其元素作为字段解析上下文,让名称、余额与计算操作数可以使用元素相对路径:
{
"fields": {
"arrayPath": "data.packages",
"displayName": "name",
"balance": "remaining",
"unit": "次"
}
}
不写 arrayPath 时,可用 data.packages[].remaining 或 data.packages.remaining 自动拆分。嵌套数组也可逐层展开,例如 data.groups[].limits[].remaining;响应本身是数组时,直接写 remaining 即可按元素解析。
这些路径是 dot 字段路径及数组索引/通配语法,不是完整的 JSONPath 表达式。不要把 [*] 当作拆分,也不要把 [0] 当作遍历全部元素。
计算字段与数组求和
fields 中的 balance、paid、granted 支持 sum / subtract / multiply / divide。paths 里既可以写字段路径、常量数值(例如 500000),也可以继续嵌套计算字段对象,适合 Ticket / 500000、(总额 - 已用) / 500000 这类余额换算。
数组拆分后,计算按元素执行,相对操作数路径优先在当前元素、父级元素中查找,再回退到响应根数据;完整数组路径会绑定到当前选中的元素。因此上面的 arrayPath 示例可以直接用 total 和 used,无需手写元素索引。
{
"balance": {
"operation": "divide",
"paths": [
{
"operation": "subtract",
"paths": [
"data.subscriptions[0].subscription.amount_total",
"data.subscriptions[0].subscription.amount_used"
]
},
500000
]
}
}
嵌套对象会先计算子表达式,再参与外层运算。
路径中的 [*] 可匹配数组中的所有元素,并对目标字段求和。例如,data.subscriptions[*].subscription.amount_total 会汇总所有订阅的 amount_total。匹配不到数组、字段缺失或值无法解析为有限数字时按 0 处理;该规则也适用于嵌套计算,以及 fields.paid 和 fields.granted。
{
"balance": {
"operation": "divide",
"paths": [
{
"operation": "subtract",
"paths": [
"data.subscriptions[*].subscription.amount_total",
"data.subscriptions[*].subscription.amount_used"
]
},
500000
]
}
}
查询模式的继承与请求次数
- 只配置
usage:注册一个查询模式;一个模式仍可通过fields数组返回多个额度 - 需要多个查询模式时:通过
usages配置,每个最终注册的模式分别查询一次。即使 URL 相同,不同模式也不会因为使用同一个接口而自动合并请求;同一响应内的多额度应优先使用fields数组 usage与某个命名模式最终解析出的查询配置等价时,不额外生成重复的default模式;外层模式displayName不影响该等价判断usage和usages都不配置:就不会注册该自定义 provider 的余额/用量查询
usages 每项继承 usage 的 URL、鉴权、字段与单位等默认值。fields 的覆盖规则是:
- 默认值为单对象时,覆盖对象按字段增量合并,例如只修改
granted,仍保留默认balance - 覆盖值为数组时,完整替换默认
fields,不拼接、不按索引继承。数组不能为空,每一项都必须重新提供balance - 默认
fields是多项数组时,改成单对象不会继承其中任意一项;必须提供完整的balance。默认数组只有一项时,兼容对该唯一项作对象增量覆盖 - 未配置共享
usage时,每个usages条目都必须自行提供url和完整fields
内置已知 provider 的 usage / usages 参考配置方式,可直接查看源码 src/utils/config/knownProviders.ts。
注意:
gcmp.providerOverrides的 provider key 必须与gcmp.compatibleModels[*].provider完全一致,包括大小写。
例如,下面这个更贴近实际 settings.json 的 NekoCode 相关配置片段表示:
gcmp.compatibleModels中的模型使用provider: "NekoCode",也可继续添加相同 provider 的其他模型gcmp.providerOverrides.NekoCode.usage提供默认查询 URLhttps://api2.nekoapi.ai/v1/usage和公共字段路径balancegcmp.providerOverrides.NekoCode.usages.pay与usage的最终查询配置等价,只额外提供显示名称余额gcmp.providerOverrides.NekoCode.usages.sub把查询 URL 覆盖为https://api2.nekoapi.ai/v1/user/balance,并把余额字段覆盖为remaining
{
"gcmp.compatibleModels": [
{
"id": "nekocode:gpt-5.5",
"name": "GPT-5.5 (NekoCode)",
"provider": "NekoCode",
"model": "gpt-5.5",
"sdkMode": "openai-responses",
"baseUrl": "https://api2.nekoapi.ai/v1",
"proxy": "noproxy",
"maxInputTokens": 272000,
"maxOutputTokens": 128000,
"capabilities": {
"toolCalling": true,
"imageInput": true
},
"reasoningDefault": "xhigh",
"reasoningEffort": ["none", "low", "medium", "high", "xhigh"],
"extraBody": {
"store": false,
"reasoning": {
"effort": "xhigh",
"summary": "auto"
}
},
"useInstructions": true,
"customHeader": {
"version": "0.134.0",
"user-agent": "codex-tui/0.134.0 (Windows 10.0.26200; x86_64) unknown (codex-tui; 0.134.0)",
"originator": "codex-tui"
}
}
],
"gcmp.providerOverrides": {
"NekoCode": {
"usage": {
"url": "https://api2.nekoapi.ai/v1/usage",
"fields": {
"balance": "balance"
}
},
"usages": {
"pay": {
"displayName": "余额",
"url": "https://api2.nekoapi.ai/v1/usage"
},
"sub": {
"displayName": "订阅",
"url": "https://api2.nekoapi.ai/v1/user/balance",
"fields": {
"balance": "remaining"
}
}
}
}
}
}
该配置的实际效果是:
providerOverrides.NekoCode会作用于所有provider: "NekoCode"的兼容模型,包括示例中的GPT-5.5 (NekoCode)pay会继承usage.fields.balance = "balance"sub会使用覆盖后的fields.balance = "remaining"- 因为
pay与usage解析出的查询配置等价,所以不会再额外生成一个重复的default模式
最终状态栏会按两个命名模式进行查询与展示:
NekoCode / 余额NekoCode / 订阅
展示、告警与刷新注意事项
- Compatible 状态栏逐项显示余额;悬浮表格显示额度名称、余额及可选的充值/赠送明细。配置面板对具名的单个额度和多个额度显示名称与余额;无名单项保持紧凑展示
- 所有成功解析的额度都参与余额告警:任意一项为负数时标红,否则按提供商的
balanceWarning阈值判断黄色警告。不同单位的额度沿用同一个提供商数值阈值,不做单位换算 balance未取到数值时,仅当paid与granted都有效才回退为两者之和,否则跳过该额度项。空的拆分数组不会生成额度项,所有配置都未解析出额度时查询失败;[*]求和的缺失值仍按0处理- 修改
gcmp.providerOverrides下的usage/usages后,不会立即重新查询现有缓存;可点击 Compatible 状态栏手动刷新。状态栏尚未出现时,可重新加载窗口;配置面板可点击对应配置的“刷新”按钮重新查询
数组目标校验:显式
arrayPath必须对应实际数组。路径缺失或目标不是数组时,跳过该fields配置;嵌套路径只跳过无效分支,不回退到根余额。其他有效额度仍正常展示,所有配置都没有有效额度时查询失败。配置前应核对真实响应结构。
💡 FIM / NES 内联补全建议功能
从 0.29.0 起,FIM / NES 已拆分为主扩展的可选安装项目。如需使用补全,请在扩展市场手动安装 AI Chat Models - FIM/NES Completion。
从旧版升级:已有 gcmp.fimCompletion.* 和 gcmp.nesCompletion.* 设置无需改名,安装补全扩展后可继续使用;仅升级主扩展不会恢复补全。FIM 和 NES 默认关闭,按需启用。API Key 仍在主扩展中管理,无需重复录入。
- FIM:根据上下文预测并补全光标处缺失的代码,适合单行/短片段补全。
- NES:基于编辑上下文提供智能代码建议,支持多行代码生成。
使用前必读:需先在对话模型中配置并验证 ApiKey;在输出面板选择
GitHub Copilot Inline Completion via GCMP可查看调试信息。接入的是通用大模型,未针对代码补全专门训练,效果可能不及 Copilot 原生 Tab 补全。
展开查看详细配置说明
FIM / NES 内联补全建议模型配置
FIM 和 NES 补全都使用单独的模型配置,可以分别通过 gcmp.fimCompletion.modelConfig 和 gcmp.nesCompletion.modelConfig 进行设置。
代理配置:FIM 和 NES 支持通过
proxy字段单独设置代理地址(如http://127.0.0.1:7890),方便在不同网络环境下调试。支持带认证的代理,日志中会自动脱敏用户凭据。
- 启用 FIM 补全模式(推荐 DeepSeek、Qwen 等支持 FIM 的模型):
- 已测试支持
DeepSeek、硅基流动,特殊支持阿里云百炼。
- 已测试支持
{
"gcmp.fimCompletion.enabled": true, // 启用 FIM 补全功能
"gcmp.fimCompletion.debounceMs": 500, // 自动触发补全的防抖延迟
"gcmp.fimCompletion.timeoutMs": 5000, // FIM 补全的请求超时时间
"gcmp.fimCompletion.modelConfig": {
"provider": "deepseek", // 提供商ID,其他请先添加 OpenAI Compatible 自定义模型 provider 并设置 ApiKey
"baseUrl": "https://api.deepseek.com/beta", // ⚠️ DeepSeek FIM 必须使用 beta 端点才支持
// "baseUrl": "https://api.siliconflow.cn/v1", // 硅基流动(provider:`siliconflow`)
// "baseUrl": "https://dashscope.aliyuncs.com/compatible-mode/v1", // 阿里云百炼(provider:`dashscope`)
// "proxy": "http://127.0.0.1:7890", // 可选:单独设置代理地址
"model": "deepseek-chat",
"maxTokens": 100
// "extraBody": { "top_p": 0.9 }
}
}
- 启用 NES 手动补全模式:
{
"gcmp.nesCompletion.enabled": true, // 启用 NES 补全功能
"gcmp.nesCompletion.debounceMs": 500, // 自动触发补全的防抖延迟
"gcmp.nesCompletion.timeoutMs": 10000, // NES 补全请求超时时间
"gcmp.nesCompletion.manualOnly": true, // 启用手动 `Alt+/` 快捷键触发代码补全提示
"gcmp.nesCompletion.modelConfig": {
"provider": "zhipu", // 提供商ID,其他请先添加 OpenAI Compatible 自定义模型 provider 并设置 ApiKey
"baseUrl": "https://open.bigmodel.cn/api/coding/paas/v4", // OpenAI Chat Completion Endpoint 的 BaseUrl 地址
// "proxy": "http://127.0.0.1:7890", // 可选:单独设置代理地址
"model": "glm-4.7", // 推荐使用性能较好的模型,留意日志输出是否包含 ``` markdown 代码符
"maxTokens": 200,
"extraBody": {
// GLM-4.7 默认启用思考,补全场景建议关闭思考以加快响应
"thinking": { "type": "disabled" }
}
}
}
- 混合使用 FIM + NES 补全模式:
- 自动触发 + manualOnly: false:根据光标位置智能选择提供者
- 光标在行尾 → 使用 FIM(适合补全当前行)
- 光标不在行尾 → 使用 NES(适合编辑代码中间部分)
- 如果使用 NES 提供无结果或补全无意义,则自动回退到 FIM
- 自动触发 + manualOnly: true:仅发起 FIM 请求(NES 需手动触发)
- 手动触发(按
Alt+/):直接调用 NES,不发起 FIM- 模式切换(按
Shift+Alt+/):在自动/手动间切换(仅影响 NES)
MistralAI Coding FIM 配置示例
{
"gcmp.compatibleModels": [
{
"id": "codestral-latest",
"name": "codestral-latest",
"provider": "mistral",
"baseUrl": "https://codestral.mistral.ai/v1",
"sdkMode": "openai",
"maxInputTokens": 32000,
"maxOutputTokens": 4096,
"capabilities": {
"toolCalling": true,
"imageInput": false
}
}
],
"gcmp.fimCompletion.enabled": true,
"gcmp.fimCompletion.debounceMs": 500,
"gcmp.fimCompletion.timeoutMs": 5000,
"gcmp.fimCompletion.modelConfig": {
"provider": "mistral",
"baseUrl": "https://codestral.mistral.ai/v1/fim",
// "proxy": "http://127.0.0.1:7890", // 可选:单独设置代理地址
"model": "codestral-latest",
"extraBody": { "code_annotations": null },
"maxTokens": 100
}
}
熔断器(Circuit Breaker)
FIM 与 NES 补全请求连续失败时,熔断器会暂时停止请求,避免无限重试浪费资源和费用。
三态模型:
| 状态 | 说明 |
|---|---|
| Closed | 正常通行,请求通过并累计失败次数 |
| Open | 熔断断开,拒绝所有请求,进入冷却倒计时 |
| HalfOpen | 冷却结束后允许一次探测请求,成功则恢复 Closed,失败则重新熔断 Open |
工作流程:
- 请求连续失败达到
failureThreshold后,熔断器从 Closed → Open - Open 状态下所有请求被立即拒绝,等待
cooldownSeconds秒冷却 - 冷却结束后首次
allowRequest()进入 HalfOpen,发放一次探测请求 - 探测成功(
recordSuccess())→ 回到 Closed,恢复服务 - 探测失败(
recordFailure())→ 回到 Open,重新冷却。每冷却周期只重试一次(默认每 30 秒一次),直到成功或用户手动「立即重试」 - 请求被用户取消(
recordCancellation())→ 不消耗 HalfOpen 探测名额,可重新探测
熔断通知:Open 状态首次触发时弹出通知提示(30 秒内不重复),支持「立即重试」恢复服务或「查看设置」跳转配置页。
配置项:
{
// FIM 熔断器配置(默认启用)
"gcmp.fimCompletion.circuitBreaker": {
"enabled": true, // 启用熔断
"failureThreshold": 10, // 默认 10,范围 2-60
"cooldownSeconds": 30 // 默认 30,范围 10-300
},
// NES 熔断器配置(默认启用)
"gcmp.nesCompletion.circuitBreaker": {
"enabled": true, // 启用熔断
"failureThreshold": 5, // 默认 5,范围 2-20
"cooldownSeconds": 30 // 默认 30,范围 10-300
}
}
配置修改即时生效,无需重启 VS Code。
快捷键与操作
| 快捷键 | 操作说明 |
|---|---|
Alt+/ |
手动触发补全建议(NES 模式) |
Shift+Alt+/ |
切换 NES 手动触发模式 |
📊 Token 消耗统计功能
GCMP 内置了完整的 Token 消耗统计功能,帮助您追踪和管理 AI 模型的使用情况。
展开查看详细功能说明
主要特性
- 持久化记录:基于文件系统的日志记录,无存储限制,支持长期数据保存
- 用量统计:记录每次 API 请求的模型和用量信息,包括:
- 模型信息(提供商、模型 ID、模型名称)
- Token 用量(预估输入、实际输入、输出、缓存、推理等)
- 请求状态(预估/完成/失败)
- 多维度统计:按日期、提供商、模型、小时等多维度查看统计数据
- 小时统计详情:支持按小时、提供商、模型三层嵌套显示
- ⏰ 小时级别:显示该小时的总计数据
- 📦 提供商级别:显示该提供商在该小时的汇总数据
- ├─ 模型级别:显示该模型在该小时的详细数据
- 提供商和模型按请求数降序排列,无有效请求的提供商和模型不显示
- 小时统计详情:支持按小时、提供商、模型三层嵌套显示
- 实时状态栏:状态栏实时显示今日 Token 用量,30秒自动刷新
- 增量预估:支持基于上一轮 API 实际用量做增量预估,WebView 详细视图中会显示"本次新增"(
~+xx)列,帮助追踪长会话中每轮请求的新增 Token 消耗 - 可视化视图:WebView 详细视图支持查看历史记录、分页显示请求记录
- 请求余额与额度快照:在 Key 标签旁显示实际派发凭据对应的缓存余额或剩余额度,支持离线查看历史明细
- 请求来源分类:记录并显示每次请求的 Copilot 请求类型(如主 Agent、标题生成、提交消息、搜索子 Agent、视觉识别等),便于追踪后台实用任务的实际消耗
- 实时请求指标:流式阶段实时展示首流延迟(TTFT)与输出耗时(TPOT),完成后由真实 usage 自然刷新
- 实时输出 token 估算:流式阶段基于 tokenizer 实时估算输出 token 与输出速度(tokens/s),输出列以"最近一次接收的预估增量"(
+xx tks)形式展示,完成后由真实 usage 覆盖 - 缓存命中率可视化:输入列合并展示缓存命中数与输入总数,并显示缓存命中率,帮助判断缓存策略效果
- 客户端成本估算:支持峰谷分档定价、服务等级(
serviceTier)计费和上下文大小条件分档,Token 数量下方内联显示预估成本,状态栏、详情页、多日趋势页均集成展示 - 双币种成本展示:定价配置支持 USD/RMB 双币种并列,按模型原生结算币种标记展示;状态栏(中文环境)、详情页、侧边栏日期列表与会话记录、多日趋势页均支持成本双币显示,并新增 USD/RMB 货币切换视图
- 多日成本视图:多日趋势图新增成本趋势折线图与成本卡片汇总
使用方式
- 查看统计:点击状态栏的 Token 用量显示,或通过命令面板执行
GCMP: 查看今日 Token 消耗统计详情命令 - 历史记录:在详细视图中可查看任意日期的统计记录
- 数据管理:支持打开日志存储目录进行手动管理
请求余额与额度快照
- 查看明细:请求记录的 Key 标签旁展示余额或剩余额度摘要,悬停或聚焦摘要可查看明细及查询时间。支持原生提供商与 Compatible 多项查询,历史快照可离线查看,展示语言跟随当前界面。
- 缓存边界:请求实际派发时,读取所用凭据对应的已有有效缓存,不会为保存快照额外查询接口。查询时间可能早于请求开始时间,不代表该次请求的实时余额或实际扣费。
- 缺失数据:尚未查询、查询失败且没有有效缓存,或缓存已过期时,可能没有可展示的快照;不会使用其他 Key 的余额替代。
- 刷新调度:实际派发的请求结束后,在同一窗口内按提供商合并刷新通知,默认延迟 2 秒、调度间隔至少 30 秒;冷却期内的新通知保留一次尾部刷新,周期和手动刷新仍可用。
- 历史不回填:后续刷新只更新当前状态栏数据,不覆盖已保存的请求快照;没有快照的旧请求也不会使用当前额度回填。
配置选项
{
"gcmp.usages.retentionDays": 100 // 历史数据保留天数(0表示永久保留)
}
📝 Commit 生成提交消息功能
GCMP 支持在提交前自动读取当前仓库的改动(已暂存/未暂存/新文件),提取关键 diff 片段并结合相关历史提交与仓库整体提交风格(auto 模式下)来生成更贴合你项目习惯的提交信息。
为避免将无关噪音或潜在敏感内容发送给模型,Commit 消息生成功能会在分析 diff 前做一层过滤:
- 自动省略 lockfile / snapshot 的大段 diff 内容,例如
package-lock.json、yarn.lock、pnpm-lock.yaml、bun.lockb、*.snap - 自动跳过常见敏感文件,例如
.env*、证书/私钥文件、.aws/.ssh/.gnupg/.docker目录下的文件 - 支持通过
gcmp.commit.sensitiveFiles追加你自己的敏感文件匹配规则
展开查看详细使用说明
系统要求
- vscode.git 扩展:该功能依赖 VS Code 内置的
vscode.git扩展来访问 Git 仓库信息- 扩展会自动检测 Git 可用性,当 Git 不可用时相关按钮将自动隐藏
- 如果你的环境中禁用了
vscode.git扩展,Commit 消息生成功能将不可用
使用入口:Git仓库管理视图
- 仓库标题栏按钮:
生成提交消息 - 更改分组栏按钮:
- 在“暂存的更改”上生成:
生成提交消息 - 暂存的更改 - 在“更改”上生成
生成提交消息 - 未暂存的更改
- 在“暂存的更改”上生成:
生成范围说明(staged / working tree)
生成提交消息:默认行为,同时分析 staged + working tree(tracked + untracked)。生成提交消息 - 暂存的更改:仅分析 staged,适合“分步提交/拆分提交”。生成提交消息 - 未暂存的更改:仅分析 working tree(tracked + untracked),不包含 staged。
多仓库工作区:如果当前工作区包含多个 Git 仓库,GCMP 会尝试根据你点击的 SCM 区域推断仓库;无法推断时会弹出仓库选择。
模型选择与配置
该功能基于 VS Code Language Model API 调用模型。
- 第一次使用或未配置模型时,会自动引导选择模型(也可手动运行
GCMP: 选择 Commit 消息生成模型)。 - 相关配置项:
{
"gcmp.commit.enabled": true, // 启用内置提交消息生成功能(默认 true,将在下个主版本移除)
"gcmp.commit.language": "chinese", // 生成语言:chinese / english(auto 模式语言不明确时的回退值)
"gcmp.commit.format": "auto", // 提交消息格式:auto(默认) / 见下方 format 说明
"gcmp.commit.customInstructions": "", // 自定义指令(仅当 format=custom 时生效)
"gcmp.commit.sensitiveFiles": ["*.pem", "**/.env.local", "secrets/**"], // 额外排除在 diff 分析之外的敏感文件路径模式
"gcmp.commit.model": {
"provider": "zhipu", // 生成模型的提供商(providerKey,例如 zhipu / minimax / compatible)
"model": "glm-4.7" // 生成模型的 ID(对应 VS Code Language Model 的 model.id)
}
}
gcmp.commit.sensitiveFiles 过滤规则说明
gcmp.commit.sensitiveFiles 用于补充内置敏感文件过滤规则。它接收一组简单的类 glob 字符串:
*.pem:匹配任意.pem文件**/.env.local:匹配任意目录下的.env.localsecrets/**:匹配secrets/目录下的所有文件**/private/*.key:匹配任意private目录下的.key文件
命中后,该文件不会参与 Commit diff 分析,也不会被发送给模型用于生成提交消息。
gcmp.commit.format 格式说明与示例
说明:以下示例仅用于展示格式形态;实际内容会根据你的 diff 自动生成。
auto:自动推断(会参考仓库历史的语言/风格;不明确时回退为plain+gcmp.commit.language),默认推荐。plain:简洁一句话,不含 type/scope/emoji(适合快速提交)。custom:完全由你的自定义指令控制(gcmp.commit.customInstructions)。conventional:Conventional Commits(可带 scope,常见写法是“标题 + 可选正文要点”)。
feat(commit): 新增提交消息生成
- 支持 staged / 未暂存分别生成
- 自动补充相关历史提交作为参考
angular:Angular 风格(type(scope): summary,语义上接近 conventional)。
feat(commit): 新增 SCM 入口
- 在仓库标题栏与更改分组栏增加入口
karma:Karma 风格(偏“单行”,保持短小)。
fix(commit): 修复多仓库选择
semantic:语义化type: message(不带 scope;也可以带正文要点)。
feat: 新增提交消息生成
- 自动识别本次变更的关键 diff
emoji:Emoji 前缀(不带 type)。
✨ 新增提交消息生成
emojiKarma:Emoji + Karma(emoji +type(scope): msg)。
✨ feat(commit): 新增提交消息生成
- 更贴合仓库既有提交习惯
google:Google 风格(Type: Description)。
Feat: 新增提交消息生成
- 支持按仓库风格自动选择语言与格式
atom:Atom 风格(:emoji: message)。
:sparkles: 新增提交消息生成
👁️ 视觉分析工具
GCMP 内置一组专用视觉分析工具,用于把图片/截图转换为可直接落地的开发产物、提取文字、诊断错误、理解技术图纸、分析数据可视化以及对比 UI 差异。所有视觉分析完全委托给原生支持多模态的 GCMP 模型,不依赖第三方 MCP 后端。
展开查看视觉分析工具详细说明
工具列表
| 工具引用 | 用途 |
|---|---|
#gcmpUiToArtifact |
将 UI 截图转换为前端代码、AI 提示词、设计规范或自然语言描述 |
#gcmpExtractTextFromScreenshot |
从截图中提取和识别文字(OCR),支持代码、终端输出、文档等 |
#gcmpDiagnoseErrorScreenshot |
分析错误弹窗、堆栈和异常截图,定位根因并给出修复建议 |
#gcmpUnderstandTechnicalDiagram |
分析架构图、流程图、UML、ER 图和系统设计图 |
#gcmpAnalyzeDataVisualization |
从图表、图形和仪表盘中提取趋势、异常和可操作建议 |
#gcmpUiDiffCheck |
对比预期/参考 UI 截图与实际实现截图,识别视觉差异和实现偏差 |
#gcmpAnalyzeImage |
通用图像分析,适配未被专项工具覆盖的视觉内容 |
使用方式
视觉工具通过 # 引用调用,例如 #gcmpUiToArtifact。调用时可直接粘贴图片、截图或引用图片文件路径,模型会基于图片内容生成对应产物或分析结果。所有工具共用同一个视觉分析模型配置。
配置视觉分析模型
视觉工具依赖 gcmp.vision.model 指定的多模态模型。首次调用视觉工具时若未配置,会自动拉起选择向导;也可手动运行命令 GCMP: 选择视觉分析模型,或通过 GCMP: 设置辅助偏好 面板统一配置。
{
"gcmp.vision.model": {
"provider": "zhipu",
"model": "glm-4.6v"
}
}
- 所选模型必须支持图像输入能力(
capabilities.imageInput: true)。 - 支持选择内置提供商模型、已配置图像输入能力的 Compatible Provider 模型,也支持选择 GitHub Copilot 原生多模态模型(将
provider设为copilot,model设为 Copilot 模型 ID)。 - 未配置时首次调用会自动引导选择模型,无需提前手动填写 JSON。
🗝️ API Key 管理面板
GCMP 提供统一的 API Key 管理面板,可按提供商/槽位维护多套配置(站点 + Key + 备注),并在多套配置之间随时切换。
如何使用
通过 VS Code 命令面板执行 GCMP: API Key 管理。
主要特性
- 多配置集管理:每个提供商槽位可保存多套配置(自定义名称 + 站点 + Key + 备注),支持新增、修改、删除、激活与停用;面板内操作后状态栏即时刷新,模型列表缓存按槽位精确失效。
- CLI 认证并入:Codex / Grok 的认证状态与订阅余量直接在面板内展示,支持打开终端登录、导入/刷新凭证;移除认证改为在文件管理器中定位凭证文件,由用户手动删除。
- Gist 备份与恢复:配置集可上传至 GitHub Secret Gist 备份并跨设备恢复(文件
gcmp-configsets.json,描述以GCMP ConfigSets开头);槽位与配置项元数据保持明文可读,仅各配置项的 apiKey 字段单独加密(AES-256-GCM),支持自定义加密口令。
查看 Gist 备份的加密原理与安全说明
存储原理
| 层级 | 说明 |
|---|---|
| 远端存储 | GitHub Secret Gist(私有 Gist),文件名为 gcmp-configsets.json(描述以 GCMP ConfigSets 开头),元数据明文、仅 apiKey 字段单独加密 |
| 加密算法 | AES-256-GCM(认证加密,保证机密性 + 完整性) |
| 密钥派生 | scrypt(N=16384, r=8, p=1),输入为 GitHub 用户 ID + 固定 pepper + 可选自定义口令 |
| 认证方式 | VS Code 内置 GitHub OAuth,通过 vscode.authentication API 获取 token |
| 认证复用 | 首次授权 gist scope;后续操作静默复用已授权 session |
加密流程
GitHub 数字ID + pepper + [自定义口令] → scrypt(N=16384, r=8, p=1) → AES-256 密钥
↓
每个 API Key → 随机 Salt(32B) + 随机 IV(16B) → AES-256-GCM 加密 → Salt+IV+Tag+密文 → JSON
- 每条密钥加密时使用独立的随机盐值和初始向量,相同明文每次加密结果不同
- 加密后的数据包包含
Salt、IV、Tag(认证标签)和密文,全部以十六进制字符串编码 - 解密依赖于 GitHub 用户数字 ID:同一 GitHub 账号在不同设备上登录,派生出的加密密钥相同,因此可以互相解密
自定义加密口令
由于扩展是开源项目,加密方式(pepper、scrypt 参数等)均可在源码中直接查看。若希望把 Gist 同步数据视为真正的跨设备机密,必须设置自定义加密口令。
- 在面板「Gist 同步」菜单中选择「设置口令」即可添加,输入两次确认
- 口令与 GitHub 用户 ID、pepper 共同参与密钥派生,三者缺一不可(最少 8 个字符)
- 口令更改后,之前用旧口令加密的数据将无法再解密(派生密钥不同)
- 口令通过 VS Code
SecretStorage存储在本地(操作系统级加密),不会上传到任何服务器 - 同一 GitHub 账号的不同设备需设置相同的口令才能互相解密
恢复时的口令验证
恢复时如果本地口令与上传时不匹配,会自动弹出提示:
- 已设置口令但无法解密 → 提示口令可能已更改,引导输入之前使用的口令
- 未设置口令但数据无法解密 → 提示数据可能在其他设备上用口令加密过,引导输入
- 输入口令后自动验证:解密成功则自动存储正确口令,后续下载无需再次输入
- 若只有部分密钥能解密,会提示数量不匹配
跨设备提示
设置口令时会弹出提示,告知多设备同步需要所有设备使用相同口令:
- 首次设置:提示请牢记口令并在所有设备上设置
- 更改口令:提示更改后需在所有设备上同步更新
数据兼容性
- 已有 Gist 数据时设置/更改口令,可选择**「设置并重新上传」**直接以新口令重写远端数据,避免遗漏
- 清除口令时需确认,清除后现有加密数据将无法再解密
安全说明
- Gist 会暴露在用户的 Gist 列表中;设置自定义口令后,其内容才应视为面向离线攻击者的机密数据备份
- 未设置自定义口令时,请不要把该方案视为针对有意离线分析者的强机密性保护
- 加密密钥不在网络中传输
- 本地 API Key 通过 VS Code
SecretStorage存储,操作系统级加密保护 - 所有网络请求均通过 HTTPS
🤝 贡献指南
我们欢迎社区贡献!无论是报告bug、提出功能建议还是提交代码,都能帮助这个项目变得更好。
开发环境设置
# 克隆项目
git clone https://github.com/VicBilibily/GCMP.git
cd GCMP
# 安装依赖
npm install
# 在 VsCode 打开后按下 F5 开始扩展调试
💰 赞助
如果您觉得这个项目对您有帮助,欢迎通过 查看赞助二维码 支持项目的持续开发。
📄 许可证
本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情。