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.
- package/CHANGELOG.md +60 -0
- package/README.md +8 -10
- package/core/DefaultRun.cjs +0 -4
- package/core/DefaultRun.d.ts +0 -2
- package/core/DefaultRun.js +0 -4
- package/core/ExtensionFunctionEvent.d.ts +11 -0
- package/core/FunctionEvent.d.ts +2 -2
- package/extension/index.cjs +22 -3
- package/extension/index.d.ts +5 -1
- package/extension/index.js +4 -1
- package/index.cjs +0 -3
- package/index.d.ts +0 -3
- package/index.js +0 -3
- package/model-function/Delta.d.ts +1 -2
- package/model-function/executeStreamCall.cjs +6 -4
- package/model-function/executeStreamCall.d.ts +2 -2
- package/model-function/executeStreamCall.js +6 -4
- package/model-function/generate-speech/streamSpeech.cjs +1 -2
- package/model-function/generate-speech/streamSpeech.js +1 -2
- package/model-function/generate-structure/StructureFromTextStreamingModel.cjs +25 -29
- package/model-function/generate-structure/StructureFromTextStreamingModel.d.ts +3 -1
- package/model-function/generate-structure/StructureFromTextStreamingModel.js +25 -29
- package/model-function/generate-structure/StructureGenerationModel.d.ts +2 -0
- package/model-function/generate-structure/jsonStructurePrompt.cjs +42 -6
- package/model-function/generate-structure/jsonStructurePrompt.d.ts +12 -1
- package/model-function/generate-structure/jsonStructurePrompt.js +42 -5
- package/model-function/generate-structure/streamStructure.cjs +7 -8
- package/model-function/generate-structure/streamStructure.d.ts +1 -1
- package/model-function/generate-structure/streamStructure.js +7 -8
- package/model-function/generate-text/PromptTemplateFullTextModel.cjs +35 -0
- package/model-function/generate-text/PromptTemplateFullTextModel.d.ts +41 -0
- package/model-function/generate-text/PromptTemplateFullTextModel.js +31 -0
- package/model-function/generate-text/PromptTemplateTextGenerationModel.d.ts +2 -1
- package/model-function/generate-text/PromptTemplateTextGenerationModel.js +1 -1
- package/model-function/generate-text/PromptTemplateTextStreamingModel.cjs +3 -0
- package/model-function/generate-text/PromptTemplateTextStreamingModel.d.ts +2 -1
- package/model-function/generate-text/PromptTemplateTextStreamingModel.js +3 -0
- package/model-function/generate-text/TextGenerationModel.d.ts +2 -1
- package/model-function/generate-text/index.cjs +1 -0
- package/model-function/generate-text/index.d.ts +1 -0
- package/model-function/generate-text/index.js +1 -0
- package/model-function/generate-text/prompt-template/AlpacaPromptTemplate.cjs +2 -2
- package/model-function/generate-text/prompt-template/AlpacaPromptTemplate.js +1 -1
- package/model-function/generate-text/prompt-template/ChatMLPromptTemplate.cjs +8 -5
- package/model-function/generate-text/prompt-template/ChatMLPromptTemplate.js +7 -4
- package/model-function/generate-text/prompt-template/ChatPrompt.cjs +42 -0
- package/model-function/generate-text/prompt-template/ChatPrompt.d.ts +27 -5
- package/model-function/generate-text/prompt-template/ChatPrompt.js +41 -1
- package/model-function/generate-text/prompt-template/{Content.cjs → ContentPart.cjs} +1 -1
- package/model-function/generate-text/prompt-template/ContentPart.d.ts +30 -0
- package/model-function/generate-text/prompt-template/{Content.js → ContentPart.js} +1 -1
- package/model-function/generate-text/prompt-template/InstructionPrompt.d.ts +3 -2
- package/model-function/generate-text/prompt-template/Llama2PromptTemplate.cjs +8 -5
- package/model-function/generate-text/prompt-template/Llama2PromptTemplate.d.ts +1 -1
- package/model-function/generate-text/prompt-template/Llama2PromptTemplate.js +6 -3
- package/model-function/generate-text/prompt-template/NeuralChatPromptTemplate.cjs +8 -4
- package/model-function/generate-text/prompt-template/NeuralChatPromptTemplate.js +6 -2
- package/model-function/generate-text/prompt-template/TextPromptTemplate.cjs +8 -4
- package/model-function/generate-text/prompt-template/TextPromptTemplate.js +6 -2
- package/model-function/generate-text/prompt-template/VicunaPromptTemplate.cjs +7 -3
- package/model-function/generate-text/prompt-template/VicunaPromptTemplate.js +6 -2
- package/model-function/generate-text/prompt-template/index.cjs +1 -1
- package/model-function/generate-text/prompt-template/index.d.ts +1 -1
- package/model-function/generate-text/prompt-template/index.js +1 -1
- package/model-function/generate-text/streamText.cjs +27 -28
- package/model-function/generate-text/streamText.d.ts +1 -0
- package/model-function/generate-text/streamText.js +27 -28
- package/model-function/index.cjs +0 -1
- package/model-function/index.d.ts +0 -1
- package/model-function/index.js +0 -1
- package/model-provider/anthropic/AnthropicPromptTemplate.cjs +7 -3
- package/model-provider/anthropic/AnthropicPromptTemplate.js +5 -1
- package/model-provider/anthropic/AnthropicTextGenerationModel.cjs +8 -14
- package/model-provider/anthropic/AnthropicTextGenerationModel.d.ts +11 -2
- package/model-provider/anthropic/AnthropicTextGenerationModel.js +8 -14
- package/model-provider/anthropic/AnthropicTextGenerationModel.test.cjs +44 -0
- package/model-provider/anthropic/AnthropicTextGenerationModel.test.js +42 -0
- package/model-provider/cohere/CohereTextEmbeddingModel.d.ts +3 -3
- package/model-provider/cohere/CohereTextGenerationModel.cjs +6 -44
- package/model-provider/cohere/CohereTextGenerationModel.d.ts +49 -15
- package/model-provider/cohere/CohereTextGenerationModel.js +7 -45
- package/model-provider/cohere/CohereTextGenerationModel.test.cjs +33 -0
- package/model-provider/cohere/CohereTextGenerationModel.test.js +31 -0
- package/model-provider/elevenlabs/ElevenLabsSpeechModel.cjs +1 -2
- package/model-provider/elevenlabs/ElevenLabsSpeechModel.js +1 -2
- package/model-provider/llamacpp/LlamaCppBakLLaVA1PromptTemplate.cjs +6 -1
- package/model-provider/llamacpp/LlamaCppBakLLaVA1PromptTemplate.js +6 -1
- package/model-provider/llamacpp/LlamaCppTextGenerationModel.cjs +7 -14
- package/model-provider/llamacpp/LlamaCppTextGenerationModel.d.ts +171 -20
- package/model-provider/llamacpp/LlamaCppTextGenerationModel.js +8 -15
- package/model-provider/llamacpp/LlamaCppTextGenerationModel.test.cjs +37 -0
- package/model-provider/llamacpp/LlamaCppTextGenerationModel.test.js +35 -0
- package/model-provider/mistral/MistralChatModel.cjs +30 -104
- package/model-provider/mistral/MistralChatModel.d.ts +47 -14
- package/model-provider/mistral/MistralChatModel.js +30 -104
- package/model-provider/mistral/MistralChatModel.test.cjs +51 -0
- package/model-provider/mistral/MistralChatModel.test.js +49 -0
- package/model-provider/mistral/MistralPromptTemplate.cjs +11 -4
- package/model-provider/mistral/MistralPromptTemplate.js +9 -2
- package/model-provider/mistral/MistralTextEmbeddingModel.d.ts +13 -13
- package/model-provider/ollama/OllamaChatModel.cjs +7 -43
- package/model-provider/ollama/OllamaChatModel.d.ts +67 -14
- package/model-provider/ollama/OllamaChatModel.js +8 -44
- package/model-provider/ollama/OllamaChatModel.test.cjs +27 -0
- package/model-provider/ollama/OllamaChatModel.test.js +25 -0
- package/model-provider/ollama/OllamaChatPromptTemplate.cjs +34 -4
- package/model-provider/ollama/OllamaChatPromptTemplate.js +34 -4
- package/model-provider/ollama/OllamaCompletionModel.cjs +22 -43
- package/model-provider/ollama/OllamaCompletionModel.d.ts +67 -10
- package/model-provider/ollama/OllamaCompletionModel.js +24 -45
- package/model-provider/ollama/OllamaCompletionModel.test.cjs +95 -13
- package/model-provider/ollama/OllamaCompletionModel.test.js +72 -13
- package/model-provider/openai/{chat/AbstractOpenAIChatModel.cjs → AbstractOpenAIChatModel.cjs} +71 -15
- package/model-provider/openai/{chat/AbstractOpenAIChatModel.d.ts → AbstractOpenAIChatModel.d.ts} +273 -19
- package/model-provider/openai/{chat/AbstractOpenAIChatModel.js → AbstractOpenAIChatModel.js} +71 -15
- package/model-provider/openai/{chat/OpenAIChatFunctionCallStructureGenerationModel.cjs → OpenAIChatFunctionCallStructureGenerationModel.cjs} +18 -2
- package/model-provider/openai/{chat/OpenAIChatFunctionCallStructureGenerationModel.d.ts → OpenAIChatFunctionCallStructureGenerationModel.d.ts} +41 -11
- package/model-provider/openai/{chat/OpenAIChatFunctionCallStructureGenerationModel.js → OpenAIChatFunctionCallStructureGenerationModel.js} +18 -2
- package/model-provider/openai/{chat/OpenAIChatMessage.d.ts → OpenAIChatMessage.d.ts} +3 -3
- package/model-provider/openai/{chat/OpenAIChatModel.cjs → OpenAIChatModel.cjs} +5 -5
- package/model-provider/openai/{chat/OpenAIChatModel.d.ts → OpenAIChatModel.d.ts} +12 -12
- package/model-provider/openai/{chat/OpenAIChatModel.js → OpenAIChatModel.js} +5 -5
- package/model-provider/openai/OpenAIChatModel.test.cjs +94 -0
- package/model-provider/openai/OpenAIChatModel.test.js +92 -0
- package/model-provider/openai/OpenAIChatPromptTemplate.cjs +114 -0
- package/model-provider/openai/{chat/OpenAIChatPromptTemplate.d.ts → OpenAIChatPromptTemplate.d.ts} +3 -3
- package/model-provider/openai/OpenAIChatPromptTemplate.js +107 -0
- package/model-provider/openai/OpenAICompletionModel.cjs +32 -84
- package/model-provider/openai/OpenAICompletionModel.d.ts +27 -10
- package/model-provider/openai/OpenAICompletionModel.js +33 -85
- package/model-provider/openai/OpenAICompletionModel.test.cjs +53 -0
- package/model-provider/openai/OpenAICompletionModel.test.js +51 -0
- package/model-provider/openai/OpenAIFacade.cjs +2 -2
- package/model-provider/openai/OpenAIFacade.d.ts +3 -3
- package/model-provider/openai/OpenAIFacade.js +2 -2
- package/model-provider/openai/OpenAITextEmbeddingModel.d.ts +12 -12
- package/model-provider/openai/OpenAITranscriptionModel.d.ts +17 -17
- package/model-provider/openai/TikTokenTokenizer.d.ts +1 -1
- package/model-provider/openai/{chat/countOpenAIChatMessageTokens.cjs → countOpenAIChatMessageTokens.cjs} +2 -2
- package/model-provider/openai/{chat/countOpenAIChatMessageTokens.js → countOpenAIChatMessageTokens.js} +2 -2
- package/model-provider/openai/index.cjs +6 -7
- package/model-provider/openai/index.d.ts +5 -7
- package/model-provider/openai/index.js +5 -6
- package/model-provider/openai-compatible/OpenAICompatibleChatModel.cjs +4 -4
- package/model-provider/openai-compatible/OpenAICompatibleChatModel.d.ts +6 -6
- package/model-provider/openai-compatible/OpenAICompatibleChatModel.js +4 -4
- package/model-provider/stability/StabilityImageGenerationModel.d.ts +5 -5
- package/package.json +13 -24
- package/test/JsonTestServer.cjs +33 -0
- package/test/JsonTestServer.d.ts +7 -0
- package/test/JsonTestServer.js +29 -0
- package/test/StreamingTestServer.cjs +55 -0
- package/test/StreamingTestServer.d.ts +7 -0
- package/test/StreamingTestServer.js +51 -0
- package/test/arrayFromAsync.cjs +13 -0
- package/test/arrayFromAsync.d.ts +1 -0
- package/test/arrayFromAsync.js +9 -0
- package/tool/generate-tool-call/TextGenerationToolCallModel.cjs +1 -1
- package/tool/generate-tool-call/TextGenerationToolCallModel.d.ts +1 -1
- package/tool/generate-tool-call/TextGenerationToolCallModel.js +1 -1
- package/tool/generate-tool-calls-or-text/TextGenerationToolCallsOrGenerateTextModel.d.ts +1 -11
- package/tool/generate-tool-calls-or-text/ToolCallsOrGenerateTextPromptTemplate.d.ts +12 -0
- package/tool/generate-tool-calls-or-text/ToolCallsOrGenerateTextPromptTemplate.js +1 -0
- package/tool/generate-tool-calls-or-text/index.cjs +1 -0
- package/tool/generate-tool-calls-or-text/index.d.ts +1 -0
- package/tool/generate-tool-calls-or-text/index.js +1 -0
- package/util/index.cjs +0 -1
- package/util/index.d.ts +0 -1
- package/util/index.js +0 -1
- package/util/streaming/createEventSourceResponseHandler.cjs +9 -0
- package/util/streaming/createEventSourceResponseHandler.d.ts +4 -0
- package/util/streaming/createEventSourceResponseHandler.js +5 -0
- package/util/streaming/createJsonStreamResponseHandler.cjs +9 -0
- package/util/streaming/createJsonStreamResponseHandler.d.ts +4 -0
- package/util/streaming/createJsonStreamResponseHandler.js +5 -0
- package/util/streaming/parseEventSourceStreamAsAsyncIterable.cjs +52 -0
- package/util/streaming/parseEventSourceStreamAsAsyncIterable.d.ts +6 -0
- package/util/streaming/parseEventSourceStreamAsAsyncIterable.js +48 -0
- package/util/streaming/parseJsonStreamAsAsyncIterable.cjs +21 -0
- package/util/streaming/parseJsonStreamAsAsyncIterable.d.ts +6 -0
- package/util/streaming/parseJsonStreamAsAsyncIterable.js +17 -0
- package/browser/MediaSourceAppender.cjs +0 -54
- package/browser/MediaSourceAppender.d.ts +0 -11
- package/browser/MediaSourceAppender.js +0 -50
- package/browser/convertAudioChunksToBase64.cjs +0 -8
- package/browser/convertAudioChunksToBase64.d.ts +0 -4
- package/browser/convertAudioChunksToBase64.js +0 -4
- package/browser/convertBlobToBase64.cjs +0 -23
- package/browser/convertBlobToBase64.d.ts +0 -1
- package/browser/convertBlobToBase64.js +0 -19
- package/browser/index.cjs +0 -22
- package/browser/index.d.ts +0 -6
- package/browser/index.js +0 -6
- package/browser/invokeFlow.cjs +0 -23
- package/browser/invokeFlow.d.ts +0 -8
- package/browser/invokeFlow.js +0 -19
- package/browser/readEventSource.cjs +0 -29
- package/browser/readEventSource.d.ts +0 -9
- package/browser/readEventSource.js +0 -25
- package/browser/readEventSourceStream.cjs +0 -35
- package/browser/readEventSourceStream.d.ts +0 -7
- package/browser/readEventSourceStream.js +0 -31
- package/composed-function/index.cjs +0 -19
- package/composed-function/index.d.ts +0 -3
- package/composed-function/index.js +0 -3
- package/composed-function/summarize/SummarizationFunction.d.ts +0 -4
- package/composed-function/summarize/summarizeRecursively.cjs +0 -19
- package/composed-function/summarize/summarizeRecursively.d.ts +0 -11
- package/composed-function/summarize/summarizeRecursively.js +0 -15
- package/composed-function/summarize/summarizeRecursivelyWithTextGenerationAndTokenSplitting.cjs +0 -25
- package/composed-function/summarize/summarizeRecursivelyWithTextGenerationAndTokenSplitting.d.ts +0 -24
- package/composed-function/summarize/summarizeRecursivelyWithTextGenerationAndTokenSplitting.js +0 -21
- package/cost/Cost.cjs +0 -38
- package/cost/Cost.d.ts +0 -16
- package/cost/Cost.js +0 -34
- package/cost/CostCalculator.d.ts +0 -8
- package/cost/calculateCost.cjs +0 -28
- package/cost/calculateCost.d.ts +0 -7
- package/cost/calculateCost.js +0 -24
- package/cost/index.cjs +0 -19
- package/cost/index.d.ts +0 -3
- package/cost/index.js +0 -3
- package/guard/GuardEvent.cjs +0 -2
- package/guard/GuardEvent.d.ts +0 -7
- package/guard/fixStructure.cjs +0 -75
- package/guard/fixStructure.d.ts +0 -64
- package/guard/fixStructure.js +0 -71
- package/guard/guard.cjs +0 -79
- package/guard/guard.d.ts +0 -29
- package/guard/guard.js +0 -75
- package/guard/index.cjs +0 -19
- package/guard/index.d.ts +0 -3
- package/guard/index.js +0 -3
- package/model-function/SuccessfulModelCall.cjs +0 -10
- package/model-function/SuccessfulModelCall.d.ts +0 -12
- package/model-function/SuccessfulModelCall.js +0 -6
- package/model-function/generate-text/prompt-template/Content.d.ts +0 -25
- package/model-provider/openai/OpenAICostCalculator.cjs +0 -89
- package/model-provider/openai/OpenAICostCalculator.d.ts +0 -6
- package/model-provider/openai/OpenAICostCalculator.js +0 -85
- package/model-provider/openai/chat/OpenAIChatModel.test.cjs +0 -61
- package/model-provider/openai/chat/OpenAIChatModel.test.js +0 -59
- package/model-provider/openai/chat/OpenAIChatPromptTemplate.cjs +0 -70
- package/model-provider/openai/chat/OpenAIChatPromptTemplate.js +0 -63
- package/model-provider/openai/chat/OpenAIChatStreamIterable.cjs +0 -156
- package/model-provider/openai/chat/OpenAIChatStreamIterable.d.ts +0 -19
- package/model-provider/openai/chat/OpenAIChatStreamIterable.js +0 -152
- package/server/fastify/AssetStorage.cjs +0 -2
- package/server/fastify/AssetStorage.d.ts +0 -17
- package/server/fastify/DefaultFlow.cjs +0 -22
- package/server/fastify/DefaultFlow.d.ts +0 -16
- package/server/fastify/DefaultFlow.js +0 -18
- package/server/fastify/FileSystemAssetStorage.cjs +0 -60
- package/server/fastify/FileSystemAssetStorage.d.ts +0 -19
- package/server/fastify/FileSystemAssetStorage.js +0 -56
- package/server/fastify/FileSystemLogger.cjs +0 -49
- package/server/fastify/FileSystemLogger.d.ts +0 -18
- package/server/fastify/FileSystemLogger.js +0 -45
- package/server/fastify/Flow.cjs +0 -2
- package/server/fastify/Flow.d.ts +0 -9
- package/server/fastify/FlowRun.cjs +0 -71
- package/server/fastify/FlowRun.d.ts +0 -28
- package/server/fastify/FlowRun.js +0 -67
- package/server/fastify/FlowSchema.cjs +0 -2
- package/server/fastify/FlowSchema.d.ts +0 -5
- package/server/fastify/Logger.cjs +0 -2
- package/server/fastify/Logger.d.ts +0 -13
- package/server/fastify/PathProvider.cjs +0 -34
- package/server/fastify/PathProvider.d.ts +0 -12
- package/server/fastify/PathProvider.js +0 -30
- package/server/fastify/index.cjs +0 -24
- package/server/fastify/index.d.ts +0 -8
- package/server/fastify/index.js +0 -8
- package/server/fastify/modelFusionFlowPlugin.cjs +0 -103
- package/server/fastify/modelFusionFlowPlugin.d.ts +0 -12
- package/server/fastify/modelFusionFlowPlugin.js +0 -99
- package/util/getAudioFileExtension.cjs +0 -29
- package/util/getAudioFileExtension.d.ts +0 -1
- package/util/getAudioFileExtension.js +0 -25
- /package/{composed-function/summarize/SummarizationFunction.cjs → core/ExtensionFunctionEvent.cjs} +0 -0
- /package/{composed-function/summarize/SummarizationFunction.js → core/ExtensionFunctionEvent.js} +0 -0
- /package/{cost/CostCalculator.js → model-provider/anthropic/AnthropicTextGenerationModel.test.d.ts} +0 -0
- /package/{guard/GuardEvent.js → model-provider/cohere/CohereTextGenerationModel.test.d.ts} +0 -0
- /package/model-provider/{openai/chat/OpenAIChatModel.test.d.ts → llamacpp/LlamaCppTextGenerationModel.test.d.ts} +0 -0
- /package/{server/fastify/AssetStorage.js → model-provider/mistral/MistralChatModel.test.d.ts} +0 -0
- /package/{server/fastify/Flow.js → model-provider/ollama/OllamaChatModel.test.d.ts} +0 -0
- /package/model-provider/openai/{chat/OpenAIChatMessage.cjs → OpenAIChatMessage.cjs} +0 -0
- /package/model-provider/openai/{chat/OpenAIChatMessage.js → OpenAIChatMessage.js} +0 -0
- /package/{server/fastify/FlowSchema.js → model-provider/openai/OpenAIChatModel.test.d.ts} +0 -0
- /package/{server/fastify/Logger.js → model-provider/openai/OpenAICompletionModel.test.d.ts} +0 -0
- /package/model-provider/openai/{chat/countOpenAIChatMessageTokens.d.ts → countOpenAIChatMessageTokens.d.ts} +0 -0
- /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
|
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
|
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
|
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:
|
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
|
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<
|
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
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
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:
|
195
|
+
stream: boolean;
|
157
196
|
handler: ({ response }: {
|
158
197
|
response: Response;
|
159
|
-
}) => Promise<AsyncIterable<Delta<
|
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
|
12
|
-
import {
|
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
|
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
|
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:
|
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
|
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 {
|
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
|
+
});
|