modelfusion 0.104.0 → 0.106.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 (292) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/README.md +8 -10
  3. package/core/DefaultRun.cjs +0 -4
  4. package/core/DefaultRun.d.ts +0 -2
  5. package/core/DefaultRun.js +0 -4
  6. package/core/ExtensionFunctionEvent.d.ts +11 -0
  7. package/core/FunctionEvent.d.ts +2 -2
  8. package/extension/index.cjs +22 -3
  9. package/extension/index.d.ts +5 -1
  10. package/extension/index.js +4 -1
  11. package/index.cjs +0 -3
  12. package/index.d.ts +0 -3
  13. package/index.js +0 -3
  14. package/model-function/Delta.d.ts +1 -2
  15. package/model-function/executeStreamCall.cjs +6 -4
  16. package/model-function/executeStreamCall.d.ts +2 -2
  17. package/model-function/executeStreamCall.js +6 -4
  18. package/model-function/generate-speech/streamSpeech.cjs +1 -2
  19. package/model-function/generate-speech/streamSpeech.js +1 -2
  20. package/model-function/generate-structure/StructureFromTextStreamingModel.cjs +25 -29
  21. package/model-function/generate-structure/StructureFromTextStreamingModel.d.ts +3 -1
  22. package/model-function/generate-structure/StructureFromTextStreamingModel.js +25 -29
  23. package/model-function/generate-structure/StructureGenerationModel.d.ts +2 -0
  24. package/model-function/generate-structure/jsonStructurePrompt.cjs +42 -6
  25. package/model-function/generate-structure/jsonStructurePrompt.d.ts +12 -1
  26. package/model-function/generate-structure/jsonStructurePrompt.js +42 -5
  27. package/model-function/generate-structure/streamStructure.cjs +7 -8
  28. package/model-function/generate-structure/streamStructure.d.ts +1 -1
  29. package/model-function/generate-structure/streamStructure.js +7 -8
  30. package/model-function/generate-text/PromptTemplateFullTextModel.cjs +35 -0
  31. package/model-function/generate-text/PromptTemplateFullTextModel.d.ts +41 -0
  32. package/model-function/generate-text/PromptTemplateFullTextModel.js +31 -0
  33. package/model-function/generate-text/PromptTemplateTextGenerationModel.d.ts +2 -1
  34. package/model-function/generate-text/PromptTemplateTextGenerationModel.js +1 -1
  35. package/model-function/generate-text/PromptTemplateTextStreamingModel.cjs +3 -0
  36. package/model-function/generate-text/PromptTemplateTextStreamingModel.d.ts +2 -1
  37. package/model-function/generate-text/PromptTemplateTextStreamingModel.js +3 -0
  38. package/model-function/generate-text/TextGenerationModel.d.ts +2 -1
  39. package/model-function/generate-text/index.cjs +1 -0
  40. package/model-function/generate-text/index.d.ts +1 -0
  41. package/model-function/generate-text/index.js +1 -0
  42. package/model-function/generate-text/prompt-template/AlpacaPromptTemplate.cjs +2 -2
  43. package/model-function/generate-text/prompt-template/AlpacaPromptTemplate.js +1 -1
  44. package/model-function/generate-text/prompt-template/ChatMLPromptTemplate.cjs +8 -5
  45. package/model-function/generate-text/prompt-template/ChatMLPromptTemplate.js +7 -4
  46. package/model-function/generate-text/prompt-template/ChatPrompt.cjs +42 -0
  47. package/model-function/generate-text/prompt-template/ChatPrompt.d.ts +27 -5
  48. package/model-function/generate-text/prompt-template/ChatPrompt.js +41 -1
  49. package/model-function/generate-text/prompt-template/{Content.cjs → ContentPart.cjs} +1 -1
  50. package/model-function/generate-text/prompt-template/ContentPart.d.ts +30 -0
  51. package/model-function/generate-text/prompt-template/{Content.js → ContentPart.js} +1 -1
  52. package/model-function/generate-text/prompt-template/InstructionPrompt.d.ts +3 -2
  53. package/model-function/generate-text/prompt-template/Llama2PromptTemplate.cjs +8 -5
  54. package/model-function/generate-text/prompt-template/Llama2PromptTemplate.d.ts +1 -1
  55. package/model-function/generate-text/prompt-template/Llama2PromptTemplate.js +6 -3
  56. package/model-function/generate-text/prompt-template/NeuralChatPromptTemplate.cjs +8 -4
  57. package/model-function/generate-text/prompt-template/NeuralChatPromptTemplate.js +6 -2
  58. package/model-function/generate-text/prompt-template/TextPromptTemplate.cjs +8 -4
  59. package/model-function/generate-text/prompt-template/TextPromptTemplate.js +6 -2
  60. package/model-function/generate-text/prompt-template/VicunaPromptTemplate.cjs +7 -3
  61. package/model-function/generate-text/prompt-template/VicunaPromptTemplate.js +6 -2
  62. package/model-function/generate-text/prompt-template/index.cjs +1 -1
  63. package/model-function/generate-text/prompt-template/index.d.ts +1 -1
  64. package/model-function/generate-text/prompt-template/index.js +1 -1
  65. package/model-function/generate-text/streamText.cjs +27 -28
  66. package/model-function/generate-text/streamText.d.ts +1 -0
  67. package/model-function/generate-text/streamText.js +27 -28
  68. package/model-function/index.cjs +0 -1
  69. package/model-function/index.d.ts +0 -1
  70. package/model-function/index.js +0 -1
  71. package/model-provider/anthropic/AnthropicPromptTemplate.cjs +7 -3
  72. package/model-provider/anthropic/AnthropicPromptTemplate.js +5 -1
  73. package/model-provider/anthropic/AnthropicTextGenerationModel.cjs +8 -14
  74. package/model-provider/anthropic/AnthropicTextGenerationModel.d.ts +11 -2
  75. package/model-provider/anthropic/AnthropicTextGenerationModel.js +8 -14
  76. package/model-provider/anthropic/AnthropicTextGenerationModel.test.cjs +44 -0
  77. package/model-provider/anthropic/AnthropicTextGenerationModel.test.js +42 -0
  78. package/model-provider/cohere/CohereTextEmbeddingModel.d.ts +3 -3
  79. package/model-provider/cohere/CohereTextGenerationModel.cjs +6 -44
  80. package/model-provider/cohere/CohereTextGenerationModel.d.ts +49 -15
  81. package/model-provider/cohere/CohereTextGenerationModel.js +7 -45
  82. package/model-provider/cohere/CohereTextGenerationModel.test.cjs +33 -0
  83. package/model-provider/cohere/CohereTextGenerationModel.test.js +31 -0
  84. package/model-provider/elevenlabs/ElevenLabsSpeechModel.cjs +1 -2
  85. package/model-provider/elevenlabs/ElevenLabsSpeechModel.js +1 -2
  86. package/model-provider/llamacpp/LlamaCppBakLLaVA1PromptTemplate.cjs +6 -1
  87. package/model-provider/llamacpp/LlamaCppBakLLaVA1PromptTemplate.js +6 -1
  88. package/model-provider/llamacpp/LlamaCppTextGenerationModel.cjs +7 -14
  89. package/model-provider/llamacpp/LlamaCppTextGenerationModel.d.ts +171 -20
  90. package/model-provider/llamacpp/LlamaCppTextGenerationModel.js +8 -15
  91. package/model-provider/llamacpp/LlamaCppTextGenerationModel.test.cjs +37 -0
  92. package/model-provider/llamacpp/LlamaCppTextGenerationModel.test.js +35 -0
  93. package/model-provider/mistral/MistralChatModel.cjs +30 -104
  94. package/model-provider/mistral/MistralChatModel.d.ts +47 -14
  95. package/model-provider/mistral/MistralChatModel.js +30 -104
  96. package/model-provider/mistral/MistralChatModel.test.cjs +51 -0
  97. package/model-provider/mistral/MistralChatModel.test.js +49 -0
  98. package/model-provider/mistral/MistralPromptTemplate.cjs +11 -4
  99. package/model-provider/mistral/MistralPromptTemplate.js +9 -2
  100. package/model-provider/mistral/MistralTextEmbeddingModel.d.ts +13 -13
  101. package/model-provider/ollama/OllamaChatModel.cjs +7 -43
  102. package/model-provider/ollama/OllamaChatModel.d.ts +67 -14
  103. package/model-provider/ollama/OllamaChatModel.js +8 -44
  104. package/model-provider/ollama/OllamaChatModel.test.cjs +27 -0
  105. package/model-provider/ollama/OllamaChatModel.test.js +25 -0
  106. package/model-provider/ollama/OllamaChatPromptTemplate.cjs +34 -4
  107. package/model-provider/ollama/OllamaChatPromptTemplate.js +34 -4
  108. package/model-provider/ollama/OllamaCompletionModel.cjs +22 -43
  109. package/model-provider/ollama/OllamaCompletionModel.d.ts +67 -10
  110. package/model-provider/ollama/OllamaCompletionModel.js +24 -45
  111. package/model-provider/ollama/OllamaCompletionModel.test.cjs +95 -13
  112. package/model-provider/ollama/OllamaCompletionModel.test.js +72 -13
  113. package/model-provider/openai/{chat/AbstractOpenAIChatModel.cjs → AbstractOpenAIChatModel.cjs} +71 -15
  114. package/model-provider/openai/{chat/AbstractOpenAIChatModel.d.ts → AbstractOpenAIChatModel.d.ts} +273 -19
  115. package/model-provider/openai/{chat/AbstractOpenAIChatModel.js → AbstractOpenAIChatModel.js} +71 -15
  116. package/model-provider/openai/{chat/OpenAIChatFunctionCallStructureGenerationModel.cjs → OpenAIChatFunctionCallStructureGenerationModel.cjs} +18 -2
  117. package/model-provider/openai/{chat/OpenAIChatFunctionCallStructureGenerationModel.d.ts → OpenAIChatFunctionCallStructureGenerationModel.d.ts} +41 -11
  118. package/model-provider/openai/{chat/OpenAIChatFunctionCallStructureGenerationModel.js → OpenAIChatFunctionCallStructureGenerationModel.js} +18 -2
  119. package/model-provider/openai/{chat/OpenAIChatMessage.d.ts → OpenAIChatMessage.d.ts} +3 -3
  120. package/model-provider/openai/{chat/OpenAIChatModel.cjs → OpenAIChatModel.cjs} +5 -5
  121. package/model-provider/openai/{chat/OpenAIChatModel.d.ts → OpenAIChatModel.d.ts} +12 -12
  122. package/model-provider/openai/{chat/OpenAIChatModel.js → OpenAIChatModel.js} +5 -5
  123. package/model-provider/openai/OpenAIChatModel.test.cjs +94 -0
  124. package/model-provider/openai/OpenAIChatModel.test.js +92 -0
  125. package/model-provider/openai/OpenAIChatPromptTemplate.cjs +114 -0
  126. package/model-provider/openai/{chat/OpenAIChatPromptTemplate.d.ts → OpenAIChatPromptTemplate.d.ts} +3 -3
  127. package/model-provider/openai/OpenAIChatPromptTemplate.js +107 -0
  128. package/model-provider/openai/OpenAICompletionModel.cjs +32 -84
  129. package/model-provider/openai/OpenAICompletionModel.d.ts +27 -10
  130. package/model-provider/openai/OpenAICompletionModel.js +33 -85
  131. package/model-provider/openai/OpenAICompletionModel.test.cjs +53 -0
  132. package/model-provider/openai/OpenAICompletionModel.test.js +51 -0
  133. package/model-provider/openai/OpenAIFacade.cjs +2 -2
  134. package/model-provider/openai/OpenAIFacade.d.ts +3 -3
  135. package/model-provider/openai/OpenAIFacade.js +2 -2
  136. package/model-provider/openai/OpenAITextEmbeddingModel.d.ts +12 -12
  137. package/model-provider/openai/OpenAITranscriptionModel.d.ts +17 -17
  138. package/model-provider/openai/TikTokenTokenizer.d.ts +1 -1
  139. package/model-provider/openai/{chat/countOpenAIChatMessageTokens.cjs → countOpenAIChatMessageTokens.cjs} +2 -2
  140. package/model-provider/openai/{chat/countOpenAIChatMessageTokens.js → countOpenAIChatMessageTokens.js} +2 -2
  141. package/model-provider/openai/index.cjs +6 -7
  142. package/model-provider/openai/index.d.ts +5 -7
  143. package/model-provider/openai/index.js +5 -6
  144. package/model-provider/openai-compatible/OpenAICompatibleChatModel.cjs +4 -4
  145. package/model-provider/openai-compatible/OpenAICompatibleChatModel.d.ts +6 -6
  146. package/model-provider/openai-compatible/OpenAICompatibleChatModel.js +4 -4
  147. package/model-provider/stability/StabilityImageGenerationModel.d.ts +5 -5
  148. package/package.json +13 -24
  149. package/test/JsonTestServer.cjs +33 -0
  150. package/test/JsonTestServer.d.ts +7 -0
  151. package/test/JsonTestServer.js +29 -0
  152. package/test/StreamingTestServer.cjs +55 -0
  153. package/test/StreamingTestServer.d.ts +7 -0
  154. package/test/StreamingTestServer.js +51 -0
  155. package/test/arrayFromAsync.cjs +13 -0
  156. package/test/arrayFromAsync.d.ts +1 -0
  157. package/test/arrayFromAsync.js +9 -0
  158. package/tool/generate-tool-call/TextGenerationToolCallModel.cjs +1 -1
  159. package/tool/generate-tool-call/TextGenerationToolCallModel.d.ts +1 -1
  160. package/tool/generate-tool-call/TextGenerationToolCallModel.js +1 -1
  161. package/tool/generate-tool-calls-or-text/TextGenerationToolCallsOrGenerateTextModel.d.ts +1 -11
  162. package/tool/generate-tool-calls-or-text/ToolCallsOrGenerateTextPromptTemplate.d.ts +12 -0
  163. package/tool/generate-tool-calls-or-text/ToolCallsOrGenerateTextPromptTemplate.js +1 -0
  164. package/tool/generate-tool-calls-or-text/index.cjs +1 -0
  165. package/tool/generate-tool-calls-or-text/index.d.ts +1 -0
  166. package/tool/generate-tool-calls-or-text/index.js +1 -0
  167. package/util/index.cjs +0 -1
  168. package/util/index.d.ts +0 -1
  169. package/util/index.js +0 -1
  170. package/util/streaming/createEventSourceResponseHandler.cjs +9 -0
  171. package/util/streaming/createEventSourceResponseHandler.d.ts +4 -0
  172. package/util/streaming/createEventSourceResponseHandler.js +5 -0
  173. package/util/streaming/createJsonStreamResponseHandler.cjs +9 -0
  174. package/util/streaming/createJsonStreamResponseHandler.d.ts +4 -0
  175. package/util/streaming/createJsonStreamResponseHandler.js +5 -0
  176. package/util/streaming/parseEventSourceStreamAsAsyncIterable.cjs +52 -0
  177. package/util/streaming/parseEventSourceStreamAsAsyncIterable.d.ts +6 -0
  178. package/util/streaming/parseEventSourceStreamAsAsyncIterable.js +48 -0
  179. package/util/streaming/parseJsonStreamAsAsyncIterable.cjs +21 -0
  180. package/util/streaming/parseJsonStreamAsAsyncIterable.d.ts +6 -0
  181. package/util/streaming/parseJsonStreamAsAsyncIterable.js +17 -0
  182. package/browser/MediaSourceAppender.cjs +0 -54
  183. package/browser/MediaSourceAppender.d.ts +0 -11
  184. package/browser/MediaSourceAppender.js +0 -50
  185. package/browser/convertAudioChunksToBase64.cjs +0 -8
  186. package/browser/convertAudioChunksToBase64.d.ts +0 -4
  187. package/browser/convertAudioChunksToBase64.js +0 -4
  188. package/browser/convertBlobToBase64.cjs +0 -23
  189. package/browser/convertBlobToBase64.d.ts +0 -1
  190. package/browser/convertBlobToBase64.js +0 -19
  191. package/browser/index.cjs +0 -22
  192. package/browser/index.d.ts +0 -6
  193. package/browser/index.js +0 -6
  194. package/browser/invokeFlow.cjs +0 -23
  195. package/browser/invokeFlow.d.ts +0 -8
  196. package/browser/invokeFlow.js +0 -19
  197. package/browser/readEventSource.cjs +0 -29
  198. package/browser/readEventSource.d.ts +0 -9
  199. package/browser/readEventSource.js +0 -25
  200. package/browser/readEventSourceStream.cjs +0 -35
  201. package/browser/readEventSourceStream.d.ts +0 -7
  202. package/browser/readEventSourceStream.js +0 -31
  203. package/composed-function/index.cjs +0 -19
  204. package/composed-function/index.d.ts +0 -3
  205. package/composed-function/index.js +0 -3
  206. package/composed-function/summarize/SummarizationFunction.d.ts +0 -4
  207. package/composed-function/summarize/summarizeRecursively.cjs +0 -19
  208. package/composed-function/summarize/summarizeRecursively.d.ts +0 -11
  209. package/composed-function/summarize/summarizeRecursively.js +0 -15
  210. package/composed-function/summarize/summarizeRecursivelyWithTextGenerationAndTokenSplitting.cjs +0 -25
  211. package/composed-function/summarize/summarizeRecursivelyWithTextGenerationAndTokenSplitting.d.ts +0 -24
  212. package/composed-function/summarize/summarizeRecursivelyWithTextGenerationAndTokenSplitting.js +0 -21
  213. package/cost/Cost.cjs +0 -38
  214. package/cost/Cost.d.ts +0 -16
  215. package/cost/Cost.js +0 -34
  216. package/cost/CostCalculator.d.ts +0 -8
  217. package/cost/calculateCost.cjs +0 -28
  218. package/cost/calculateCost.d.ts +0 -7
  219. package/cost/calculateCost.js +0 -24
  220. package/cost/index.cjs +0 -19
  221. package/cost/index.d.ts +0 -3
  222. package/cost/index.js +0 -3
  223. package/guard/GuardEvent.cjs +0 -2
  224. package/guard/GuardEvent.d.ts +0 -7
  225. package/guard/fixStructure.cjs +0 -75
  226. package/guard/fixStructure.d.ts +0 -64
  227. package/guard/fixStructure.js +0 -71
  228. package/guard/guard.cjs +0 -79
  229. package/guard/guard.d.ts +0 -29
  230. package/guard/guard.js +0 -75
  231. package/guard/index.cjs +0 -19
  232. package/guard/index.d.ts +0 -3
  233. package/guard/index.js +0 -3
  234. package/model-function/SuccessfulModelCall.cjs +0 -10
  235. package/model-function/SuccessfulModelCall.d.ts +0 -12
  236. package/model-function/SuccessfulModelCall.js +0 -6
  237. package/model-function/generate-text/prompt-template/Content.d.ts +0 -25
  238. package/model-provider/openai/OpenAICostCalculator.cjs +0 -89
  239. package/model-provider/openai/OpenAICostCalculator.d.ts +0 -6
  240. package/model-provider/openai/OpenAICostCalculator.js +0 -85
  241. package/model-provider/openai/chat/OpenAIChatModel.test.cjs +0 -61
  242. package/model-provider/openai/chat/OpenAIChatModel.test.js +0 -59
  243. package/model-provider/openai/chat/OpenAIChatPromptTemplate.cjs +0 -70
  244. package/model-provider/openai/chat/OpenAIChatPromptTemplate.js +0 -63
  245. package/model-provider/openai/chat/OpenAIChatStreamIterable.cjs +0 -156
  246. package/model-provider/openai/chat/OpenAIChatStreamIterable.d.ts +0 -19
  247. package/model-provider/openai/chat/OpenAIChatStreamIterable.js +0 -152
  248. package/server/fastify/AssetStorage.cjs +0 -2
  249. package/server/fastify/AssetStorage.d.ts +0 -17
  250. package/server/fastify/DefaultFlow.cjs +0 -22
  251. package/server/fastify/DefaultFlow.d.ts +0 -16
  252. package/server/fastify/DefaultFlow.js +0 -18
  253. package/server/fastify/FileSystemAssetStorage.cjs +0 -60
  254. package/server/fastify/FileSystemAssetStorage.d.ts +0 -19
  255. package/server/fastify/FileSystemAssetStorage.js +0 -56
  256. package/server/fastify/FileSystemLogger.cjs +0 -49
  257. package/server/fastify/FileSystemLogger.d.ts +0 -18
  258. package/server/fastify/FileSystemLogger.js +0 -45
  259. package/server/fastify/Flow.cjs +0 -2
  260. package/server/fastify/Flow.d.ts +0 -9
  261. package/server/fastify/FlowRun.cjs +0 -71
  262. package/server/fastify/FlowRun.d.ts +0 -28
  263. package/server/fastify/FlowRun.js +0 -67
  264. package/server/fastify/FlowSchema.cjs +0 -2
  265. package/server/fastify/FlowSchema.d.ts +0 -5
  266. package/server/fastify/Logger.cjs +0 -2
  267. package/server/fastify/Logger.d.ts +0 -13
  268. package/server/fastify/PathProvider.cjs +0 -34
  269. package/server/fastify/PathProvider.d.ts +0 -12
  270. package/server/fastify/PathProvider.js +0 -30
  271. package/server/fastify/index.cjs +0 -24
  272. package/server/fastify/index.d.ts +0 -8
  273. package/server/fastify/index.js +0 -8
  274. package/server/fastify/modelFusionFlowPlugin.cjs +0 -103
  275. package/server/fastify/modelFusionFlowPlugin.d.ts +0 -12
  276. package/server/fastify/modelFusionFlowPlugin.js +0 -99
  277. package/util/getAudioFileExtension.cjs +0 -29
  278. package/util/getAudioFileExtension.d.ts +0 -1
  279. package/util/getAudioFileExtension.js +0 -25
  280. /package/{composed-function/summarize/SummarizationFunction.cjs → core/ExtensionFunctionEvent.cjs} +0 -0
  281. /package/{composed-function/summarize/SummarizationFunction.js → core/ExtensionFunctionEvent.js} +0 -0
  282. /package/{cost/CostCalculator.js → model-provider/anthropic/AnthropicTextGenerationModel.test.d.ts} +0 -0
  283. /package/{guard/GuardEvent.js → model-provider/cohere/CohereTextGenerationModel.test.d.ts} +0 -0
  284. /package/model-provider/{openai/chat/OpenAIChatModel.test.d.ts → llamacpp/LlamaCppTextGenerationModel.test.d.ts} +0 -0
  285. /package/{server/fastify/AssetStorage.js → model-provider/mistral/MistralChatModel.test.d.ts} +0 -0
  286. /package/{server/fastify/Flow.js → model-provider/ollama/OllamaChatModel.test.d.ts} +0 -0
  287. /package/model-provider/openai/{chat/OpenAIChatMessage.cjs → OpenAIChatMessage.cjs} +0 -0
  288. /package/model-provider/openai/{chat/OpenAIChatMessage.js → OpenAIChatMessage.js} +0 -0
  289. /package/{server/fastify/FlowSchema.js → model-provider/openai/OpenAIChatModel.test.d.ts} +0 -0
  290. /package/{server/fastify/Logger.js → model-provider/openai/OpenAICompletionModel.test.d.ts} +0 -0
  291. /package/model-provider/openai/{chat/countOpenAIChatMessageTokens.d.ts → countOpenAIChatMessageTokens.d.ts} +0 -0
  292. /package/{cost/CostCalculator.cjs → tool/generate-tool-calls-or-text/ToolCallsOrGenerateTextPromptTemplate.cjs} +0 -0
