memeloop 0.2.2 → 0.2.3

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.
@@ -51,6 +51,15 @@ module.exports = __toCommonJS(llm_providers_exports);
51
51
 
52
52
  // src/llm/fetchProvider.ts
53
53
  var import_ai = require("ai");
54
+ function resolveFetchLLMCallSettings(body) {
55
+ return {
56
+ maxOutputTokens: body.maxOutputTokens ?? body.max_tokens,
57
+ temperature: body.temperature,
58
+ topP: body.topP,
59
+ providerOptions: body.providerOptions,
60
+ abortSignal: body.abortSignal
61
+ };
62
+ }
54
63
  function createFetchLLMProvider(config) {
55
64
  return {
56
65
  name: config.name,
@@ -75,9 +84,7 @@ function createFetchLLMProvider(config) {
75
84
  };
76
85
  });
77
86
  const system = body.system ?? (systemMessages.length > 0 ? systemMessages.join("\n\n") : void 0);
78
- const temperature = body.temperature;
79
- const abortSignal = body.abortSignal;
80
- const maxOutputTokens = body.max_tokens;
87
+ const { abortSignal, maxOutputTokens, providerOptions, temperature, topP } = resolveFetchLLMCallSettings(body);
81
88
  if (body.stream !== false) {
82
89
  let streamingError;
83
90
  const result2 = (0, import_ai.streamText)({
@@ -86,6 +93,8 @@ function createFetchLLMProvider(config) {
86
93
  messages,
87
94
  maxOutputTokens,
88
95
  temperature,
96
+ topP,
97
+ providerOptions,
89
98
  abortSignal,
90
99
  onError: ({ error }) => {
91
100
  streamingError = error;
@@ -106,6 +115,8 @@ function createFetchLLMProvider(config) {
106
115
  messages,
107
116
  maxOutputTokens,
108
117
  temperature,
118
+ topP,
119
+ providerOptions,
109
120
  abortSignal
110
121
  });
111
122
  return result.text;
@@ -129,13 +140,13 @@ var defaultModels = {
129
140
  "google-vertex": "",
130
141
  ollama: "llama3.1"
131
142
  };
132
- async function loadProviderFactory(provider) {
143
+ async function loadProviderFactory(provider, openAIApiMode) {
133
144
  switch (provider) {
134
145
  case "openai": {
135
146
  const { createOpenAI } = await import("@ai-sdk/openai");
136
147
  return (apiKey, baseUrl, options) => {
137
148
  const sdk = createOpenAI({ apiKey, baseURL: baseUrl, ...options });
138
- return (modelId) => sdk.chat(modelId);
149
+ return (modelId) => openAIApiMode === "responses" ? sdk.responses(modelId) : sdk.chat(modelId);
139
150
  };
140
151
  }
141
152
  case "anthropic": {
@@ -233,7 +244,7 @@ async function createLLMProvider(config) {
233
244
  function resolveModel(modelId) {
234
245
  return modelId ?? config.model ?? defaultModels[config.provider] ?? "";
235
246
  }
236
- const createProviderModel = await loadProviderFactory(config.provider);
247
+ const createProviderModel = await loadProviderFactory(config.provider, config.openAIApiMode);
237
248
  const modelFactory = createProviderModel(config.apiKey, config.baseUrl, config.options);
238
249
  return createFetchLLMProvider({
239
250
  name,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/llm-providers.ts","../src/llm/fetchProvider.ts"],"sourcesContent":["/**\n * Pre-built, config-driven LLM providers.\n *\n * Exposes every major @ai-sdk/* provider through a single entry point so hosts\n * can switch providers by changing a string in user config — no need to install\n * AI SDK packages individually.\n *\n * ```ts\n * import { createLLMProvider } from 'memeloop/llm-providers';\n *\n * const provider = createLLMProvider({\n * provider: 'openai',\n * baseUrl: 'https://api.openai.com/v1',\n * apiKey: process.env.OPENAI_API_KEY,\n * model: 'gpt-4o',\n * });\n * ```\n *\n * For custom providers, or to keep bundle size minimal, use the generic\n * `createFetchLLMProvider` exported from `memeloop` and supply your own\n * `createModel` factory.\n *\n * `createLLMProvider` is async because it dynamically imports the selected\n * AI SDK provider on first use. Host bundlers can then decide whether to\n * bundle, split, or externalize those provider dependencies for their runtime.\n */\n\nimport type { LanguageModel } from 'ai';\n\nimport { createFetchLLMProvider } from './llm/fetchProvider.js';\nimport type { ILLMProvider } from './types.js';\n\n// ─── Provider ids ──────────────────────────────────────────────────────\n\nexport type LLMProviderId =\n | 'openai'\n | 'anthropic'\n | 'google'\n | 'deepseek'\n | 'groq'\n | 'mistral'\n | 'cohere'\n | 'xai'\n | 'togetherai'\n | 'perplexity'\n | 'azure'\n | 'google-vertex'\n | 'ollama';\n\n// ─── Config ────────────────────────────────────────────────────────────\n\nexport interface LLMProviderConfig {\n /** Provider id. */\n provider: LLMProviderId;\n /** Display name (defaults to provider id). */\n name?: string;\n /** API key or credential. */\n apiKey?: string;\n /** Override the provider's default API base URL. */\n baseUrl?: string;\n /** Default model id. When omitted a provider-specific default is used. */\n model?: string;\n /** Provider-specific options passed through to the AI SDK factory. */\n options?: Record<string, unknown>;\n}\n\n/** A provider entry from any host config (loose shape used by CLI/Desktop). */\nexport interface ConfiguredProviderEntry {\n /** Provider id matching LLMProviderId. */\n name: string;\n /** API base URL. */\n baseUrl?: string;\n /** API key. */\n apiKey?: string;\n /** Provider-specific options. */\n options?: Record<string, unknown>;\n /** Available models; the first key is used as the default model. */\n models?: Record<string, { name: string }>;\n}\n\n// ─── Defaults ──────────────────────────────────────────────────────────\n\nconst defaultModels: Record<LLMProviderId, string> = {\n openai: 'gpt-4o-mini',\n anthropic: 'claude-3-5-sonnet-20241022',\n google: 'gemini-1.5-flash',\n deepseek: 'deepseek-chat',\n groq: 'llama-3.1-8b-instant',\n mistral: 'mistral-small-latest',\n cohere: 'command-r-plus',\n xai: 'grok-beta',\n togetherai: 'meta-llama/Llama-3.1-8B-Instruct-Turbo',\n perplexity: 'sonar',\n azure: '',\n 'google-vertex': '',\n ollama: 'llama3.1',\n};\n\n// ─── Unified factory ───────────────────────────────────────────────────\n\n/**\n * Dynamic loader for AI SDK provider factories.\n *\n * Each provider is imported on demand so that hosts only load the SDK packages\n * they actually use. This avoids eagerly loading Node-only providers in hosts\n * that bundle or externalize this entry for multiple runtimes.\n */\nasync function loadProviderFactory(\n provider: LLMProviderId,\n): Promise<\n (\n apiKey: string | undefined,\n baseUrl: string | undefined,\n options: Record<string, unknown> | undefined,\n ) => (modelId: string) => LanguageModel\n> {\n switch (provider) {\n case 'openai': {\n const { createOpenAI } = await import('@ai-sdk/openai');\n return (apiKey, baseUrl, options) => {\n const sdk = createOpenAI({ apiKey, baseURL: baseUrl, ...options });\n // The generic OpenAI factory defaults to the Responses API in current\n // SDKs. MemeLoop's provider contract and compatible/self-hosted\n // endpoints use Chat Completions, so select it explicitly.\n return (modelId) => sdk.chat(modelId) as unknown as LanguageModel;\n };\n }\n case 'anthropic': {\n const { createAnthropic } = await import('@ai-sdk/anthropic');\n return (apiKey, baseUrl, options) => {\n const sdk = createAnthropic({ apiKey, baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'google': {\n const { createGoogleGenerativeAI } = await import('@ai-sdk/google');\n return (apiKey, baseUrl, options) => {\n const sdk = createGoogleGenerativeAI({ apiKey, baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'deepseek': {\n const { createDeepSeek } = await import('@ai-sdk/deepseek');\n return (apiKey, baseUrl, options) => {\n const sdk = createDeepSeek({ apiKey, baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'groq': {\n const { createGroq } = await import('@ai-sdk/groq');\n return (apiKey, baseUrl, options) => {\n const sdk = createGroq({ apiKey, baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'mistral': {\n const { createMistral } = await import('@ai-sdk/mistral');\n return (apiKey, baseUrl, options) => {\n const sdk = createMistral({ apiKey, baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'cohere': {\n const { createCohere } = await import('@ai-sdk/cohere');\n return (apiKey, baseUrl, options) => {\n const sdk = createCohere({ apiKey, baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'xai': {\n const { createXai } = await import('@ai-sdk/xai');\n return (apiKey, baseUrl, options) => {\n const sdk = createXai({ apiKey, baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'togetherai': {\n const { createTogetherAI } = await import('@ai-sdk/togetherai');\n return (apiKey, baseUrl, options) => {\n const sdk = createTogetherAI({ apiKey, baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'perplexity': {\n const { createPerplexity } = await import('@ai-sdk/perplexity');\n return (apiKey, baseUrl, options) => {\n const sdk = createPerplexity({ apiKey, baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'azure': {\n const { createAzure } = await import('@ai-sdk/azure');\n return (apiKey, _baseUrl, options) => {\n const sdk = createAzure({ apiKey, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'google-vertex': {\n const { createVertex } = await import('@ai-sdk/google-vertex');\n return (_apiKey, _baseUrl, options) => {\n const sdk = createVertex({ ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'ollama': {\n const { createOllama } = await import('ollama-ai-provider-v2');\n return (_apiKey, baseUrl, options) => {\n const sdk = createOllama({ baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n default: {\n const exhaustive: never = provider;\n throw new Error(`Unsupported provider: ${String(exhaustive)}`);\n }\n }\n}\n\n/**\n * Create an `ILLMProvider` from a config-driven provider id.\n *\n * Switches implementation based on `config.provider`.\n * The selected provider's AI SDK package is loaded on demand, so hosts only\n * pay the dependency cost for providers they actually use.\n */\nexport async function createLLMProvider(config: LLMProviderConfig): Promise<ILLMProvider> {\n const name = config.name ?? config.provider;\n\n function resolveModel(modelId?: string): string {\n return modelId ?? config.model ?? defaultModels[config.provider] ?? '';\n }\n\n const createProviderModel = await loadProviderFactory(config.provider);\n const modelFactory = createProviderModel(config.apiKey, config.baseUrl, config.options);\n\n return createFetchLLMProvider({\n name,\n modelId: resolveModel(),\n createModel: (modelId?: string) => modelFactory(resolveModel(modelId)),\n });\n}\n\n/** Fallback OpenAI-compatible provider for unknown provider ids. */\nasync function createOpenAICompatibleProvider(\n config: Omit<LLMProviderConfig, 'provider'> & { provider: string },\n): Promise<ILLMProvider> {\n const name = config.name ?? config.provider;\n const { createOpenAICompatible } = await import('@ai-sdk/openai-compatible');\n\n function resolveModel(modelId?: string): string {\n return modelId ?? config.model ?? 'gpt-4o-mini';\n }\n\n const sdk = createOpenAICompatible({\n name: config.provider,\n baseURL: config.baseUrl ?? 'https://api.openai.com/v1',\n apiKey: config.apiKey,\n ...config.options,\n });\n\n return createFetchLLMProvider({\n name,\n modelId: resolveModel(),\n createModel: (modelId?: string) => sdk(resolveModel(modelId)) as unknown as LanguageModel,\n });\n}\n\n// ─── Convenience per-provider factories ────────────────────────────────\n\ntype ProviderConfigWithoutId = Omit<LLMProviderConfig, 'provider'>;\n\n/** Convenience factory for OpenAI. */\nexport function createOpenaiProvider(config: ProviderConfigWithoutId = {}): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'openai', ...config });\n}\n\n/** Convenience factory for Anthropic. */\nexport function createAnthropicProvider(\n config: ProviderConfigWithoutId = {},\n): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'anthropic', ...config });\n}\n\n/** Convenience factory for Google Generative AI. */\nexport function createGoogleProvider(config: ProviderConfigWithoutId = {}): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'google', ...config });\n}\n\n/** Convenience factory for DeepSeek. */\nexport function createDeepseekProvider(\n config: ProviderConfigWithoutId = {},\n): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'deepseek', ...config });\n}\n\n/** Convenience factory for Groq. */\nexport function createGroqProvider(config: ProviderConfigWithoutId = {}): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'groq', ...config });\n}\n\n/** Convenience factory for Mistral. */\nexport function createMistralProvider(config: ProviderConfigWithoutId = {}): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'mistral', ...config });\n}\n\n/** Convenience factory for Cohere. */\nexport function createCohereProvider(config: ProviderConfigWithoutId = {}): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'cohere', ...config });\n}\n\n/** Convenience factory for xAI. */\nexport function createXaiProvider(config: ProviderConfigWithoutId = {}): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'xai', ...config });\n}\n\n/** Convenience factory for Together AI. */\nexport function createTogetheraiProvider(\n config: ProviderConfigWithoutId = {},\n): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'togetherai', ...config });\n}\n\n/** Convenience factory for Perplexity. */\nexport function createPerplexityProvider(\n config: ProviderConfigWithoutId = {},\n): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'perplexity', ...config });\n}\n\n/** Convenience factory for Azure OpenAI. */\nexport function createAzureProvider(config: ProviderConfigWithoutId = {}): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'azure', ...config });\n}\n\n/** Convenience factory for Google Vertex. */\nexport function createGoogleVertexProvider(\n config: ProviderConfigWithoutId = {},\n): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'google-vertex', ...config });\n}\n\n/** Convenience factory for Ollama. */\nexport function createOllamaProvider(config: ProviderConfigWithoutId = {}): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'ollama', ...config });\n}\n\n// ─── Host config mapping ───────────────────────────────────────────────\n\n/**\n * Resolve the default model name from a host config entry.\n * Uses the first key in `entry.models` if present, otherwise falls back\n * to the provider-specific default.\n */\nexport function resolveProviderModelId(entry: ConfiguredProviderEntry): string {\n const firstModelKey = entry.models ? Object.keys(entry.models)[0] : undefined;\n if (firstModelKey) {\n return `${entry.name}/${firstModelKey}`;\n }\n return entry.name;\n}\n\n/**\n * Convert a loose host config entry into an `ILLMProvider` via the core registry.\n * Provider id is taken from `entry.name`. Model id is inferred from `entry.models`\n * or the provider-specific default.\n *\n * Unknown provider names fall back to OpenAI-compatible mode, preserving CLI/Desktop\n * behavior where arbitrary OpenAI-compatible endpoints can be configured with any name.\n */\nexport function createProviderFromEntry(entry: ConfiguredProviderEntry): Promise<ILLMProvider> {\n const providerId = entry.name as LLMProviderId;\n const firstModelKey = entry.models ? Object.keys(entry.models)[0] : undefined;\n const firstModelName = firstModelKey ? entry.models?.[firstModelKey]?.name : undefined;\n const configWithoutProvider = {\n name: entry.name,\n apiKey: entry.apiKey,\n baseUrl: entry.baseUrl,\n model: firstModelName,\n options: entry.options,\n };\n\n if (!defaultModels[providerId]) {\n return createOpenAICompatibleProvider({ provider: entry.name, ...configWithoutProvider });\n }\n\n return createLLMProvider({\n provider: providerId,\n ...configWithoutProvider,\n });\n}\n","/**\n * Provider-agnostic LLM provider — wraps a current Vercel AI SDK LanguageModel.\n *\n * The core does NOT depend on @ai-sdk/openai or any specific provider.\n * Hosts inject their own `createModel` factory:\n *\n * import { createOpenAI } from '@ai-sdk/openai';\n * const openai = createOpenAI({ baseURL: '...', apiKey: '...' });\n * const provider = createFetchLLMProvider({\n * name: 'openai',\n * createModel: (id) => openai(id ?? 'gpt-4o-mini'),\n * });\n *\n * Or for Anthropic:\n * import { createAnthropic } from '@ai-sdk/anthropic';\n * const anthropic = createAnthropic({ apiKey: '...' });\n * const provider = createFetchLLMProvider({\n * name: 'claude',\n * createModel: (id) => anthropic(id ?? 'claude-3-5-sonnet-20241022'),\n * });\n *\n * Works with every @ai-sdk/* provider: openai, anthropic, google, deepseek,\n * cohere, mistral, azure, bedrock, groq, ollama, openrouter, together, etc.\n */\n\nimport type { LanguageModel } from 'ai';\nimport { generateText, streamText } from 'ai';\n\nimport type { ILLMProvider } from '../types.js';\n\n// ─── Config ────────────────────────────────────────────────────────────\n\nexport interface FetchLLMProviderConfig {\n /** Display name. */\n name: string;\n /** Serializable default model identity for scheduling and audit records. */\n modelId?: string;\n /**\n * Factory: given an optional model id, return a LanguageModel from any @ai-sdk/* provider.\n * The factory is responsible for picking a default model when `modelId` is omitted.\n */\n createModel: (modelId?: string) => LanguageModel;\n}\n\n// ─── Factory ───────────────────────────────────────────────────────────\n\n/**\n * Create an `ILLMProvider` that delegates to the Vercel AI SDK.\n *\n * Provider-agnostic — hosts supply their own `createModel` factory.\n * Supports every @ai-sdk/* provider (OpenAI, Anthropic, Google, DeepSeek,\n * Groq, Ollama, OpenRouter, Together, Bedrock, Azure, Mistral, Cohere…).\n *\n * @example\n * ```ts\n * import { createOpenAI } from '@ai-sdk/openai';\n * const openai = createOpenAI({ baseURL: 'https://api.openai.com/v1', apiKey });\n * const provider = createFetchLLMProvider({\n * name: 'openai',\n * createModel: (modelId) => openai(modelId ?? 'gpt-4o-mini'),\n * });\n * ```\n */\nexport function createFetchLLMProvider(config: FetchLLMProviderConfig): ILLMProvider {\n return {\n name: config.name,\n ...(config.modelId !== undefined ? { modelId: config.modelId } : {}),\n // Store the factory so hosts can introspect or extend\n model: config.createModel as unknown as LanguageModel,\n async chat(request: unknown) {\n const body = (typeof request === 'object' && request !== null ? request : {}) as {\n messages?: Array<{ role: string; content: string }>;\n model?: string;\n stream?: boolean;\n max_tokens?: number;\n temperature?: number;\n system?: string;\n abortSignal?: AbortSignal;\n };\n\n const model = config.createModel(body.model);\n const specificationVersion = (\n model as { specificationVersion?: unknown } | null\n )?.specificationVersion;\n if (\n model === null ||\n typeof model !== 'object' ||\n !['v2', 'v3', 'v4'].includes(String(specificationVersion))\n ) {\n throw new Error(\n `LLM provider '${config.name}' returned an incompatible AI SDK model for '${\n typeof body.model === 'string' ? body.model : (config.modelId ?? 'default')\n }' (expected specificationVersion v2, v3, or v4; received ${String(specificationVersion)})`,\n );\n }\n\n const systemMessages = (body.messages ?? [])\n .filter((message) => message.role === 'system')\n .map((message) => message.content);\n const messages = (body.messages ?? [])\n .filter((message) => message.role !== 'system')\n .map((message) => {\n // AI SDK model messages do not accept a bare textual tool role.\n // MemeLoop stores tool results as role='tool'; promote them to user\n // messages while preserving the result text in conversation history.\n const role = message.role === 'tool' ? 'user' : (message.role as 'user' | 'assistant');\n return {\n role,\n content: message.content,\n };\n });\n\n const system = body.system ?? (\n systemMessages.length > 0 ? systemMessages.join('\\n\\n') : undefined\n );\n const temperature = body.temperature;\n const abortSignal = body.abortSignal;\n const maxOutputTokens = body.max_tokens;\n\n if (body.stream !== false) {\n let streamingError: unknown;\n const result = streamText({\n model,\n instructions: system,\n messages,\n maxOutputTokens,\n temperature,\n abortSignal,\n onError: ({ error }) => {\n streamingError = error;\n },\n });\n return (async function*() {\n for await (const chunk of result.textStream) {\n yield chunk;\n }\n if (streamingError !== undefined) {\n throw streamingError instanceof Error\n ? streamingError\n : new Error('The model stream failed', { cause: streamingError });\n }\n })();\n }\n\n const result = await generateText({\n model,\n instructions: system,\n messages,\n maxOutputTokens,\n temperature,\n abortSignal,\n });\n return result.text;\n },\n };\n}\n"],"mappings":"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","names":["result"]}
1
+ {"version":3,"sources":["../src/llm-providers.ts","../src/llm/fetchProvider.ts"],"sourcesContent":["/**\n * Pre-built, config-driven LLM providers.\n *\n * Exposes every major @ai-sdk/* provider through a single entry point so hosts\n * can switch providers by changing a string in user config — no need to install\n * AI SDK packages individually.\n *\n * ```ts\n * import { createLLMProvider } from 'memeloop/llm-providers';\n *\n * const provider = createLLMProvider({\n * provider: 'openai',\n * baseUrl: 'https://api.openai.com/v1',\n * apiKey: process.env.OPENAI_API_KEY,\n * model: 'gpt-4o',\n * });\n * ```\n *\n * For custom providers, or to keep bundle size minimal, use the generic\n * `createFetchLLMProvider` exported from `memeloop` and supply your own\n * `createModel` factory.\n *\n * `createLLMProvider` is async because it dynamically imports the selected\n * AI SDK provider on first use. Host bundlers can then decide whether to\n * bundle, split, or externalize those provider dependencies for their runtime.\n */\n\nimport type { LanguageModel } from 'ai';\n\nimport { createFetchLLMProvider } from './llm/fetchProvider.js';\nimport type { ILLMProvider } from './types.js';\n\n// ─── Provider ids ──────────────────────────────────────────────────────\n\nexport type LLMProviderId =\n | 'openai'\n | 'anthropic'\n | 'google'\n | 'deepseek'\n | 'groq'\n | 'mistral'\n | 'cohere'\n | 'xai'\n | 'togetherai'\n | 'perplexity'\n | 'azure'\n | 'google-vertex'\n | 'ollama';\n\n// ─── Config ────────────────────────────────────────────────────────────\n\nexport interface LLMProviderConfig {\n /** Provider id. */\n provider: LLMProviderId;\n /** Display name (defaults to provider id). */\n name?: string;\n /** API key or credential. */\n apiKey?: string;\n /** Override the provider's default API base URL. */\n baseUrl?: string;\n /** Default model id. When omitted a provider-specific default is used. */\n model?: string;\n /** Provider-specific options passed through to the AI SDK factory. */\n options?: Record<string, unknown>;\n /** OpenAI wire API selected for this model. Defaults to Chat Completions. */\n openAIApiMode?: 'chat-completions' | 'responses';\n}\n\n/** A provider entry from any host config (loose shape used by CLI/Desktop). */\nexport interface ConfiguredProviderEntry {\n /** Provider id matching LLMProviderId. */\n name: string;\n /** API base URL. */\n baseUrl?: string;\n /** API key. */\n apiKey?: string;\n /** Provider-specific options. */\n options?: Record<string, unknown>;\n /** Available models; the first key is used as the default model. */\n models?: Record<string, { name: string }>;\n}\n\n// ─── Defaults ──────────────────────────────────────────────────────────\n\nconst defaultModels: Record<LLMProviderId, string> = {\n openai: 'gpt-4o-mini',\n anthropic: 'claude-3-5-sonnet-20241022',\n google: 'gemini-1.5-flash',\n deepseek: 'deepseek-chat',\n groq: 'llama-3.1-8b-instant',\n mistral: 'mistral-small-latest',\n cohere: 'command-r-plus',\n xai: 'grok-beta',\n togetherai: 'meta-llama/Llama-3.1-8B-Instruct-Turbo',\n perplexity: 'sonar',\n azure: '',\n 'google-vertex': '',\n ollama: 'llama3.1',\n};\n\n// ─── Unified factory ───────────────────────────────────────────────────\n\n/**\n * Dynamic loader for AI SDK provider factories.\n *\n * Each provider is imported on demand so that hosts only load the SDK packages\n * they actually use. This avoids eagerly loading Node-only providers in hosts\n * that bundle or externalize this entry for multiple runtimes.\n */\nasync function loadProviderFactory(\n provider: LLMProviderId,\n openAIApiMode: LLMProviderConfig['openAIApiMode'],\n): Promise<\n (\n apiKey: string | undefined,\n baseUrl: string | undefined,\n options: Record<string, unknown> | undefined,\n ) => (modelId: string) => LanguageModel\n> {\n switch (provider) {\n case 'openai': {\n const { createOpenAI } = await import('@ai-sdk/openai');\n return (apiKey, baseUrl, options) => {\n const sdk = createOpenAI({ apiKey, baseURL: baseUrl, ...options });\n // Keep Chat Completions as the compatibility default. Hosts may opt a\n // specific model into Responses without splitting a shared provider.\n return (modelId) =>\n (openAIApiMode === 'responses'\n ? sdk.responses(modelId)\n : sdk.chat(modelId)) as unknown as LanguageModel;\n };\n }\n case 'anthropic': {\n const { createAnthropic } = await import('@ai-sdk/anthropic');\n return (apiKey, baseUrl, options) => {\n const sdk = createAnthropic({ apiKey, baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'google': {\n const { createGoogleGenerativeAI } = await import('@ai-sdk/google');\n return (apiKey, baseUrl, options) => {\n const sdk = createGoogleGenerativeAI({ apiKey, baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'deepseek': {\n const { createDeepSeek } = await import('@ai-sdk/deepseek');\n return (apiKey, baseUrl, options) => {\n const sdk = createDeepSeek({ apiKey, baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'groq': {\n const { createGroq } = await import('@ai-sdk/groq');\n return (apiKey, baseUrl, options) => {\n const sdk = createGroq({ apiKey, baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'mistral': {\n const { createMistral } = await import('@ai-sdk/mistral');\n return (apiKey, baseUrl, options) => {\n const sdk = createMistral({ apiKey, baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'cohere': {\n const { createCohere } = await import('@ai-sdk/cohere');\n return (apiKey, baseUrl, options) => {\n const sdk = createCohere({ apiKey, baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'xai': {\n const { createXai } = await import('@ai-sdk/xai');\n return (apiKey, baseUrl, options) => {\n const sdk = createXai({ apiKey, baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'togetherai': {\n const { createTogetherAI } = await import('@ai-sdk/togetherai');\n return (apiKey, baseUrl, options) => {\n const sdk = createTogetherAI({ apiKey, baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'perplexity': {\n const { createPerplexity } = await import('@ai-sdk/perplexity');\n return (apiKey, baseUrl, options) => {\n const sdk = createPerplexity({ apiKey, baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'azure': {\n const { createAzure } = await import('@ai-sdk/azure');\n return (apiKey, _baseUrl, options) => {\n const sdk = createAzure({ apiKey, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'google-vertex': {\n const { createVertex } = await import('@ai-sdk/google-vertex');\n return (_apiKey, _baseUrl, options) => {\n const sdk = createVertex({ ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'ollama': {\n const { createOllama } = await import('ollama-ai-provider-v2');\n return (_apiKey, baseUrl, options) => {\n const sdk = createOllama({ baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n default: {\n const exhaustive: never = provider;\n throw new Error(`Unsupported provider: ${String(exhaustive)}`);\n }\n }\n}\n\n/**\n * Create an `ILLMProvider` from a config-driven provider id.\n *\n * Switches implementation based on `config.provider`.\n * The selected provider's AI SDK package is loaded on demand, so hosts only\n * pay the dependency cost for providers they actually use.\n */\nexport async function createLLMProvider(config: LLMProviderConfig): Promise<ILLMProvider> {\n const name = config.name ?? config.provider;\n\n function resolveModel(modelId?: string): string {\n return modelId ?? config.model ?? defaultModels[config.provider] ?? '';\n }\n\n const createProviderModel = await loadProviderFactory(config.provider, config.openAIApiMode);\n const modelFactory = createProviderModel(config.apiKey, config.baseUrl, config.options);\n\n return createFetchLLMProvider({\n name,\n modelId: resolveModel(),\n createModel: (modelId?: string) => modelFactory(resolveModel(modelId)),\n });\n}\n\n/** Fallback OpenAI-compatible provider for unknown provider ids. */\nasync function createOpenAICompatibleProvider(\n config: Omit<LLMProviderConfig, 'provider'> & { provider: string },\n): Promise<ILLMProvider> {\n const name = config.name ?? config.provider;\n const { createOpenAICompatible } = await import('@ai-sdk/openai-compatible');\n\n function resolveModel(modelId?: string): string {\n return modelId ?? config.model ?? 'gpt-4o-mini';\n }\n\n const sdk = createOpenAICompatible({\n name: config.provider,\n baseURL: config.baseUrl ?? 'https://api.openai.com/v1',\n apiKey: config.apiKey,\n ...config.options,\n });\n\n return createFetchLLMProvider({\n name,\n modelId: resolveModel(),\n createModel: (modelId?: string) => sdk(resolveModel(modelId)) as unknown as LanguageModel,\n });\n}\n\n// ─── Convenience per-provider factories ────────────────────────────────\n\ntype ProviderConfigWithoutId = Omit<LLMProviderConfig, 'provider'>;\n\n/** Convenience factory for OpenAI. */\nexport function createOpenaiProvider(config: ProviderConfigWithoutId = {}): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'openai', ...config });\n}\n\n/** Convenience factory for Anthropic. */\nexport function createAnthropicProvider(\n config: ProviderConfigWithoutId = {},\n): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'anthropic', ...config });\n}\n\n/** Convenience factory for Google Generative AI. */\nexport function createGoogleProvider(config: ProviderConfigWithoutId = {}): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'google', ...config });\n}\n\n/** Convenience factory for DeepSeek. */\nexport function createDeepseekProvider(\n config: ProviderConfigWithoutId = {},\n): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'deepseek', ...config });\n}\n\n/** Convenience factory for Groq. */\nexport function createGroqProvider(config: ProviderConfigWithoutId = {}): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'groq', ...config });\n}\n\n/** Convenience factory for Mistral. */\nexport function createMistralProvider(config: ProviderConfigWithoutId = {}): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'mistral', ...config });\n}\n\n/** Convenience factory for Cohere. */\nexport function createCohereProvider(config: ProviderConfigWithoutId = {}): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'cohere', ...config });\n}\n\n/** Convenience factory for xAI. */\nexport function createXaiProvider(config: ProviderConfigWithoutId = {}): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'xai', ...config });\n}\n\n/** Convenience factory for Together AI. */\nexport function createTogetheraiProvider(\n config: ProviderConfigWithoutId = {},\n): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'togetherai', ...config });\n}\n\n/** Convenience factory for Perplexity. */\nexport function createPerplexityProvider(\n config: ProviderConfigWithoutId = {},\n): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'perplexity', ...config });\n}\n\n/** Convenience factory for Azure OpenAI. */\nexport function createAzureProvider(config: ProviderConfigWithoutId = {}): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'azure', ...config });\n}\n\n/** Convenience factory for Google Vertex. */\nexport function createGoogleVertexProvider(\n config: ProviderConfigWithoutId = {},\n): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'google-vertex', ...config });\n}\n\n/** Convenience factory for Ollama. */\nexport function createOllamaProvider(config: ProviderConfigWithoutId = {}): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'ollama', ...config });\n}\n\n// ─── Host config mapping ───────────────────────────────────────────────\n\n/**\n * Resolve the default model name from a host config entry.\n * Uses the first key in `entry.models` if present, otherwise falls back\n * to the provider-specific default.\n */\nexport function resolveProviderModelId(entry: ConfiguredProviderEntry): string {\n const firstModelKey = entry.models ? Object.keys(entry.models)[0] : undefined;\n if (firstModelKey) {\n return `${entry.name}/${firstModelKey}`;\n }\n return entry.name;\n}\n\n/**\n * Convert a loose host config entry into an `ILLMProvider` via the core registry.\n * Provider id is taken from `entry.name`. Model id is inferred from `entry.models`\n * or the provider-specific default.\n *\n * Unknown provider names fall back to OpenAI-compatible mode, preserving CLI/Desktop\n * behavior where arbitrary OpenAI-compatible endpoints can be configured with any name.\n */\nexport function createProviderFromEntry(entry: ConfiguredProviderEntry): Promise<ILLMProvider> {\n const providerId = entry.name as LLMProviderId;\n const firstModelKey = entry.models ? Object.keys(entry.models)[0] : undefined;\n const firstModelName = firstModelKey ? entry.models?.[firstModelKey]?.name : undefined;\n const configWithoutProvider = {\n name: entry.name,\n apiKey: entry.apiKey,\n baseUrl: entry.baseUrl,\n model: firstModelName,\n options: entry.options,\n };\n\n if (!defaultModels[providerId]) {\n return createOpenAICompatibleProvider({ provider: entry.name, ...configWithoutProvider });\n }\n\n return createLLMProvider({\n provider: providerId,\n ...configWithoutProvider,\n });\n}\n","/**\n * Provider-agnostic LLM provider — wraps a current Vercel AI SDK LanguageModel.\n *\n * The core does NOT depend on @ai-sdk/openai or any specific provider.\n * Hosts inject their own `createModel` factory:\n *\n * import { createOpenAI } from '@ai-sdk/openai';\n * const openai = createOpenAI({ baseURL: '...', apiKey: '...' });\n * const provider = createFetchLLMProvider({\n * name: 'openai',\n * createModel: (id) => openai(id ?? 'gpt-4o-mini'),\n * });\n *\n * Or for Anthropic:\n * import { createAnthropic } from '@ai-sdk/anthropic';\n * const anthropic = createAnthropic({ apiKey: '...' });\n * const provider = createFetchLLMProvider({\n * name: 'claude',\n * createModel: (id) => anthropic(id ?? 'claude-3-5-sonnet-20241022'),\n * });\n *\n * Works with every @ai-sdk/* provider: openai, anthropic, google, deepseek,\n * cohere, mistral, azure, bedrock, groq, ollama, openrouter, together, etc.\n */\n\nimport type { JSONValue, LanguageModel } from 'ai';\nimport { generateText, streamText } from 'ai';\n\nimport type { ILLMProvider } from '../types.js';\n\nexport interface FetchLLMChatRequest {\n messages?: Array<{ role: string; content: string }>;\n model?: string;\n stream?: boolean;\n /** Legacy OpenAI-compatible spelling retained for host adapters. */\n max_tokens?: number;\n /** AI SDK spelling. Takes precedence over max_tokens. */\n maxOutputTokens?: number;\n temperature?: number;\n topP?: number;\n providerOptions?: Record<string, Record<string, JSONValue>>;\n system?: string;\n abortSignal?: AbortSignal;\n}\n\nexport function resolveFetchLLMCallSettings(body: FetchLLMChatRequest): {\n maxOutputTokens: number | undefined;\n temperature: number | undefined;\n topP: number | undefined;\n providerOptions: Record<string, Record<string, JSONValue>> | undefined;\n abortSignal: AbortSignal | undefined;\n} {\n return {\n maxOutputTokens: body.maxOutputTokens ?? body.max_tokens,\n temperature: body.temperature,\n topP: body.topP,\n providerOptions: body.providerOptions,\n abortSignal: body.abortSignal,\n };\n}\n\n// ─── Config ────────────────────────────────────────────────────────────\n\nexport interface FetchLLMProviderConfig {\n /** Display name. */\n name: string;\n /** Serializable default model identity for scheduling and audit records. */\n modelId?: string;\n /**\n * Factory: given an optional model id, return a LanguageModel from any @ai-sdk/* provider.\n * The factory is responsible for picking a default model when `modelId` is omitted.\n */\n createModel: (modelId?: string) => LanguageModel;\n}\n\n// ─── Factory ───────────────────────────────────────────────────────────\n\n/**\n * Create an `ILLMProvider` that delegates to the Vercel AI SDK.\n *\n * Provider-agnostic — hosts supply their own `createModel` factory.\n * Supports every @ai-sdk/* provider (OpenAI, Anthropic, Google, DeepSeek,\n * Groq, Ollama, OpenRouter, Together, Bedrock, Azure, Mistral, Cohere…).\n *\n * @example\n * ```ts\n * import { createOpenAI } from '@ai-sdk/openai';\n * const openai = createOpenAI({ baseURL: 'https://api.openai.com/v1', apiKey });\n * const provider = createFetchLLMProvider({\n * name: 'openai',\n * createModel: (modelId) => openai(modelId ?? 'gpt-4o-mini'),\n * });\n * ```\n */\nexport function createFetchLLMProvider(config: FetchLLMProviderConfig): ILLMProvider {\n return {\n name: config.name,\n ...(config.modelId !== undefined ? { modelId: config.modelId } : {}),\n // Store the factory so hosts can introspect or extend\n model: config.createModel as unknown as LanguageModel,\n async chat(request: unknown) {\n const body = (typeof request === 'object' && request !== null ? request : {}) as FetchLLMChatRequest;\n\n const model = config.createModel(body.model);\n const specificationVersion = (\n model as { specificationVersion?: unknown } | null\n )?.specificationVersion;\n if (\n model === null ||\n typeof model !== 'object' ||\n !['v2', 'v3', 'v4'].includes(String(specificationVersion))\n ) {\n throw new Error(\n `LLM provider '${config.name}' returned an incompatible AI SDK model for '${\n typeof body.model === 'string' ? body.model : (config.modelId ?? 'default')\n }' (expected specificationVersion v2, v3, or v4; received ${String(specificationVersion)})`,\n );\n }\n\n const systemMessages = (body.messages ?? [])\n .filter((message) => message.role === 'system')\n .map((message) => message.content);\n const messages = (body.messages ?? [])\n .filter((message) => message.role !== 'system')\n .map((message) => {\n // AI SDK model messages do not accept a bare textual tool role.\n // MemeLoop stores tool results as role='tool'; promote them to user\n // messages while preserving the result text in conversation history.\n const role = message.role === 'tool' ? 'user' : (message.role as 'user' | 'assistant');\n return {\n role,\n content: message.content,\n };\n });\n\n const system = body.system ?? (\n systemMessages.length > 0 ? systemMessages.join('\\n\\n') : undefined\n );\n const { abortSignal, maxOutputTokens, providerOptions, temperature, topP } = resolveFetchLLMCallSettings(body);\n\n if (body.stream !== false) {\n let streamingError: unknown;\n const result = streamText({\n model,\n instructions: system,\n messages,\n maxOutputTokens,\n temperature,\n topP,\n providerOptions,\n abortSignal,\n onError: ({ error }) => {\n streamingError = error;\n },\n });\n return (async function*() {\n for await (const chunk of result.textStream) {\n yield chunk;\n }\n if (streamingError !== undefined) {\n throw streamingError instanceof Error\n ? streamingError\n : new Error('The model stream failed', { cause: streamingError });\n }\n })();\n }\n\n const result = await generateText({\n model,\n instructions: system,\n messages,\n maxOutputTokens,\n temperature,\n topP,\n providerOptions,\n abortSignal,\n });\n return result.text;\n },\n };\n}\n"],"mappings":"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","names":["result"]}
@@ -42,6 +42,8 @@ interface LLMProviderConfig {
42
42
  model?: string;
43
43
  /** Provider-specific options passed through to the AI SDK factory. */
44
44
  options?: Record<string, unknown>;
45
+ /** OpenAI wire API selected for this model. Defaults to Chat Completions. */
46
+ openAIApiMode?: 'chat-completions' | 'responses';
45
47
  }
46
48
  /** A provider entry from any host config (loose shape used by CLI/Desktop). */
47
49
  interface ConfiguredProviderEntry {
@@ -42,6 +42,8 @@ interface LLMProviderConfig {
42
42
  model?: string;
43
43
  /** Provider-specific options passed through to the AI SDK factory. */
44
44
  options?: Record<string, unknown>;
45
+ /** OpenAI wire API selected for this model. Defaults to Chat Completions. */
46
+ openAIApiMode?: 'chat-completions' | 'responses';
45
47
  }
46
48
  /** A provider entry from any host config (loose shape used by CLI/Desktop). */
47
49
  interface ConfiguredProviderEntry {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createFetchLLMProvider
3
- } from "./chunk-K6P63KD4.js";
3
+ } from "./chunk-HY3U3GLE.js";
4
4
 
5
5
  // src/llm-providers.ts
6
6
  var defaultModels = {
@@ -18,13 +18,13 @@ var defaultModels = {
18
18
  "google-vertex": "",
19
19
  ollama: "llama3.1"
20
20
  };
21
- async function loadProviderFactory(provider) {
21
+ async function loadProviderFactory(provider, openAIApiMode) {
22
22
  switch (provider) {
23
23
  case "openai": {
24
24
  const { createOpenAI } = await import("@ai-sdk/openai");
25
25
  return (apiKey, baseUrl, options) => {
26
26
  const sdk = createOpenAI({ apiKey, baseURL: baseUrl, ...options });
27
- return (modelId) => sdk.chat(modelId);
27
+ return (modelId) => openAIApiMode === "responses" ? sdk.responses(modelId) : sdk.chat(modelId);
28
28
  };
29
29
  }
30
30
  case "anthropic": {
@@ -122,7 +122,7 @@ async function createLLMProvider(config) {
122
122
  function resolveModel(modelId) {
123
123
  return modelId ?? config.model ?? defaultModels[config.provider] ?? "";
124
124
  }
125
- const createProviderModel = await loadProviderFactory(config.provider);
125
+ const createProviderModel = await loadProviderFactory(config.provider, config.openAIApiMode);
126
126
  const modelFactory = createProviderModel(config.apiKey, config.baseUrl, config.options);
127
127
  return createFetchLLMProvider({
128
128
  name,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/llm-providers.ts"],"sourcesContent":["/**\n * Pre-built, config-driven LLM providers.\n *\n * Exposes every major @ai-sdk/* provider through a single entry point so hosts\n * can switch providers by changing a string in user config — no need to install\n * AI SDK packages individually.\n *\n * ```ts\n * import { createLLMProvider } from 'memeloop/llm-providers';\n *\n * const provider = createLLMProvider({\n * provider: 'openai',\n * baseUrl: 'https://api.openai.com/v1',\n * apiKey: process.env.OPENAI_API_KEY,\n * model: 'gpt-4o',\n * });\n * ```\n *\n * For custom providers, or to keep bundle size minimal, use the generic\n * `createFetchLLMProvider` exported from `memeloop` and supply your own\n * `createModel` factory.\n *\n * `createLLMProvider` is async because it dynamically imports the selected\n * AI SDK provider on first use. Host bundlers can then decide whether to\n * bundle, split, or externalize those provider dependencies for their runtime.\n */\n\nimport type { LanguageModel } from 'ai';\n\nimport { createFetchLLMProvider } from './llm/fetchProvider.js';\nimport type { ILLMProvider } from './types.js';\n\n// ─── Provider ids ──────────────────────────────────────────────────────\n\nexport type LLMProviderId =\n | 'openai'\n | 'anthropic'\n | 'google'\n | 'deepseek'\n | 'groq'\n | 'mistral'\n | 'cohere'\n | 'xai'\n | 'togetherai'\n | 'perplexity'\n | 'azure'\n | 'google-vertex'\n | 'ollama';\n\n// ─── Config ────────────────────────────────────────────────────────────\n\nexport interface LLMProviderConfig {\n /** Provider id. */\n provider: LLMProviderId;\n /** Display name (defaults to provider id). */\n name?: string;\n /** API key or credential. */\n apiKey?: string;\n /** Override the provider's default API base URL. */\n baseUrl?: string;\n /** Default model id. When omitted a provider-specific default is used. */\n model?: string;\n /** Provider-specific options passed through to the AI SDK factory. */\n options?: Record<string, unknown>;\n}\n\n/** A provider entry from any host config (loose shape used by CLI/Desktop). */\nexport interface ConfiguredProviderEntry {\n /** Provider id matching LLMProviderId. */\n name: string;\n /** API base URL. */\n baseUrl?: string;\n /** API key. */\n apiKey?: string;\n /** Provider-specific options. */\n options?: Record<string, unknown>;\n /** Available models; the first key is used as the default model. */\n models?: Record<string, { name: string }>;\n}\n\n// ─── Defaults ──────────────────────────────────────────────────────────\n\nconst defaultModels: Record<LLMProviderId, string> = {\n openai: 'gpt-4o-mini',\n anthropic: 'claude-3-5-sonnet-20241022',\n google: 'gemini-1.5-flash',\n deepseek: 'deepseek-chat',\n groq: 'llama-3.1-8b-instant',\n mistral: 'mistral-small-latest',\n cohere: 'command-r-plus',\n xai: 'grok-beta',\n togetherai: 'meta-llama/Llama-3.1-8B-Instruct-Turbo',\n perplexity: 'sonar',\n azure: '',\n 'google-vertex': '',\n ollama: 'llama3.1',\n};\n\n// ─── Unified factory ───────────────────────────────────────────────────\n\n/**\n * Dynamic loader for AI SDK provider factories.\n *\n * Each provider is imported on demand so that hosts only load the SDK packages\n * they actually use. This avoids eagerly loading Node-only providers in hosts\n * that bundle or externalize this entry for multiple runtimes.\n */\nasync function loadProviderFactory(\n provider: LLMProviderId,\n): Promise<\n (\n apiKey: string | undefined,\n baseUrl: string | undefined,\n options: Record<string, unknown> | undefined,\n ) => (modelId: string) => LanguageModel\n> {\n switch (provider) {\n case 'openai': {\n const { createOpenAI } = await import('@ai-sdk/openai');\n return (apiKey, baseUrl, options) => {\n const sdk = createOpenAI({ apiKey, baseURL: baseUrl, ...options });\n // The generic OpenAI factory defaults to the Responses API in current\n // SDKs. MemeLoop's provider contract and compatible/self-hosted\n // endpoints use Chat Completions, so select it explicitly.\n return (modelId) => sdk.chat(modelId) as unknown as LanguageModel;\n };\n }\n case 'anthropic': {\n const { createAnthropic } = await import('@ai-sdk/anthropic');\n return (apiKey, baseUrl, options) => {\n const sdk = createAnthropic({ apiKey, baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'google': {\n const { createGoogleGenerativeAI } = await import('@ai-sdk/google');\n return (apiKey, baseUrl, options) => {\n const sdk = createGoogleGenerativeAI({ apiKey, baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'deepseek': {\n const { createDeepSeek } = await import('@ai-sdk/deepseek');\n return (apiKey, baseUrl, options) => {\n const sdk = createDeepSeek({ apiKey, baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'groq': {\n const { createGroq } = await import('@ai-sdk/groq');\n return (apiKey, baseUrl, options) => {\n const sdk = createGroq({ apiKey, baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'mistral': {\n const { createMistral } = await import('@ai-sdk/mistral');\n return (apiKey, baseUrl, options) => {\n const sdk = createMistral({ apiKey, baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'cohere': {\n const { createCohere } = await import('@ai-sdk/cohere');\n return (apiKey, baseUrl, options) => {\n const sdk = createCohere({ apiKey, baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'xai': {\n const { createXai } = await import('@ai-sdk/xai');\n return (apiKey, baseUrl, options) => {\n const sdk = createXai({ apiKey, baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'togetherai': {\n const { createTogetherAI } = await import('@ai-sdk/togetherai');\n return (apiKey, baseUrl, options) => {\n const sdk = createTogetherAI({ apiKey, baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'perplexity': {\n const { createPerplexity } = await import('@ai-sdk/perplexity');\n return (apiKey, baseUrl, options) => {\n const sdk = createPerplexity({ apiKey, baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'azure': {\n const { createAzure } = await import('@ai-sdk/azure');\n return (apiKey, _baseUrl, options) => {\n const sdk = createAzure({ apiKey, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'google-vertex': {\n const { createVertex } = await import('@ai-sdk/google-vertex');\n return (_apiKey, _baseUrl, options) => {\n const sdk = createVertex({ ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'ollama': {\n const { createOllama } = await import('ollama-ai-provider-v2');\n return (_apiKey, baseUrl, options) => {\n const sdk = createOllama({ baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n default: {\n const exhaustive: never = provider;\n throw new Error(`Unsupported provider: ${String(exhaustive)}`);\n }\n }\n}\n\n/**\n * Create an `ILLMProvider` from a config-driven provider id.\n *\n * Switches implementation based on `config.provider`.\n * The selected provider's AI SDK package is loaded on demand, so hosts only\n * pay the dependency cost for providers they actually use.\n */\nexport async function createLLMProvider(config: LLMProviderConfig): Promise<ILLMProvider> {\n const name = config.name ?? config.provider;\n\n function resolveModel(modelId?: string): string {\n return modelId ?? config.model ?? defaultModels[config.provider] ?? '';\n }\n\n const createProviderModel = await loadProviderFactory(config.provider);\n const modelFactory = createProviderModel(config.apiKey, config.baseUrl, config.options);\n\n return createFetchLLMProvider({\n name,\n modelId: resolveModel(),\n createModel: (modelId?: string) => modelFactory(resolveModel(modelId)),\n });\n}\n\n/** Fallback OpenAI-compatible provider for unknown provider ids. */\nasync function createOpenAICompatibleProvider(\n config: Omit<LLMProviderConfig, 'provider'> & { provider: string },\n): Promise<ILLMProvider> {\n const name = config.name ?? config.provider;\n const { createOpenAICompatible } = await import('@ai-sdk/openai-compatible');\n\n function resolveModel(modelId?: string): string {\n return modelId ?? config.model ?? 'gpt-4o-mini';\n }\n\n const sdk = createOpenAICompatible({\n name: config.provider,\n baseURL: config.baseUrl ?? 'https://api.openai.com/v1',\n apiKey: config.apiKey,\n ...config.options,\n });\n\n return createFetchLLMProvider({\n name,\n modelId: resolveModel(),\n createModel: (modelId?: string) => sdk(resolveModel(modelId)) as unknown as LanguageModel,\n });\n}\n\n// ─── Convenience per-provider factories ────────────────────────────────\n\ntype ProviderConfigWithoutId = Omit<LLMProviderConfig, 'provider'>;\n\n/** Convenience factory for OpenAI. */\nexport function createOpenaiProvider(config: ProviderConfigWithoutId = {}): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'openai', ...config });\n}\n\n/** Convenience factory for Anthropic. */\nexport function createAnthropicProvider(\n config: ProviderConfigWithoutId = {},\n): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'anthropic', ...config });\n}\n\n/** Convenience factory for Google Generative AI. */\nexport function createGoogleProvider(config: ProviderConfigWithoutId = {}): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'google', ...config });\n}\n\n/** Convenience factory for DeepSeek. */\nexport function createDeepseekProvider(\n config: ProviderConfigWithoutId = {},\n): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'deepseek', ...config });\n}\n\n/** Convenience factory for Groq. */\nexport function createGroqProvider(config: ProviderConfigWithoutId = {}): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'groq', ...config });\n}\n\n/** Convenience factory for Mistral. */\nexport function createMistralProvider(config: ProviderConfigWithoutId = {}): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'mistral', ...config });\n}\n\n/** Convenience factory for Cohere. */\nexport function createCohereProvider(config: ProviderConfigWithoutId = {}): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'cohere', ...config });\n}\n\n/** Convenience factory for xAI. */\nexport function createXaiProvider(config: ProviderConfigWithoutId = {}): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'xai', ...config });\n}\n\n/** Convenience factory for Together AI. */\nexport function createTogetheraiProvider(\n config: ProviderConfigWithoutId = {},\n): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'togetherai', ...config });\n}\n\n/** Convenience factory for Perplexity. */\nexport function createPerplexityProvider(\n config: ProviderConfigWithoutId = {},\n): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'perplexity', ...config });\n}\n\n/** Convenience factory for Azure OpenAI. */\nexport function createAzureProvider(config: ProviderConfigWithoutId = {}): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'azure', ...config });\n}\n\n/** Convenience factory for Google Vertex. */\nexport function createGoogleVertexProvider(\n config: ProviderConfigWithoutId = {},\n): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'google-vertex', ...config });\n}\n\n/** Convenience factory for Ollama. */\nexport function createOllamaProvider(config: ProviderConfigWithoutId = {}): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'ollama', ...config });\n}\n\n// ─── Host config mapping ───────────────────────────────────────────────\n\n/**\n * Resolve the default model name from a host config entry.\n * Uses the first key in `entry.models` if present, otherwise falls back\n * to the provider-specific default.\n */\nexport function resolveProviderModelId(entry: ConfiguredProviderEntry): string {\n const firstModelKey = entry.models ? Object.keys(entry.models)[0] : undefined;\n if (firstModelKey) {\n return `${entry.name}/${firstModelKey}`;\n }\n return entry.name;\n}\n\n/**\n * Convert a loose host config entry into an `ILLMProvider` via the core registry.\n * Provider id is taken from `entry.name`. Model id is inferred from `entry.models`\n * or the provider-specific default.\n *\n * Unknown provider names fall back to OpenAI-compatible mode, preserving CLI/Desktop\n * behavior where arbitrary OpenAI-compatible endpoints can be configured with any name.\n */\nexport function createProviderFromEntry(entry: ConfiguredProviderEntry): Promise<ILLMProvider> {\n const providerId = entry.name as LLMProviderId;\n const firstModelKey = entry.models ? Object.keys(entry.models)[0] : undefined;\n const firstModelName = firstModelKey ? entry.models?.[firstModelKey]?.name : undefined;\n const configWithoutProvider = {\n name: entry.name,\n apiKey: entry.apiKey,\n baseUrl: entry.baseUrl,\n model: firstModelName,\n options: entry.options,\n };\n\n if (!defaultModels[providerId]) {\n return createOpenAICompatibleProvider({ provider: entry.name, ...configWithoutProvider });\n }\n\n return createLLMProvider({\n provider: providerId,\n ...configWithoutProvider,\n });\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/llm-providers.ts"],"sourcesContent":["/**\n * Pre-built, config-driven LLM providers.\n *\n * Exposes every major @ai-sdk/* provider through a single entry point so hosts\n * can switch providers by changing a string in user config — no need to install\n * AI SDK packages individually.\n *\n * ```ts\n * import { createLLMProvider } from 'memeloop/llm-providers';\n *\n * const provider = createLLMProvider({\n * provider: 'openai',\n * baseUrl: 'https://api.openai.com/v1',\n * apiKey: process.env.OPENAI_API_KEY,\n * model: 'gpt-4o',\n * });\n * ```\n *\n * For custom providers, or to keep bundle size minimal, use the generic\n * `createFetchLLMProvider` exported from `memeloop` and supply your own\n * `createModel` factory.\n *\n * `createLLMProvider` is async because it dynamically imports the selected\n * AI SDK provider on first use. Host bundlers can then decide whether to\n * bundle, split, or externalize those provider dependencies for their runtime.\n */\n\nimport type { LanguageModel } from 'ai';\n\nimport { createFetchLLMProvider } from './llm/fetchProvider.js';\nimport type { ILLMProvider } from './types.js';\n\n// ─── Provider ids ──────────────────────────────────────────────────────\n\nexport type LLMProviderId =\n | 'openai'\n | 'anthropic'\n | 'google'\n | 'deepseek'\n | 'groq'\n | 'mistral'\n | 'cohere'\n | 'xai'\n | 'togetherai'\n | 'perplexity'\n | 'azure'\n | 'google-vertex'\n | 'ollama';\n\n// ─── Config ────────────────────────────────────────────────────────────\n\nexport interface LLMProviderConfig {\n /** Provider id. */\n provider: LLMProviderId;\n /** Display name (defaults to provider id). */\n name?: string;\n /** API key or credential. */\n apiKey?: string;\n /** Override the provider's default API base URL. */\n baseUrl?: string;\n /** Default model id. When omitted a provider-specific default is used. */\n model?: string;\n /** Provider-specific options passed through to the AI SDK factory. */\n options?: Record<string, unknown>;\n /** OpenAI wire API selected for this model. Defaults to Chat Completions. */\n openAIApiMode?: 'chat-completions' | 'responses';\n}\n\n/** A provider entry from any host config (loose shape used by CLI/Desktop). */\nexport interface ConfiguredProviderEntry {\n /** Provider id matching LLMProviderId. */\n name: string;\n /** API base URL. */\n baseUrl?: string;\n /** API key. */\n apiKey?: string;\n /** Provider-specific options. */\n options?: Record<string, unknown>;\n /** Available models; the first key is used as the default model. */\n models?: Record<string, { name: string }>;\n}\n\n// ─── Defaults ──────────────────────────────────────────────────────────\n\nconst defaultModels: Record<LLMProviderId, string> = {\n openai: 'gpt-4o-mini',\n anthropic: 'claude-3-5-sonnet-20241022',\n google: 'gemini-1.5-flash',\n deepseek: 'deepseek-chat',\n groq: 'llama-3.1-8b-instant',\n mistral: 'mistral-small-latest',\n cohere: 'command-r-plus',\n xai: 'grok-beta',\n togetherai: 'meta-llama/Llama-3.1-8B-Instruct-Turbo',\n perplexity: 'sonar',\n azure: '',\n 'google-vertex': '',\n ollama: 'llama3.1',\n};\n\n// ─── Unified factory ───────────────────────────────────────────────────\n\n/**\n * Dynamic loader for AI SDK provider factories.\n *\n * Each provider is imported on demand so that hosts only load the SDK packages\n * they actually use. This avoids eagerly loading Node-only providers in hosts\n * that bundle or externalize this entry for multiple runtimes.\n */\nasync function loadProviderFactory(\n provider: LLMProviderId,\n openAIApiMode: LLMProviderConfig['openAIApiMode'],\n): Promise<\n (\n apiKey: string | undefined,\n baseUrl: string | undefined,\n options: Record<string, unknown> | undefined,\n ) => (modelId: string) => LanguageModel\n> {\n switch (provider) {\n case 'openai': {\n const { createOpenAI } = await import('@ai-sdk/openai');\n return (apiKey, baseUrl, options) => {\n const sdk = createOpenAI({ apiKey, baseURL: baseUrl, ...options });\n // Keep Chat Completions as the compatibility default. Hosts may opt a\n // specific model into Responses without splitting a shared provider.\n return (modelId) =>\n (openAIApiMode === 'responses'\n ? sdk.responses(modelId)\n : sdk.chat(modelId)) as unknown as LanguageModel;\n };\n }\n case 'anthropic': {\n const { createAnthropic } = await import('@ai-sdk/anthropic');\n return (apiKey, baseUrl, options) => {\n const sdk = createAnthropic({ apiKey, baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'google': {\n const { createGoogleGenerativeAI } = await import('@ai-sdk/google');\n return (apiKey, baseUrl, options) => {\n const sdk = createGoogleGenerativeAI({ apiKey, baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'deepseek': {\n const { createDeepSeek } = await import('@ai-sdk/deepseek');\n return (apiKey, baseUrl, options) => {\n const sdk = createDeepSeek({ apiKey, baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'groq': {\n const { createGroq } = await import('@ai-sdk/groq');\n return (apiKey, baseUrl, options) => {\n const sdk = createGroq({ apiKey, baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'mistral': {\n const { createMistral } = await import('@ai-sdk/mistral');\n return (apiKey, baseUrl, options) => {\n const sdk = createMistral({ apiKey, baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'cohere': {\n const { createCohere } = await import('@ai-sdk/cohere');\n return (apiKey, baseUrl, options) => {\n const sdk = createCohere({ apiKey, baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'xai': {\n const { createXai } = await import('@ai-sdk/xai');\n return (apiKey, baseUrl, options) => {\n const sdk = createXai({ apiKey, baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'togetherai': {\n const { createTogetherAI } = await import('@ai-sdk/togetherai');\n return (apiKey, baseUrl, options) => {\n const sdk = createTogetherAI({ apiKey, baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'perplexity': {\n const { createPerplexity } = await import('@ai-sdk/perplexity');\n return (apiKey, baseUrl, options) => {\n const sdk = createPerplexity({ apiKey, baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'azure': {\n const { createAzure } = await import('@ai-sdk/azure');\n return (apiKey, _baseUrl, options) => {\n const sdk = createAzure({ apiKey, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'google-vertex': {\n const { createVertex } = await import('@ai-sdk/google-vertex');\n return (_apiKey, _baseUrl, options) => {\n const sdk = createVertex({ ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n case 'ollama': {\n const { createOllama } = await import('ollama-ai-provider-v2');\n return (_apiKey, baseUrl, options) => {\n const sdk = createOllama({ baseURL: baseUrl, ...options });\n return (modelId) => sdk(modelId) as unknown as LanguageModel;\n };\n }\n default: {\n const exhaustive: never = provider;\n throw new Error(`Unsupported provider: ${String(exhaustive)}`);\n }\n }\n}\n\n/**\n * Create an `ILLMProvider` from a config-driven provider id.\n *\n * Switches implementation based on `config.provider`.\n * The selected provider's AI SDK package is loaded on demand, so hosts only\n * pay the dependency cost for providers they actually use.\n */\nexport async function createLLMProvider(config: LLMProviderConfig): Promise<ILLMProvider> {\n const name = config.name ?? config.provider;\n\n function resolveModel(modelId?: string): string {\n return modelId ?? config.model ?? defaultModels[config.provider] ?? '';\n }\n\n const createProviderModel = await loadProviderFactory(config.provider, config.openAIApiMode);\n const modelFactory = createProviderModel(config.apiKey, config.baseUrl, config.options);\n\n return createFetchLLMProvider({\n name,\n modelId: resolveModel(),\n createModel: (modelId?: string) => modelFactory(resolveModel(modelId)),\n });\n}\n\n/** Fallback OpenAI-compatible provider for unknown provider ids. */\nasync function createOpenAICompatibleProvider(\n config: Omit<LLMProviderConfig, 'provider'> & { provider: string },\n): Promise<ILLMProvider> {\n const name = config.name ?? config.provider;\n const { createOpenAICompatible } = await import('@ai-sdk/openai-compatible');\n\n function resolveModel(modelId?: string): string {\n return modelId ?? config.model ?? 'gpt-4o-mini';\n }\n\n const sdk = createOpenAICompatible({\n name: config.provider,\n baseURL: config.baseUrl ?? 'https://api.openai.com/v1',\n apiKey: config.apiKey,\n ...config.options,\n });\n\n return createFetchLLMProvider({\n name,\n modelId: resolveModel(),\n createModel: (modelId?: string) => sdk(resolveModel(modelId)) as unknown as LanguageModel,\n });\n}\n\n// ─── Convenience per-provider factories ────────────────────────────────\n\ntype ProviderConfigWithoutId = Omit<LLMProviderConfig, 'provider'>;\n\n/** Convenience factory for OpenAI. */\nexport function createOpenaiProvider(config: ProviderConfigWithoutId = {}): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'openai', ...config });\n}\n\n/** Convenience factory for Anthropic. */\nexport function createAnthropicProvider(\n config: ProviderConfigWithoutId = {},\n): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'anthropic', ...config });\n}\n\n/** Convenience factory for Google Generative AI. */\nexport function createGoogleProvider(config: ProviderConfigWithoutId = {}): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'google', ...config });\n}\n\n/** Convenience factory for DeepSeek. */\nexport function createDeepseekProvider(\n config: ProviderConfigWithoutId = {},\n): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'deepseek', ...config });\n}\n\n/** Convenience factory for Groq. */\nexport function createGroqProvider(config: ProviderConfigWithoutId = {}): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'groq', ...config });\n}\n\n/** Convenience factory for Mistral. */\nexport function createMistralProvider(config: ProviderConfigWithoutId = {}): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'mistral', ...config });\n}\n\n/** Convenience factory for Cohere. */\nexport function createCohereProvider(config: ProviderConfigWithoutId = {}): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'cohere', ...config });\n}\n\n/** Convenience factory for xAI. */\nexport function createXaiProvider(config: ProviderConfigWithoutId = {}): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'xai', ...config });\n}\n\n/** Convenience factory for Together AI. */\nexport function createTogetheraiProvider(\n config: ProviderConfigWithoutId = {},\n): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'togetherai', ...config });\n}\n\n/** Convenience factory for Perplexity. */\nexport function createPerplexityProvider(\n config: ProviderConfigWithoutId = {},\n): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'perplexity', ...config });\n}\n\n/** Convenience factory for Azure OpenAI. */\nexport function createAzureProvider(config: ProviderConfigWithoutId = {}): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'azure', ...config });\n}\n\n/** Convenience factory for Google Vertex. */\nexport function createGoogleVertexProvider(\n config: ProviderConfigWithoutId = {},\n): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'google-vertex', ...config });\n}\n\n/** Convenience factory for Ollama. */\nexport function createOllamaProvider(config: ProviderConfigWithoutId = {}): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'ollama', ...config });\n}\n\n// ─── Host config mapping ───────────────────────────────────────────────\n\n/**\n * Resolve the default model name from a host config entry.\n * Uses the first key in `entry.models` if present, otherwise falls back\n * to the provider-specific default.\n */\nexport function resolveProviderModelId(entry: ConfiguredProviderEntry): string {\n const firstModelKey = entry.models ? Object.keys(entry.models)[0] : undefined;\n if (firstModelKey) {\n return `${entry.name}/${firstModelKey}`;\n }\n return entry.name;\n}\n\n/**\n * Convert a loose host config entry into an `ILLMProvider` via the core registry.\n * Provider id is taken from `entry.name`. Model id is inferred from `entry.models`\n * or the provider-specific default.\n *\n * Unknown provider names fall back to OpenAI-compatible mode, preserving CLI/Desktop\n * behavior where arbitrary OpenAI-compatible endpoints can be configured with any name.\n */\nexport function createProviderFromEntry(entry: ConfiguredProviderEntry): Promise<ILLMProvider> {\n const providerId = entry.name as LLMProviderId;\n const firstModelKey = entry.models ? Object.keys(entry.models)[0] : undefined;\n const firstModelName = firstModelKey ? entry.models?.[firstModelKey]?.name : undefined;\n const configWithoutProvider = {\n name: entry.name,\n apiKey: entry.apiKey,\n baseUrl: entry.baseUrl,\n model: firstModelName,\n options: entry.options,\n };\n\n if (!defaultModels[providerId]) {\n return createOpenAICompatibleProvider({ provider: entry.name, ...configWithoutProvider });\n }\n\n return createLLMProvider({\n provider: providerId,\n ...configWithoutProvider,\n });\n}\n"],"mappings":"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","names":[]}
package/dist/loop-api.cjs CHANGED
@@ -7509,6 +7509,7 @@ __export(loop_api_exports, {
7509
7509
  resetLoopRegistry: () => resetLoopRegistry,
7510
7510
  resolveAgentToolLoopTerminalState: () => resolveAgentToolLoopTerminalState,
7511
7511
  resolveCategory: () => resolveCategory,
7512
+ resolveFetchLLMCallSettings: () => resolveFetchLLMCallSettings,
7512
7513
  runAgentToolLoopTurn: () => runAgentToolLoopTurn,
7513
7514
  saveUserPermissions: () => saveUserPermissions,
7514
7515
  shouldCompact: () => shouldCompact,
@@ -7711,6 +7712,15 @@ function resolveCategory(category) {
7711
7712
 
7712
7713
  // src/llm/fetchProvider.ts
7713
7714
  var import_ai = require("ai");
7715
+ function resolveFetchLLMCallSettings(body) {
7716
+ return {
7717
+ maxOutputTokens: body.maxOutputTokens ?? body.max_tokens,
7718
+ temperature: body.temperature,
7719
+ topP: body.topP,
7720
+ providerOptions: body.providerOptions,
7721
+ abortSignal: body.abortSignal
7722
+ };
7723
+ }
7714
7724
  function createFetchLLMProvider(config) {
7715
7725
  return {
7716
7726
  name: config.name,
@@ -7735,9 +7745,7 @@ function createFetchLLMProvider(config) {
7735
7745
  };
7736
7746
  });
7737
7747
  const system = body.system ?? (systemMessages.length > 0 ? systemMessages.join("\n\n") : void 0);
7738
- const temperature = body.temperature;
7739
- const abortSignal = body.abortSignal;
7740
- const maxOutputTokens = body.max_tokens;
7748
+ const { abortSignal, maxOutputTokens, providerOptions, temperature, topP } = resolveFetchLLMCallSettings(body);
7741
7749
  if (body.stream !== false) {
7742
7750
  let streamingError;
7743
7751
  const result2 = (0, import_ai.streamText)({
@@ -7746,6 +7754,8 @@ function createFetchLLMProvider(config) {
7746
7754
  messages,
7747
7755
  maxOutputTokens,
7748
7756
  temperature,
7757
+ topP,
7758
+ providerOptions,
7749
7759
  abortSignal,
7750
7760
  onError: ({ error }) => {
7751
7761
  streamingError = error;
@@ -7766,6 +7776,8 @@ function createFetchLLMProvider(config) {
7766
7776
  messages,
7767
7777
  maxOutputTokens,
7768
7778
  temperature,
7779
+ topP,
7780
+ providerOptions,
7769
7781
  abortSignal
7770
7782
  });
7771
7783
  return result.text;
@@ -8131,6 +8143,7 @@ function clearPluginRegistrations() {
8131
8143
  resetLoopRegistry,
8132
8144
  resolveAgentToolLoopTerminalState,
8133
8145
  resolveCategory,
8146
+ resolveFetchLLMCallSettings,
8134
8147
  runAgentToolLoopTurn,
8135
8148
  saveUserPermissions,
8136
8149
  shouldCompact,