memeloop 0.0.1 → 0.1.1

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.
Files changed (228) hide show
  1. package/README.md +63 -0
  2. package/dist/browser.cjs +1413 -0
  3. package/dist/browser.cjs.map +1 -0
  4. package/dist/browser.d.cts +3066 -0
  5. package/dist/browser.d.ts +3066 -0
  6. package/dist/browser.js +43 -0
  7. package/dist/chunk-2C6BJZI3.js +382 -0
  8. package/dist/chunk-2C6BJZI3.js.map +1 -0
  9. package/dist/chunk-426CJUZP.js +630 -0
  10. package/dist/chunk-426CJUZP.js.map +1 -0
  11. package/dist/chunk-7ZDTB4VZ.js +63 -0
  12. package/dist/chunk-7ZDTB4VZ.js.map +1 -0
  13. package/dist/chunk-AZFYDWIN.js +98 -0
  14. package/dist/chunk-AZFYDWIN.js.map +1 -0
  15. package/dist/chunk-BGPU4RR7.js +367 -0
  16. package/dist/chunk-BGPU4RR7.js.map +1 -0
  17. package/dist/chunk-CCEFAOSH.js +496 -0
  18. package/dist/chunk-CCEFAOSH.js.map +1 -0
  19. package/dist/chunk-FWSY5HOA.js +63 -0
  20. package/dist/chunk-FWSY5HOA.js.map +1 -0
  21. package/dist/chunk-GYIOMQMY.js +8726 -0
  22. package/dist/chunk-GYIOMQMY.js.map +1 -0
  23. package/dist/chunk-K6P63KD4.js +68 -0
  24. package/dist/chunk-K6P63KD4.js.map +1 -0
  25. package/dist/chunk-KFS2EJT6.js +42 -0
  26. package/dist/chunk-KFS2EJT6.js.map +1 -0
  27. package/dist/chunk-MAJWHAKR.js +3637 -0
  28. package/dist/chunk-MAJWHAKR.js.map +1 -0
  29. package/dist/chunk-MRKY4HGF.js +205 -0
  30. package/dist/chunk-MRKY4HGF.js.map +1 -0
  31. package/dist/chunk-T7FSXWFR.js +2744 -0
  32. package/dist/chunk-T7FSXWFR.js.map +1 -0
  33. package/dist/chunk-VZKQX5PP.js +1 -0
  34. package/dist/chunk-VZKQX5PP.js.map +1 -0
  35. package/dist/chunk-WAI6BODI.js +175 -0
  36. package/dist/chunk-WAI6BODI.js.map +1 -0
  37. package/dist/chunk-YMNXDNDW.js +798 -0
  38. package/dist/chunk-YMNXDNDW.js.map +1 -0
  39. package/dist/conversation.cjs +208 -0
  40. package/dist/conversation.cjs.map +1 -0
  41. package/dist/conversation.d.cts +100 -0
  42. package/dist/conversation.d.ts +100 -0
  43. package/dist/conversation.js +21 -0
  44. package/dist/conversation.js.map +1 -0
  45. package/dist/device-network-portable.cjs +702 -0
  46. package/dist/device-network-portable.cjs.map +1 -0
  47. package/dist/device-network-portable.d.cts +110 -0
  48. package/dist/device-network-portable.d.ts +110 -0
  49. package/dist/device-network-portable.js +53 -0
  50. package/dist/device-network-portable.js.map +1 -0
  51. package/dist/device-network.cjs +906 -0
  52. package/dist/device-network.cjs.map +1 -0
  53. package/dist/device-network.d.cts +6 -0
  54. package/dist/device-network.d.ts +6 -0
  55. package/dist/device-network.js +59 -0
  56. package/dist/device-network.js.map +1 -0
  57. package/dist/fetchProvider-WWnWnQFP.d.ts +91 -0
  58. package/dist/fetchProvider-toTHy5Nu.d.cts +91 -0
  59. package/dist/index.cjs +28051 -5459
  60. package/dist/index.cjs.map +1 -1
  61. package/dist/index.d.cts +94 -1320
  62. package/dist/index.d.ts +94 -1320
  63. package/dist/index.js +10616 -2420
  64. package/dist/index.js.map +1 -1
  65. package/dist/interface-IrKBFtL1.d.cts +493 -0
  66. package/dist/interface-IrKBFtL1.d.ts +493 -0
  67. package/dist/llm-providers.cjs +43 -8
  68. package/dist/llm-providers.cjs.map +1 -1
  69. package/dist/llm-providers.d.cts +2 -1
  70. package/dist/llm-providers.d.ts +2 -1
  71. package/dist/llm-providers.js +4 -2
  72. package/dist/llm-providers.js.map +1 -1
  73. package/dist/loop-api.cjs +5227 -2010
  74. package/dist/loop-api.cjs.map +1 -1
  75. package/dist/loop-api.d.cts +11 -5
  76. package/dist/loop-api.d.ts +11 -5
  77. package/dist/loop-api.js +86 -49
  78. package/dist/mobile.cjs +2711 -0
  79. package/dist/mobile.cjs.map +1 -0
  80. package/dist/mobile.d.cts +6 -0
  81. package/dist/mobile.d.ts +6 -0
  82. package/dist/mobile.js +22 -0
  83. package/dist/mobile.js.map +1 -0
  84. package/dist/orchestration-portable-BHB_YrNN.d.ts +2192 -0
  85. package/dist/orchestration-portable-mvYBvGBb.d.cts +2192 -0
  86. package/dist/orchestration-portable.cjs +9553 -0
  87. package/dist/orchestration-portable.cjs.map +1 -0
  88. package/dist/orchestration-portable.d.cts +5 -0
  89. package/dist/orchestration-portable.d.ts +5 -0
  90. package/dist/orchestration-portable.js +290 -0
  91. package/dist/orchestration-portable.js.map +1 -0
  92. package/dist/pairingInvite-BXPWY3aM.d.cts +149 -0
  93. package/dist/pairingInvite-Cuz0wuq9.d.ts +149 -0
  94. package/dist/promptConcat-0WNFTg4l.d.ts +516 -0
  95. package/dist/promptConcat-D6wr5V-V.d.cts +516 -0
  96. package/dist/providerRegistry-Bi6pAvSj.d.ts +86 -0
  97. package/dist/providerRegistry-CPsktuiX.d.cts +86 -0
  98. package/dist/registry-D0kbxksn.d.cts +393 -0
  99. package/dist/registry-DDbvhlhs.d.ts +393 -0
  100. package/dist/remoteClient-B_spK019.d.ts +87 -0
  101. package/dist/remoteClient-CBggnRy3.d.cts +87 -0
  102. package/dist/runtime-PGWR6FIV.js +18 -0
  103. package/dist/runtime-PGWR6FIV.js.map +1 -0
  104. package/dist/scriptDeploymentPipeline-CXJcC82H.d.ts +2464 -0
  105. package/dist/scriptDeploymentPipeline-yG1ZhVVI.d.cts +2464 -0
  106. package/dist/syncCloudDevices-BEqwgrhD.d.ts +49 -0
  107. package/dist/syncCloudDevices-Ds_Kcgrv.d.cts +49 -0
  108. package/dist/types-7pYti-k9.d.cts +255 -0
  109. package/dist/types-CdFVSntj.d.ts +255 -0
  110. package/package.json +110 -35
  111. package/dist/anthropic.cjs +0 -72
  112. package/dist/anthropic.cjs.map +0 -1
  113. package/dist/anthropic.d.cts +0 -21
  114. package/dist/anthropic.d.ts +0 -21
  115. package/dist/anthropic.js +0 -21
  116. package/dist/anthropic.js.map +0 -1
  117. package/dist/azure.cjs +0 -72
  118. package/dist/azure.cjs.map +0 -1
  119. package/dist/azure.d.cts +0 -21
  120. package/dist/azure.d.ts +0 -21
  121. package/dist/azure.js +0 -21
  122. package/dist/azure.js.map +0 -1
  123. package/dist/chunk-3CN7DFBL.js +0 -4894
  124. package/dist/chunk-3CN7DFBL.js.map +0 -1
  125. package/dist/chunk-4AZ4D7U5.js +0 -32
  126. package/dist/chunk-4AZ4D7U5.js.map +0 -1
  127. package/dist/chunk-6ON4XSOV.js +0 -63
  128. package/dist/chunk-6ON4XSOV.js.map +0 -1
  129. package/dist/chunk-DJQNGIXX.js +0 -4793
  130. package/dist/chunk-DJQNGIXX.js.map +0 -1
  131. package/dist/chunk-FKQP6AOQ.js +0 -32
  132. package/dist/chunk-FKQP6AOQ.js.map +0 -1
  133. package/dist/chunk-OVJ7JJBA.js +0 -35
  134. package/dist/chunk-OVJ7JJBA.js.map +0 -1
  135. package/dist/chunk-P4UZ7IXC.js +0 -42
  136. package/dist/chunk-YHJ2AEFR.js +0 -4933
  137. package/dist/chunk-YHJ2AEFR.js.map +0 -1
  138. package/dist/chunk-YVK7RYRO.js +0 -4973
  139. package/dist/chunk-YVK7RYRO.js.map +0 -1
  140. package/dist/code-assistant.json +0 -114
  141. package/dist/cohere.cjs +0 -72
  142. package/dist/cohere.cjs.map +0 -1
  143. package/dist/cohere.d.cts +0 -21
  144. package/dist/cohere.d.ts +0 -21
  145. package/dist/cohere.js +0 -21
  146. package/dist/cohere.js.map +0 -1
  147. package/dist/deepseek.cjs +0 -72
  148. package/dist/deepseek.cjs.map +0 -1
  149. package/dist/deepseek.d.cts +0 -21
  150. package/dist/deepseek.d.ts +0 -21
  151. package/dist/deepseek.js +0 -21
  152. package/dist/deepseek.js.map +0 -1
  153. package/dist/dist-65U7OYRG.js +0 -1257
  154. package/dist/dist-65U7OYRG.js.map +0 -1
  155. package/dist/fetchProvider-Cu4WkU5O.d.cts +0 -819
  156. package/dist/fetchProvider-Cu4WkU5O.d.ts +0 -819
  157. package/dist/frontend-ui-ux.json +0 -105
  158. package/dist/general-assistant.json +0 -95
  159. package/dist/git-master.json +0 -51
  160. package/dist/google-vertex.cjs +0 -72
  161. package/dist/google-vertex.cjs.map +0 -1
  162. package/dist/google-vertex.d.cts +0 -21
  163. package/dist/google-vertex.d.ts +0 -21
  164. package/dist/google-vertex.js +0 -21
  165. package/dist/google-vertex.js.map +0 -1
  166. package/dist/google.cjs +0 -72
  167. package/dist/google.cjs.map +0 -1
  168. package/dist/google.d.cts +0 -21
  169. package/dist/google.d.ts +0 -21
  170. package/dist/google.js +0 -21
  171. package/dist/google.js.map +0 -1
  172. package/dist/groq.cjs +0 -72
  173. package/dist/groq.cjs.map +0 -1
  174. package/dist/groq.d.cts +0 -21
  175. package/dist/groq.d.ts +0 -21
  176. package/dist/groq.js +0 -21
  177. package/dist/groq.js.map +0 -1
  178. package/dist/index.d.mts +0 -3203
  179. package/dist/index.mjs +0 -7064
  180. package/dist/index.mjs.map +0 -1
  181. package/dist/mistral.cjs +0 -72
  182. package/dist/mistral.cjs.map +0 -1
  183. package/dist/mistral.d.cts +0 -21
  184. package/dist/mistral.d.ts +0 -21
  185. package/dist/mistral.js +0 -21
  186. package/dist/mistral.js.map +0 -1
  187. package/dist/multipart-parser-EJCXIUHC.js +0 -372
  188. package/dist/multipart-parser-EJCXIUHC.js.map +0 -1
  189. package/dist/openai.cjs +0 -72
  190. package/dist/openai.cjs.map +0 -1
  191. package/dist/openai.d.cts +0 -21
  192. package/dist/openai.d.ts +0 -21
  193. package/dist/openai.js +0 -21
  194. package/dist/openai.js.map +0 -1
  195. package/dist/perplexity.cjs +0 -72
  196. package/dist/perplexity.cjs.map +0 -1
  197. package/dist/perplexity.d.cts +0 -21
  198. package/dist/perplexity.d.ts +0 -21
  199. package/dist/perplexity.js +0 -21
  200. package/dist/perplexity.js.map +0 -1
  201. package/dist/playwright.json +0 -52
  202. package/dist/promptConcat-BJdazTg5.d.cts +0 -1832
  203. package/dist/promptConcat-BJdazTg5.d.ts +0 -1832
  204. package/dist/promptConcat-CAkpni_8.d.cts +0 -1834
  205. package/dist/promptConcat-CAkpni_8.d.ts +0 -1834
  206. package/dist/promptConcat-CfH5-GAE.d.cts +0 -1036
  207. package/dist/promptConcat-ChcAZOOL.d.ts +0 -1036
  208. package/dist/promptConcat-G5TnJVRy.d.cts +0 -1800
  209. package/dist/promptConcat-G5TnJVRy.d.ts +0 -1800
  210. package/dist/promptConcat-L72eowzp.d.ts +0 -1090
  211. package/dist/promptConcat-eLHdN7K8.d.cts +0 -1090
  212. package/dist/src-VTSXKG72.js +0 -1409
  213. package/dist/src-VTSXKG72.js.map +0 -1
  214. package/dist/togetherai.cjs +0 -72
  215. package/dist/togetherai.cjs.map +0 -1
  216. package/dist/togetherai.d.cts +0 -21
  217. package/dist/togetherai.d.ts +0 -21
  218. package/dist/togetherai.js +0 -21
  219. package/dist/togetherai.js.map +0 -1
  220. package/dist/types-B0Jm2l38.d.cts +0 -767
  221. package/dist/types-B0Jm2l38.d.ts +0 -767
  222. package/dist/xai.cjs +0 -72
  223. package/dist/xai.cjs.map +0 -1
  224. package/dist/xai.d.cts +0 -21
  225. package/dist/xai.d.ts +0 -21
  226. package/dist/xai.js +0 -21
  227. package/dist/xai.js.map +0 -1
  228. /package/dist/{chunk-P4UZ7IXC.js.map → browser.js.map} +0 -0
