summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--README.md7
-rw-r--r--opencode.json4
-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
8 files changed, 28 insertions, 19 deletions
diff --git a/README.md b/README.md
index 6b82000c5..9820f28e7 100644
--- a/README.md
+++ b/README.md
@@ -84,8 +84,8 @@ You can use opencode with any provider listed at [here](https://ai-sdk.dev/provi
{
"$schema": "https://opencode.ai/config.json",
"provider": {
- "@ai-sdk/openai-compatible": {
- "name": "ollama",
+ "ollama": {
+ "npm": "@ai-sdk/openai-compatible",
"options": {
"baseURL": "http://localhost:11434/v1"
},
@@ -124,7 +124,8 @@ OpenRouter is not yet in the models.dev database, but you can configure it manua
{
"$schema": "https://opencode.ai/config.json",
"provider": {
- "@openrouter/ai-sdk-provider": {
+ "openrouter": {
+ "npm": "@openrouter/ai-sdk-provider",
"name": "OpenRouter",
"options": {
"apiKey": "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
diff --git a/opencode.json b/opencode.json
index 7bf1d1318..691bd372f 100644
--- a/opencode.json
+++ b/opencode.json
@@ -1,8 +1,8 @@
{
"$schema": "https://opencode.ai/config.json",
"provider": {
- "@ai-sdk/openai-compatible": {
- "name": "ollama",
+ "ollama": {
+ "npm": "@ai-sdk/openai-compatible",
"options": {
"baseURL": "http://localhost:11434/v1"
},
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 =