libre-webui 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (287) hide show
  1. package/README.md +64 -46
  2. package/backend/dist/db.d.ts.map +1 -1
  3. package/backend/dist/db.js +21 -19
  4. package/backend/dist/db.js.map +1 -1
  5. package/backend/dist/index.d.ts.map +1 -1
  6. package/backend/dist/index.js +26 -908
  7. package/backend/dist/index.js.map +1 -1
  8. package/backend/dist/middleware/auth.d.ts.map +1 -1
  9. package/backend/dist/middleware/auth.js +4 -2
  10. package/backend/dist/middleware/auth.js.map +1 -1
  11. package/backend/dist/middleware/index.d.ts.map +1 -1
  12. package/backend/dist/middleware/index.js +4 -2
  13. package/backend/dist/middleware/index.js.map +1 -1
  14. package/backend/dist/models/personaModel.d.ts.map +1 -1
  15. package/backend/dist/models/personaModel.js +11 -9
  16. package/backend/dist/models/personaModel.js.map +1 -1
  17. package/backend/dist/routes/auth.d.ts.map +1 -1
  18. package/backend/dist/routes/auth.js +36 -14
  19. package/backend/dist/routes/auth.js.map +1 -1
  20. package/backend/dist/routes/chat.d.ts.map +1 -1
  21. package/backend/dist/routes/chat.js +61 -249
  22. package/backend/dist/routes/chat.js.map +1 -1
  23. package/backend/dist/routes/documents.d.ts.map +1 -1
  24. package/backend/dist/routes/documents.js +10 -8
  25. package/backend/dist/routes/documents.js.map +1 -1
  26. package/backend/dist/routes/imageGen.d.ts.map +1 -1
  27. package/backend/dist/routes/imageGen.js +9 -7
  28. package/backend/dist/routes/imageGen.js.map +1 -1
  29. package/backend/dist/routes/ollama.d.ts.map +1 -1
  30. package/backend/dist/routes/ollama.js +7 -247
  31. package/backend/dist/routes/ollama.js.map +1 -1
  32. package/backend/dist/routes/plugins.d.ts.map +1 -1
  33. package/backend/dist/routes/plugins.js +7 -105
  34. package/backend/dist/routes/plugins.js.map +1 -1
  35. package/backend/dist/routes/tts.d.ts.map +1 -1
  36. package/backend/dist/routes/tts.js +7 -5
  37. package/backend/dist/routes/tts.js.map +1 -1
  38. package/backend/dist/routes/users.d.ts.map +1 -1
  39. package/backend/dist/routes/users.js +7 -5
  40. package/backend/dist/routes/users.js.map +1 -1
  41. package/backend/dist/services/assistantCompletionService.d.ts +26 -0
  42. package/backend/dist/services/assistantCompletionService.d.ts.map +1 -0
  43. package/backend/dist/services/assistantCompletionService.js +53 -0
  44. package/backend/dist/services/assistantCompletionService.js.map +1 -0
  45. package/backend/dist/services/authService.d.ts +2 -0
  46. package/backend/dist/services/authService.d.ts.map +1 -1
  47. package/backend/dist/services/authService.js +9 -5
  48. package/backend/dist/services/authService.js.map +1 -1
  49. package/backend/dist/services/chatGenerationService.d.ts +32 -0
  50. package/backend/dist/services/chatGenerationService.d.ts.map +1 -0
  51. package/backend/dist/services/chatGenerationService.js +118 -0
  52. package/backend/dist/services/chatGenerationService.js.map +1 -0
  53. package/backend/dist/services/chatRequestService.d.ts +55 -0
  54. package/backend/dist/services/chatRequestService.d.ts.map +1 -0
  55. package/backend/dist/services/chatRequestService.js +103 -0
  56. package/backend/dist/services/chatRequestService.js.map +1 -0
  57. package/backend/dist/services/chatService.d.ts +0 -1
  58. package/backend/dist/services/chatService.d.ts.map +1 -1
  59. package/backend/dist/services/chatService.js +13 -27
  60. package/backend/dist/services/chatService.js.map +1 -1
  61. package/backend/dist/services/documentService.d.ts.map +1 -1
  62. package/backend/dist/services/documentService.js +21 -19
  63. package/backend/dist/services/documentService.js.map +1 -1
  64. package/backend/dist/services/embeddingService.d.ts.map +1 -1
  65. package/backend/dist/services/embeddingService.js +3 -1
  66. package/backend/dist/services/embeddingService.js.map +1 -1
  67. package/backend/dist/services/encryptionService.d.ts.map +1 -1
  68. package/backend/dist/services/encryptionService.js +26 -24
  69. package/backend/dist/services/encryptionService.js.map +1 -1
  70. package/backend/dist/services/galleryService.d.ts.map +1 -1
  71. package/backend/dist/services/galleryService.js +8 -6
  72. package/backend/dist/services/galleryService.js.map +1 -1
  73. package/backend/dist/services/memoryService.d.ts +2 -13
  74. package/backend/dist/services/memoryService.d.ts.map +1 -1
  75. package/backend/dist/services/memoryService.js +37 -198
  76. package/backend/dist/services/memoryService.js.map +1 -1
  77. package/backend/dist/services/memoryUtils.d.ts +29 -0
  78. package/backend/dist/services/memoryUtils.d.ts.map +1 -0
  79. package/backend/dist/services/memoryUtils.js +165 -0
  80. package/backend/dist/services/memoryUtils.js.map +1 -0
  81. package/backend/dist/services/mutationEngineService.d.ts.map +1 -1
  82. package/backend/dist/services/mutationEngineService.js +3 -1
  83. package/backend/dist/services/mutationEngineService.js.map +1 -1
  84. package/backend/dist/services/ollamaService.d.ts.map +1 -1
  85. package/backend/dist/services/ollamaService.js +36 -34
  86. package/backend/dist/services/ollamaService.js.map +1 -1
  87. package/backend/dist/services/personaService.d.ts.map +1 -1
  88. package/backend/dist/services/personaService.js +3 -1
  89. package/backend/dist/services/personaService.js.map +1 -1
  90. package/backend/dist/services/pluginCapabilityRegistryService.d.ts +11 -0
  91. package/backend/dist/services/pluginCapabilityRegistryService.d.ts.map +1 -0
  92. package/backend/dist/services/pluginCapabilityRegistryService.js +70 -0
  93. package/backend/dist/services/pluginCapabilityRegistryService.js.map +1 -0
  94. package/backend/dist/services/pluginCredentialsService.d.ts.map +1 -1
  95. package/backend/dist/services/pluginCredentialsService.js +13 -11
  96. package/backend/dist/services/pluginCredentialsService.js.map +1 -1
  97. package/backend/dist/services/pluginEmbeddingService.d.ts +26 -0
  98. package/backend/dist/services/pluginEmbeddingService.d.ts.map +1 -0
  99. package/backend/dist/services/pluginEmbeddingService.js +159 -0
  100. package/backend/dist/services/pluginEmbeddingService.js.map +1 -0
  101. package/backend/dist/services/pluginImageGenerationService.d.ts +29 -0
  102. package/backend/dist/services/pluginImageGenerationService.d.ts.map +1 -0
  103. package/backend/dist/services/pluginImageGenerationService.js +402 -0
  104. package/backend/dist/services/pluginImageGenerationService.js.map +1 -0
  105. package/backend/dist/services/pluginService.d.ts +9 -18
  106. package/backend/dist/services/pluginService.d.ts.map +1 -1
  107. package/backend/dist/services/pluginService.js +120 -1469
  108. package/backend/dist/services/pluginService.js.map +1 -1
  109. package/backend/dist/services/pluginTTSService.d.ts +28 -0
  110. package/backend/dist/services/pluginTTSService.d.ts.map +1 -0
  111. package/backend/dist/services/pluginTTSService.js +286 -0
  112. package/backend/dist/services/pluginTTSService.js.map +1 -0
  113. package/backend/dist/services/pluginVariablesService.d.ts.map +1 -1
  114. package/backend/dist/services/pluginVariablesService.js +7 -5
  115. package/backend/dist/services/pluginVariablesService.js.map +1 -1
  116. package/backend/dist/services/preferencesService.d.ts.map +1 -1
  117. package/backend/dist/services/preferencesService.js +9 -7
  118. package/backend/dist/services/preferencesService.js.map +1 -1
  119. package/backend/dist/services/simpleGitHubOAuth.d.ts.map +1 -1
  120. package/backend/dist/services/simpleGitHubOAuth.js +10 -8
  121. package/backend/dist/services/simpleGitHubOAuth.js.map +1 -1
  122. package/backend/dist/services/simpleHuggingFaceOAuth.d.ts.map +1 -1
  123. package/backend/dist/services/simpleHuggingFaceOAuth.js +11 -9
  124. package/backend/dist/services/simpleHuggingFaceOAuth.js.map +1 -1
  125. package/backend/dist/services/systemSettingsService.d.ts.map +1 -1
  126. package/backend/dist/services/systemSettingsService.js +4 -2
  127. package/backend/dist/services/systemSettingsService.js.map +1 -1
  128. package/backend/dist/services/titleGenerationService.d.ts +55 -0
  129. package/backend/dist/services/titleGenerationService.d.ts.map +1 -0
  130. package/backend/dist/services/titleGenerationService.js +121 -0
  131. package/backend/dist/services/titleGenerationService.js.map +1 -0
  132. package/backend/dist/services/turnstileService.d.ts +13 -0
  133. package/backend/dist/services/turnstileService.d.ts.map +1 -0
  134. package/backend/dist/services/turnstileService.js +79 -0
  135. package/backend/dist/services/turnstileService.js.map +1 -0
  136. package/backend/dist/storage.d.ts +2 -22
  137. package/backend/dist/storage.d.ts.map +1 -1
  138. package/backend/dist/storage.js +22 -170
  139. package/backend/dist/storage.js.map +1 -1
  140. package/backend/dist/storageMappers.d.ts +82 -0
  141. package/backend/dist/storageMappers.d.ts.map +1 -0
  142. package/backend/dist/storageMappers.js +85 -0
  143. package/backend/dist/storageMappers.js.map +1 -0
  144. package/backend/dist/test-encryption.js +20 -18
  145. package/backend/dist/test-encryption.js.map +1 -1
  146. package/backend/dist/utils/assistantBranching.d.ts +8 -0
  147. package/backend/dist/utils/assistantBranching.d.ts.map +1 -0
  148. package/backend/dist/utils/assistantBranching.js +30 -0
  149. package/backend/dist/utils/assistantBranching.js.map +1 -0
  150. package/backend/dist/utils/chatContext.d.ts +17 -0
  151. package/backend/dist/utils/chatContext.d.ts.map +1 -0
  152. package/backend/dist/utils/chatContext.js +82 -0
  153. package/backend/dist/utils/chatContext.js.map +1 -0
  154. package/backend/dist/utils/chatDocumentContext.d.ts +7 -0
  155. package/backend/dist/utils/chatDocumentContext.d.ts.map +1 -0
  156. package/backend/dist/utils/chatDocumentContext.js +51 -0
  157. package/backend/dist/utils/chatDocumentContext.js.map +1 -0
  158. package/backend/dist/utils/logger.d.ts +12 -0
  159. package/backend/dist/utils/logger.d.ts.map +1 -0
  160. package/backend/dist/utils/logger.js +82 -0
  161. package/backend/dist/utils/logger.js.map +1 -0
  162. package/backend/dist/utils/ollamaLibrary.d.ts +17 -0
  163. package/backend/dist/utils/ollamaLibrary.d.ts.map +1 -0
  164. package/backend/dist/utils/ollamaLibrary.js +253 -0
  165. package/backend/dist/utils/ollamaLibrary.js.map +1 -0
  166. package/backend/dist/utils/ollamaStreaming.d.ts +19 -0
  167. package/backend/dist/utils/ollamaStreaming.d.ts.map +1 -0
  168. package/backend/dist/utils/ollamaStreaming.js +67 -0
  169. package/backend/dist/utils/ollamaStreaming.js.map +1 -0
  170. package/backend/dist/utils/pluginChatAdapter.d.ts +32 -0
  171. package/backend/dist/utils/pluginChatAdapter.d.ts.map +1 -0
  172. package/backend/dist/utils/pluginChatAdapter.js +308 -0
  173. package/backend/dist/utils/pluginChatAdapter.js.map +1 -0
  174. package/backend/dist/utils/pluginChatContext.d.ts +23 -0
  175. package/backend/dist/utils/pluginChatContext.d.ts.map +1 -0
  176. package/backend/dist/utils/pluginChatContext.js +77 -0
  177. package/backend/dist/utils/pluginChatContext.js.map +1 -0
  178. package/backend/dist/utils/pluginResponse.d.ts +6 -0
  179. package/backend/dist/utils/pluginResponse.d.ts.map +1 -0
  180. package/backend/dist/utils/pluginResponse.js +70 -0
  181. package/backend/dist/utils/pluginResponse.js.map +1 -0
  182. package/backend/dist/utils/pluginStreamAdapter.d.ts +16 -0
  183. package/backend/dist/utils/pluginStreamAdapter.d.ts.map +1 -0
  184. package/backend/dist/utils/pluginStreamAdapter.js +141 -0
  185. package/backend/dist/utils/pluginStreamAdapter.js.map +1 -0
  186. package/backend/dist/utils/pluginStreaming.d.ts +24 -0
  187. package/backend/dist/utils/pluginStreaming.d.ts.map +1 -0
  188. package/backend/dist/utils/pluginStreaming.js +106 -0
  189. package/backend/dist/utils/pluginStreaming.js.map +1 -0
  190. package/backend/dist/utils/pluginUpload.d.ts +8 -0
  191. package/backend/dist/utils/pluginUpload.d.ts.map +1 -0
  192. package/backend/dist/utils/pluginUpload.js +51 -0
  193. package/backend/dist/utils/pluginUpload.js.map +1 -0
  194. package/backend/dist/utils/pluginValidation.d.ts +10 -0
  195. package/backend/dist/utils/pluginValidation.d.ts.map +1 -0
  196. package/backend/dist/utils/pluginValidation.js +94 -0
  197. package/backend/dist/utils/pluginValidation.js.map +1 -0
  198. package/backend/dist/utils/pluginVariableValidation.d.ts +10 -0
  199. package/backend/dist/utils/pluginVariableValidation.d.ts.map +1 -0
  200. package/backend/dist/utils/pluginVariableValidation.js +80 -0
  201. package/backend/dist/utils/pluginVariableValidation.js.map +1 -0
  202. package/backend/dist/utils/websocketMessages.d.ts +26 -0
  203. package/backend/dist/utils/websocketMessages.d.ts.map +1 -0
  204. package/backend/dist/utils/websocketMessages.js +74 -0
  205. package/backend/dist/utils/websocketMessages.js.map +1 -0
  206. package/backend/dist/websocketServer.d.ts +3 -0
  207. package/backend/dist/websocketServer.d.ts.map +1 -0
  208. package/backend/dist/websocketServer.js +332 -0
  209. package/backend/dist/websocketServer.js.map +1 -0
  210. package/backend/package.json +2 -2
  211. package/frontend/dist/assets/index-BxHDVIti.css +1 -0
  212. package/frontend/dist/assets/index-CDA2f43l.js +5 -0
  213. package/frontend/dist/assets/markdown-math-CYlHEDRF.css +1 -0
  214. package/frontend/dist/index.html +11 -10
  215. package/frontend/dist/js/ArtifactContainer-CA523BOS.js +1 -0
  216. package/frontend/dist/js/ArtifactDemoPage-C0p2-ccP.js +200 -0
  217. package/frontend/dist/js/ArtifactSlideOutPanel-BBYuYyr_.js +1 -0
  218. package/frontend/dist/js/Button-BmZQkAPD.js +1 -0
  219. package/frontend/dist/js/ChatPage-QSOhIynr.js +16 -0
  220. package/frontend/dist/js/FirstTimeSetup-pi-S4VU-.js +1 -0
  221. package/frontend/dist/js/GalleryPage-BPXB-D4f.js +1 -0
  222. package/frontend/dist/js/ModelManagerModals-D3SZV7CU.js +1 -0
  223. package/frontend/dist/js/ModelsPage-Fmqc1Zxb.js +2 -0
  224. package/frontend/dist/js/OptimizedSyntaxHighlighter-DlI4omE2.js +1 -0
  225. package/frontend/dist/js/PersonasPage-BuLOCG1Y.js +13 -0
  226. package/frontend/dist/js/RichMessageContent-Darvuw8F.js +3 -0
  227. package/frontend/dist/js/SettingsModal-CQhAeaia.js +1 -0
  228. package/frontend/dist/js/UserManagementPage-yX9vOase.js +1 -0
  229. package/frontend/dist/js/api-d05r9G59.js +15 -0
  230. package/frontend/dist/js/ar-BIL8U_dv.js +2 -0
  231. package/frontend/dist/js/artifactHtml-CRdkOCnz.js +27 -0
  232. package/frontend/dist/js/bn-BWQoWPn6.js +2 -0
  233. package/frontend/dist/js/cs-DOD1vscE.js +2 -0
  234. package/frontend/dist/js/da-DYPzSzX4.js +2 -0
  235. package/frontend/dist/js/de-CHd4b2Xf.js +2 -0
  236. package/frontend/dist/js/demoMode-BhEpMVh5.js +1 -0
  237. package/frontend/dist/js/es-BmDO6uNe.js +2 -0
  238. package/frontend/dist/js/fr-DW24sUV7.js +2 -0
  239. package/frontend/dist/js/hi-BRDq_y1B.js +2 -0
  240. package/frontend/dist/js/id-I_F2nstV.js +2 -0
  241. package/frontend/dist/js/is-Boj7-J12.js +2 -0
  242. package/frontend/dist/js/it-CNeHl9Fh.js +2 -0
  243. package/frontend/dist/js/ja-DrVG6G8s.js +2 -0
  244. package/frontend/dist/js/ko-BtKRwlHW.js +2 -0
  245. package/frontend/dist/js/logger-1THq8-96.js +1 -0
  246. package/frontend/dist/js/markdown-core-CEpaJrKd.js +16 -0
  247. package/frontend/dist/js/markdown-math-DAmpvM9y.js +261 -0
  248. package/frontend/dist/js/ms-Dp9MigoU.js +2 -0
  249. package/frontend/dist/js/nl-Bk9pGoCF.js +2 -0
  250. package/frontend/dist/js/pl-seE8_lLS.js +2 -0
  251. package/frontend/dist/js/pt-BAeBtldI.js +2 -0
  252. package/frontend/dist/js/{react-vendor-Dh6nfvM2.js → react-vendor-DtQrJICq.js} +1 -1
  253. package/frontend/dist/js/ru-CkCpWFNb.js +2 -0
  254. package/frontend/dist/js/sv-BM7nqxmA.js +2 -0
  255. package/frontend/dist/js/syntax-highlight-B758xPeo.js +8 -0
  256. package/frontend/dist/js/th-vDIZbpa4.js +2 -0
  257. package/frontend/dist/js/tr-G2-XodhW.js +2 -0
  258. package/frontend/dist/js/ui-vendor-MCs1MDmN.js +177 -0
  259. package/frontend/dist/js/uk-DfVfZcBQ.js +2 -0
  260. package/frontend/dist/js/useBaseQuery-CrdrLcmR.js +1 -0
  261. package/frontend/dist/js/useQuery-DaEnYfWR.js +1 -0
  262. package/frontend/dist/js/utils-es0n-47H.js +1 -0
  263. package/frontend/dist/js/utils-vendor-B2ZBL57Y.js +9 -0
  264. package/frontend/dist/js/vi-Yp9yjb06.js +2 -0
  265. package/frontend/dist/js/zh-DtRb97we.js +2 -0
  266. package/package.json +12 -8
  267. package/plugins/openclaw-agent.json +1 -1
  268. package/backend/dist/services/openclawSessionService.d.ts +0 -63
  269. package/backend/dist/services/openclawSessionService.d.ts.map +0 -1
  270. package/backend/dist/services/openclawSessionService.js +0 -307
  271. package/backend/dist/services/openclawSessionService.js.map +0 -1
  272. package/frontend/dist/assets/index-cOuIFv6G.js +0 -314
  273. package/frontend/dist/assets/index-tuVjvNle.css +0 -1
  274. package/frontend/dist/js/ArtifactContainer-DXa2t8GS.js +0 -24
  275. package/frontend/dist/js/ArtifactDemoPage-Dms7P2gI.js +0 -98
  276. package/frontend/dist/js/ChatPage-C6hOVIAS.js +0 -15
  277. package/frontend/dist/js/GalleryPage-CGKPECJV.js +0 -1
  278. package/frontend/dist/js/ModelsPage-CNB-c-JM.js +0 -1
  279. package/frontend/dist/js/PersonasPage-hDiS0Rvl.js +0 -13
  280. package/frontend/dist/js/UserManagementPage-1H9kcHeR.js +0 -1
  281. package/frontend/dist/js/api-MQ7bONaU.js +0 -3
  282. package/frontend/dist/js/appStore-BpzQfKOd.js +0 -2
  283. package/frontend/dist/js/authStore-Cn_WS6Kb.js +0 -2
  284. package/frontend/dist/js/demoMode-PKHbba1m.js +0 -1
  285. package/frontend/dist/js/markdown-vendor-DLzJCMRQ.js +0 -22
  286. package/frontend/dist/js/ui-vendor-ClcVY3m-.js +0 -177
  287. package/frontend/dist/js/utils-vendor-BCQRX-0Q.js +0 -9
