diff --git a/env.example b/env.example index 8d01d0e..7df2030 100644 --- a/env.example +++ b/env.example @@ -20,16 +20,20 @@ AI_MODEL=global.anthropic.claude-sonnet-4-5-20250929-v1:0 # Anthropic (Direct) Configuration # ANTHROPIC_API_KEY=sk-ant-... +# ANTHROPIC_BASE_URL=https://your-custom-anthropic/v1 # Google Generative AI Configuration # GOOGLE_GENERATIVE_AI_API_KEY=... +# GOOGLE_BASE_URL=https://generativelanguage.googleapis.com/v1beta # Optional: Custom endpoint # Azure OpenAI Configuration # AZURE_RESOURCE_NAME=your-resource-name # AZURE_API_KEY=... +# AZURE_BASE_URL=https://your-resource.openai.azure.com # Optional: Custom endpoint (overrides resourceName) # Ollama (Local) Configuration # OLLAMA_BASE_URL=http://localhost:11434/api # Optional, defaults to localhost # OpenRouter Configuration # OPENROUTER_API_KEY=sk-or-v1-... +# OPENROUTER_BASE_URL=https://openrouter.ai/api/v1 # Optional: Custom endpoint diff --git a/lib/ai-providers.ts b/lib/ai-providers.ts index b2eda07..aeb65fd 100644 --- a/lib/ai-providers.ts +++ b/lib/ai-providers.ts @@ -1,9 +1,9 @@ import { bedrock } from '@ai-sdk/amazon-bedrock'; import { openai, createOpenAI } from '@ai-sdk/openai'; -import { anthropic } from '@ai-sdk/anthropic'; -import { google } from '@ai-sdk/google'; -import { azure } from '@ai-sdk/azure'; -import { ollama } from 'ollama-ai-provider-v2'; +import { createAnthropic } from '@ai-sdk/anthropic'; +import { google, createGoogleGenerativeAI } from '@ai-sdk/google'; +import { azure, createAzure } from '@ai-sdk/azure'; +import { ollama, createOllama } from 'ollama-ai-provider-v2'; import { createOpenRouter } from '@openrouter/ai-sdk-provider'; export type ProviderName = @@ -115,26 +115,55 @@ export function getAIModel(): ModelConfig { break; case 'anthropic': - model = anthropic(modelId); + const customProvider = createAnthropic({ + apiKey: process.env.ANTHROPIC_API_KEY, + baseURL: process.env.ANTHROPIC_BASE_URL || 'https://api.anthropic.com/v1', + headers: ANTHROPIC_BETA_HEADERS, + }); + model = customProvider(modelId); // Add beta headers for fine-grained tool streaming headers = ANTHROPIC_BETA_HEADERS; break; case 'google': - model = google(modelId); + if (process.env.GOOGLE_BASE_URL) { + const customGoogle = createGoogleGenerativeAI({ + apiKey: process.env.GOOGLE_GENERATIVE_AI_API_KEY, + baseURL: process.env.GOOGLE_BASE_URL, + }); + model = customGoogle(modelId); + } else { + model = google(modelId); + } break; case 'azure': - model = azure(modelId); + if (process.env.AZURE_BASE_URL) { + const customAzure = createAzure({ + apiKey: process.env.AZURE_API_KEY, + baseURL: process.env.AZURE_BASE_URL, + }); + model = customAzure(modelId); + } else { + model = azure(modelId); + } break; case 'ollama': - model = ollama(modelId); + if (process.env.OLLAMA_BASE_URL) { + const customOllama = createOllama({ + baseURL: process.env.OLLAMA_BASE_URL, + }); + model = customOllama(modelId); + } else { + model = ollama(modelId); + } break; case 'openrouter': const openrouter = createOpenRouter({ apiKey: process.env.OPENROUTER_API_KEY, + ...(process.env.OPENROUTER_BASE_URL && { baseURL: process.env.OPENROUTER_BASE_URL }), }); model = openrouter(modelId); break;