@contractspec/lib.ai-providers 1.46.2 → 1.48.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"factory.js","names":["apiKey: string | undefined","providers: ProviderAvailability[]"],"sources":["../src/factory.ts"],"sourcesContent":["/**\n * Provider factory and creation utilities\n */\nimport type { LanguageModel } from 'ai';\nimport { anthropic } from '@ai-sdk/anthropic';\nimport { google } from '@ai-sdk/google';\nimport { mistral } from '@ai-sdk/mistral';\nimport { openai } from '@ai-sdk/openai';\nimport { ollama } from 'ollama-ai-provider';\nimport type {\n ModelInfo,\n Provider,\n ProviderAvailability,\n ProviderConfig,\n ProviderMode,\n ProviderName,\n} from './types';\nimport { DEFAULT_MODELS, getModelsForProvider } from './models';\n\n/**\n * Base provider implementation\n */\nclass BaseProvider implements Provider {\n readonly name: ProviderName;\n readonly model: string;\n readonly mode: ProviderMode;\n\n private readonly config: ProviderConfig;\n private cachedModel: LanguageModel | null = null;\n\n constructor(config: ProviderConfig) {\n this.name = config.provider;\n this.model = config.model ?? DEFAULT_MODELS[config.provider];\n this.mode = this.determineMode(config);\n this.config = config;\n }\n\n getModel(): LanguageModel {\n if (!this.cachedModel) {\n this.cachedModel = this.createModel();\n }\n return this.cachedModel;\n }\n\n async listModels(): Promise<ModelInfo[]> {\n if (this.name === 'ollama') {\n return this.listOllamaModels();\n }\n return getModelsForProvider(this.name);\n }\n\n async validate(): Promise<{ valid: boolean; error?: string }> {\n if (this.name === 'ollama') {\n return this.validateOllama();\n }\n\n if (this.mode === 'byok' && !this.config.apiKey) {\n return {\n valid: false,\n error: `API key required for ${this.name}`,\n };\n }\n\n if (\n this.mode === 'managed' &&\n !this.config.proxyUrl &&\n !this.config.organizationId\n ) {\n return {\n valid: false,\n error: 'Managed mode requires proxyUrl or organizationId',\n };\n }\n\n return { valid: true };\n }\n\n private determineMode(config: ProviderConfig): ProviderMode {\n if (config.provider === 'ollama') return 'local';\n if (config.apiKey) return 'byok';\n return 'managed';\n }\n\n private createModel(): LanguageModel {\n const { baseUrl, proxyUrl } = this.config;\n\n switch (this.name) {\n case 'ollama': {\n // For Ollama, set the base URL via environment variable\n const originalBaseUrl = process.env.OLLAMA_BASE_URL;\n if (baseUrl && baseUrl !== 'http://localhost:11434') {\n process.env.OLLAMA_BASE_URL = baseUrl;\n }\n\n const ollamaModel = ollama(this.model);\n\n // Restore original environment variable\n if (originalBaseUrl !== undefined) {\n process.env.OLLAMA_BASE_URL = originalBaseUrl;\n } else if (baseUrl && baseUrl !== 'http://localhost:11434') {\n delete process.env.OLLAMA_BASE_URL;\n }\n\n return ollamaModel as unknown as LanguageModel;\n }\n\n case 'openai':\n if (this.mode === 'managed') {\n // For managed mode, use proxy URL via environment variable\n const originalBaseUrl = process.env.OPENAI_BASE_URL;\n if (proxyUrl) {\n process.env.OPENAI_BASE_URL = proxyUrl;\n }\n\n const model = openai(this.model);\n\n // Restore original environment variable\n if (originalBaseUrl !== undefined) {\n process.env.OPENAI_BASE_URL = originalBaseUrl;\n } else if (proxyUrl) {\n delete process.env.OPENAI_BASE_URL;\n }\n\n return model;\n }\n return openai(this.model);\n\n case 'anthropic':\n if (this.mode === 'managed') {\n // For managed mode with Anthropic, we use the proxy via openai\n const originalBaseUrl = process.env.OPENAI_BASE_URL;\n if (proxyUrl) {\n process.env.OPENAI_BASE_URL = proxyUrl;\n }\n\n const model = openai(this.model);\n\n // Restore original environment variable\n if (originalBaseUrl !== undefined) {\n process.env.OPENAI_BASE_URL = originalBaseUrl;\n } else if (proxyUrl) {\n delete process.env.OPENAI_BASE_URL;\n }\n\n return model;\n }\n return anthropic(this.model);\n\n case 'mistral':\n if (this.mode === 'managed') {\n // For managed mode with Mistral, we use the proxy via openai\n const originalBaseUrl = process.env.OPENAI_BASE_URL;\n if (proxyUrl) {\n process.env.OPENAI_BASE_URL = proxyUrl;\n }\n\n const model = openai(this.model);\n\n // Restore original environment variable\n if (originalBaseUrl !== undefined) {\n process.env.OPENAI_BASE_URL = originalBaseUrl;\n } else if (proxyUrl) {\n delete process.env.OPENAI_BASE_URL;\n }\n\n return model;\n }\n return mistral(this.model);\n\n case 'gemini':\n if (this.mode === 'managed') {\n // For managed mode with Gemini, we use the proxy via openai\n const originalBaseUrl = process.env.OPENAI_BASE_URL;\n if (proxyUrl) {\n process.env.OPENAI_BASE_URL = proxyUrl;\n }\n\n const model = openai(this.model);\n\n // Restore original environment variable\n if (originalBaseUrl !== undefined) {\n process.env.OPENAI_BASE_URL = originalBaseUrl;\n } else if (proxyUrl) {\n delete process.env.OPENAI_BASE_URL;\n }\n\n return model;\n }\n return google(this.model);\n\n default:\n throw new Error(`Unknown provider: ${this.name}`);\n }\n }\n\n private async listOllamaModels(): Promise<ModelInfo[]> {\n try {\n const baseUrl = this.config.baseUrl ?? 'http://localhost:11434';\n const response = await fetch(`${baseUrl}/api/tags`);\n if (!response.ok) {\n return getModelsForProvider('ollama');\n }\n\n const data = (await response.json()) as {\n models?: { name: string; size?: number }[];\n };\n const models = data.models ?? [];\n\n return models.map((m) => ({\n id: m.name,\n name: m.name,\n provider: 'ollama' as const,\n contextWindow: 8000,\n capabilities: {\n vision: false,\n tools: false,\n reasoning: false,\n streaming: true,\n },\n }));\n } catch {\n return getModelsForProvider('ollama');\n }\n }\n\n private async validateOllama(): Promise<{ valid: boolean; error?: string }> {\n try {\n const baseUrl = this.config.baseUrl ?? 'http://localhost:11434';\n const response = await fetch(`${baseUrl}/api/tags`);\n if (!response.ok) {\n return {\n valid: false,\n error: `Ollama server returned ${response.status}`,\n };\n }\n\n const data = (await response.json()) as {\n models?: { name: string }[];\n };\n const models = data.models ?? [];\n const hasModel = models.some((m) => m.name === this.model);\n\n if (!hasModel) {\n return {\n valid: false,\n error: `Model \"${this.model}\" not found. Available: ${models.map((m) => m.name).join(', ')}`,\n };\n }\n\n return { valid: true };\n } catch (error) {\n const baseUrl = this.config.baseUrl ?? 'http://localhost:11434';\n return {\n valid: false,\n error: `Cannot connect to Ollama at ${baseUrl}: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n }\n}\n\n/**\n * Create a provider from configuration\n */\nexport function createProvider(config: ProviderConfig): Provider {\n return new BaseProvider(config);\n}\n\n/**\n * Create a provider from environment variables\n */\nexport function createProviderFromEnv(): Provider {\n const provider =\n (process.env.CONTRACTSPEC_AI_PROVIDER as ProviderName) ?? 'openai';\n const model = process.env.CONTRACTSPEC_AI_MODEL;\n\n let apiKey: string | undefined;\n switch (provider) {\n case 'openai':\n apiKey = process.env.OPENAI_API_KEY;\n break;\n case 'anthropic':\n apiKey = process.env.ANTHROPIC_API_KEY;\n break;\n case 'mistral':\n apiKey = process.env.MISTRAL_API_KEY;\n break;\n case 'gemini':\n apiKey = process.env.GOOGLE_API_KEY ?? process.env.GEMINI_API_KEY;\n break;\n case 'ollama':\n // No API key needed\n break;\n }\n\n return createProvider({\n provider,\n model,\n apiKey,\n baseUrl: process.env.OLLAMA_BASE_URL,\n proxyUrl: process.env.CONTRACTSPEC_AI_PROXY_URL,\n organizationId: process.env.CONTRACTSPEC_ORG_ID,\n });\n}\n\n/**\n * Get all available providers with their status\n */\nexport function getAvailableProviders(): ProviderAvailability[] {\n const providers: ProviderAvailability[] = [];\n\n // Ollama (local)\n providers.push({\n provider: 'ollama',\n available: true,\n mode: 'local',\n });\n\n // OpenAI\n const openaiKey = process.env.OPENAI_API_KEY;\n providers.push({\n provider: 'openai',\n available:\n Boolean(openaiKey) || Boolean(process.env.CONTRACTSPEC_AI_PROXY_URL),\n mode: openaiKey ? 'byok' : 'managed',\n reason: !openaiKey ? 'Set OPENAI_API_KEY for BYOK mode' : undefined,\n });\n\n // Anthropic\n const anthropicKey = process.env.ANTHROPIC_API_KEY;\n providers.push({\n provider: 'anthropic',\n available:\n Boolean(anthropicKey) || Boolean(process.env.CONTRACTSPEC_AI_PROXY_URL),\n mode: anthropicKey ? 'byok' : 'managed',\n reason: !anthropicKey ? 'Set ANTHROPIC_API_KEY for BYOK mode' : undefined,\n });\n\n // Mistral\n const mistralKey = process.env.MISTRAL_API_KEY;\n providers.push({\n provider: 'mistral',\n available:\n Boolean(mistralKey) || Boolean(process.env.CONTRACTSPEC_AI_PROXY_URL),\n mode: mistralKey ? 'byok' : 'managed',\n reason: !mistralKey ? 'Set MISTRAL_API_KEY for BYOK mode' : undefined,\n });\n\n // Gemini\n const geminiKey = process.env.GOOGLE_API_KEY ?? process.env.GEMINI_API_KEY;\n providers.push({\n provider: 'gemini',\n available:\n Boolean(geminiKey) || Boolean(process.env.CONTRACTSPEC_AI_PROXY_URL),\n mode: geminiKey ? 'byok' : 'managed',\n reason: !geminiKey ? 'Set GOOGLE_API_KEY for BYOK mode' : undefined,\n });\n\n return providers;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"factory.js","names":[],"sources":["../src/factory.ts"],"sourcesContent":["/**\n * Provider factory and creation utilities\n */\nimport type { LanguageModel } from 'ai';\nimport { anthropic } from '@ai-sdk/anthropic';\nimport { google } from '@ai-sdk/google';\nimport { mistral } from '@ai-sdk/mistral';\nimport { openai } from '@ai-sdk/openai';\nimport { ollama } from 'ollama-ai-provider';\nimport type {\n ModelInfo,\n Provider,\n ProviderAvailability,\n ProviderConfig,\n ProviderMode,\n ProviderName,\n} from './types';\nimport { DEFAULT_MODELS, getModelsForProvider } from './models';\n\n/**\n * Base provider implementation\n */\nclass BaseProvider implements Provider {\n readonly name: ProviderName;\n readonly model: string;\n readonly mode: ProviderMode;\n\n private readonly config: ProviderConfig;\n private cachedModel: LanguageModel | null = null;\n\n constructor(config: ProviderConfig) {\n this.name = config.provider;\n this.model = config.model ?? DEFAULT_MODELS[config.provider];\n this.mode = this.determineMode(config);\n this.config = config;\n }\n\n getModel(): LanguageModel {\n if (!this.cachedModel) {\n this.cachedModel = this.createModel();\n }\n return this.cachedModel;\n }\n\n async listModels(): Promise<ModelInfo[]> {\n if (this.name === 'ollama') {\n return this.listOllamaModels();\n }\n return getModelsForProvider(this.name);\n }\n\n async validate(): Promise<{ valid: boolean; error?: string }> {\n if (this.name === 'ollama') {\n return this.validateOllama();\n }\n\n if (this.mode === 'byok' && !this.config.apiKey) {\n return {\n valid: false,\n error: `API key required for ${this.name}`,\n };\n }\n\n if (\n this.mode === 'managed' &&\n !this.config.proxyUrl &&\n !this.config.organizationId\n ) {\n return {\n valid: false,\n error: 'Managed mode requires proxyUrl or organizationId',\n };\n }\n\n return { valid: true };\n }\n\n private determineMode(config: ProviderConfig): ProviderMode {\n if (config.provider === 'ollama') return 'local';\n if (config.apiKey) return 'byok';\n return 'managed';\n }\n\n private createModel(): LanguageModel {\n const { baseUrl, proxyUrl } = this.config;\n\n switch (this.name) {\n case 'ollama': {\n // For Ollama, set the base URL via environment variable\n const originalBaseUrl = process.env.OLLAMA_BASE_URL;\n if (baseUrl && baseUrl !== 'http://localhost:11434') {\n process.env.OLLAMA_BASE_URL = baseUrl;\n }\n\n const ollamaModel = ollama(this.model);\n\n // Restore original environment variable\n if (originalBaseUrl !== undefined) {\n process.env.OLLAMA_BASE_URL = originalBaseUrl;\n } else if (baseUrl && baseUrl !== 'http://localhost:11434') {\n delete process.env.OLLAMA_BASE_URL;\n }\n\n return ollamaModel as unknown as LanguageModel;\n }\n\n case 'openai':\n if (this.mode === 'managed') {\n // For managed mode, use proxy URL via environment variable\n const originalBaseUrl = process.env.OPENAI_BASE_URL;\n if (proxyUrl) {\n process.env.OPENAI_BASE_URL = proxyUrl;\n }\n\n const model = openai(this.model);\n\n // Restore original environment variable\n if (originalBaseUrl !== undefined) {\n process.env.OPENAI_BASE_URL = originalBaseUrl;\n } else if (proxyUrl) {\n delete process.env.OPENAI_BASE_URL;\n }\n\n return model;\n }\n return openai(this.model);\n\n case 'anthropic':\n if (this.mode === 'managed') {\n // For managed mode with Anthropic, we use the proxy via openai\n const originalBaseUrl = process.env.OPENAI_BASE_URL;\n if (proxyUrl) {\n process.env.OPENAI_BASE_URL = proxyUrl;\n }\n\n const model = openai(this.model);\n\n // Restore original environment variable\n if (originalBaseUrl !== undefined) {\n process.env.OPENAI_BASE_URL = originalBaseUrl;\n } else if (proxyUrl) {\n delete process.env.OPENAI_BASE_URL;\n }\n\n return model;\n }\n return anthropic(this.model);\n\n case 'mistral':\n if (this.mode === 'managed') {\n // For managed mode with Mistral, we use the proxy via openai\n const originalBaseUrl = process.env.OPENAI_BASE_URL;\n if (proxyUrl) {\n process.env.OPENAI_BASE_URL = proxyUrl;\n }\n\n const model = openai(this.model);\n\n // Restore original environment variable\n if (originalBaseUrl !== undefined) {\n process.env.OPENAI_BASE_URL = originalBaseUrl;\n } else if (proxyUrl) {\n delete process.env.OPENAI_BASE_URL;\n }\n\n return model;\n }\n return mistral(this.model);\n\n case 'gemini':\n if (this.mode === 'managed') {\n // For managed mode with Gemini, we use the proxy via openai\n const originalBaseUrl = process.env.OPENAI_BASE_URL;\n if (proxyUrl) {\n process.env.OPENAI_BASE_URL = proxyUrl;\n }\n\n const model = openai(this.model);\n\n // Restore original environment variable\n if (originalBaseUrl !== undefined) {\n process.env.OPENAI_BASE_URL = originalBaseUrl;\n } else if (proxyUrl) {\n delete process.env.OPENAI_BASE_URL;\n }\n\n return model;\n }\n return google(this.model);\n\n default:\n throw new Error(`Unknown provider: ${this.name}`);\n }\n }\n\n private async listOllamaModels(): Promise<ModelInfo[]> {\n try {\n const baseUrl = this.config.baseUrl ?? 'http://localhost:11434';\n const response = await fetch(`${baseUrl}/api/tags`);\n if (!response.ok) {\n return getModelsForProvider('ollama');\n }\n\n const data = (await response.json()) as {\n models?: { name: string; size?: number }[];\n };\n const models = data.models ?? [];\n\n return models.map((m) => ({\n id: m.name,\n name: m.name,\n provider: 'ollama' as const,\n contextWindow: 8000,\n capabilities: {\n vision: false,\n tools: false,\n reasoning: false,\n streaming: true,\n },\n }));\n } catch {\n return getModelsForProvider('ollama');\n }\n }\n\n private async validateOllama(): Promise<{ valid: boolean; error?: string }> {\n try {\n const baseUrl = this.config.baseUrl ?? 'http://localhost:11434';\n const response = await fetch(`${baseUrl}/api/tags`);\n if (!response.ok) {\n return {\n valid: false,\n error: `Ollama server returned ${response.status}`,\n };\n }\n\n const data = (await response.json()) as {\n models?: { name: string }[];\n };\n const models = data.models ?? [];\n const hasModel = models.some((m) => m.name === this.model);\n\n if (!hasModel) {\n return {\n valid: false,\n error: `Model \"${this.model}\" not found. Available: ${models.map((m) => m.name).join(', ')}`,\n };\n }\n\n return { valid: true };\n } catch (error) {\n const baseUrl = this.config.baseUrl ?? 'http://localhost:11434';\n return {\n valid: false,\n error: `Cannot connect to Ollama at ${baseUrl}: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n }\n}\n\n/**\n * Create a provider from configuration\n */\nexport function createProvider(config: ProviderConfig): Provider {\n return new BaseProvider(config);\n}\n\n/**\n * Create a provider from environment variables\n */\nexport function createProviderFromEnv(): Provider {\n const provider =\n (process.env.CONTRACTSPEC_AI_PROVIDER as ProviderName) ?? 'openai';\n const model = process.env.CONTRACTSPEC_AI_MODEL;\n\n let apiKey: string | undefined;\n switch (provider) {\n case 'openai':\n apiKey = process.env.OPENAI_API_KEY;\n break;\n case 'anthropic':\n apiKey = process.env.ANTHROPIC_API_KEY;\n break;\n case 'mistral':\n apiKey = process.env.MISTRAL_API_KEY;\n break;\n case 'gemini':\n apiKey = process.env.GOOGLE_API_KEY ?? process.env.GEMINI_API_KEY;\n break;\n case 'ollama':\n // No API key needed\n break;\n }\n\n return createProvider({\n provider,\n model,\n apiKey,\n baseUrl: process.env.OLLAMA_BASE_URL,\n proxyUrl: process.env.CONTRACTSPEC_AI_PROXY_URL,\n organizationId: process.env.CONTRACTSPEC_ORG_ID,\n });\n}\n\n/**\n * Get all available providers with their status\n */\nexport function getAvailableProviders(): ProviderAvailability[] {\n const providers: ProviderAvailability[] = [];\n\n // Ollama (local)\n providers.push({\n provider: 'ollama',\n available: true,\n mode: 'local',\n });\n\n // OpenAI\n const openaiKey = process.env.OPENAI_API_KEY;\n providers.push({\n provider: 'openai',\n available:\n Boolean(openaiKey) || Boolean(process.env.CONTRACTSPEC_AI_PROXY_URL),\n mode: openaiKey ? 'byok' : 'managed',\n reason: !openaiKey ? 'Set OPENAI_API_KEY for BYOK mode' : undefined,\n });\n\n // Anthropic\n const anthropicKey = process.env.ANTHROPIC_API_KEY;\n providers.push({\n provider: 'anthropic',\n available:\n Boolean(anthropicKey) || Boolean(process.env.CONTRACTSPEC_AI_PROXY_URL),\n mode: anthropicKey ? 'byok' : 'managed',\n reason: !anthropicKey ? 'Set ANTHROPIC_API_KEY for BYOK mode' : undefined,\n });\n\n // Mistral\n const mistralKey = process.env.MISTRAL_API_KEY;\n providers.push({\n provider: 'mistral',\n available:\n Boolean(mistralKey) || Boolean(process.env.CONTRACTSPEC_AI_PROXY_URL),\n mode: mistralKey ? 'byok' : 'managed',\n reason: !mistralKey ? 'Set MISTRAL_API_KEY for BYOK mode' : undefined,\n });\n\n // Gemini\n const geminiKey = process.env.GOOGLE_API_KEY ?? process.env.GEMINI_API_KEY;\n providers.push({\n provider: 'gemini',\n available:\n Boolean(geminiKey) || Boolean(process.env.CONTRACTSPEC_AI_PROXY_URL),\n mode: geminiKey ? 'byok' : 'managed',\n reason: !geminiKey ? 'Set GOOGLE_API_KEY for BYOK mode' : undefined,\n });\n\n return providers;\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"legacy.js","names":["apiKey: string | undefined"],"sources":["../src/legacy.ts"],"sourcesContent":["/**\n * Legacy compatibility layer\n *\n * Provides backwards-compatible functions for existing code\n * that uses the old provider API from contractspec-workspace.\n */\nimport type { LanguageModel } from 'ai';\nimport type { LegacyConfig, ProviderName } from './types';\nimport { createProvider } from './factory';\nimport { getRecommendedModels as getModels } from './models';\n\n/**\n * Map legacy provider names to new ones\n */\nfunction mapLegacyProvider(legacy: LegacyConfig['aiProvider']): ProviderName {\n switch (legacy) {\n case 'claude':\n return 'anthropic';\n case 'custom':\n return 'openai'; // Custom endpoints use OpenAI-compatible API\n default:\n return legacy as ProviderName;\n }\n}\n\n/**\n * Get AI provider from legacy Config type\n *\n * @deprecated Use createProvider() instead\n */\nexport function getAIProvider(config: LegacyConfig): LanguageModel {\n const provider = mapLegacyProvider(config.aiProvider);\n\n // Get API key from environment\n let apiKey: string | undefined;\n switch (provider) {\n case 'openai':\n apiKey = process.env.OPENAI_API_KEY;\n break;\n case 'anthropic':\n apiKey = process.env.ANTHROPIC_API_KEY;\n break;\n case 'mistral':\n apiKey = process.env.MISTRAL_API_KEY;\n break;\n case 'gemini':\n apiKey = process.env.GOOGLE_API_KEY ?? process.env.GEMINI_API_KEY;\n break;\n }\n\n const instance = createProvider({\n provider,\n model: config.aiModel,\n apiKey,\n baseUrl: config.customEndpoint,\n });\n\n return instance.getModel();\n}\n\n/**\n * Validate provider from legacy Config type\n *\n * @deprecated Use validateProvider() from './validation' instead\n */\nexport async function validateProvider(\n config: LegacyConfig\n): Promise<{ success: boolean; error?: string }> {\n const provider = mapLegacyProvider(config.aiProvider);\n\n // For Ollama, we can't easily validate without making a request\n if (provider === 'ollama') {\n return { success: true };\n }\n\n // For cloud providers, check API key exists\n if (provider === 'anthropic' && !process.env.ANTHROPIC_API_KEY) {\n return {\n success: false,\n error: 'ANTHROPIC_API_KEY environment variable not set',\n };\n }\n\n if (provider === 'openai' && !process.env.OPENAI_API_KEY) {\n return {\n success: false,\n error: 'OPENAI_API_KEY environment variable not set',\n };\n }\n\n if (provider === 'mistral' && !process.env.MISTRAL_API_KEY) {\n return {\n success: false,\n error: 'MISTRAL_API_KEY environment variable not set',\n };\n }\n\n if (\n provider === 'gemini' &&\n !process.env.GOOGLE_API_KEY &&\n !process.env.GEMINI_API_KEY\n ) {\n return {\n success: false,\n error: 'GOOGLE_API_KEY or GEMINI_API_KEY environment variable not set',\n };\n }\n\n return { success: true };\n}\n\n/**\n * Get recommended models for legacy provider name\n *\n * @deprecated Use getModelsForProvider() instead\n */\nexport { getModels as getRecommendedModels };\n"],"mappings":";;;;;;;AAcA,SAAS,kBAAkB,QAAkD;AAC3E,SAAQ,QAAR;EACE,KAAK,SACH,QAAO;EACT,KAAK,SACH,QAAO;EACT,QACE,QAAO;;;;;;;;AASb,SAAgB,cAAc,QAAqC;CACjE,MAAM,WAAW,kBAAkB,OAAO,WAAW;CAGrD,IAAIA;AACJ,SAAQ,UAAR;EACE,KAAK;AACH,YAAS,QAAQ,IAAI;AACrB;EACF,KAAK;AACH,YAAS,QAAQ,IAAI;AACrB;EACF,KAAK;AACH,YAAS,QAAQ,IAAI;AACrB;EACF,KAAK;AACH,YAAS,QAAQ,IAAI,kBAAkB,QAAQ,IAAI;AACnD;;AAUJ,QAPiB,eAAe;EAC9B;EACA,OAAO,OAAO;EACd;EACA,SAAS,OAAO;EACjB,CAAC,CAEc,UAAU;;;;;;;AAQ5B,eAAsB,iBACpB,QAC+C;CAC/C,MAAM,WAAW,kBAAkB,OAAO,WAAW;AAGrD,KAAI,aAAa,SACf,QAAO,EAAE,SAAS,MAAM;AAI1B,KAAI,aAAa,eAAe,CAAC,QAAQ,IAAI,kBAC3C,QAAO;EACL,SAAS;EACT,OAAO;EACR;AAGH,KAAI,aAAa,YAAY,CAAC,QAAQ,IAAI,eACxC,QAAO;EACL,SAAS;EACT,OAAO;EACR;AAGH,KAAI,aAAa,aAAa,CAAC,QAAQ,IAAI,gBACzC,QAAO;EACL,SAAS;EACT,OAAO;EACR;AAGH,KACE,aAAa,YACb,CAAC,QAAQ,IAAI,kBACb,CAAC,QAAQ,IAAI,eAEb,QAAO;EACL,SAAS;EACT,OAAO;EACR;AAGH,QAAO,EAAE,SAAS,MAAM"}
1
+ {"version":3,"file":"legacy.js","names":[],"sources":["../src/legacy.ts"],"sourcesContent":["/**\n * Legacy compatibility layer\n *\n * Provides backwards-compatible functions for existing code\n * that uses the old provider API from contractspec-workspace.\n */\nimport type { LanguageModel } from 'ai';\nimport type { LegacyConfig, ProviderName } from './types';\nimport { createProvider } from './factory';\nimport { getRecommendedModels as getModels } from './models';\n\n/**\n * Map legacy provider names to new ones\n */\nfunction mapLegacyProvider(legacy: LegacyConfig['aiProvider']): ProviderName {\n switch (legacy) {\n case 'claude':\n return 'anthropic';\n case 'custom':\n return 'openai'; // Custom endpoints use OpenAI-compatible API\n default:\n return legacy as ProviderName;\n }\n}\n\n/**\n * Get AI provider from legacy Config type\n *\n * @deprecated Use createProvider() instead\n */\nexport function getAIProvider(config: LegacyConfig): LanguageModel {\n const provider = mapLegacyProvider(config.aiProvider);\n\n // Get API key from environment\n let apiKey: string | undefined;\n switch (provider) {\n case 'openai':\n apiKey = process.env.OPENAI_API_KEY;\n break;\n case 'anthropic':\n apiKey = process.env.ANTHROPIC_API_KEY;\n break;\n case 'mistral':\n apiKey = process.env.MISTRAL_API_KEY;\n break;\n case 'gemini':\n apiKey = process.env.GOOGLE_API_KEY ?? process.env.GEMINI_API_KEY;\n break;\n }\n\n const instance = createProvider({\n provider,\n model: config.aiModel,\n apiKey,\n baseUrl: config.customEndpoint,\n });\n\n return instance.getModel();\n}\n\n/**\n * Validate provider from legacy Config type\n *\n * @deprecated Use validateProvider() from './validation' instead\n */\nexport async function validateProvider(\n config: LegacyConfig\n): Promise<{ success: boolean; error?: string }> {\n const provider = mapLegacyProvider(config.aiProvider);\n\n // For Ollama, we can't easily validate without making a request\n if (provider === 'ollama') {\n return { success: true };\n }\n\n // For cloud providers, check API key exists\n if (provider === 'anthropic' && !process.env.ANTHROPIC_API_KEY) {\n return {\n success: false,\n error: 'ANTHROPIC_API_KEY environment variable not set',\n };\n }\n\n if (provider === 'openai' && !process.env.OPENAI_API_KEY) {\n return {\n success: false,\n error: 'OPENAI_API_KEY environment variable not set',\n };\n }\n\n if (provider === 'mistral' && !process.env.MISTRAL_API_KEY) {\n return {\n success: false,\n error: 'MISTRAL_API_KEY environment variable not set',\n };\n }\n\n if (\n provider === 'gemini' &&\n !process.env.GOOGLE_API_KEY &&\n !process.env.GEMINI_API_KEY\n ) {\n return {\n success: false,\n error: 'GOOGLE_API_KEY or GEMINI_API_KEY environment variable not set',\n };\n }\n\n return { success: true };\n}\n\n/**\n * Get recommended models for legacy provider name\n *\n * @deprecated Use getModelsForProvider() instead\n */\nexport { getModels as getRecommendedModels };\n"],"mappings":";;;;;;;AAcA,SAAS,kBAAkB,QAAkD;AAC3E,SAAQ,QAAR;EACE,KAAK,SACH,QAAO;EACT,KAAK,SACH,QAAO;EACT,QACE,QAAO;;;;;;;;AASb,SAAgB,cAAc,QAAqC;CACjE,MAAM,WAAW,kBAAkB,OAAO,WAAW;CAGrD,IAAI;AACJ,SAAQ,UAAR;EACE,KAAK;AACH,YAAS,QAAQ,IAAI;AACrB;EACF,KAAK;AACH,YAAS,QAAQ,IAAI;AACrB;EACF,KAAK;AACH,YAAS,QAAQ,IAAI;AACrB;EACF,KAAK;AACH,YAAS,QAAQ,IAAI,kBAAkB,QAAQ,IAAI;AACnD;;AAUJ,QAPiB,eAAe;EAC9B;EACA,OAAO,OAAO;EACd;EACA,SAAS,OAAO;EACjB,CAAC,CAEc,UAAU;;;;;;;AAQ5B,eAAsB,iBACpB,QAC+C;CAC/C,MAAM,WAAW,kBAAkB,OAAO,WAAW;AAGrD,KAAI,aAAa,SACf,QAAO,EAAE,SAAS,MAAM;AAI1B,KAAI,aAAa,eAAe,CAAC,QAAQ,IAAI,kBAC3C,QAAO;EACL,SAAS;EACT,OAAO;EACR;AAGH,KAAI,aAAa,YAAY,CAAC,QAAQ,IAAI,eACxC,QAAO;EACL,SAAS;EACT,OAAO;EACR;AAGH,KAAI,aAAa,aAAa,CAAC,QAAQ,IAAI,gBACzC,QAAO;EACL,SAAS;EACT,OAAO;EACR;AAGH,KACE,aAAa,YACb,CAAC,QAAQ,IAAI,kBACb,CAAC,QAAQ,IAAI,eAEb,QAAO;EACL,SAAS;EACT,OAAO;EACR;AAGH,QAAO,EAAE,SAAS,MAAM"}
@@ -1 +1 @@
1
- {"version":3,"file":"models.js","names":["DEFAULT_MODELS: Record<ProviderName, string>","MODELS: ModelInfo[]"],"sources":["../src/models.ts"],"sourcesContent":["/**\n * Model definitions and recommendations\n */\nimport type { ModelInfo, ProviderName } from './types';\n\n/**\n * Default models per provider\n */\nexport const DEFAULT_MODELS: Record<ProviderName, string> = {\n ollama: 'llama3.2',\n openai: 'gpt-4o',\n anthropic: 'claude-sonnet-4-20250514',\n mistral: 'mistral-large-latest',\n gemini: 'gemini-2.0-flash',\n};\n\n/**\n * All recommended models with metadata\n */\nexport const MODELS: ModelInfo[] = [\n // Ollama\n {\n id: 'llama3.2',\n name: 'Llama 3.2',\n provider: 'ollama',\n contextWindow: 128000,\n capabilities: {\n vision: false,\n tools: true,\n reasoning: false,\n streaming: true,\n },\n },\n {\n id: 'codellama',\n name: 'Code Llama',\n provider: 'ollama',\n contextWindow: 16000,\n capabilities: {\n vision: false,\n tools: false,\n reasoning: false,\n streaming: true,\n },\n },\n {\n id: 'deepseek-coder',\n name: 'DeepSeek Coder',\n provider: 'ollama',\n contextWindow: 16000,\n capabilities: {\n vision: false,\n tools: false,\n reasoning: false,\n streaming: true,\n },\n },\n {\n id: 'mistral',\n name: 'Mistral 7B',\n provider: 'ollama',\n contextWindow: 32000,\n capabilities: {\n vision: false,\n tools: false,\n reasoning: false,\n streaming: true,\n },\n },\n\n // OpenAI\n {\n id: 'gpt-4o',\n name: 'GPT-4o',\n provider: 'openai',\n contextWindow: 128000,\n capabilities: {\n vision: true,\n tools: true,\n reasoning: false,\n streaming: true,\n },\n costPerMillion: { input: 2.5, output: 10 },\n },\n {\n id: 'gpt-4o-mini',\n name: 'GPT-4o Mini',\n provider: 'openai',\n contextWindow: 128000,\n capabilities: {\n vision: true,\n tools: true,\n reasoning: false,\n streaming: true,\n },\n costPerMillion: { input: 0.15, output: 0.6 },\n },\n {\n id: 'o1',\n name: 'o1',\n provider: 'openai',\n contextWindow: 200000,\n capabilities: {\n vision: true,\n tools: true,\n reasoning: true,\n streaming: true,\n },\n costPerMillion: { input: 15, output: 60 },\n },\n {\n id: 'o1-mini',\n name: 'o1 Mini',\n provider: 'openai',\n contextWindow: 128000,\n capabilities: {\n vision: false,\n tools: true,\n reasoning: true,\n streaming: true,\n },\n costPerMillion: { input: 3, output: 12 },\n },\n\n // Anthropic\n {\n id: 'claude-sonnet-4-20250514',\n name: 'Claude Sonnet 4',\n provider: 'anthropic',\n contextWindow: 200000,\n capabilities: {\n vision: true,\n tools: true,\n reasoning: true,\n streaming: true,\n },\n costPerMillion: { input: 3, output: 15 },\n },\n {\n id: 'claude-3-5-sonnet-20241022',\n name: 'Claude 3.5 Sonnet',\n provider: 'anthropic',\n contextWindow: 200000,\n capabilities: {\n vision: true,\n tools: true,\n reasoning: false,\n streaming: true,\n },\n costPerMillion: { input: 3, output: 15 },\n },\n {\n id: 'claude-3-5-haiku-20241022',\n name: 'Claude 3.5 Haiku',\n provider: 'anthropic',\n contextWindow: 200000,\n capabilities: {\n vision: true,\n tools: true,\n reasoning: false,\n streaming: true,\n },\n costPerMillion: { input: 0.8, output: 4 },\n },\n\n // Mistral\n {\n id: 'mistral-large-latest',\n name: 'Mistral Large',\n provider: 'mistral',\n contextWindow: 128000,\n capabilities: {\n vision: false,\n tools: true,\n reasoning: false,\n streaming: true,\n },\n costPerMillion: { input: 2, output: 6 },\n },\n {\n id: 'codestral-latest',\n name: 'Codestral',\n provider: 'mistral',\n contextWindow: 32000,\n capabilities: {\n vision: false,\n tools: true,\n reasoning: false,\n streaming: true,\n },\n costPerMillion: { input: 0.2, output: 0.6 },\n },\n {\n id: 'mistral-small-latest',\n name: 'Mistral Small',\n provider: 'mistral',\n contextWindow: 32000,\n capabilities: {\n vision: false,\n tools: true,\n reasoning: false,\n streaming: true,\n },\n costPerMillion: { input: 0.2, output: 0.6 },\n },\n\n // Gemini\n {\n id: 'gemini-2.0-flash',\n name: 'Gemini 2.0 Flash',\n provider: 'gemini',\n contextWindow: 1000000,\n capabilities: {\n vision: true,\n tools: true,\n reasoning: false,\n streaming: true,\n },\n costPerMillion: { input: 0.075, output: 0.3 },\n },\n {\n id: 'gemini-2.5-pro-preview-06-05',\n name: 'Gemini 2.5 Pro',\n provider: 'gemini',\n contextWindow: 1000000,\n capabilities: {\n vision: true,\n tools: true,\n reasoning: true,\n streaming: true,\n },\n costPerMillion: { input: 1.25, output: 10 },\n },\n {\n id: 'gemini-2.5-flash-preview-05-20',\n name: 'Gemini 2.5 Flash',\n provider: 'gemini',\n contextWindow: 1000000,\n capabilities: {\n vision: true,\n tools: true,\n reasoning: true,\n streaming: true,\n },\n costPerMillion: { input: 0.15, output: 0.6 },\n },\n];\n\n/**\n * Get models for a specific provider\n */\nexport function getModelsForProvider(provider: ProviderName): ModelInfo[] {\n return MODELS.filter((m) => m.provider === provider);\n}\n\n/**\n * Get model info by ID\n */\nexport function getModelInfo(modelId: string): ModelInfo | undefined {\n return MODELS.find((m) => m.id === modelId);\n}\n\n/**\n * Get recommended models for a provider (legacy format)\n */\nexport function getRecommendedModels(\n provider: ProviderName | 'claude' | 'custom'\n): string[] {\n // Handle legacy provider names\n const normalizedProvider =\n provider === 'claude'\n ? 'anthropic'\n : provider === 'custom'\n ? 'openai'\n : provider;\n\n return getModelsForProvider(normalizedProvider as ProviderName).map(\n (m) => m.id\n );\n}\n\n/**\n * Get default model for a provider\n */\nexport function getDefaultModel(provider: ProviderName): string {\n return DEFAULT_MODELS[provider];\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"models.js","names":[],"sources":["../src/models.ts"],"sourcesContent":["/**\n * Model definitions and recommendations\n */\nimport type { ModelInfo, ProviderName } from './types';\n\n/**\n * Default models per provider\n */\nexport const DEFAULT_MODELS: Record<ProviderName, string> = {\n ollama: 'llama3.2',\n openai: 'gpt-4o',\n anthropic: 'claude-sonnet-4-20250514',\n mistral: 'mistral-large-latest',\n gemini: 'gemini-2.0-flash',\n};\n\n/**\n * All recommended models with metadata\n */\nexport const MODELS: ModelInfo[] = [\n // Ollama\n {\n id: 'llama3.2',\n name: 'Llama 3.2',\n provider: 'ollama',\n contextWindow: 128000,\n capabilities: {\n vision: false,\n tools: true,\n reasoning: false,\n streaming: true,\n },\n },\n {\n id: 'codellama',\n name: 'Code Llama',\n provider: 'ollama',\n contextWindow: 16000,\n capabilities: {\n vision: false,\n tools: false,\n reasoning: false,\n streaming: true,\n },\n },\n {\n id: 'deepseek-coder',\n name: 'DeepSeek Coder',\n provider: 'ollama',\n contextWindow: 16000,\n capabilities: {\n vision: false,\n tools: false,\n reasoning: false,\n streaming: true,\n },\n },\n {\n id: 'mistral',\n name: 'Mistral 7B',\n provider: 'ollama',\n contextWindow: 32000,\n capabilities: {\n vision: false,\n tools: false,\n reasoning: false,\n streaming: true,\n },\n },\n\n // OpenAI\n {\n id: 'gpt-4o',\n name: 'GPT-4o',\n provider: 'openai',\n contextWindow: 128000,\n capabilities: {\n vision: true,\n tools: true,\n reasoning: false,\n streaming: true,\n },\n costPerMillion: { input: 2.5, output: 10 },\n },\n {\n id: 'gpt-4o-mini',\n name: 'GPT-4o Mini',\n provider: 'openai',\n contextWindow: 128000,\n capabilities: {\n vision: true,\n tools: true,\n reasoning: false,\n streaming: true,\n },\n costPerMillion: { input: 0.15, output: 0.6 },\n },\n {\n id: 'o1',\n name: 'o1',\n provider: 'openai',\n contextWindow: 200000,\n capabilities: {\n vision: true,\n tools: true,\n reasoning: true,\n streaming: true,\n },\n costPerMillion: { input: 15, output: 60 },\n },\n {\n id: 'o1-mini',\n name: 'o1 Mini',\n provider: 'openai',\n contextWindow: 128000,\n capabilities: {\n vision: false,\n tools: true,\n reasoning: true,\n streaming: true,\n },\n costPerMillion: { input: 3, output: 12 },\n },\n\n // Anthropic\n {\n id: 'claude-sonnet-4-20250514',\n name: 'Claude Sonnet 4',\n provider: 'anthropic',\n contextWindow: 200000,\n capabilities: {\n vision: true,\n tools: true,\n reasoning: true,\n streaming: true,\n },\n costPerMillion: { input: 3, output: 15 },\n },\n {\n id: 'claude-3-5-sonnet-20241022',\n name: 'Claude 3.5 Sonnet',\n provider: 'anthropic',\n contextWindow: 200000,\n capabilities: {\n vision: true,\n tools: true,\n reasoning: false,\n streaming: true,\n },\n costPerMillion: { input: 3, output: 15 },\n },\n {\n id: 'claude-3-5-haiku-20241022',\n name: 'Claude 3.5 Haiku',\n provider: 'anthropic',\n contextWindow: 200000,\n capabilities: {\n vision: true,\n tools: true,\n reasoning: false,\n streaming: true,\n },\n costPerMillion: { input: 0.8, output: 4 },\n },\n\n // Mistral\n {\n id: 'mistral-large-latest',\n name: 'Mistral Large',\n provider: 'mistral',\n contextWindow: 128000,\n capabilities: {\n vision: false,\n tools: true,\n reasoning: false,\n streaming: true,\n },\n costPerMillion: { input: 2, output: 6 },\n },\n {\n id: 'codestral-latest',\n name: 'Codestral',\n provider: 'mistral',\n contextWindow: 32000,\n capabilities: {\n vision: false,\n tools: true,\n reasoning: false,\n streaming: true,\n },\n costPerMillion: { input: 0.2, output: 0.6 },\n },\n {\n id: 'mistral-small-latest',\n name: 'Mistral Small',\n provider: 'mistral',\n contextWindow: 32000,\n capabilities: {\n vision: false,\n tools: true,\n reasoning: false,\n streaming: true,\n },\n costPerMillion: { input: 0.2, output: 0.6 },\n },\n\n // Gemini\n {\n id: 'gemini-2.0-flash',\n name: 'Gemini 2.0 Flash',\n provider: 'gemini',\n contextWindow: 1000000,\n capabilities: {\n vision: true,\n tools: true,\n reasoning: false,\n streaming: true,\n },\n costPerMillion: { input: 0.075, output: 0.3 },\n },\n {\n id: 'gemini-2.5-pro-preview-06-05',\n name: 'Gemini 2.5 Pro',\n provider: 'gemini',\n contextWindow: 1000000,\n capabilities: {\n vision: true,\n tools: true,\n reasoning: true,\n streaming: true,\n },\n costPerMillion: { input: 1.25, output: 10 },\n },\n {\n id: 'gemini-2.5-flash-preview-05-20',\n name: 'Gemini 2.5 Flash',\n provider: 'gemini',\n contextWindow: 1000000,\n capabilities: {\n vision: true,\n tools: true,\n reasoning: true,\n streaming: true,\n },\n costPerMillion: { input: 0.15, output: 0.6 },\n },\n];\n\n/**\n * Get models for a specific provider\n */\nexport function getModelsForProvider(provider: ProviderName): ModelInfo[] {\n return MODELS.filter((m) => m.provider === provider);\n}\n\n/**\n * Get model info by ID\n */\nexport function getModelInfo(modelId: string): ModelInfo | undefined {\n return MODELS.find((m) => m.id === modelId);\n}\n\n/**\n * Get recommended models for a provider (legacy format)\n */\nexport function getRecommendedModels(\n provider: ProviderName | 'claude' | 'custom'\n): string[] {\n // Handle legacy provider names\n const normalizedProvider =\n provider === 'claude'\n ? 'anthropic'\n : provider === 'custom'\n ? 'openai'\n : provider;\n\n return getModelsForProvider(normalizedProvider as ProviderName).map(\n (m) => m.id\n );\n}\n\n/**\n * Get default model for a provider\n */\nexport function getDefaultModel(provider: ProviderName): string {\n return DEFAULT_MODELS[provider];\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contractspec/lib.ai-providers",
3
- "version": "1.46.2",
3
+ "version": "1.48.0",
4
4
  "description": "Unified AI provider abstraction layer",
5
5
  "keywords": [
6
6
  "contractspec",
@@ -12,8 +12,6 @@
12
12
  "typescript"
13
13
  ],
14
14
  "type": "module",
15
- "main": "./dist/index.js",
16
- "module": "./dist/index.js",
17
15
  "types": "./dist/index.d.ts",
18
16
  "files": [
19
17
  "dist",
@@ -33,18 +31,18 @@
33
31
  "test": "bun test"
34
32
  },
35
33
  "dependencies": {
36
- "@ai-sdk/anthropic": "3.0.1",
37
- "@ai-sdk/google": "3.0.1",
38
- "@ai-sdk/mistral": "3.0.1",
39
- "@ai-sdk/openai": "3.0.1",
40
- "ai": "6.0.3",
34
+ "@ai-sdk/anthropic": "3.0.11",
35
+ "@ai-sdk/google": "3.0.6",
36
+ "@ai-sdk/mistral": "3.0.5",
37
+ "@ai-sdk/openai": "3.0.8",
38
+ "ai": "6.0.29",
41
39
  "ollama-ai-provider": "^1.2.0",
42
- "zod": "^4.1.13"
40
+ "zod": "^4.3.5"
43
41
  },
44
42
  "devDependencies": {
45
- "@contractspec/tool.tsdown": "1.46.2",
46
- "@contractspec/tool.typescript": "1.46.2",
47
- "tsdown": "^0.18.3",
43
+ "@contractspec/tool.tsdown": "1.48.0",
44
+ "@contractspec/tool.typescript": "1.48.0",
45
+ "tsdown": "^0.19.0",
48
46
  "typescript": "^5.9.3"
49
47
  },
50
48
  "exports": {