ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

GSD 自定义模型与 Provider 接入实战:通过 models.json 注册自建端点、微调模型与代理网关

GSD 自定义模型与 Provider 接入实战:通过 models.json 注册自建端点、微调模型与代理网关 人工智能AI Agent代码智能体Agent 编排CLIAI 应用【免费下载链接】gsd-2A powerful meta-prompting, context engineering and spec-driven development system that enables agents to work for long periods of time autonomously without losing track of the big picture项目地址https://gitcode.com/gh_mirrors/gs/gsd-2点击查看免费下载本篇技术指南以 GSD 项目GitHub 加速计划 / gsd-2一个面向长期自主运行的元提示、上下文工程与规范驱动开发系统的官方文档为基础系统讲解如何通过~/.gsd/agent/models.json将默认模型注册表之外的模型接入 GSD——包括自托管推理端点Ollama、vLLM、LM Studio、微调模型、代理网关LiteLLM、OpenRouter、Vercel AI Gateway以及新发布的商业模型。读完本文你将掌握 models.json 的完整配置语法、API Key 的三种取值方式、OpenAI 兼容性开关的逐项含义、Provider 级与模型级覆盖语义以及成本追踪与社区扩展的接入方法。配置入口models.json 的位置、加载时机与优先级GSD 通过~/.gsd/agent/models.json加载自定义模型与 Provider其解析逻辑实现在 models-resolver.ts 中。官方文档给出的查找顺序为~/.gsd/agent/models.json主路径~/.pi/agent/models.json回退路径面向从 PI 平滑迁移/开发场景从源码看实际解析逻辑比文档描述更细resolveModelsJsonPath()会依次检查两个路径是否存在——若 GSD 路径存在则直接返回否则若 PI 路径存在则返回 PI 路径两者都不存在时返回 GSD 路径该文件将被创建。文件头注释还揭示了三态合并语义当两个文件同时存在时两个文件会被合并且 GSD 文件优先级更高。文件在每次打开/model时重新加载会话中途编辑无需重启。这一点也体现在 preferences-models.ts 的实现中它以轻量 JSON 解析直接读取 models.json保持与resolveModelsJsonPath()一致的双路径回退并且格式错误的 models.json 不会阻断会话启动——该模块显式忽略解析异常。同理doctor-providers.ts 在健康检查中对损坏的 models.json 也不会报错。基本结构Provider 与 Model 两层模型models.json 采用Provider 容器 Model 列表的两层结构{ providers: { my-provider: { baseUrl: https://my-endpoint.example.com/v1, apiKey: MY_PROVIDER_API_KEY, api: openai-completions, models: [ { id: model-id-here, name: Friendly Model Name, reasoning: false, input: [text], contextWindow: 128000, maxTokens: 16384, cost: { input: 0.15, output: 0.60, cacheRead: 0.015, cacheWrite: 0.19 } } ] } } }最小示例接入本地模型对于本地模型Ollama、LM Studio、vLLM每个模型只需要id一个字段{ providers: { ollama: { baseUrl: http://localhost:11434/v1, api: openai-completions, apiKey: ollama, models: [ { id: llama3.1:8b }, { id: qwen2.5-coder:7b } ] } } }apiKey字段在 JSON 语法上必须存在但 Ollama 会忽略它的值所以任意字符串都可以。/model与--list-models均按模型id列出条目配置的name用于模型匹配--model模式匹配以及模型详情/状态文本展示。支持的 API 类型api字段决定 GSD 以何种协议与端点通信可在 Provider 层设置该 Provider 下所有模型的默认值也可在模型层覆盖API说明openai-completionsOpenAI Chat Completions兼容性最好本地服务首选openai-responsesOpenAI Responses APIanthropic-messagesAnthropic Messages APIgoogle-generative-aiGoogle Generative AI模型配置字段参考字段必填默认值说明id是—模型标识符实际传给 API 的模型名name否id人类可读的模型标签用于--model匹配与状态展示api否Provider 的api覆盖 Provider 层的 API 类型reasoning否false是否支持扩展思考extended thinkinginput否[text]输入类型[text]或[text, image]contextWindow否128000上下文窗口大小token 数maxTokens否16384最大输出 token 数cost否全零每百万 token 成本{input, output, cacheRead, cacheWrite}compat否Provider 的compatOpenAI 兼容性覆盖与 Provider 层compat合并生效关于reasoning: true的模型从 openai-completions.ts 的实现看系统提示词的角色选择与思考参数的注入都由reasoning与compat共同决定见下文。API Key 解析环境变量、字面量与占位值apiKey字段支持三种取值方式GSD 会自动分辨环境变量名OPENROUTER_API_KEY— GSD 自动解析同名环境变量的值字面量sk-abc123...— 直接使用该字符串占位值not-needed— 供无需鉴权的本地服务使用。更完整的取值机制见 docs/user-docs/custom-models.md其中apiKey与headers的取值实际支持三种格式比 gitbook 版文档多出一种Shell 命令格式Shell 命令以!开头执行命令并取 stdout 作为值例如从系统钥匙串或密码管理器读取凭据apiKey: !security find-generic-password -ws anthropic apiKey: !op read op://vault/item/credential该机制有命令白名单保护只有以pass、op、aws、gcloud、vault、security、gpg、bw、gopass、lpass开头的命令允许执行其余命令被拦截且值解析为undefined同时向 stderr 写入警告命令参数中禁止出现;、|、、反引号、$、、等 Shell 运算符以防止注入。若使用白名单之外的凭据工具可在全局设置~/.gsd/agent/settings.json中通过allowedCommandPrefixes整体替换默认白名单需自行包含仍要保留的默认项{ allowedCommandPrefixes: [pass, op, sops, doppler, mycli] }也可以设置逗号分隔的环境变量GSD_ALLOWED_COMMAND_PREFIXES其优先级高于 settings.jsonexport GSD_ALLOWED_COMMAND_PREFIXESpass,op,sops,doppler注意该设置是全局限定的项目级project/.gsd/settings.json无法覆盖命令白名单——这是为了防止克隆仓库提升命令执行权限。从源码侧印证doctor-providers.ts 会把认证来源归类为auth.json、env、models.json、none四类doctor-providers.test.ts 中的测试也验证了 models.json 中的 apiKey 可以满足自定义 Provider 的鉴权检查。这意味着配置了有效 apiKey 的自定义 Provider 不会触发仪表盘的健康告警。Compatibility FlagsOpenAI 兼容性开关本地服务与非标准服务器往往需要兼容性调整compat字段就是为此设计的{ compat: { supportsDeveloperRole: false, supportsReasoningEffort: false, stripReasoningContent: true, supportsUsageInStreaming: false, thinkingFormat: qwen } }compat可以放在 Provider 层对该 Provider 下所有模型生效也可以放在模型层仅覆盖该模型。两层同时设置时会合并模型层优先。开关默认值作用supportsDeveloperRoletrue服务器不支持developer消息角色时设为falsesupportsReasoningEfforttrue服务器不支持reasoning_effort参数时设为falsestripReasoningContentfalse设为true时从外发历史中剥离回放的 assistantreasoning_content字段部分 vLLM/TensorRT-LLM 端点否则会返回 400 错误supportsUsageInStreamingtrue流式响应不包含 token 用量时设为falsethinkingFormat—qwen使用 Qwen 思考模式qwen-chat-template使用聊天模板变体背后的源码机制这些开关在 pi-ai 的 OpenAI 兼容层中有完整实现。OpenAICompletionsCompat接口定义于 types.ts除上述开关外还包括maxTokensFieldmax_completion_tokens或max_tokens、requiresToolResultName、requiresAssistantAfterToolResult、requiresThinkingAsText、supportsStrictMode、reasoningEffortMap等且多数开关标注为从 URL 自动探测默认值。关键行为对应关系如下supportsDeveloperRole在 openai-completions.ts 的convertMessages()中系统提示词的角色由model.reasoning compat.supportsDeveloperRole决定——推理模型且服务器支持时才使用developer角色否则回退为system消息。这与 docs/user-docs/custom-models.md 的说明一致不支持developer角色的服务器如 Ollama 等本地端点应设supportsDeveloperRole: false让 GSD 用system消息发送系统提示词。stripReasoningContent同样在convertMessages()中实现启用时会在外发消息转换阶段剥离回放的推理字段。单元测试 openai-completions.test.ts 用一条带thinkingSignature: reasoning_content的 assistant 消息验证了两种行为启用后reasoning_content字段被剥离值为undefined未启用时则原样透传。thinkingFormat与思考参数请求构造逻辑中zai与qwen格式对推理模型使用顶层enable_thinking: boolean值由 reasoningEffort 决定OpenAI 风格默认openai则通过reasoning_effort参数注入并可经reasoningEffortMap将 GSD 思考级别映射为 Provider 特定的取值。qwen使用顶层enable_thinking而qwen-chat-template针对需要chat_template_kwargs.enable_thinking的本地 Qwen 兼容服务器。内置模型注册表 custom.ts 中多个 Qwen/Z.ai 系列条目即使用thinkingFormat: qwen/zai配合supportsDeveloperRole: false。自定义 Headers为代理补充额外请求头需要额外请求头的代理场景可在 Provider 层设置headers{ providers: { litellm-proxy: { baseUrl: https://litellm.example.com/v1, apiKey: MY_API_KEY, api: openai-completions, headers: { x-custom-header: value }, models: [...] } } }headers的取值方式与apiKey完全一致同样支持环境变量名、字面量与 Shell 命令三种格式。例如通过 Portkey 网关路由 Anthropic 请求时可以这样写headers: { x-portkey-api-key: PORTKEY_API_KEY, x-secret: !op read op://vault/item/secret }另外Provider 层还有authHeader字段设为true时 GSD 自动追加Authorization: Bearer apiKey请求头。Model Overrides按模型覆盖内置模型无需重定义整个模型modelOverrides允许在不重写 Provider 全部模型列表的前提下精细化定制某个内置模型的设置{ providers: { openrouter: { modelOverrides: { anthropic/claude-sonnet-4: { compat: { openRouterRouting: { only: [amazon-bedrock] } } } } } } }modelOverrides支持按模型覆盖以下字段name、reasoning、input、cost支持部分覆盖、contextWindow、maxTokens、headers、compat。行为语义如下覆盖只作用于内置 Provider 的模型未知模型 ID 会被忽略可同时使用 Provider 层的baseUrl/headers与modelOverrides若 Provider 同时定义了models数组自定义模型在内置覆盖之后合并——id相同的自定义模型会替换被覆盖的内置条目。openRouterRouting与vercelGatewayRouting在 types.ts 中都有类型定义二者结构一致only指定仅路由到的 Provider 列表order指定尝试顺序。请求构造逻辑中当baseUrl指向 openrouter.ai 且模型带openRouterRouting时路由偏好以provider字段传给 OpenRouter指向 Vercel AI Gateway 时则以providerOptions.gateway传递。Vercel 网关示例如路由 Kimi K2.5 经由 Fireworks/Novitacompat: { vercelGatewayRouting: { only: [fireworks, novita], order: [fireworks, novita] } }覆盖内置 Provider将流量重定向到代理若只是想把某个内置 Provider 的流量经代理转发不必重定义其模型列表——直接覆盖baseUrl即可{ providers: { anthropic: { baseUrl: https://my-proxy.example.com/v1 } } }此时内置 Anthropic 模型全部保留可用原有的 OAuth 或 API Key 鉴权继续生效。若要同时向内置 Provider 合并自定义模型则需补上models数组{ providers: { anthropic: { baseUrl: https://my-proxy.example.com/v1, apiKey: ANTHROPIC_API_KEY, api: anthropic-messages, models: [...] } } }合并语义与 docs/user-docs/custom-models.md 中 Overriding Built-in Providers 章节一致内置模型保留自定义模型按id在 Provider 内 upsertid与内置模型相同的自定义模型替换内置条目全新id则追加到内置模型旁。Cost Tracking让自定义模型成本不再显示为 $0.00自定义模型默认不产生成本数据——没有cost字段时成本追踪显示 $0.00这是预期默认行为。需要准确成本统计时按每百万 token添加cost字段cost: { input: 0.15, output: 0.60, cacheRead: 0.015, cacheWrite: 0.19 }cost同样支持部分覆盖如仅在modelOverrides中覆盖input与output。本地模型成本为零时可显式写全零与内置注册表中各模型的成本结构保持同构。社区扩展为未内置 Provider 提供完整支持对于 GSD 未内置的 Provider社区扩展可提供完整的 Provider 支持。例如阿里云 DashScopeQwen3、GLM-5 等通过pi-dashscope扩展安装gsd install npm:pi-dashscope扩展机制与 extensions 生态相关更多说明可参考 docs/dev/extending-pi/ 与 docs/extension-sdk/。常见排障与最佳实践小结400 错误来自推理内容回放若接入 vLLM/TensorRT-LLM 端点时多轮对话请求返回 400优先检查compat.stripReasoningContent: true参考 docs/user-docs/custom-models.md 的说明与 openai-completions.test.ts 的验证用例。角色错误本地服务器不支持developer角色时设置compat.supportsDeveloperRole: false同时不支持reasoning_effort时再设置supportsReasoningEffort: falseOllama 即属此类详见 docs/user-docs/providers.md 中的 Ollama 配置示例。凭据来源可观测gsd doctor的健康检查会报告每个自定义 Provider 的认证来源models.json/env/auth.json可通过 doctor-providers.ts 的实现了解其判定逻辑。配置即时生效修改 models.json 后打开/model即可重载无需重启 GSD格式错误不会阻断启动可放心迭代。综合来看models.json 是 GSD 接入任意模型的关键扩展点无论是本地 Ollama/vLLM/LM Studio、私有微调模型还是 OpenRouter、Vercel AI Gateway 等代理网关都可在一份 JSON 中完成注册、鉴权、兼容性适配与成本配置并在/model中立即切换使用。赞分享人工智能AI Agent代码智能体Agent 编排CLIAI 应用【免费下载链接】gsd-2A powerful meta-prompting, context engineering and spec-driven development system that enables agents to work for long periods of time autonomously without losing track of the big picture项目地址https://gitcode.com/gh_mirrors/gs/gsd-2点击查看免费下载相关推荐MLflow Gateway 插件 Provider 实战通过 Python Entry Point 扩展自定义模型端点MLflow Gateway 插件 Provider 实战通过 Python Entry Point 扩展自定义模型端点 导读 MLflow GatewayMLOpsLLMOps人工智能大模型模型评测LLM 网关可观测性mpv Lua 脚本完整指南5 个脚本快速搞定追剧、裁剪、音量与置顶mpv Lua 脚本完整指南5 个脚本快速搞定追剧、裁剪、音量与置顶 看老电影上下黑边占掉小半个屏追到第 5 集播放器却停在列表结束电视剧广告炸耳音视频视频音频Flue 模型接入完全指南useModel 声明、调参与 Provider 注册实战Flue 模型接入完全指南useModel 声明、调参与 Provider 注册实战 每个 Flue Agent 在同一时刻只由一个 LLM 驱动而这个模型人工智能大模型AI AgentAgent 框架工具调用Agent 沙箱MCP Clients上一篇告别聊天记录丢失WeChatMsg 微信聊天记录导出与永久保存完整指南下一篇如何用SubtitleEdit完成字幕编辑时间轴校准、批量转换与OCR实战全攻略创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表