summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDax Raad <[email protected]>2025-06-17 13:23:15 -0400
committerDax Raad <[email protected]>2025-06-17 13:23:15 -0400
commit1c58023df93d915959d89d9540f9be5522b2fb82 (patch)
tree94105993794ccb3b9ce53f4a5893ad80bfa53e89
parent4e0aa58b7e8f73bc8c730cc81a62fa64cf8ec14c (diff)
downloadopencode-1c58023df93d915959d89d9540f9be5522b2fb82.tar.gz
opencode-1c58023df93d915959d89d9540f9be5522b2fb82.zip
improve anthropic oauth token caching and authentication handling
🤖 Generated with [opencode](https://opencode.ai) Co-Authored-By: opencode <[email protected]>
-rw-r--r--bun.lock3
-rw-r--r--packages/opencode/package.json3
-rw-r--r--packages/opencode/src/auth/anthropic.ts3
-rw-r--r--packages/opencode/src/auth/index.ts1
-rw-r--r--packages/opencode/src/provider/provider.ts15
5 files changed, 21 insertions, 4 deletions
diff --git a/bun.lock b/bun.lock
index e6da18ca7..90191032f 100644
--- a/bun.lock
+++ b/bun.lock
@@ -45,6 +45,7 @@
"zod-openapi": "4.2.4",
},
"devDependencies": {
+ "@ai-sdk/anthropic": "1.2.12",
"@tsconfig/bun": "1.0.7",
"@types/bun": "latest",
"@types/turndown": "5.0.5",
@@ -99,6 +100,8 @@
"zod": "3.24.2",
},
"packages": {
+ "@ai-sdk/anthropic": ["@ai-sdk/[email protected]", "", { "dependencies": { "@ai-sdk/provider": "1.1.3", "@ai-sdk/provider-utils": "2.2.8" }, "peerDependencies": { "zod": "^3.0.0" } }, "sha512-YSzjlko7JvuiyQFmI9RN1tNZdEiZxc+6xld/0tq/VkJaHpEzGAb1yiNxxvmYVcjvfu/PcvCxAAYXmTYQQ63IHQ=="],
+
"@ai-sdk/provider": ["@ai-sdk/[email protected]", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg=="],
"@ai-sdk/provider-utils": ["@ai-sdk/[email protected]", "", { "dependencies": { "@ai-sdk/provider": "1.1.3", "nanoid": "^3.3.8", "secure-json-parse": "^2.7.0" }, "peerDependencies": { "zod": "^3.23.8" } }, "sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA=="],
diff --git a/packages/opencode/package.json b/packages/opencode/package.json
index 1f732ecb1..41ce3b4d4 100644
--- a/packages/opencode/package.json
+++ b/packages/opencode/package.json
@@ -20,7 +20,8 @@
"@types/turndown": "5.0.5",
"@types/yargs": "17.0.33",
"typescript": "catalog:",
- "zod-to-json-schema": "3.24.5"
+ "zod-to-json-schema": "3.24.5",
+ "@ai-sdk/anthropic": "1.2.12"
},
"dependencies": {
"@clack/prompts": "0.11.0",
diff --git a/packages/opencode/src/auth/anthropic.ts b/packages/opencode/src/auth/anthropic.ts
index 5ee48ff81..d1eebdead 100644
--- a/packages/opencode/src/auth/anthropic.ts
+++ b/packages/opencode/src/auth/anthropic.ts
@@ -48,6 +48,7 @@ export namespace AuthAnthropic {
await Auth.set("anthropic", {
type: "oauth",
refresh: json.refresh_token as string,
+ access: json.access_token as string,
expires: Date.now() + json.expires_in * 1000,
})
}
@@ -55,6 +56,7 @@ export namespace AuthAnthropic {
export async function access() {
const info = await Auth.get("anthropic")
if (!info || info.type !== "oauth") return
+ if (info.access && info.expires > Date.now()) return info.access
const response = await fetch(
"https://console.anthropic.com/v1/oauth/token",
{
@@ -74,6 +76,7 @@ export namespace AuthAnthropic {
await Auth.set("anthropic", {
type: "oauth",
refresh: json.refresh_token as string,
+ access: json.access_token as string,
expires: Date.now() + json.expires_in * 1000,
})
return json.access_token as string
diff --git a/packages/opencode/src/auth/index.ts b/packages/opencode/src/auth/index.ts
index b2b222fce..76afa0383 100644
--- a/packages/opencode/src/auth/index.ts
+++ b/packages/opencode/src/auth/index.ts
@@ -7,6 +7,7 @@ export namespace Auth {
export const Oauth = z.object({
type: z.literal("oauth"),
refresh: z.string(),
+ access: z.string(),
expires: z.number(),
})
diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts
index 0d11ce0c9..c155891e8 100644
--- a/packages/opencode/src/provider/provider.ts
+++ b/packages/opencode/src/provider/provider.ts
@@ -50,9 +50,18 @@ export namespace Provider {
}
return {
apiKey: "",
- headers: {
- authorization: `Bearer ${access}`,
- "anthropic-beta": "oauth-2025-04-20",
+ async fetch(input: any, init: any) {
+ const access = await AuthAnthropic.access()
+ const headers = {
+ ...init.headers,
+ authorization: `Bearer ${access}`,
+ "anthropic-beta": "oauth-2025-04-20",
+ }
+ delete headers["x-api-key"]
+ return fetch(input, {
+ ...init,
+ headers,
+ })
},
}
},