@@ -12,8 +12,7 @@ const PromptTemplateTextStreamingModel_js_1 = require("../../model-function/gene
12
12
  const TextGenerationModel_js_1 = require("../../model-function/generate-text/TextGenerationModel.cjs");
13
13
  const TextGenerationToolCallModel_js_1 = require("../../tool/generate-tool-call/TextGenerationToolCallModel.cjs");
14
14
  const TextGenerationToolCallsOrGenerateTextModel_js_1 = require("../../tool/generate-tool-calls-or-text/TextGenerationToolCallsOrGenerateTextModel.cjs");
15
- const AsyncQueue_js_1 = require("../../util/AsyncQueue.cjs");
16
- const parseJsonStream_js_1 = require("../../util/streaming/parseJsonStream.cjs");
15
+ const createJsonStreamResponseHandler_js_1 = require("../../util/streaming/createJsonStreamResponseHandler.cjs");
17
16
  const OllamaApiConfiguration_js_1 = require("./OllamaApiConfiguration.cjs");
18
17
  const OllamaError_js_1 = require("./OllamaError.cjs");
19
18
  class OllamaCompletionModel extends AbstractModel_js_1.AbstractModel {
@@ -135,6 +134,10 @@ class OllamaCompletionModel extends AbstractModel_js_1.AbstractModel {
135
134
  responseFormat: exports.OllamaCompletionResponseFormat.deltaIterable,
136
135
  });
137
136
  }
