modelfusion 0.103.0 → 0.105.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 +56 -0
- 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/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/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 -1
- package/model-function/generate-text/prompt-template/AlpacaPromptTemplate.d.ts +2 -2
- package/model-function/generate-text/prompt-template/AlpacaPromptTemplate.js +2 -1
- package/model-function/generate-text/prompt-template/ChatMLPromptTemplate.cjs +9 -5
- package/model-function/generate-text/prompt-template/ChatMLPromptTemplate.d.ts +4 -4
- package/model-function/generate-text/prompt-template/ChatMLPromptTemplate.js +9 -5
- package/model-function/generate-text/prompt-template/ChatPrompt.cjs +38 -20
- package/model-function/generate-text/prompt-template/ChatPrompt.d.ts +33 -34
- package/model-function/generate-text/prompt-template/ChatPrompt.js +37 -18
- package/model-function/generate-text/prompt-template/ContentPart.cjs +11 -0
- package/model-function/generate-text/prompt-template/ContentPart.d.ts +30 -0
- package/model-function/generate-text/prompt-template/ContentPart.js +7 -0
- package/model-function/generate-text/prompt-template/InstructionPrompt.d.ts +7 -22
- package/model-function/generate-text/prompt-template/Llama2PromptTemplate.cjs +40 -6
- package/model-function/generate-text/prompt-template/Llama2PromptTemplate.d.ts +16 -4
- package/model-function/generate-text/prompt-template/Llama2PromptTemplate.js +38 -5
- package/model-function/generate-text/prompt-template/NeuralChatPromptTemplate.cjs +10 -5
- package/model-function/generate-text/prompt-template/NeuralChatPromptTemplate.d.ts +4 -4
- package/model-function/generate-text/prompt-template/NeuralChatPromptTemplate.js +10 -5
- package/model-function/generate-text/prompt-template/TextPromptTemplate.cjs +8 -5
- package/model-function/generate-text/prompt-template/TextPromptTemplate.d.ts +4 -4
- package/model-function/generate-text/prompt-template/TextPromptTemplate.js +8 -5
- package/model-function/generate-text/prompt-template/VicunaPromptTemplate.cjs +8 -4
- package/model-function/generate-text/prompt-template/VicunaPromptTemplate.d.ts +2 -2
- package/model-function/generate-text/prompt-template/VicunaPromptTemplate.js +8 -4
- 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/prompt-template/trimChatPrompt.cjs +0 -2
- package/model-function/generate-text/prompt-template/trimChatPrompt.d.ts +4 -4
- package/model-function/generate-text/prompt-template/trimChatPrompt.js +0 -2
- 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-provider/anthropic/AnthropicPromptTemplate.cjs +9 -4
- package/model-provider/anthropic/AnthropicPromptTemplate.d.ts +4 -4
- package/model-provider/anthropic/AnthropicPromptTemplate.js +9 -4
- package/model-provider/anthropic/AnthropicTextGenerationModel.cjs +8 -14
- package/model-provider/anthropic/AnthropicTextGenerationModel.d.ts +13 -4
- 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/automatic1111/Automatic1111ImageGenerationModel.d.ts +1 -1
- package/model-provider/cohere/CohereTextGenerationModel.cjs +6 -44
- package/model-provider/cohere/CohereTextGenerationModel.d.ts +47 -13
- 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 +29 -17
- package/model-provider/llamacpp/LlamaCppBakLLaVA1PromptTemplate.d.ts +4 -4
- package/model-provider/llamacpp/LlamaCppBakLLaVA1PromptTemplate.js +29 -17
- package/model-provider/llamacpp/LlamaCppTextGenerationModel.cjs +7 -14
- package/model-provider/llamacpp/LlamaCppTextGenerationModel.d.ts +157 -6
- package/model-provider/llamacpp/LlamaCppTextGenerationModel.js +8 -15
- package/model-provider/llamacpp/LlamaCppTextGenerationModel.test.cjs +37 -0
- package/model-provider/llamacpp/LlamaCppTextGenerationModel.test.d.ts +1 -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 +49 -16
- package/model-provider/mistral/MistralChatModel.js +30 -104
- package/model-provider/mistral/MistralChatModel.test.cjs +51 -0
- package/model-provider/mistral/MistralChatModel.test.d.ts +1 -0
- package/model-provider/mistral/MistralChatModel.test.js +49 -0
- package/model-provider/mistral/MistralPromptTemplate.cjs +13 -5
- package/model-provider/mistral/MistralPromptTemplate.d.ts +4 -4
- package/model-provider/mistral/MistralPromptTemplate.js +13 -5
- package/model-provider/ollama/OllamaChatModel.cjs +7 -43
- package/model-provider/ollama/OllamaChatModel.d.ts +63 -11
- package/model-provider/ollama/OllamaChatModel.js +7 -43
- package/model-provider/ollama/OllamaChatModel.test.cjs +27 -0
- package/model-provider/ollama/OllamaChatModel.test.d.ts +1 -0
- package/model-provider/ollama/OllamaChatModel.test.js +25 -0
- package/model-provider/ollama/OllamaChatPromptTemplate.cjs +43 -17
- package/model-provider/ollama/OllamaChatPromptTemplate.d.ts +4 -4
- package/model-provider/ollama/OllamaChatPromptTemplate.js +43 -17
- package/model-provider/ollama/OllamaCompletionModel.cjs +22 -43
- package/model-provider/ollama/OllamaCompletionModel.d.ts +65 -9
- package/model-provider/ollama/OllamaCompletionModel.js +23 -44
- package/model-provider/ollama/OllamaCompletionModel.test.cjs +101 -13
- package/model-provider/ollama/OllamaCompletionModel.test.js +78 -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.d.ts +1 -0
- package/model-provider/openai/OpenAIChatModel.test.js +92 -0
- package/model-provider/openai/OpenAIChatPromptTemplate.cjs +114 -0
- package/model-provider/openai/OpenAIChatPromptTemplate.d.ts +20 -0
- package/model-provider/openai/OpenAIChatPromptTemplate.js +107 -0
- package/model-provider/openai/OpenAICompletionModel.cjs +32 -84
- package/model-provider/openai/OpenAICompletionModel.d.ts +29 -12
- package/model-provider/openai/OpenAICompletionModel.js +33 -85
- package/model-provider/openai/OpenAICompletionModel.test.cjs +53 -0
- package/model-provider/openai/OpenAICompletionModel.test.d.ts +1 -0
- package/model-provider/openai/OpenAICompletionModel.test.js +51 -0
- package/model-provider/openai/OpenAICostCalculator.cjs +1 -1
- package/model-provider/openai/OpenAICostCalculator.js +1 -1
- 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/OpenAITranscriptionModel.d.ts +6 -6
- 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 -6
- package/model-provider/openai/index.d.ts +5 -6
- package/model-provider/openai/index.js +5 -5
- 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 +1 -1
- package/package.json +5 -5
- 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/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/model-function/generate-text/prompt-template/Content.cjs +0 -2
- package/model-function/generate-text/prompt-template/Content.d.ts +0 -20
- 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 -72
- package/model-provider/openai/chat/OpenAIChatPromptTemplate.d.ts +0 -20
- package/model-provider/openai/chat/OpenAIChatPromptTemplate.js +0 -65
- 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/{model-function/generate-text/prompt-template/Content.js → model-provider/anthropic/AnthropicTextGenerationModel.test.d.ts} +0 -0
- /package/model-provider/{openai/chat/OpenAIChatModel.test.d.ts → cohere/CohereTextGenerationModel.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/model-provider/openai/{chat/countOpenAIChatMessageTokens.d.ts → countOpenAIChatMessageTokens.d.ts} +0 -0
@@ -1,4 +1,5 @@
|
|
1
|
-
import {
|
1
|
+
import { validateContentIsString } from "../../model-function/generate-text/prompt-template/ContentPart.js";
|
2
|
+
import { InvalidPromptError } from "../../model-function/generate-text/prompt-template/InvalidPromptError.js";
|
2
3
|
/**
|
3
4
|
* OllamaChatPrompt identity chat format.
|
4
5
|
*/
|
@@ -22,9 +23,15 @@ export function instruction() {
|
|
22
23
|
format(prompt) {
|
23
24
|
const messages = [];
|
24
25
|
if (prompt.system != null) {
|
25
|
-
messages.push({
|
26
|
+
messages.push({
|
27
|
+
role: "system",
|
28
|
+
content: prompt.system,
|
29
|
+
});
|
26
30
|
}
|
27
|
-
messages.push({
|
31
|
+
messages.push({
|
32
|
+
role: "user",
|
33
|
+
...extractUserContent(prompt.instruction),
|
34
|
+
});
|
28
35
|
return messages;
|
29
36
|
},
|
30
37
|
stopSequences: [],
|
@@ -36,34 +43,53 @@ export function instruction() {
|
|
36
43
|
export function chat() {
|
37
44
|
return {
|
38
45
|
format(prompt) {
|
39
|
-
validateChatPrompt(prompt);
|
40
46
|
const messages = [];
|
41
47
|
if (prompt.system != null) {
|
42
48
|
messages.push({ role: "system", content: prompt.system });
|
43
49
|
}
|
44
50
|
for (const { role, content } of prompt.messages) {
|
45
|
-
|
51
|
+
switch (role) {
|
52
|
+
case "user": {
|
53
|
+
messages.push({
|
54
|
+
role: "user",
|
55
|
+
...extractUserContent(content),
|
56
|
+
});
|
57
|
+
break;
|
58
|
+
}
|
59
|
+
case "assistant": {
|
60
|
+
messages.push({
|
61
|
+
role: "assistant",
|
62
|
+
content: validateContentIsString(content, prompt),
|
63
|
+
});
|
64
|
+
break;
|
65
|
+
}
|
66
|
+
case "tool": {
|
67
|
+
throw new InvalidPromptError("Tool messages are not supported.", prompt);
|
68
|
+
}
|
69
|
+
default: {
|
70
|
+
const _exhaustiveCheck = role;
|
71
|
+
throw new Error(`Unsupported role: ${_exhaustiveCheck}`);
|
72
|
+
}
|
73
|
+
}
|
46
74
|
}
|
47
75
|
return messages;
|
48
76
|
},
|
49
77
|
stopSequences: [],
|
50
78
|
};
|
51
79
|
}
|
52
|
-
function
|
80
|
+
function extractUserContent(input) {
|
53
81
|
if (typeof input === "string") {
|
54
82
|
return { content: input, images: undefined };
|
55
83
|
}
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
images.push(part.base64Image);
|
65
|
-
}
|
84
|
+
const images = [];
|
85
|
+
let content = "";
|
86
|
+
for (const part of input) {
|
87
|
+
if (part.type === "text") {
|
88
|
+
content += part.text;
|
89
|
+
}
|
90
|
+
else {
|
91
|
+
images.push(part.base64Image);
|
66
92
|
}
|
67
|
-
return { content, images };
|
68
93
|
}
|
94
|
+
return { content, images };
|
69
95
|
}
|
@@ -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,8 +2,8 @@ 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";
|
@@ -70,10 +70,33 @@ export declare class OllamaCompletionModel<CONTEXT_WINDOW_SIZE extends number |
|
|
70
70
|
finishReason: "unknown";
|
71
71
|
}[];
|
72
72
|
}>;
|
73
|
-
doStreamText(prompt: OllamaCompletionPrompt, options?: FunctionOptions): Promise<AsyncIterable<Delta<
|
73
|
+
doStreamText(prompt: OllamaCompletionPrompt, options?: FunctionOptions): Promise<AsyncIterable<import("../../index.js").Delta<{
|
74
|
+
response: string;
|
75
|
+
model: string;
|
76
|
+
done: false;
|
77
|
+
created_at: string;
|
78
|
+
} | {
|
79
|
+
model: string;
|
80
|
+
done: true;
|
81
|
+
created_at: string;
|
82
|
+
total_duration: number;
|
83
|
+
prompt_eval_count: number;
|
84
|
+
eval_count: number;
|
85
|
+
eval_duration: number;
|
86
|
+
load_duration?: number | undefined;
|
87
|
+
sample_count?: number | undefined;
|
88
|
+
sample_duration?: number | undefined;
|
89
|
+
prompt_eval_duration?: number | undefined;
|
90
|
+
context?: number[] | undefined;
|
91
|
+
}>>>;
|
92
|
+
extractTextDelta(delta: unknown): string | undefined;
|
74
93
|
asToolCallGenerationModel<INPUT_PROMPT>(promptTemplate: ToolCallPromptTemplate<INPUT_PROMPT, OllamaCompletionPrompt>): TextGenerationToolCallModel<INPUT_PROMPT, OllamaCompletionPrompt, this>;
|
75
94
|
asToolCallsOrTextGenerationModel<INPUT_PROMPT>(promptTemplate: ToolCallsOrGenerateTextPromptTemplate<INPUT_PROMPT, OllamaCompletionPrompt>): TextGenerationToolCallsOrGenerateTextModel<INPUT_PROMPT, OllamaCompletionPrompt, this>;
|
76
95
|
withTextPrompt(): PromptTemplateTextStreamingModel<string, OllamaCompletionPrompt, OllamaCompletionModelSettings<CONTEXT_WINDOW_SIZE>, this>;
|
96
|
+
/**
|
97
|
+
* Maps the prompt for a text version of the Ollama completion prompt template (without image support).
|
98
|
+
*/
|
99
|
+
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
100
|
withPromptTemplate<INPUT_PROMPT>(promptTemplate: TextGenerationPromptTemplate<INPUT_PROMPT, OllamaCompletionPrompt>): PromptTemplateTextStreamingModel<INPUT_PROMPT, OllamaCompletionPrompt, OllamaCompletionModelSettings<CONTEXT_WINDOW_SIZE>, this>;
|
78
101
|
withSettings(additionalSettings: Partial<OllamaCompletionModelSettings<CONTEXT_WINDOW_SIZE>>): this;
|
79
102
|
}
|
@@ -115,11 +138,26 @@ declare const ollamaCompletionResponseSchema: z.ZodObject<{
|
|
115
138
|
context?: number[] | undefined;
|
116
139
|
}>;
|
117
140
|
export type OllamaCompletionResponse = z.infer<typeof ollamaCompletionResponseSchema>;
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
141
|
+
declare const ollamaCompletionStreamChunkSchema: ZodSchema<{
|
142
|
+
response: string;
|
143
|
+
model: string;
|
144
|
+
done: false;
|
145
|
+
created_at: string;
|
146
|
+
} | {
|
147
|
+
model: string;
|
148
|
+
done: true;
|
149
|
+
created_at: string;
|
150
|
+
total_duration: number;
|
151
|
+
prompt_eval_count: number;
|
152
|
+
eval_count: number;
|
153
|
+
eval_duration: number;
|
154
|
+
load_duration?: number | undefined;
|
155
|
+
sample_count?: number | undefined;
|
156
|
+
sample_duration?: number | undefined;
|
157
|
+
prompt_eval_duration?: number | undefined;
|
158
|
+
context?: number[] | undefined;
|
159
|
+
}>;
|
160
|
+
export type OllamaCompletionStreamChunk = (typeof ollamaCompletionStreamChunkSchema)["_type"];
|
123
161
|
export type OllamaCompletionResponseFormatType<T> = {
|
124
162
|
stream: boolean;
|
125
163
|
handler: ResponseHandler<T>;
|
@@ -153,10 +191,28 @@ export declare const OllamaCompletionResponseFormat: {
|
|
153
191
|
* of the response stream.
|
154
192
|
*/
|
155
193
|
deltaIterable: {
|
156
|
-
stream:
|
194
|
+
stream: boolean;
|
157
195
|
handler: ({ response }: {
|
158
196
|
response: Response;
|
159
|
-
}) => Promise<AsyncIterable<Delta<
|
197
|
+
}) => Promise<AsyncIterable<import("../../index.js").Delta<{
|
198
|
+
response: string;
|
199
|
+
model: string;
|
200
|
+
done: false;
|
201
|
+
created_at: string;
|
202
|
+
} | {
|
203
|
+
model: string;
|
204
|
+
done: true;
|
205
|
+
created_at: string;
|
206
|
+
total_duration: number;
|
207
|
+
prompt_eval_count: number;
|
208
|
+
eval_count: number;
|
209
|
+
eval_duration: number;
|
210
|
+
load_duration?: number | undefined;
|
211
|
+
sample_count?: number | undefined;
|
212
|
+
sample_duration?: number | undefined;
|
213
|
+
prompt_eval_duration?: number | undefined;
|
214
|
+
context?: number[] | undefined;
|
215
|
+
}>>>;
|
160
216
|
};
|
161
217
|
};
|
162
218
|
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
11
|
import { TextGenerationToolCallsOrGenerateTextModel, } from "../../tool/generate-tool-calls-or-text/TextGenerationToolCallsOrGenerateTextModel.js";
|
12
|
-
import {
|
13
|
-
import { parseJsonStream } from "../../util/streaming/parseJsonStream.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,68 @@ 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((0, jsonStructurePrompt_js_1.jsonStructurePrompt)((instruction, schema) => ({
|
136
|
+
system: "JSON schema: \n" +
|
137
|
+
JSON.stringify(schema.getJsonSchema()) +
|
138
|
+
"\n\n" +
|
139
|
+
"Respond only using JSON that matches the above schema.",
|
140
|
+
instruction,
|
141
|
+
}))), (0, ZodSchema_js_1.zodSchema)(zod_1.z.object({ name: zod_1.z.string() })), "generate a name");
|
142
|
+
// note: space moved to last chunk bc of trimming
|
143
|
+
expect(await (0, arrayFromAsync_js_1.arrayFromAsync)(stream)).toStrictEqual([
|
144
|
+
{ isComplete: false, value: {} },
|
145
|
+
{ isComplete: false, value: { name: "" } },
|
146
|
+
{ isComplete: false, value: { name: "M" } },
|
147
|
+
{ isComplete: false, value: { name: "Mike" } },
|
148
|
+
{ isComplete: true, value: { name: "Mike" } },
|
149
|
+
]);
|
150
|
+
});
|
151
|
+
});
|