summaryrefslogtreecommitdiffhomepage
path: root/packages
diff options
context:
space:
mode:
authorYuku Kotani <[email protected]>2025-10-04 14:10:38 +0900
committerGitHub <[email protected]>2025-10-04 01:10:38 -0400
commite7b6ffb31484c7bcc809aebbdcaf7d2ce49a13d5 (patch)
tree5d9fb2ec9caf24d7ab2b3ad80e28bd54b015a2b9 /packages
parent395c41b7488a04d46a9080e3c8dfdcbcacf3e828 (diff)
downloadopencode-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.json1
-rw-r--r--packages/opencode/src/cli/cmd/auth.ts8
-rw-r--r--packages/opencode/src/provider/provider.ts45
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) => {