@@ -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 { LanguageModelV1 } 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(provider: LLMProviderId): Promise<\n (apiKey: string | undefined, baseUrl: string | undefined, options: Record<string, unknown> | undefined) => (modelId: string) => LanguageModelV1\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 return (modelId) => sdk(modelId) as unknown as LanguageModelV1;\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 LanguageModelV1;\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 LanguageModelV1;\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 LanguageModelV1;\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 LanguageModelV1;\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 LanguageModelV1;\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 LanguageModelV1;\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 LanguageModelV1;\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 LanguageModelV1;\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 LanguageModelV1;\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 LanguageModelV1;\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 LanguageModelV1;\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 LanguageModelV1;\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 createModel: (modelId?: string) => modelFactory(resolveModel(modelId)),\n });\n}\n\n/** Fallback OpenAI-compatible provider for unknown provider ids. */\nasync function createOpenAICompatibleProvider(config: Omit<LLMProviderConfig, 'provider'> & { provider: string }): 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 createModel: (modelId?: string) => sdk(resolveModel(modelId)) as unknown as LanguageModelV1,\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(config: ProviderConfigWithoutId = {}): 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(config: ProviderConfigWithoutId = {}): 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(config: ProviderConfigWithoutId = {}): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'togetherai', ...config });\n}\n\n/** Convenience factory for Perplexity. */\nexport function createPerplexityProvider(config: ProviderConfigWithoutId = {}): 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(config: ProviderConfigWithoutId = {}): 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 any Vercel AI SDK LanguageModelV1.\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 { LanguageModelV1 } 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 /**\n * Factory: given an optional model id, return a LanguageModelV1 from any @ai-sdk/* provider.\n * The factory is responsible for picking a default model when `modelId` is omitted.\n */\n createModel: (modelId?: string) => LanguageModelV1;\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 // Store the factory so hosts can introspect or extend\n model: config.createModel as unknown as LanguageModelV1,\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\n const messages = (body.messages ?? []).map((message) => ({\n role: message.role as 'system' | 'user' | 'assistant',\n content: message.content,\n }));\n\n const system = body.system;\n const temperature = body.temperature;\n const abortSignal = body.abortSignal;\n\n if (body.stream !== false) {\n const result = streamText({ model, system, messages, temperature, abortSignal });\n return (async function*() {\n for await (const chunk of result.textStream) {\n yield chunk;\n }\n })();\n }\n\n const result = await generateText({ model, system, messages, temperature, abortSignal });\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}\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,4 +1,5 @@
1
- import { a0 as ILLMProvider } from './types-B0Jm2l38.cjs';
1
+ import { k as ILLMProvider } from './scriptDeploymentPipeline-yG1ZhVVI.cjs';
2
+ import './interface-IrKBFtL1.cjs';
2
3
 
