summaryrefslogtreecommitdiffhomepage
path: root/packages
diff options
context:
space:
mode:
authorDax Raad <[email protected]>2025-06-16 15:02:25 -0400
committerDax Raad <[email protected]>2025-06-16 15:02:25 -0400
commit2c9fd1e7760da4e1776d9cee7db93af1512c88a7 (patch)
treeb26a0422ccca227f84ddf182007792d922e48425 /packages
parent63996c4189a6f66225a34c43328e616c5963e007 (diff)
downloadopencode-2c9fd1e7760da4e1776d9cee7db93af1512c88a7.tar.gz
opencode-2c9fd1e7760da4e1776d9cee7db93af1512c88a7.zip
BREAKING CHANGE: the config structure has changed, custom providers have an `npm` field now to specify which npm package to load. see examples in README.md
Diffstat (limited to 'packages')
-rw-r--r--packages/opencode/config.schema.json3
-rw-r--r--packages/opencode/src/auth/anthropic.ts1
-rw-r--r--packages/opencode/src/bun/index.ts1
-rw-r--r--packages/opencode/src/cli/cmd/auth.ts12
-rw-r--r--packages/opencode/src/provider/models.ts1
-rw-r--r--packages/opencode/src/provider/provider.ts18
6 files changed, 22 insertions, 14 deletions
diff --git a/packages/opencode/config.schema.json b/packages/opencode/config.schema.json
index 7eba147b1..c9d7e7f59 100644
--- a/packages/opencode/config.schema.json
+++ b/packages/opencode/config.schema.json
@@ -21,6 +21,9 @@
"id": {
"type": "string"
},
+ "npm": {
+ "type": "string"
+ },
"models": {
"type": "object",
"additionalProperties": {
diff --git a/packages/opencode/src/auth/anthropic.ts b/packages/opencode/src/auth/anthropic.ts
index ef029b1d0..5ee48ff81 100644
--- a/packages/opencode/src/auth/anthropic.ts
+++ b/packages/opencode/src/auth/anthropic.ts
@@ -1,5 +1,4 @@
import { generatePKCE } from "@openauthjs/openauth/pkce"
-import fs from "fs/promises"
import { Auth } from "./index"
export namespace AuthAnthropic {
diff --git a/packages/opencode/src/bun/index.ts b/packages/opencode/src/bun/index.ts
index a003f1c5d..3f8b6178a 100644
--- a/packages/opencode/src/bun/index.ts
+++ b/packages/opencode/src/bun/index.ts
@@ -43,6 +43,7 @@ export namespace BunProc {
version: z.string(),
}),
)
+
export async function install(pkg: string, version = "latest") {
const mod = path.join(Global.Path.cache, "node_modules", pkg)
const pkgjson = Bun.file(path.join(Global.Path.cache, "package.json"))
diff --git a/packages/opencode/src/cli/cmd/auth.ts b/packages/opencode/src/cli/cmd/auth.ts
index e8f45e7ab..37df11e4c 100644
--- a/packages/opencode/src/cli/cmd/auth.ts
+++ b/packages/opencode/src/cli/cmd/auth.ts
@@ -5,7 +5,7 @@ import * as prompts from "@clack/prompts"
import open from "open"
import { UI } from "../ui"
import { ModelsDev } from "../../provider/models"
-import { map, pipe, sort, sortBy, values } from "remeda"
+import { map, pipe, sortBy, values } from "remeda"
export const AuthCommand = cmd({
command: "auth",
@@ -16,7 +16,7 @@ export const AuthCommand = cmd({
.command(AuthLogoutCommand)
.command(AuthListCommand)
.demandCommand(),
- async handler(args) {},
+ async handler() {},
})
export const AuthListCommand = cmd({
@@ -78,8 +78,10 @@ export const AuthLoginCommand = cmd({
if (provider === "other") {
provider = await prompts.text({
- message: "Enter provider - must match @ai-sdk/<provider>",
+ message:
+ "Enter provider - must be package name from https://ai-sdk.dev/providers",
})
+ provider = provider.replace(/^@ai-sdk\//, "")
if (prompts.isCancel(provider)) throw new UI.CancelledError()
}
@@ -115,7 +117,9 @@ export const AuthLoginCommand = cmd({
try {
await open(url)
} catch (e) {
- prompts.log.error("Failed to open browser perhaps you are running without a display or X server, please open the following URL in your browser:")
+ prompts.log.error(
+ "Failed to open browser perhaps you are running without a display or X server, please open the following URL in your browser:",
+ )
}
prompts.log.info(url)
diff --git a/packages/opencode/src/provider/models.ts b/packages/opencode/src/provider/models.ts
index 334b11914..a753d7ec1 100644
--- a/packages/opencode/src/provider/models.ts
+++ b/packages/opencode/src/provider/models.ts
@@ -36,6 +36,7 @@ export namespace ModelsDev {
name: z.string(),
env: z.array(z.string()),
id: z.string(),
+ npm: z.string().optional(),
models: z.record(Model),
})
.openapi({
diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts
index e55a5795f..9a08c4e3f 100644
--- a/packages/opencode/src/provider/provider.ts
+++ b/packages/opencode/src/provider/provider.ts
@@ -108,6 +108,7 @@ export namespace Provider {
const existing = database[providerID]
const parsed: ModelsDev.Provider = {
id: providerID,
+ npm: provider.npm ?? existing?.npm,
name: provider.name ?? existing?.name ?? providerID,
env: provider.env ?? existing?.env ?? [],
models: existing?.models ?? {},
@@ -181,22 +182,22 @@ export namespace Provider {
return state().then((state) => state.providers)
}
- async function getSDK(providerID: string) {
+ async function getSDK(provider: ModelsDev.Provider) {
return (async () => {
using _ = log.time("getSDK", {
- providerID,
+ providerID: provider.id,
})
const s = await state()
- const existing = s.sdk.get(providerID)
+ const existing = s.sdk.get(provider.id)
if (existing) return existing
- const [pkg, version] = await ModelsDev.pkg(providerID)
+ const [pkg, version] = await ModelsDev.pkg(provider.npm ?? provider.id)
const mod = await import(await BunProc.install(pkg, version))
const fn = mod[Object.keys(mod).find((key) => key.startsWith("create"))!]
- const loaded = fn(s.providers[providerID]?.options)
- s.sdk.set(providerID, loaded)
+ const loaded = fn(s.providers[provider.id]?.options)
+ s.sdk.set(provider.id, loaded)
return loaded as SDK
})().catch((e) => {
- throw new InitError({ providerID: providerID }, { cause: e })
+ throw new InitError({ providerID: provider.id }, { cause: e })
})
}
@@ -214,8 +215,7 @@ export namespace Provider {
if (!provider) throw new ModelNotFoundError({ providerID, modelID })
const info = provider.info.models[modelID]
if (!info) throw new ModelNotFoundError({ providerID, modelID })
-
- const sdk = await getSDK(providerID)
+ const sdk = await getSDK(provider.info)
try {
const language =