From 698ce2fa3116b85f7f2c6b11ce46a391348b2fb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E4=B8=AD=E6=B4=8B?= Date: Fri, 5 Jun 2026 20:54:26 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20zmo=20providers=20login=20=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=A1=AB=E5=86=99=E8=87=AA=E5=AE=9A=E4=B9=89=20base?= =?UTF-8?q?=20URL=EF=BC=88=E4=B8=AD=E8=BD=AC=E5=9C=B0=E5=9D=80=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit login 填完 API key 后新增一步询问 base URL(留空=官方默认)。 若填写则写入 ~/.config/zmo/zmo.json 的 provider..options.baseURL, 后续请求自动走中转。key 仍存 auth.json,baseURL 走 config。 Co-Authored-By: Claude Opus 4.7 --- packages/opencode/src/cli/cmd/providers.ts | 33 ++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/packages/opencode/src/cli/cmd/providers.ts b/packages/opencode/src/cli/cmd/providers.ts index 0d890cc21..b99e7863a 100644 --- a/packages/opencode/src/cli/cmd/providers.ts +++ b/packages/opencode/src/cli/cmd/providers.ts @@ -8,6 +8,7 @@ import { ModelsDev } from "@opencode-ai/core/models-dev" import { map, pipe, sortBy, values } from "remeda" import path from "path" import os from "os" +import fsNode from "node:fs" import { Config } from "@/config/config" import { Global } from "@opencode-ai/core/global" import { Plugin } from "../../plugin" @@ -481,6 +482,38 @@ export const ProvidersLoginCommand = effectCmd({ const apiKey = yield* promptValue(key) yield* Effect.orDie(authSvc.set(provider, { type: "api", key: apiKey })) + // zmo: 询问自定义 base URL(中转地址),留空则用官方默认。 + // baseURL 不存 auth.json,写入 config 文件的 provider..options.baseURL。 + const baseURLInput = yield* Prompt.text({ + message: "Base URL (中转地址,留空使用官方默认)", + placeholder: "https://your-proxy.example.com/v1", + }) + const baseURL = (yield* promptValue(baseURLInput))?.trim() + if (baseURL) { + try { + const configDir = Global.Path.config + fsNode.mkdirSync(configDir, { recursive: true }) + const file = path.join(configDir, "zmo.json") + let data: any = {} + if (fsNode.existsSync(file)) { + try { + data = JSON.parse(fsNode.readFileSync(file, "utf8")) ?? {} + } catch { + data = {} + } + } + if (!data.$schema) data.$schema = "https://zmo.dev/config.json" + data.provider ??= {} + data.provider[provider] ??= {} + data.provider[provider].options ??= {} + data.provider[provider].options.baseURL = baseURL + fsNode.writeFileSync(file, JSON.stringify(data, null, 2)) + yield* Prompt.log.info(`Base URL 已保存到 ${file}`) + } catch { + yield* Prompt.log.warn("Base URL 保存失败,请手动写入 zmo.json") + } + } + yield* Prompt.outro("Done") }), })