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.
- package/dist/{chunk-K6P63KD4.js → chunk-HY3U3GLE.js} +16 -4
- package/dist/chunk-HY3U3GLE.js.map +1 -0
- package/dist/{fetchProvider-BhqRqi5-.d.ts → fetchProvider-B_vva3b3.d.ts} +26 -2
- package/dist/{fetchProvider-HJ_FkORN.d.cts → fetchProvider-Bz4CE3_R.d.cts} +26 -2
- package/dist/index.cjs +16 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/llm-providers.cjs +17 -6
- package/dist/llm-providers.cjs.map +1 -1
- package/dist/llm-providers.d.cts +2 -0
- package/dist/llm-providers.d.ts +2 -0
- package/dist/llm-providers.js +4 -4
- package/dist/llm-providers.js.map +1 -1
- package/dist/loop-api.cjs +16 -3
- package/dist/loop-api.cjs.map +1 -1
- package/dist/loop-api.d.cts +1 -1
- package/dist/loop-api.d.ts +1 -1
- package/dist/loop-api.js +4 -2
- package/dist/mobile.cjs +14 -3
- package/dist/mobile.cjs.map +1 -1
- package/dist/mobile.d.cts +1 -1
- package/dist/mobile.d.ts +1 -1
- package/dist/mobile.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-K6P63KD4.js.map +0 -1
package/dist/llm-providers.cjs
CHANGED
|
@@ -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
|
|
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"]}
|
package/dist/llm-providers.d.cts
CHANGED
|
@@ -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 {
|
package/dist/llm-providers.d.ts
CHANGED
|
@@ -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 {
|
package/dist/llm-providers.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createFetchLLMProvider
|
|
3
|
-
} from "./chunk-
|
|
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
|
|
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,
|