diff options
| author | Yuku Kotani <[email protected]> | 2025-10-04 14:10:38 +0900 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-10-04 01:10:38 -0400 |
| commit | e7b6ffb31484c7bcc809aebbdcaf7d2ce49a13d5 (patch) | |
| tree | 5d9fb2ec9caf24d7ab2b3ad80e28bd54b015a2b9 /packages | |
| parent | 395c41b7488a04d46a9080e3c8dfdcbcacf3e828 (diff) | |
| download | opencode-e7b6ffb31484c7bcc809aebbdcaf7d2ce49a13d5.tar.gz opencode-e7b6ffb31484c7bcc809aebbdcaf7d2ce49a13d5.zip | |
feat: Vertex AI support; add google-vertex and google-vertex-anthropic providers (#2347)
Diffstat (limited to 'packages')
| -rw-r--r-- | packages/opencode/package.json | 1 | ||||
| -rw-r--r-- | packages/opencode/src/cli/cmd/auth.ts | 8 | ||||
| -rw-r--r-- | packages/opencode/src/provider/provider.ts | 45 |
3 files changed, 53 insertions, 1 deletions
diff --git a/packages/opencode/package.json b/packages/opencode/package.json index a8041a000..47a52b24b 100644 --- a/packages/opencode/package.json +++ b/packages/opencode/package.json @@ -18,6 +18,7 @@ }, "devDependencies": { "@ai-sdk/amazon-bedrock": "2.2.10", + "@ai-sdk/google-vertex": "3.0.16", "@octokit/webhooks-types": "7.6.1", "@standard-schema/spec": "1.0.0", "@tsconfig/bun": "1.0.7", diff --git a/packages/opencode/src/cli/cmd/auth.ts b/packages/opencode/src/cli/cmd/auth.ts index 965983b93..e0980e137 100644 --- a/packages/opencode/src/cli/cmd/auth.ts +++ b/packages/opencode/src/cli/cmd/auth.ts @@ -247,6 +247,14 @@ export const AuthLoginCommand = cmd({ return } + if (provider === "google-vertex") { + prompts.log.info( + "Google Cloud Vertex AI uses Application Default Credentials. Set GOOGLE_APPLICATION_CREDENTIALS or run 'gcloud auth application-default login'. Optionally set GOOGLE_CLOUD_PROJECT and GOOGLE_CLOUD_LOCATION (or VERTEX_LOCATION)", + ) + prompts.outro("Done") + return + } + if (provider === "opencode") { prompts.log.info("Create an api key at https://opencode.ai/auth") } diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts index 188639830..c18bc4898 100644 --- a/packages/opencode/src/provider/provider.ts +++ b/packages/opencode/src/provider/provider.ts @@ -153,6 +153,40 @@ export namespace Provider { }, } }, + "google-vertex": async () => { + const project = process.env["GOOGLE_CLOUD_PROJECT"] ?? process.env["GCP_PROJECT"] ?? process.env["GCLOUD_PROJECT"] + const location = process.env["GOOGLE_CLOUD_LOCATION"] ?? process.env["VERTEX_LOCATION"] ?? "us-east5" + const autoload = Boolean(project) + if (!autoload) return { autoload: false } + return { + autoload: true, + options: { + project, + location, + }, + async getModel(sdk: any, modelID: string) { + const id = String(modelID).trim() + return sdk.languageModel(id) + }, + } + }, + "google-vertex-anthropic": async () => { + const project = process.env["GOOGLE_CLOUD_PROJECT"] ?? process.env["GCP_PROJECT"] ?? process.env["GCLOUD_PROJECT"] + const location = process.env["GOOGLE_CLOUD_LOCATION"] ?? process.env["VERTEX_LOCATION"] ?? "us-east5" + const autoload = Boolean(project) + if (!autoload) return { autoload: false } + return { + autoload: true, + options: { + project, + location, + }, + async getModel(sdk: any, modelID: string) { + const id = String(modelID).trim() + return sdk.languageModel(id) + }, + } + }, } const state = Instance.state(async () => { @@ -344,7 +378,16 @@ export namespace Provider { const key = Bun.hash.xxHash32(JSON.stringify({ pkg, options })) const existing = s.sdk.get(key) if (existing) return existing - const mod = await import(await BunProc.install(pkg, "latest")) + const installedPath = await BunProc.install(pkg, "latest") + // The `google-vertex-anthropic` provider points to the `@ai-sdk/google-vertex` package. + // Ref: https://github.com/sst/models.dev/blob/0a87de42ab177bebad0620a889e2eb2b4a5dd4ab/providers/google-vertex-anthropic/provider.toml + // However, the actual export is at the subpath `@ai-sdk/google-vertex/anthropic`. + // Ref: https://ai-sdk.dev/providers/ai-sdk-providers/google-vertex#google-vertex-anthropic-provider-usage + // In addition, Bun's dynamic import logic does not support subpath imports, + // so we patch the import path to load directly from `dist`. + const modPath = + provider.id === "google-vertex-anthropic" ? `${installedPath}/dist/anthropic/index.mjs` : installedPath + const mod = await import(modPath) if (options["timeout"] !== undefined) { // Only override fetch if user explicitly sets timeout options["fetch"] = async (input: any, init?: any) => { |
