diff --git a/.env.example b/.env.example index eba956c..40c7031 100644 --- a/.env.example +++ b/.env.example @@ -1,5 +1,5 @@ -OPENROUTER_API_KEY= -OPENROUTER_MODEL= +AI_GATEWAY_API_KEY= +AI_GATEWAY_MODEL= UPSTASH_REDIS_REST_URL= UPSTASH_REDIS_REST_TOKEN= diff --git a/app/api/demo/chat/route.ts b/app/api/demo/chat/route.ts index 723f27d..47fee47 100644 --- a/app/api/demo/chat/route.ts +++ b/app/api/demo/chat/route.ts @@ -1,5 +1,6 @@ import { convertToModelMessages, + gateway, jsonSchema, stepCountIs, streamText, @@ -16,7 +17,6 @@ import { chatRateLimit, getClientIp, } from "@/lib/demo/rate-limit"; -import { openrouter } from "@/lib/ai/openrouter"; const SYSTEM_PROMPT = `You are an AI assistant demonstrating the Agent Auth Protocol — a standard for authorizing AI agents to act on behalf of users. @@ -375,9 +375,7 @@ export async function POST(req: Request) { } const result = streamText({ - model: openrouter.chat( - process.env.OPENROUTER_MODEL ?? "anthropic/claude-opus-4.6", - ), + model: gateway(process.env.AI_GATEWAY_MODEL ?? "anthropic/claude-opus-4.6"), system: systemPrompt, messages: await convertToModelMessages(messages), tools: buildTools(session), diff --git a/lib/ai/openrouter.ts b/lib/ai/openrouter.ts deleted file mode 100644 index 6f071f2..0000000 --- a/lib/ai/openrouter.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { createOpenRouter } from "@openrouter/ai-sdk-provider"; - -function requireOpenRouterApiKey(): string { - const apiKey = process.env.OPENROUTER_API_KEY?.trim(); - - if (!apiKey) { - throw new Error( - "Missing OPENROUTER_API_KEY. Add it to your environment before starting the server.", - ); - } - - if (!apiKey.startsWith("sk-or-v1-")) { - throw new Error( - "Invalid OPENROUTER_API_KEY format. OpenRouter keys must start with 'sk-or-v1-'.", - ); - } - - return apiKey; -} - -function getOpenRouterHeaders(): Record { - const headers: Record = { - "X-Title": "Agent Auth Protocol", - }; - - const referer = - process.env.OPENROUTER_SITE_URL?.trim() ?? - process.env.NEXT_PUBLIC_SITE_URL?.trim(); - - if (referer) { - headers["HTTP-Referer"] = referer; - } - - return headers; -} - -export const openrouter = createOpenRouter({ - apiKey: requireOpenRouterApiKey(), - headers: getOpenRouterHeaders(), -}); diff --git a/lib/ai/server.ts b/lib/ai/server.ts index 096f351..2b1e99e 100644 --- a/lib/ai/server.ts +++ b/lib/ai/server.ts @@ -1,5 +1,6 @@ import { convertToModelMessages, + gateway, stepCountIs, streamText, wrapLanguageModel, @@ -15,7 +16,6 @@ import { getSpecContent, getSpecVersions, } from "@/lib/spec"; -import { openrouter } from "@/lib/ai/openrouter"; // Build unified Orama search index: docs + spec sections const searchServer = initAdvancedSearch({ @@ -157,9 +157,7 @@ export async function POST(req: Request) { } const model = wrapLanguageModel({ - model: openrouter.chat( - process.env.OPENROUTER_MODEL ?? "moonshotai/kimi-k2.5", - ), + model: gateway(process.env.AI_GATEWAY_MODEL ?? "moonshotai/kimi-k2.5"), middleware: middlewares, }); diff --git a/package.json b/package.json index faca1cd..c7dcf35 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,6 @@ "dependencies": { "@ai-sdk/react": "^3.0.118", "@auth/agent": "latest", - "@openrouter/ai-sdk-provider": "^2.3.3", "@radix-ui/react-avatar": "^1.1.10", "@radix-ui/react-dialog": "^1.1.14", "@radix-ui/react-dropdown-menu": "^2.1.15", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 69cde4b..07708ad 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,9 +14,6 @@ importers: '@auth/agent': specifier: latest version: 0.4.6(ai@6.0.116(zod@4.3.6)) - '@openrouter/ai-sdk-provider': - specifier: ^2.3.3 - version: 2.3.3(ai@6.0.116(zod@4.3.6))(zod@4.3.6) '@radix-ui/react-avatar': specifier: ^1.1.10 version: 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -631,13 +628,6 @@ packages: cpu: [x64] os: [win32] - '@openrouter/ai-sdk-provider@2.3.3': - resolution: {integrity: sha512-4fVteGkVedc7fGoA9+qJs4tpYwALezMq14m2Sjub3KmyRlksCbK+WJf67NPdGem8+NZrV2tAN42A1NU3+SiV3w==} - engines: {node: '>=18'} - peerDependencies: - ai: ^6.0.0 - zod: ^3.25.0 || ^4.0.0 - '@opentelemetry/api@1.9.0': resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} engines: {node: '>=8.0.0'} @@ -3446,11 +3436,6 @@ snapshots: '@next/swc-win32-x64-msvc@16.1.6': optional: true - '@openrouter/ai-sdk-provider@2.3.3(ai@6.0.116(zod@4.3.6))(zod@4.3.6)': - dependencies: - ai: 6.0.116(zod@4.3.6) - zod: 4.3.6 - '@opentelemetry/api@1.9.0': {} '@orama/orama@3.1.18': {}