diff options
| author | Dax Raad <[email protected]> | 2025-06-17 13:23:15 -0400 |
|---|---|---|
| committer | Dax Raad <[email protected]> | 2025-06-17 13:23:15 -0400 |
| commit | 1c58023df93d915959d89d9540f9be5522b2fb82 (patch) | |
| tree | 94105993794ccb3b9ce53f4a5893ad80bfa53e89 | |
| parent | 4e0aa58b7e8f73bc8c730cc81a62fa64cf8ec14c (diff) | |
| download | opencode-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.lock | 3 | ||||
| -rw-r--r-- | packages/opencode/package.json | 3 | ||||
| -rw-r--r-- | packages/opencode/src/auth/anthropic.ts | 3 | ||||
| -rw-r--r-- | packages/opencode/src/auth/index.ts | 1 | ||||
| -rw-r--r-- | packages/opencode/src/provider/provider.ts | 15 |
5 files changed, 21 insertions, 4 deletions
@@ -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, + }) }, } }, |