137
+ extractTextDelta(delta) {
138
+ const chunk = delta;
139
+ return chunk.done === true ? undefined : chunk.response;
140
+ }
138
141
  asToolCallGenerationModel(promptTemplate) {
139
142
  return new TextGenerationToolCallModel_js_1.TextGenerationToolCallModel({
140
143
  model: this,
@@ -150,11 +153,25 @@ class OllamaCompletionModel extends AbstractModel_js_1.AbstractModel {
150
153
  withTextPrompt() {
151
154
  return this.withPromptTemplate({
152
155
  format(prompt) {
153
- return { prompt: prompt };
156
+ return { prompt };
154
157
  },
155
158
  stopSequences: [],
156
159
  });
157
160
  }
161
+ /**
162
+ * Maps the prompt for a text version of the Ollama completion prompt template (without image support).
163
+ */
164
+ withTextPromptTemplate(promptTemplate) {
165
+ return new PromptTemplateTextStreamingModel_js_1.PromptTemplateTextStreamingModel({
166
+ model: this.withTextPrompt().withSettings({
167
+ stopSequences: [
168
+ ...(this.settings.stopSequences ?? []),
169
+ ...promptTemplate.stopSequences,
170
+ ],
171
+ }),
172
+ promptTemplate,
173
+ });
174
+ }
158
175
  withPromptTemplate(promptTemplate) {
159
176
  return new PromptTemplateTextStreamingModel_js_1.PromptTemplateTextStreamingModel({
160
177
  model: this.withSettings({
@@ -184,7 +201,7 @@ const ollamaCompletionResponseSchema = zod_1.z.object({
184
201
  eval_duration: zod_1.z.number(),
185
202
  context: zod_1.z.array(zod_1.z.number()).optional(),
186
203
  });
187
- const ollamaCompletionStreamSchema = new ZodSchema_js_1.ZodSchema(zod_1.z.discriminatedUnion("done", [
204
+ const ollamaCompletionStreamChunkSchema = (0, ZodSchema_js_1.zodSchema)(zod_1.z.discriminatedUnion("done", [
188
205
  zod_1.z.object({
189
206
  done: zod_1.z.literal(false),
190
207
  model: zod_1.z.string(),
@@ -206,44 +223,6 @@ const ollamaCompletionStreamSchema = new ZodSchema_js_1.ZodSchema(zod_1.z.discri
206
223
  context: zod_1.z.array(zod_1.z.number()).optional(),
207
224
  }),
208
225
  ]));
209
- async function createOllamaFullDeltaIterableQueue(stream) {
210
- const queue = new AsyncQueue_js_1.AsyncQueue();
211
- let accumulatedText = "";
212
- // process the stream asynchonously (no 'await' on purpose):
213
- (0, parseJsonStream_js_1.parseJsonStream)({
214
- stream,
215
- schema: ollamaCompletionStreamSchema,
216
- process(event) {
217
- if (event.done === true) {
218
- queue.push({
219
- type: "delta",
220
- fullDelta: {
221
- content: accumulatedText,
222
- isComplete: true,
223
- delta: "",
224
- },
225
- valueDelta: "",
226
- });
227
- }
228
- else {
229
- accumulatedText += event.response;
230
- queue.push({
231
- type: "delta",
232
- fullDelta: {
233
- content: accumulatedText,
234
- isComplete: false,
235
- delta: event.response,
236
- },
237
- valueDelta: event.response,
238
- });
239
- }
240
- },
241
- onDone() {
242
- queue.close();
243
- },
244
- });
245
- return queue;
246
- }
247
226
  exports.OllamaCompletionResponseFormat = {
248
227
  /**
249
228
  * Returns the response as a JSON object.
@@ -293,6 +272,6 @@ exports.OllamaCompletionResponseFormat = {
293
272
  */
294
273
  deltaIterable: {
295
274
  stream: true,
296
- handler: async ({ response }) => createOllamaFullDeltaIterableQueue(response.body),
275
+ handler: (0, createJsonStreamResponseHandler_js_1.createJsonStreamResponseHandler)(ollamaCompletionStreamChunkSchema),
297
276
  },
298
277
  };
@@ -2,13 +2,14 @@ import { z } from "zod";
2
2
  import { FunctionOptions } from "../../core/FunctionOptions.js";
3
3
  import { ApiConfiguration } from "../../core/api/ApiConfiguration.js";
4
4
  import { ResponseHandler } from "../../core/api/postToApi.js";
5
+ import { ZodSchema } from "../../core/schema/ZodSchema.js";
5
6
  import { AbstractModel } from "../../model-function/AbstractModel.js";
6
- import { Delta } from "../../model-function/Delta.js";
7
7
  import { PromptTemplateTextStreamingModel } from "../../model-function/generate-text/PromptTemplateTextStreamingModel.js";
8
8
  import { TextStreamingModel } from "../../model-function/generate-text/TextGenerationModel.js";
9
9
  import { TextGenerationPromptTemplate } from "../../model-function/generate-text/TextGenerationPromptTemplate.js";
10
10
  import { TextGenerationToolCallModel, ToolCallPromptTemplate } from "../../tool/generate-tool-call/TextGenerationToolCallModel.js";
11
- import { TextGenerationToolCallsOrGenerateTextModel, ToolCallsOrGenerateTextPromptTemplate } from "../../tool/generate-tool-calls-or-text/TextGenerationToolCallsOrGenerateTextModel.js";
11
+ import { TextGenerationToolCallsOrGenerateTextModel } from "../../tool/generate-tool-calls-or-text/TextGenerationToolCallsOrGenerateTextModel.js";
12
+ import { ToolCallsOrGenerateTextPromptTemplate } from "../../tool/generate-tool-calls-or-text/ToolCallsOrGenerateTextPromptTemplate.js";
12
13
  import { OllamaTextGenerationSettings } from "./OllamaTextGenerationSettings.js";
13
14
  export interface OllamaCompletionPrompt {
14
15
  /**
@@ -70,10 +71,33 @@ export declare class OllamaCompletionModel<CONTEXT_WINDOW_SIZE extends number |
70
71
  finishReason: "unknown";
71
72
  }[];
72
73
  }>;
73
- doStreamText(prompt: OllamaCompletionPrompt, options?: FunctionOptions): Promise<AsyncIterable<Delta<string>>>;
74
+ doStreamText(prompt: OllamaCompletionPrompt, options?: FunctionOptions): Promise<AsyncIterable<import("../../index.js").Delta<{
75
+ response: string;
76
+ model: string;
77
+ done: false;
78
+ created_at: string;
79
+ } | {
80
+ model: string;
81
+ done: true;
82
+ created_at: string;
83
+ total_duration: number;
84
+ prompt_eval_count: number;
85
+ eval_count: number;
86
+ eval_duration: number;
87
+ load_duration?: number | undefined;
88
+ sample_count?: number | undefined;
89
+ sample_duration?: number | undefined;
90
+ prompt_eval_duration?: number | undefined;
91
+ context?: number[] | undefined;
92
+ }>>>;
93
+ extractTextDelta(delta: unknown): string | undefined;
74
94
  asToolCallGenerationModel<INPUT_PROMPT>(promptTemplate: ToolCallPromptTemplate<INPUT_PROMPT, OllamaCompletionPrompt>): TextGenerationToolCallModel<INPUT_PROMPT, OllamaCompletionPrompt, this>;
75
95
  asToolCallsOrTextGenerationModel<INPUT_PROMPT>(promptTemplate: ToolCallsOrGenerateTextPromptTemplate<INPUT_PROMPT, OllamaCompletionPrompt>): TextGenerationToolCallsOrGenerateTextModel<INPUT_PROMPT, OllamaCompletionPrompt, this>;
76
96
  withTextPrompt(): PromptTemplateTextStreamingModel<string, OllamaCompletionPrompt, OllamaCompletionModelSettings<CONTEXT_WINDOW_SIZE>, this>;
97
+ /**
98
+ * Maps the prompt for a text version of the Ollama completion prompt template (without image support).
99
+ */
100
+ withTextPromptTemplate<INPUT_PROMPT>(promptTemplate: TextGenerationPromptTemplate<INPUT_PROMPT, string>): PromptTemplateTextStreamingModel<INPUT_PROMPT, string, OllamaCompletionModelSettings<CONTEXT_WINDOW_SIZE>, PromptTemplateTextStreamingModel<string, OllamaCompletionPrompt, OllamaCompletionModelSettings<CONTEXT_WINDOW_SIZE>, this>>;
77
101
  withPromptTemplate<INPUT_PROMPT>(promptTemplate: TextGenerationPromptTemplate<INPUT_PROMPT, OllamaCompletionPrompt>): PromptTemplateTextStreamingModel<INPUT_PROMPT, OllamaCompletionPrompt, OllamaCompletionModelSettings<CONTEXT_WINDOW_SIZE>, this>;
78
102
  withSettings(additionalSettings: Partial<OllamaCompletionModelSettings<CONTEXT_WINDOW_SIZE>>): this;
79
103
  }
@@ -115,11 +139,26 @@ declare const ollamaCompletionResponseSchema: z.ZodObject<{
115
139
  context?: number[] | undefined;
116
140
  }>;
117
141
  export type OllamaCompletionResponse = z.infer<typeof ollamaCompletionResponseSchema>;
118
- export type OllamaCompletionDelta = {
119
- content: string;
120
- isComplete: boolean;
121
- delta: string;
122
- };
142
+ declare const ollamaCompletionStreamChunkSchema: ZodSchema<{
143
+ response: string;
144
+ model: string;
145
+ done: false;
146
+ created_at: string;
147
+ } | {
148
+ model: string;
149
+ done: true;
150
+ created_at: string;
151
+ total_duration: number;
152
+ prompt_eval_count: number;
153
+ eval_count: number;
154
+ eval_duration: number;
155
+ load_duration?: number | undefined;
156
+ sample_count?: number | undefined;
157
+ sample_duration?: number | undefined;
158
+ prompt_eval_duration?: number | undefined;
159
+ context?: number[] | undefined;
160
+ }>;
161
+ export type OllamaCompletionStreamChunk = (typeof ollamaCompletionStreamChunkSchema)["_type"];
123
162
  export type OllamaCompletionResponseFormatType<T> = {
124
163
  stream: boolean;
125
164
  handler: ResponseHandler<T>;
@@ -153,10 +192,28 @@ export declare const OllamaCompletionResponseFormat: {
153
192
  * of the response stream.
154
193
  */
155
194
  deltaIterable: {
156
- stream: true;
195
+ stream: boolean;
157
196
  handler: ({ response }: {
158
197
  response: Response;
159
- }) => Promise<AsyncIterable<Delta<string>>>;
198
+ }) => Promise<AsyncIterable<import("../../index.js").Delta<{
199
+ response: string;
200
+ model: string;
201
+ done: false;
202
+ created_at: string;
203
+ } | {
204
+ model: string;
205
+ done: true;
206
+ created_at: string;
207
+ total_duration: number;
208
+ prompt_eval_count: number;
209
+ eval_count: number;
210
+ eval_duration: number;
211
+ load_duration?: number | undefined;
212
+ sample_count?: number | undefined;
213
+ sample_duration?: number | undefined;
214
+ prompt_eval_duration?: number | undefined;
215
+ context?: number[] | undefined;
216
+ }>>>;
160
217
  };
161
218
  };
162
219
  export {};
@@ -2,15 +2,14 @@ import { z } from "zod";
2
2
  import { ApiCallError } from "../../core/api/ApiCallError.js";
3
3
  import { callWithRetryAndThrottle } from "../../core/api/callWithRetryAndThrottle.js";
4
4
  import { postJsonToApi } from "../../core/api/postToApi.js";
5
- import { ZodSchema } from "../../core/schema/ZodSchema.js";
5
+ import { ZodSchema, zodSchema } from "../../core/schema/ZodSchema.js";
6
6
  import { safeParseJSON } from "../../core/schema/parseJSON.js";
7
7
  import { AbstractModel } from "../../model-function/AbstractModel.js";
8
8
  import { PromptTemplateTextStreamingModel } from "../../model-function/generate-text/PromptTemplateTextStreamingModel.js";
9
9
  import { textGenerationModelProperties, } from "../../model-function/generate-text/TextGenerationModel.js";
10
10
  import { TextGenerationToolCallModel, } from "../../tool/generate-tool-call/TextGenerationToolCallModel.js";
11
- import { TextGenerationToolCallsOrGenerateTextModel, } from "../../tool/generate-tool-calls-or-text/TextGenerationToolCallsOrGenerateTextModel.js";
12
- import { AsyncQueue } from "../../util/AsyncQueue.js";
13
- import { parseJsonStream } from "../../util/streaming/parseJsonStream.js";
11
+ import { TextGenerationToolCallsOrGenerateTextModel } from "../../tool/generate-tool-calls-or-text/TextGenerationToolCallsOrGenerateTextModel.js";
12
+ import { createJsonStreamResponseHandler } from "../../util/streaming/createJsonStreamResponseHandler.js";
14
13
  import { OllamaApiConfiguration } from "./OllamaApiConfiguration.js";
15
14
  import { failedOllamaCallResponseHandler } from "./OllamaError.js";
16
15
  export class OllamaCompletionModel extends AbstractModel {
@@ -132,6 +131,10 @@ export class OllamaCompletionModel extends AbstractModel {
132
131
  responseFormat: OllamaCompletionResponseFormat.deltaIterable,
133
132
  });
134
133
  }
134
+ extractTextDelta(delta) {
135
+ const chunk = delta;
136
+ return chunk.done === true ? undefined : chunk.response;
137
+ }
135
138
  asToolCallGenerationModel(promptTemplate) {
136
139
  return new TextGenerationToolCallModel({
137
140
  model: this,
@@ -147,11 +150,25 @@ export class OllamaCompletionModel extends AbstractModel {
147
150
  withTextPrompt() {
148
151
  return this.withPromptTemplate({
149
152
  format(prompt) {
150
- return { prompt: prompt };
153
+ return { prompt };
151
154
  },
152
155
  stopSequences: [],
153
156
  });
154
157
  }
158
+ /**
159
+ * Maps the prompt for a text version of the Ollama completion prompt template (without image support).
160
+ */
161
+ withTextPromptTemplate(promptTemplate) {
162
+ return new PromptTemplateTextStreamingModel({
163
+ model: this.withTextPrompt().withSettings({
164
+ stopSequences: [
165
+ ...(this.settings.stopSequences ?? []),
166
+ ...promptTemplate.stopSequences,
167
+ ],
168
+ }),
169
+ promptTemplate,
170
+ });
171
+ }
155
172
  withPromptTemplate(promptTemplate) {
156
173
  return new PromptTemplateTextStreamingModel({
157
174
  model: this.withSettings({
@@ -180,7 +197,7 @@ const ollamaCompletionResponseSchema = z.object({
180
197
  eval_duration: z.number(),
181
198
  context: z.array(z.number()).optional(),
182
199
  });
183
- const ollamaCompletionStreamSchema = new ZodSchema(z.discriminatedUnion("done", [
200
+ const ollamaCompletionStreamChunkSchema = zodSchema(z.discriminatedUnion("done", [
184
201
  z.object({
185
202
  done: z.literal(false),
186
203
  model: z.string(),
@@ -202,44 +219,6 @@ const ollamaCompletionStreamSchema = new ZodSchema(z.discriminatedUnion("done",
202
219
  context: z.array(z.number()).optional(),
203
220
  }),
204
221
  ]));
205
- async function createOllamaFullDeltaIterableQueue(stream) {
206
- const queue = new AsyncQueue();
207
- let accumulatedText = "";
208
- // process the stream asynchonously (no 'await' on purpose):
209
- parseJsonStream({
210
- stream,
211
- schema: ollamaCompletionStreamSchema,
212
- process(event) {
213
- if (event.done === true) {
214
- queue.push({
215
- type: "delta",
216
- fullDelta: {
217
- content: accumulatedText,
218
- isComplete: true,
219
- delta: "",
220
- },
221
- valueDelta: "",
222
- });
223
- }
224
- else {
225
- accumulatedText += event.response;
226
- queue.push({
227
- type: "delta",
228
- fullDelta: {
229
- content: accumulatedText,
230
- isComplete: false,
231
- delta: event.response,
232
- },
233
- valueDelta: event.response,
234
- });
235
- }
236
- },
237
- onDone() {
238
- queue.close();
239
- },
240
- });
241
- return queue;
242
- }
243
222
  export const OllamaCompletionResponseFormat = {
244
223
  /**
245
224
  * Returns the response as a JSON object.
@@ -289,6 +268,6 @@ export const OllamaCompletionResponseFormat = {
289
268
  */
290
269
  deltaIterable: {
291
270
  stream: true,
292
- handler: async ({ response }) => createOllamaFullDeltaIterableQueue(response.body),
271
+ handler: createJsonStreamResponseHandler(ollamaCompletionStreamChunkSchema),
293
272
  },
294
273
  };
@@ -1,25 +1,48 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  Object.defineProperty(exports, "__esModule", { value: true });
3
26
  const assert_1 = require("assert");
4
- const msw_1 = require("msw");
5
- const node_1 = require("msw/node");
27
+ const zod_1 = require("zod");
6
28
  const ApiCallError_js_1 = require("../../core/api/ApiCallError.cjs");
7
29
  const retryNever_js_1 = require("../../core/api/retryNever.cjs");
30
+ const ZodSchema_js_1 = require("../../core/schema/ZodSchema.cjs");
31
+ const jsonStructurePrompt_js_1 = require("../../model-function/generate-structure/jsonStructurePrompt.cjs");
32
+ const streamStructure_js_1 = require("../../model-function/generate-structure/streamStructure.cjs");
8
33
  const generateText_js_1 = require("../../model-function/generate-text/generateText.cjs");
34
+ const TextPrompt = __importStar(require("../../model-function/generate-text/prompt-template/TextPromptTemplate.cjs"));
35
+ const streamText_js_1 = require("../../model-function/generate-text/streamText.cjs");
36
+ const JsonTestServer_js_1 = require("../../test/JsonTestServer.cjs");
37
+ const StreamingTestServer_js_1 = require("../../test/StreamingTestServer.cjs");
38
+ const arrayFromAsync_js_1 = require("../../test/arrayFromAsync.cjs");
9
39
  const OllamaApiConfiguration_js_1 = require("./OllamaApiConfiguration.cjs");
10
40
  const OllamaCompletionModel_js_1 = require("./OllamaCompletionModel.cjs");
11
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
- let responseBodyJson = {};
13
- const server = (0, node_1.setupServer)(msw_1.http.post("http://127.0.0.1:11434/api/generate", () => msw_1.HttpResponse.json(responseBodyJson)));
14
- beforeAll(() => server.listen());
15
- beforeEach(() => {
16
- responseBodyJson = {};
17
- });
18
- afterEach(() => server.resetHandlers());
19
- afterAll(() => server.close());
20
41
  describe("generateText", () => {
42
+ const server = new JsonTestServer_js_1.JsonTestServer("http://127.0.0.1:11434/api/generate");
43
+ server.setupTestEnvironment();
21
44
  it("should return the generated text", async () => {
22
- responseBodyJson = {
45
+ server.responseBodyJson = {
23
46
  model: "test-model",
24
47
  created_at: "2023-08-04T19:22:45.499127Z",
25
48
  response: "test response",
@@ -40,7 +63,7 @@ describe("generateText", () => {
40
63
  expect(result).toEqual("test response");
41
64
  });
42
65
  it("should throw retryable ApiCallError when Ollama is overloaded", async () => {
43
- responseBodyJson = {
66
+ server.responseBodyJson = {
44
67
  model: "",
45
68
  created_at: "0001-01-01T00:00:00Z",
46
69
  response: "",
@@ -61,3 +84,62 @@ describe("generateText", () => {
61
84
  }
62
85
  });
63
86
  });
87
+ describe("streamText", () => {
88
+ const server = new StreamingTestServer_js_1.StreamingTestServer("http://127.0.0.1:11434/api/generate");
89
+ server.setupTestEnvironment();
90
+ it("should return a text stream", async () => {
91
+ server.responseChunks = [
92
+ `{"model":"mistral:text","created_at":"2023-12-24T16:11:17.715003Z","response":"Hello","done":false}\n`,
93
+ `{"model":"mistral:text","created_at":"2023-12-24T16:11:17.715003Z","response":", ","done":false}\n`,
94
+ `{"model":"mistral:text","created_at":"2023-12-24T16:11:17.715003Z","response":"world!","done":false}\n`,
95
+ `{"model":"mistral:text","created_at":"2023-12-24T16:11:19.697067Z","response":"",` +
96
+ `"done":true,"context":[123,456,789],"total_duration":2165354041,"load_duration":1293958,` +
97
+ `"prompt_eval_count":5,"prompt_eval_duration":193273000,"eval_count":136,"eval_duration":1966852000}\n`,
98
+ ];
99
+ const stream = await (0, streamText_js_1.streamText)(new OllamaCompletionModel_js_1.OllamaCompletionModel({ model: "mistral:text" }).withTextPrompt(), "hello");
100
+ // note: space moved to last chunk bc of trimming
101
+ expect(await (0, arrayFromAsync_js_1.arrayFromAsync)(stream)).toStrictEqual([
102
+ "Hello",
103
+ ",",
104
+ " world!",
105
+ ]);
106
+ });
107
+ });
108
+ describe("streamStructure", () => {
109
+ const server = new StreamingTestServer_js_1.StreamingTestServer("http://127.0.0.1:11434/api/generate");
110
+ server.setupTestEnvironment();
111
+ it("should return a text stream", async () => {
112
+ server.responseChunks = [
113
+ `{"model":"mistral:text","created_at":"2023-12-25T11:48:02.253175Z","response":"{","done":false}\n`,
114
+ `{"model":"mistral:text","created_at":"2023-12-25T11:48:02.273505Z","response":"\\n","done":false}\n`,
115
+ `{"model":"mistral:text","created_at":"2023-12-25T11:48:02.293192Z","response":" ","done":false}\n`,
116
+ `{"model":"mistral:text","created_at":"2023-12-25T11:48:02.312446Z","response":" \\"","done":false}\n`,
117
+ `{"model":"mistral:text","created_at":"2023-12-25T11:48:02.332021Z","response":"name","done":false}\n`,
118
+ `{"model":"mistral:text","created_at":"2023-12-25T11:48:02.351128Z","response":"\\":","done":false}\n`,
119
+ `{"model":"mistral:text","created_at":"2023-12-25T11:48:02.372082Z","response":" \\"","done":false}\n`,
120
+ `{"model":"mistral:text","created_at":"2023-12-25T11:48:02.391903Z","response":"M","done":false}\n`,
121
+ `{"model":"mistral:text","created_at":"2023-12-25T11:48:02.411056Z","response":"ike","done":false}\n`,
122
+ `{"model":"mistral:text","created_at":"2023-12-25T11:48:02.430789Z","response":"\\"","done":false}\n`,
123
+ `{"model":"mistral:text","created_at":"2023-12-25T11:48:02.450216Z","response":"\\n","done":false}\n`,
124
+ `{"model":"mistral:text","created_at":"2023-12-25T11:48:02.47009Z","response":"}","done":false}\n`,
125
+ `{"model":"mistral:text","created_at":"2023-12-25T11:48:02.48885Z","response":"","done":true,` +
126
+ `"total_duration":521893000,"load_duration":957666,"prompt_eval_count":74,"prompt_eval_duration":302508000,` +
127
+ `"eval_count":12,"eval_duration":215282000}\n`,
128
+ ];
129
+ const stream = await (0, streamStructure_js_1.streamStructure)(new OllamaCompletionModel_js_1.OllamaCompletionModel({
130
+ model: "mistral:text",
131
+ format: "json",
132
+ raw: true,
133
+ })
134
+ .withTextPromptTemplate(TextPrompt.instruction())
135
+ .asStructureGenerationModel(jsonStructurePrompt_js_1.jsonStructurePrompt.text()), (0, ZodSchema_js_1.zodSchema)(zod_1.z.object({ name: zod_1.z.string() })), "generate a name");
136
+ // note: space moved to last chunk bc of trimming
137
+ expect(await (0, arrayFromAsync_js_1.arrayFromAsync)(stream)).toStrictEqual([
138
+ { isComplete: false, value: {} },
139
+ { isComplete: false, value: { name: "" } },
140
+ { isComplete: false, value: { name: "M" } },
141
+ { isComplete: false, value: { name: "Mike" } },
142
+ { isComplete: true, value: { name: "Mike" } },
143
+ ]);
144
+ });
145
+ });
@@ -1,23 +1,23 @@
1
1
  import { fail } from "assert";
2
- import { HttpResponse, http } from "msw";
3
- import { setupServer } from "msw/node";
2
+ import { z } from "zod";
4
3
  import { ApiCallError } from "../../core/api/ApiCallError.js";
5
4
  import { retryNever } from "../../core/api/retryNever.js";
5
+ import { zodSchema } from "../../core/schema/ZodSchema.js";
6
+ import { jsonStructurePrompt } from "../../model-function/generate-structure/jsonStructurePrompt.js";
7
+ import { streamStructure } from "../../model-function/generate-structure/streamStructure.js";
6
8
  import { generateText } from "../../model-function/generate-text/generateText.js";
9
+ import * as TextPrompt from "../../model-function/generate-text/prompt-template/TextPromptTemplate.js";
10
+ import { streamText } from "../../model-function/generate-text/streamText.js";
11
+ import { JsonTestServer } from "../../test/JsonTestServer.js";
12
+ import { StreamingTestServer } from "../../test/StreamingTestServer.js";
13
+ import { arrayFromAsync } from "../../test/arrayFromAsync.js";
7
14
  import { OllamaApiConfiguration } from "./OllamaApiConfiguration.js";
8
15
  import { OllamaCompletionModel } from "./OllamaCompletionModel.js";
9
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
10
- let responseBodyJson = {};
11
- const server = setupServer(http.post("http://127.0.0.1:11434/api/generate", () => HttpResponse.json(responseBodyJson)));
12
- beforeAll(() => server.listen());
13
- beforeEach(() => {
14
- responseBodyJson = {};
15
- });
16
- afterEach(() => server.resetHandlers());
17
- afterAll(() => server.close());
18
16
  describe("generateText", () => {
17
+ const server = new JsonTestServer("http://127.0.0.1:11434/api/generate");
18
+ server.setupTestEnvironment();
19
19
  it("should return the generated text", async () => {
20
- responseBodyJson = {
20
+ server.responseBodyJson = {
21
21
  model: "test-model",
22
22
  created_at: "2023-08-04T19:22:45.499127Z",
23
23
  response: "test response",
@@ -38,7 +38,7 @@ describe("generateText", () => {
38
38
  expect(result).toEqual("test response");
39
39
  });
40
40
  it("should throw retryable ApiCallError when Ollama is overloaded", async () => {
41
- responseBodyJson = {
41
+ server.responseBodyJson = {
42
42
  model: "",
43
43
  created_at: "0001-01-01T00:00:00Z",
44
44
  response: "",
@@ -59,3 +59,62 @@ describe("generateText", () => {
59
59
  }
60
60
  });
61
61
  });
62
+ describe("streamText", () => {
63
+ const server = new StreamingTestServer("http://127.0.0.1:11434/api/generate");
64
+ server.setupTestEnvironment();
65
+ it("should return a text stream", async () => {
66
+ server.responseChunks = [
67
+ `{"model":"mistral:text","created_at":"2023-12-24T16:11:17.715003Z","response":"Hello","done":false}\n`,
68
+ `{"model":"mistral:text","created_at":"2023-12-24T16:11:17.715003Z","response":", ","done":false}\n`,
69
+ `{"model":"mistral:text","created_at":"2023-12-24T16:11:17.715003Z","response":"world!","done":false}\n`,
70
+ `{"model":"mistral:text","created_at":"2023-12-24T16:11:19.697067Z","response":"",` +
71
+ `"done":true,"context":[123,456,789],"total_duration":2165354041,"load_duration":1293958,` +
72
+ `"prompt_eval_count":5,"prompt_eval_duration":193273000,"eval_count":136,"eval_duration":1966852000}\n`,
73
+ ];
74
+ const stream = await streamText(new OllamaCompletionModel({ model: "mistral:text" }).withTextPrompt(), "hello");
75
+ // note: space moved to last chunk bc of trimming
76
+ expect(await arrayFromAsync(stream)).toStrictEqual([
77
+ "Hello",
78
+ ",",
79
+ " world!",
80
+ ]);
81
+ });
82
+ });
83
+ describe("streamStructure", () => {
84
+ const server = new StreamingTestServer("http://127.0.0.1:11434/api/generate");
85
+ server.setupTestEnvironment();
86
+ it("should return a text stream", async () => {
87
+ server.responseChunks = [
88
+ `{"model":"mistral:text","created_at":"2023-12-25T11:48:02.253175Z","response":"{","done":false}\n`,
89
+ `{"model":"mistral:text","created_at":"2023-12-25T11:48:02.273505Z","response":"\\n","done":false}\n`,
90
+ `{"model":"mistral:text","created_at":"2023-12-25T11:48:02.293192Z","response":" ","done":false}\n`,
91
+ `{"model":"mistral:text","created_at":"2023-12-25T11:48:02.312446Z","response":" \\"","done":false}\n`,
92
+ `{"model":"mistral:text","created_at":"2023-12-25T11:48:02.332021Z","response":"name","done":false}\n`,
93
+ `{"model":"mistral:text","created_at":"2023-12-25T11:48:02.351128Z","response":"\\":","done":false}\n`,
94
+ `{"model":"mistral:text","created_at":"2023-12-25T11:48:02.372082Z","response":" \\"","done":false}\n`,
95
+ `{"model":"mistral:text","created_at":"2023-12-25T11:48:02.391903Z","response":"M","done":false}\n`,
96
+ `{"model":"mistral:text","created_at":"2023-12-25T11:48:02.411056Z","response":"ike","done":false}\n`,
97
+ `{"model":"mistral:text","created_at":"2023-12-25T11:48:02.430789Z","response":"\\"","done":false}\n`,
98
+ `{"model":"mistral:text","created_at":"2023-12-25T11:48:02.450216Z","response":"\\n","done":false}\n`,
99
+ `{"model":"mistral:text","created_at":"2023-12-25T11:48:02.47009Z","response":"}","done":false}\n`,
100
+ `{"model":"mistral:text","created_at":"2023-12-25T11:48:02.48885Z","response":"","done":true,` +
101
+ `"total_duration":521893000,"load_duration":957666,"prompt_eval_count":74,"prompt_eval_duration":302508000,` +
102
+ `"eval_count":12,"eval_duration":215282000}\n`,
103
+ ];
104
+ const stream = await streamStructure(new OllamaCompletionModel({
105
+ model: "mistral:text",
106
+ format: "json",
107
+ raw: true,
108
+ })
109
+ .withTextPromptTemplate(TextPrompt.instruction())
110
+ .asStructureGenerationModel(jsonStructurePrompt.text()), zodSchema(z.object({ name: z.string() })), "generate a name");
111
+ // note: space moved to last chunk bc of trimming
112
+ expect(await arrayFromAsync(stream)).toStrictEqual([
113
+ { isComplete: false, value: {} },
114
+ { isComplete: false, value: { name: "" } },
115
+ { isComplete: false, value: { name: "M" } },
116
+ { isComplete: false, value: { name: "Mike" } },
117
+ { isComplete: true, value: { name: "Mike" } },
118
+ ]);
119
+ });
120
+ });