@@ -0,0 +1,308 @@
1
+ /*
2
+ * Libre WebUI
3
+ * Copyright (C) 2025 Kroonen AI, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at:
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ export function resolvePluginChatParameters(options = {}, pluginVars = {}) {
18
+ return {
19
+ temperature: options.temperature ??
20
+ pluginVars.temperature ??
21
+ 0.7,
22
+ maxTokens: options.num_predict === -1
23
+ ? undefined
24
+ : (options.num_predict ??
25
+ pluginVars.max_tokens ??
26
+ undefined),
27
+ topP: options.top_p ?? pluginVars.top_p ?? undefined,
28
+ frequencyPenalty: pluginVars.frequency_penalty ?? undefined,
29
+ presencePenalty: pluginVars.presence_penalty ?? undefined,
30
+ shouldStream: pluginVars.stream ?? false,
31
+ };
32
+ }
33
+ function splitDataUrlImage(image) {
34
+ if (!image.startsWith('data:')) {
35
+ return {
36
+ mediaType: 'image/jpeg',
37
+ base64Data: image,
38
+ };
39
+ }
40
+ const match = image.match(/^data:([^;]+);base64,(.+)$/);
41
+ return {
42
+ mediaType: match?.[1] || 'image/jpeg',
43
+ base64Data: match?.[2] || image,
44
+ };
45
+ }
46
+ export function toOpenAICompatibleMessages(messages) {
47
+ return messages.map(message => {
48
+ if (message.images && message.images.length > 0) {
49
+ const content = [];
50
+ for (const image of message.images) {
51
+ const imageUrl = image.startsWith('data:')
52
+ ? image
53
+ : `data:image/jpeg;base64,${image}`;
54
+ content.push({ type: 'image_url', image_url: { url: imageUrl } });
55
+ }
56
+ if (message.content) {
57
+ content.push({ type: 'text', text: message.content });
58
+ }
59
+ return { role: message.role, content };
60
+ }
61
+ return { role: message.role, content: message.content };
62
+ });
63
+ }
64
+ function toAnthropicMessages(messages) {
65
+ return messages.map(message => {
66
+ if (message.images && message.images.length > 0) {
67
+ const content = [];
68
+ for (const image of message.images) {
69
+ const { mediaType, base64Data } = splitDataUrlImage(image);
70
+ content.push({
71
+ type: 'image',
72
+ source: {
73
+ type: 'base64',
74
+ media_type: mediaType,
75
+ data: base64Data,
76
+ },
77
+ });
78
+ }
79
+ if (message.content) {
80
+ content.push({
81
+ type: 'text',
82
+ text: message.content,
83
+ });
84
+ }
85
+ return {
86
+ role: message.role,
87
+ content,
88
+ };
89
+ }
90
+ return {
91
+ role: message.role,
92
+ content: message.content,
93
+ };
94
+ });
95
+ }
96
+ function buildAnthropicChatPayload(model, messages, options, params) {
97
+ const systemMessages = messages.filter(message => message.role === 'system');
98
+ const nonSystemMessages = messages.filter(message => message.role !== 'system');
99
+ const payload = {
100
+ model,
101
+ messages: toAnthropicMessages(nonSystemMessages),
102
+ max_tokens: params.maxTokens ?? 1024,
103
+ temperature: params.temperature,
104
+ top_p: params.topP,
105
+ stop_sequences: options.stop,
106
+ stream: params.shouldStream,
107
+ };
108
+ if (systemMessages.length > 0) {
109
+ payload.system = systemMessages.map(message => message.content).join('\n');
110
+ }
111
+ return {
112
+ payload,
113
+ headers: {
114
+ 'anthropic-version': '2023-06-01',
115
+ },
116
+ };
117
+ }
118
+ function buildGeminiChatPayload(model, messages, options, params) {
119
+ const lastMessage = messages[messages.length - 1];
120
+ const parts = [];
121
+ if (lastMessage?.images && lastMessage.images.length > 0) {
122
+ for (const image of lastMessage.images) {
123
+ const { mediaType, base64Data } = splitDataUrlImage(image);
124
+ parts.push({
125
+ inline_data: {
126
+ mime_type: mediaType,
127
+ data: base64Data,
128
+ },
129
+ });
130
+ }
131
+ }
132
+ if (lastMessage?.content) {
133
+ parts.push({ text: lastMessage.content });
134
+ }
135
+ return {
136
+ payload: {
137
+ contents: [{ parts }],
138
+ generationConfig: {
139
+ temperature: params.temperature,
140
+ maxOutputTokens: params.maxTokens ?? 1024,
141
+ topP: params.topP,
142
+ stopSequences: options.stop,
143
+ },
144
+ },
145
+ };
146
+ }
147
+ function buildOpenAICompatibleChatPayload(model, messages, options, params) {
148
+ return {
149
+ payload: {
150
+ model,
151
+ messages: toOpenAICompatibleMessages(messages),
152
+ temperature: params.temperature,
153
+ max_tokens: params.maxTokens,
154
+ top_p: params.topP,
155
+ frequency_penalty: params.frequencyPenalty,
156
+ presence_penalty: params.presencePenalty,
157
+ stop: options.stop,
158
+ stream: params.shouldStream,
159
+ },
160
+ };
161
+ }
162
+ export function buildPluginChatPayload(plugin, model, messages, options = {}, pluginVars = {}, streamOverride) {
163
+ const params = resolvePluginChatParameters(options, pluginVars);
164
+ if (streamOverride !== undefined) {
165
+ params.shouldStream = streamOverride;
166
+ }
167
+ if (plugin.id === 'anthropic') {
168
+ return buildAnthropicChatPayload(model, messages, options, params);
169
+ }
170
+ if (plugin.id === 'gemini') {
171
+ return buildGeminiChatPayload(model, messages, options, params);
172
+ }
173
+ return buildOpenAICompatibleChatPayload(model, messages, options, params);
174
+ }
175
+ export function convertAnthropicResponse(anthropicResponse, model) {
176
+ const id = typeof anthropicResponse.id === 'string'
177
+ ? anthropicResponse.id
178
+ : `chatcmpl-${Date.now()}`;
179
+ const stopReasonMap = {
180
+ end_turn: 'stop',
181
+ max_tokens: 'length',
182
+ stop_sequence: 'stop',
183
+ tool_use: 'tool_calls',
184
+ };
185
+ const stopReason = typeof anthropicResponse.stop_reason === 'string'
186
+ ? stopReasonMap[anthropicResponse.stop_reason] || 'stop'
187
+ : 'stop';
188
+ let content = '';
189
+ if (Array.isArray(anthropicResponse.content)) {
190
+ for (const block of anthropicResponse.content) {
191
+ if (block &&
192
+ typeof block === 'object' &&
193
+ 'type' in block &&
194
+ block.type === 'text' &&
195
+ 'text' in block &&
196
+ typeof block.text === 'string') {
197
+ content += block.text;
198
+ }
199
+ }
200
+ }
201
+ let usage;
202
+ if (anthropicResponse.usage &&
203
+ typeof anthropicResponse.usage === 'object' &&
204
+ anthropicResponse.usage !== null) {
205
+ const usageObj = anthropicResponse.usage;
206
+ const inputTokens = typeof usageObj.input_tokens === 'number' ? usageObj.input_tokens : 0;
207
+ const outputTokens = typeof usageObj.output_tokens === 'number' ? usageObj.output_tokens : 0;
208
+ usage = {
209
+ prompt_tokens: inputTokens,
210
+ completion_tokens: outputTokens,
211
+ total_tokens: inputTokens + outputTokens,
212
+ };
213
+ }
214
+ return {
215
+ id,
216
+ object: 'chat.completion',
217
+ created: Math.floor(Date.now() / 1000),
218
+ model,
219
+ choices: [
220
+ {
221
+ index: 0,
222
+ message: {
223
+ role: 'assistant',
224
+ content,
225
+ },
226
+ finish_reason: stopReason,
227
+ },
228
+ ],
229
+ usage,
230
+ };
231
+ }
232
+ export function convertGeminiResponse(geminiResponse, model) {
233
+ const id = `chatcmpl-${Date.now()}`;
234
+ let content = '';
235
+ let finishReason = 'stop';
236
+ if (Array.isArray(geminiResponse.candidates)) {
237
+ const candidate = geminiResponse.candidates[0];
238
+ if (candidate && typeof candidate === 'object') {
239
+ const candidateObj = candidate;
240
+ if (candidateObj.content && typeof candidateObj.content === 'object') {
241
+ const contentObj = candidateObj.content;
242
+ if (Array.isArray(contentObj.parts)) {
243
+ for (const part of contentObj.parts) {
244
+ if (part &&
245
+ typeof part === 'object' &&
246
+ 'text' in part &&
247
+ typeof part.text === 'string') {
248
+ content += part.text;
249
+ }
250
+ }
251
+ }
252
+ }
253
+ if (typeof candidateObj.finishReason === 'string') {
254
+ const finishReasonMap = {
255
+ STOP: 'stop',
256
+ MAX_TOKENS: 'length',
257
+ SAFETY: 'content_filter',
258
+ RECITATION: 'content_filter',
259
+ OTHER: 'stop',
260
+ };
261
+ finishReason = finishReasonMap[candidateObj.finishReason] || 'stop';
262
+ }
263
+ }
264
+ }
265
+ let usage;
266
+ if (geminiResponse.usageMetadata &&
267
+ typeof geminiResponse.usageMetadata === 'object') {
268
+ const usageObj = geminiResponse.usageMetadata;
269
+ const promptTokens = typeof usageObj.promptTokenCount === 'number'
270
+ ? usageObj.promptTokenCount
271
+ : 0;
272
+ const completionTokens = typeof usageObj.candidatesTokenCount === 'number'
273
+ ? usageObj.candidatesTokenCount
274
+ : 0;
275
+ usage = {
276
+ prompt_tokens: promptTokens,
277
+ completion_tokens: completionTokens,
278
+ total_tokens: promptTokens + completionTokens,
279
+ };
280
+ }
281
+ return {
282
+ id,
283
+ object: 'chat.completion',
284
+ created: Math.floor(Date.now() / 1000),
285
+ model,
286
+ choices: [
287
+ {
288
+ index: 0,
289
+ message: {
290
+ role: 'assistant',
291
+ content,
292
+ },
293
+ finish_reason: finishReason,
294
+ },
295
+ ],
296
+ usage,
297
+ };
298
+ }
299
+ export function convertProviderResponse(plugin, response, model) {
300
+ if (plugin.id === 'anthropic') {
301
+ return convertAnthropicResponse(response, model);
302
+ }
303
+ if (plugin.id === 'gemini') {
304
+ return convertGeminiResponse(response, model);
305
+ }
306
+ return response;
307
+ }
308
+ //# sourceMappingURL=pluginChatAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginChatAdapter.js","sourceRoot":"","sources":["../../src/utils/pluginChatAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { type ChatContextMessage } from './chatContext.js';
2
+ import type { ChatMessage } from '../types/index.js';
3
+ export type PluginVariables = Record<string, string | number | boolean>;
4
+ export interface PluginChatContextOptions {
5
+ isPrivate: boolean;
6
+ persistedMessages: readonly ChatMessage[];
7
+ messageHistory?: readonly ChatContextMessage[];
8
+ regenerate?: boolean;
9
+ content: string;
10
+ images?: string[];
11
+ hasRelevantContext?: boolean;
12
+ enhancedContent?: string;
13
+ pluginVariables?: PluginVariables;
14
+ now?: () => number;
15
+ }
16
+ export interface PluginChatContextResult {
17
+ messages: ChatMessage[];
18
+ shouldStream: boolean;
19
+ }
20
+ export declare function resolvePluginStreamFlag(value: unknown): boolean;
21
+ export declare function buildPluginIdentityContent(pluginVariables?: PluginVariables): string;
22
+ export declare function preparePluginChatContext({ isPrivate, persistedMessages, messageHistory, regenerate, content, images, hasRelevantContext, enhancedContent, pluginVariables, now, }: PluginChatContextOptions): PluginChatContextResult;
23
+ //# sourceMappingURL=pluginChatContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginChatContext.d.ts","sourceRoot":"","sources":["../../src/utils/pluginChatContext.ts"],"names":[],"mappings":"AAiBA,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;AAExE,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,OAAO,CAAC;IACnB,iBAAiB,EAAE,SAAS,WAAW,EAAE,CAAC;IAC1C,cAAc,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAC/C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAU/D;AAED,wBAAgB,0BAA0B,CACxC,eAAe,GAAE,eAAoB,GACpC,MAAM,CAqBR;AAED,wBAAgB,wBAAwB,CAAC,EACvC,SAAS,EACT,iBAAiB,EACjB,cAAmB,EACnB,UAAkB,EAClB,OAAO,EACP,MAAM,EACN,kBAA0B,EAC1B,eAAe,EACf,eAAoB,EACpB,GAAc,GACf,EAAE,wBAAwB,GAAG,uBAAuB,CAsCpD"}
@@ -0,0 +1,77 @@
1
+ /*
2
+ * Libre WebUI
3
+ * Copyright (C) 2025 Kroonen AI, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at:
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ import { replaceLatestUserMessageContent, toChatMessages, } from './chatContext.js';
18
+ export function resolvePluginStreamFlag(value) {
19
+ if (typeof value === 'boolean') {
20
+ return value;
21
+ }
22
+ if (typeof value === 'string') {
23
+ return value.trim().toLowerCase() === 'true';
24
+ }
25
+ return false;
26
+ }
27
+ export function buildPluginIdentityContent(pluginVariables = {}) {
28
+ const systemPromptPrefix = typeof pluginVariables.system_prompt_prefix === 'string'
29
+ ? pluginVariables.system_prompt_prefix
30
+ : '';
31
+ const userName = typeof pluginVariables.user_name === 'string'
32
+ ? pluginVariables.user_name
33
+ : '';
34
+ if (!systemPromptPrefix && !userName) {
35
+ return '';
36
+ }
37
+ if (!userName) {
38
+ return systemPromptPrefix;
39
+ }
40
+ return systemPromptPrefix
41
+ ? `${systemPromptPrefix}\n\nThe user's name is: ${userName}`
42
+ : `The user's name is: ${userName}`;
43
+ }
44
+ export function preparePluginChatContext({ isPrivate, persistedMessages, messageHistory = [], regenerate = false, content, images, hasRelevantContext = false, enhancedContent, pluginVariables = {}, now = Date.now, }) {
45
+ let messages = isPrivate
46
+ ? toChatMessages(regenerate
47
+ ? messageHistory
48
+ : [
49
+ ...messageHistory,
50
+ {
51
+ role: 'user',
52
+ content,
53
+ images,
54
+ },
55
+ ], 'private-context')
56
+ : [...persistedMessages];
57
+ if (hasRelevantContext && enhancedContent) {
58
+ messages = replaceLatestUserMessageContent(messages, enhancedContent);
59
+ }
60
+ const identityContent = buildPluginIdentityContent(pluginVariables);
61
+ if (identityContent) {
62
+ messages = [
63
+ {
64
+ id: 'system-identity',
65
+ role: 'system',
66
+ content: identityContent,
67
+ timestamp: now(),
68
+ },
69
+ ...messages,
70
+ ];
71
+ }
72
+ return {
73
+ messages,
74
+ shouldStream: resolvePluginStreamFlag(pluginVariables.stream),
75
+ };
76
+ }
77
+ //# sourceMappingURL=pluginChatContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginChatContext.js","sourceRoot":"","sources":["../../src/utils/pluginChatContext.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EACL,+BAA+B,EAC/B,cAAc,GAEf,MAAM,kBAAkB,CAAC;AAuB1B,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;IAC/C,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,kBAAmC,EAAE;IAErC,MAAM,kBAAkB,GACtB,OAAO,eAAe,CAAC,oBAAoB,KAAK,QAAQ;QACtD,CAAC,CAAC,eAAe,CAAC,oBAAoB;QACtC,CAAC,CAAC,EAAE,CAAC;IACT,MAAM,QAAQ,GACZ,OAAO,eAAe,CAAC,SAAS,KAAK,QAAQ;QAC3C,CAAC,CAAC,eAAe,CAAC,SAAS;QAC3B,CAAC,CAAC,EAAE,CAAC;IAET,IAAI,CAAC,kBAAkB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACrC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAED,OAAO,kBAAkB;QACvB,CAAC,CAAC,GAAG,kBAAkB,2BAA2B,QAAQ,EAAE;QAC5D,CAAC,CAAC,uBAAuB,QAAQ,EAAE,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,EACvC,SAAS,EACT,iBAAiB,EACjB,cAAc,GAAG,EAAE,EACnB,UAAU,GAAG,KAAK,EAClB,OAAO,EACP,MAAM,EACN,kBAAkB,GAAG,KAAK,EAC1B,eAAe,EACf,eAAe,GAAG,EAAE,EACpB,GAAG,GAAG,IAAI,CAAC,GAAG,GACW;IACzB,IAAI,QAAQ,GAAG,SAAS;QACtB,CAAC,CAAC,cAAc,CACZ,UAAU;YACR,CAAC,CAAC,cAAc;YAChB,CAAC,CAAC;gBACE,GAAG,cAAc;gBACjB;oBACE,IAAI,EAAE,MAAe;oBACrB,OAAO;oBACP,MAAM;iBACP;aACF,EACL,iBAAiB,CAClB;QACH,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC;IAE3B,IAAI,kBAAkB,IAAI,eAAe,EAAE,CAAC;QAC1C,QAAQ,GAAG,+BAA+B,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,eAAe,GAAG,0BAA0B,CAAC,eAAe,CAAC,CAAC;IACpE,IAAI,eAAe,EAAE,CAAC;QACpB,QAAQ,GAAG;YACT;gBACE,EAAE,EAAE,iBAAiB;gBACrB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,eAAe;gBACxB,SAAS,EAAE,GAAG,EAAE;aACjB;YACD,GAAG,QAAQ;SACZ,CAAC;IACJ,CAAC;IAED,OAAO;QACL,QAAQ;QACR,YAAY,EAAE,uBAAuB,CAAC,eAAe,CAAC,MAAM,CAAC;KAC9D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { PluginResponse } from '../types/index.js';
2
+ export declare function formatPluginToolArguments(args: string): string;
3
+ export declare function formatPluginContent(content: unknown): string;
4
+ export declare function formatPluginToolCalls(toolCalls: unknown): string;
5
+ export declare function extractPluginAssistantContent(response: PluginResponse): string;
6
+ //# sourceMappingURL=pluginResponse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginResponse.d.ts","sourceRoot":"","sources":["../../src/utils/pluginResponse.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAqBxD,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM9D;AAUD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAmB5D;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,CAehE;AAED,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,cAAc,GACvB,MAAM,CAYR"}
@@ -0,0 +1,70 @@
1
+ /*
2
+ * Libre WebUI
3
+ * Copyright (C) 2025 Kroonen AI, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at:
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ export function formatPluginToolArguments(args) {
18
+ try {
19
+ return JSON.stringify(JSON.parse(args), null, 2);
20
+ }
21
+ catch {
22
+ return args;
23
+ }
24
+ }
25
+ function imageUrlFromBlock(block) {
26
+ if (typeof block.image_url === 'string') {
27
+ return block.image_url;
28
+ }
29
+ return block.image_url?.url;
30
+ }
31
+ export function formatPluginContent(content) {
32
+ if (Array.isArray(content)) {
33
+ return content
34
+ .flatMap(block => {
35
+ if (block.type === 'text' && block.text) {
36
+ return [block.text];
37
+ }
38
+ if (block.type === 'image_url') {
39
+ const imageUrl = imageUrlFromBlock(block);
40
+ return imageUrl ? [`![image](${imageUrl})`] : [];
41
+ }
42
+ return [];
43
+ })
44
+ .join('\n\n');
45
+ }
46
+ return typeof content === 'string' ? content : '';
47
+ }
48
+ export function formatPluginToolCalls(toolCalls) {
49
+ if (!Array.isArray(toolCalls) || toolCalls.length === 0) {
50
+ return '';
51
+ }
52
+ let toolContent = '\n\n---\n**🔧 Tool Calls:**\n';
53
+ for (const toolCall of toolCalls) {
54
+ const name = toolCall.function?.name || 'unknown';
55
+ const id = toolCall.id || '';
56
+ const args = formatPluginToolArguments(toolCall.function?.arguments || '');
57
+ toolContent += `\n**${name}** (\`${id}\`)\n\`\`\`json\n${args}\n\`\`\`\n`;
58
+ }
59
+ return toolContent;
60
+ }
61
+ export function extractPluginAssistantContent(response) {
62
+ if (!response?.choices?.length) {
63
+ throw new Error('Plugin returned empty or invalid response');
64
+ }
65
+ const choice = response.choices[0];
66
+ const message = choice?.message;
67
+ return (formatPluginContent(message?.content) +
68
+ formatPluginToolCalls(message?.tool_calls));
69
+ }
70
+ //# sourceMappingURL=pluginResponse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginResponse.js","sourceRoot":"","sources":["../../src/utils/pluginResponse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAuBH,MAAM,UAAU,yBAAyB,CAAC,IAAY;IACpD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAmB;IAC5C,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC,SAAS,CAAC;IACzB,CAAC;IAED,OAAO,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAQ,OAA0B;aAC/B,OAAO,CAAC,KAAK,CAAC,EAAE;YACf,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACxC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACtB,CAAC;YAED,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAC/B,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;gBAC1C,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,CAAC;YAED,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;aACD,IAAI,CAAC,MAAM,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,SAAkB;IACtD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,WAAW,GAAG,+BAA+B,CAAC;IAElD,KAAK,MAAM,QAAQ,IAAI,SAAuB,EAAE,CAAC;QAC/C,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,EAAE,IAAI,IAAI,SAAS,CAAC;QAClD,MAAM,EAAE,GAAG,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,yBAAyB,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC;QAC3E,WAAW,IAAI,OAAO,IAAI,SAAS,EAAE,oBAAoB,IAAI,YAAY,CAAC;IAC5E,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,QAAwB;IAExB,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,MAAM,EAAE,OAAkD,CAAC;IAE3E,OAAO,CACL,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC;QACrC,qBAAqB,CAAC,OAAO,EAAE,UAAU,CAAC,CAC3C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ export interface PluginToolCall {
2
+ id: string;
3
+ name: string;
4
+ arguments: string;
5
+ }
6
+ export type PluginStreamChunk = {
7
+ type: 'content';
8
+ content: string;
9
+ } | {
10
+ type: 'tool_call';
11
+ toolCall: PluginToolCall;
12
+ } | {
13
+ type: 'done';
14
+ };
15
+ export declare function streamOpenAICompatibleResponse(response: Awaited<ReturnType<typeof fetch>>): AsyncGenerator<PluginStreamChunk, void, unknown>;
16
+ //# sourceMappingURL=pluginStreamAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginStreamAdapter.d.ts","sourceRoot":"","sources":["../../src/utils/pluginStreamAdapter.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,iBAAiB,GACzB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,cAAc,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AA2FrB,wBAAuB,8BAA8B,CACnD,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC,GAC1C,cAAc,CAAC,iBAAiB,EAAE,IAAI,EAAE,OAAO,CAAC,CAoElD"}