3
4
  /**
4
5
  * Pre-built, config-driven LLM providers.
@@ -1,4 +1,5 @@
1
- import { a0 as ILLMProvider } from './types-B0Jm2l38.js';
1
+ import { k as ILLMProvider } from './scriptDeploymentPipeline-CXJcC82H.js';
2
+ import './interface-IrKBFtL1.js';
2
3
 
3
4
  /**
4
5
  * Pre-built, config-driven LLM providers.
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createFetchLLMProvider
3
- } from "./chunk-OVJ7JJBA.js";
3
+ } from "./chunk-K6P63KD4.js";
4
4
 
5
5
  // src/llm-providers.ts
6
6
  var defaultModels = {
@@ -24,7 +24,7 @@ async function loadProviderFactory(provider) {
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(modelId);
27
+ return (modelId) => sdk.chat(modelId);
28
28
  };
29
29
  }
30
30
  case "anthropic": {
@@ -126,6 +126,7 @@ async function createLLMProvider(config) {
126
126
  const modelFactory = createProviderModel(config.apiKey, config.baseUrl, config.options);
127
127
  return createFetchLLMProvider({
128
128
  name,
129
+ modelId: resolveModel(),
129
130
  createModel: (modelId) => modelFactory(resolveModel(modelId))
130
131
  });
131
132
  }
@@ -143,6 +144,7 @@ async function createOpenAICompatibleProvider(config) {
143
144
  });
144
145
  return createFetchLLMProvider({
145
146
  name,
147
+ modelId: resolveModel(),
146
148
  createModel: (modelId) => sdk(resolveModel(modelId))
147
149
  });
148
150
  }
@@ -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 { LanguageModelV1 } 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(provider: LLMProviderId): Promise<\n (apiKey: string | undefined, baseUrl: string | undefined, options: Record<string, unknown> | undefined) => (modelId: string) => LanguageModelV1\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 return (modelId) => sdk(modelId) as unknown as LanguageModelV1;\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 LanguageModelV1;\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 LanguageModelV1;\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 LanguageModelV1;\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 LanguageModelV1;\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 LanguageModelV1;\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 LanguageModelV1;\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 LanguageModelV1;\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 LanguageModelV1;\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 LanguageModelV1;\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 LanguageModelV1;\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 LanguageModelV1;\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 LanguageModelV1;\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 createModel: (modelId?: string) => modelFactory(resolveModel(modelId)),\n });\n}\n\n/** Fallback OpenAI-compatible provider for unknown provider ids. */\nasync function createOpenAICompatibleProvider(config: Omit<LLMProviderConfig, 'provider'> & { provider: string }): 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 createModel: (modelId?: string) => sdk(resolveModel(modelId)) as unknown as LanguageModelV1,\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(config: ProviderConfigWithoutId = {}): 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(config: ProviderConfigWithoutId = {}): 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(config: ProviderConfigWithoutId = {}): Promise<ILLMProvider> {\n return createLLMProvider({ provider: 'togetherai', ...config });\n}\n\n/** Convenience factory for Perplexity. */\nexport function createPerplexityProvider(config: ProviderConfigWithoutId = {}): 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(config: ProviderConfigWithoutId = {}): 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}\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":[]}