modelfusion 0.104.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.
Files changed (164) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/model-function/Delta.d.ts +1 -2
  3. package/model-function/executeStreamCall.cjs +6 -4
  4. package/model-function/executeStreamCall.d.ts +2 -2
  5. package/model-function/executeStreamCall.js +6 -4
  6. package/model-function/generate-speech/streamSpeech.cjs +1 -2
  7. package/model-function/generate-speech/streamSpeech.js +1 -2
  8. package/model-function/generate-structure/StructureFromTextStreamingModel.cjs +25 -29
  9. package/model-function/generate-structure/StructureFromTextStreamingModel.d.ts +3 -1
  10. package/model-function/generate-structure/StructureFromTextStreamingModel.js +25 -29
  11. package/model-function/generate-structure/StructureGenerationModel.d.ts +2 -0
  12. package/model-function/generate-structure/streamStructure.cjs +7 -8
  13. package/model-function/generate-structure/streamStructure.d.ts +1 -1
  14. package/model-function/generate-structure/streamStructure.js +7 -8
  15. package/model-function/generate-text/PromptTemplateFullTextModel.cjs +35 -0
  16. package/model-function/generate-text/PromptTemplateFullTextModel.d.ts +41 -0
  17. package/model-function/generate-text/PromptTemplateFullTextModel.js +31 -0
  18. package/model-function/generate-text/PromptTemplateTextStreamingModel.cjs +3 -0
  19. package/model-function/generate-text/PromptTemplateTextStreamingModel.d.ts +2 -1
  20. package/model-function/generate-text/PromptTemplateTextStreamingModel.js +3 -0
  21. package/model-function/generate-text/TextGenerationModel.d.ts +2 -1
  22. package/model-function/generate-text/index.cjs +1 -0
  23. package/model-function/generate-text/index.d.ts +1 -0
  24. package/model-function/generate-text/index.js +1 -0
  25. package/model-function/generate-text/prompt-template/AlpacaPromptTemplate.cjs +2 -2
  26. package/model-function/generate-text/prompt-template/AlpacaPromptTemplate.js +1 -1
  27. package/model-function/generate-text/prompt-template/ChatMLPromptTemplate.cjs +8 -5
  28. package/model-function/generate-text/prompt-template/ChatMLPromptTemplate.js +7 -4
  29. package/model-function/generate-text/prompt-template/ChatPrompt.cjs +42 -0
  30. package/model-function/generate-text/prompt-template/ChatPrompt.d.ts +27 -5
  31. package/model-function/generate-text/prompt-template/ChatPrompt.js +41 -1
  32. package/model-function/generate-text/prompt-template/{Content.cjs → ContentPart.cjs} +1 -1
  33. package/model-function/generate-text/prompt-template/ContentPart.d.ts +30 -0
  34. package/model-function/generate-text/prompt-template/{Content.js → ContentPart.js} +1 -1
  35. package/model-function/generate-text/prompt-template/InstructionPrompt.d.ts +3 -2
  36. package/model-function/generate-text/prompt-template/Llama2PromptTemplate.cjs +7 -4
  37. package/model-function/generate-text/prompt-template/Llama2PromptTemplate.js +5 -2
  38. package/model-function/generate-text/prompt-template/NeuralChatPromptTemplate.cjs +8 -4
  39. package/model-function/generate-text/prompt-template/NeuralChatPromptTemplate.js +6 -2
  40. package/model-function/generate-text/prompt-template/TextPromptTemplate.cjs +8 -4
  41. package/model-function/generate-text/prompt-template/TextPromptTemplate.js +6 -2
  42. package/model-function/generate-text/prompt-template/VicunaPromptTemplate.cjs +7 -3
  43. package/model-function/generate-text/prompt-template/VicunaPromptTemplate.js +6 -2
  44. package/model-function/generate-text/prompt-template/index.cjs +1 -1
  45. package/model-function/generate-text/prompt-template/index.d.ts +1 -1
  46. package/model-function/generate-text/prompt-template/index.js +1 -1
  47. package/model-function/generate-text/streamText.cjs +27 -28
  48. package/model-function/generate-text/streamText.d.ts +1 -0
  49. package/model-function/generate-text/streamText.js +27 -28
  50. package/model-provider/anthropic/AnthropicPromptTemplate.cjs +7 -3
  51. package/model-provider/anthropic/AnthropicPromptTemplate.js +5 -1
  52. package/model-provider/anthropic/AnthropicTextGenerationModel.cjs +8 -14
  53. package/model-provider/anthropic/AnthropicTextGenerationModel.d.ts +11 -2
  54. package/model-provider/anthropic/AnthropicTextGenerationModel.js +8 -14
  55. package/model-provider/anthropic/AnthropicTextGenerationModel.test.cjs +44 -0
  56. package/model-provider/anthropic/AnthropicTextGenerationModel.test.js +42 -0
  57. package/model-provider/cohere/CohereTextGenerationModel.cjs +6 -44
  58. package/model-provider/cohere/CohereTextGenerationModel.d.ts +45 -11
  59. package/model-provider/cohere/CohereTextGenerationModel.js +7 -45
  60. package/model-provider/cohere/CohereTextGenerationModel.test.cjs +33 -0
  61. package/model-provider/cohere/CohereTextGenerationModel.test.d.ts +1 -0
  62. package/model-provider/cohere/CohereTextGenerationModel.test.js +31 -0
  63. package/model-provider/elevenlabs/ElevenLabsSpeechModel.cjs +1 -2
  64. package/model-provider/elevenlabs/ElevenLabsSpeechModel.js +1 -2
  65. package/model-provider/llamacpp/LlamaCppBakLLaVA1PromptTemplate.cjs +6 -1
  66. package/model-provider/llamacpp/LlamaCppBakLLaVA1PromptTemplate.js +6 -1
  67. package/model-provider/llamacpp/LlamaCppTextGenerationModel.cjs +7 -14
  68. package/model-provider/llamacpp/LlamaCppTextGenerationModel.d.ts +157 -6
  69. package/model-provider/llamacpp/LlamaCppTextGenerationModel.js +8 -15
  70. package/model-provider/llamacpp/LlamaCppTextGenerationModel.test.cjs +37 -0
  71. package/model-provider/llamacpp/LlamaCppTextGenerationModel.test.d.ts +1 -0
  72. package/model-provider/llamacpp/LlamaCppTextGenerationModel.test.js +35 -0
  73. package/model-provider/mistral/MistralChatModel.cjs +30 -104
  74. package/model-provider/mistral/MistralChatModel.d.ts +47 -14
  75. package/model-provider/mistral/MistralChatModel.js +30 -104
  76. package/model-provider/mistral/MistralChatModel.test.cjs +51 -0
  77. package/model-provider/mistral/MistralChatModel.test.d.ts +1 -0
  78. package/model-provider/mistral/MistralChatModel.test.js +49 -0
  79. package/model-provider/mistral/MistralPromptTemplate.cjs +11 -4
  80. package/model-provider/mistral/MistralPromptTemplate.js +9 -2
  81. package/model-provider/ollama/OllamaChatModel.cjs +7 -43
  82. package/model-provider/ollama/OllamaChatModel.d.ts +61 -9
  83. package/model-provider/ollama/OllamaChatModel.js +7 -43
  84. package/model-provider/ollama/OllamaChatModel.test.cjs +27 -0
  85. package/model-provider/ollama/OllamaChatModel.test.d.ts +1 -0
  86. package/model-provider/ollama/OllamaChatModel.test.js +25 -0
  87. package/model-provider/ollama/OllamaChatPromptTemplate.cjs +34 -4
  88. package/model-provider/ollama/OllamaChatPromptTemplate.js +34 -4
  89. package/model-provider/ollama/OllamaCompletionModel.cjs +22 -43
  90. package/model-provider/ollama/OllamaCompletionModel.d.ts +65 -9
  91. package/model-provider/ollama/OllamaCompletionModel.js +23 -44
  92. package/model-provider/ollama/OllamaCompletionModel.test.cjs +101 -13
  93. package/model-provider/ollama/OllamaCompletionModel.test.js +78 -13
  94. package/model-provider/openai/{chat/AbstractOpenAIChatModel.cjs → AbstractOpenAIChatModel.cjs} +71 -15
  95. package/model-provider/openai/{chat/AbstractOpenAIChatModel.d.ts → AbstractOpenAIChatModel.d.ts} +273 -19
  96. package/model-provider/openai/{chat/AbstractOpenAIChatModel.js → AbstractOpenAIChatModel.js} +71 -15
  97. package/model-provider/openai/{chat/OpenAIChatFunctionCallStructureGenerationModel.cjs → OpenAIChatFunctionCallStructureGenerationModel.cjs} +18 -2
  98. package/model-provider/openai/{chat/OpenAIChatFunctionCallStructureGenerationModel.d.ts → OpenAIChatFunctionCallStructureGenerationModel.d.ts} +41 -11
  99. package/model-provider/openai/{chat/OpenAIChatFunctionCallStructureGenerationModel.js → OpenAIChatFunctionCallStructureGenerationModel.js} +18 -2
  100. package/model-provider/openai/{chat/OpenAIChatMessage.d.ts → OpenAIChatMessage.d.ts} +3 -3
  101. package/model-provider/openai/{chat/OpenAIChatModel.cjs → OpenAIChatModel.cjs} +5 -5
  102. package/model-provider/openai/{chat/OpenAIChatModel.d.ts → OpenAIChatModel.d.ts} +12 -12
  103. package/model-provider/openai/{chat/OpenAIChatModel.js → OpenAIChatModel.js} +5 -5
  104. package/model-provider/openai/OpenAIChatModel.test.cjs +94 -0
  105. package/model-provider/openai/OpenAIChatModel.test.d.ts +1 -0
  106. package/model-provider/openai/OpenAIChatModel.test.js +92 -0
  107. package/model-provider/openai/OpenAIChatPromptTemplate.cjs +114 -0
  108. package/model-provider/openai/{chat/OpenAIChatPromptTemplate.d.ts → OpenAIChatPromptTemplate.d.ts} +3 -3
  109. package/model-provider/openai/OpenAIChatPromptTemplate.js +107 -0
  110. package/model-provider/openai/OpenAICompletionModel.cjs +32 -84
  111. package/model-provider/openai/OpenAICompletionModel.d.ts +27 -10
  112. package/model-provider/openai/OpenAICompletionModel.js +33 -85
  113. package/model-provider/openai/OpenAICompletionModel.test.cjs +53 -0
  114. package/model-provider/openai/OpenAICompletionModel.test.d.ts +1 -0
  115. package/model-provider/openai/OpenAICompletionModel.test.js +51 -0
  116. package/model-provider/openai/OpenAICostCalculator.cjs +1 -1
  117. package/model-provider/openai/OpenAICostCalculator.js +1 -1
  118. package/model-provider/openai/OpenAIFacade.cjs +2 -2
  119. package/model-provider/openai/OpenAIFacade.d.ts +3 -3
  120. package/model-provider/openai/OpenAIFacade.js +2 -2
  121. package/model-provider/openai/OpenAITranscriptionModel.d.ts +6 -6
  122. package/model-provider/openai/TikTokenTokenizer.d.ts +1 -1
  123. package/model-provider/openai/{chat/countOpenAIChatMessageTokens.cjs → countOpenAIChatMessageTokens.cjs} +2 -2
  124. package/model-provider/openai/{chat/countOpenAIChatMessageTokens.js → countOpenAIChatMessageTokens.js} +2 -2
  125. package/model-provider/openai/index.cjs +6 -6
  126. package/model-provider/openai/index.d.ts +5 -6
  127. package/model-provider/openai/index.js +5 -5
  128. package/model-provider/openai-compatible/OpenAICompatibleChatModel.cjs +4 -4
  129. package/model-provider/openai-compatible/OpenAICompatibleChatModel.d.ts +6 -6
  130. package/model-provider/openai-compatible/OpenAICompatibleChatModel.js +4 -4
  131. package/package.json +5 -5
  132. package/test/JsonTestServer.cjs +33 -0
  133. package/test/JsonTestServer.d.ts +7 -0
  134. package/test/JsonTestServer.js +29 -0
  135. package/test/StreamingTestServer.cjs +55 -0
  136. package/test/StreamingTestServer.d.ts +7 -0
  137. package/test/StreamingTestServer.js +51 -0
  138. package/test/arrayFromAsync.cjs +13 -0
  139. package/test/arrayFromAsync.d.ts +1 -0
  140. package/test/arrayFromAsync.js +9 -0
  141. package/util/streaming/createEventSourceResponseHandler.cjs +9 -0
  142. package/util/streaming/createEventSourceResponseHandler.d.ts +4 -0
  143. package/util/streaming/createEventSourceResponseHandler.js +5 -0
  144. package/util/streaming/createJsonStreamResponseHandler.cjs +9 -0
  145. package/util/streaming/createJsonStreamResponseHandler.d.ts +4 -0
  146. package/util/streaming/createJsonStreamResponseHandler.js +5 -0
  147. package/util/streaming/parseEventSourceStreamAsAsyncIterable.cjs +52 -0
  148. package/util/streaming/parseEventSourceStreamAsAsyncIterable.d.ts +6 -0
  149. package/util/streaming/parseEventSourceStreamAsAsyncIterable.js +48 -0
  150. package/util/streaming/parseJsonStreamAsAsyncIterable.cjs +21 -0
  151. package/util/streaming/parseJsonStreamAsAsyncIterable.d.ts +6 -0
  152. package/util/streaming/parseJsonStreamAsAsyncIterable.js +17 -0
  153. package/model-function/generate-text/prompt-template/Content.d.ts +0 -25
  154. package/model-provider/openai/chat/OpenAIChatModel.test.cjs +0 -61
  155. package/model-provider/openai/chat/OpenAIChatModel.test.js +0 -59
  156. package/model-provider/openai/chat/OpenAIChatPromptTemplate.cjs +0 -70
  157. package/model-provider/openai/chat/OpenAIChatPromptTemplate.js +0 -63
  158. package/model-provider/openai/chat/OpenAIChatStreamIterable.cjs +0 -156
  159. package/model-provider/openai/chat/OpenAIChatStreamIterable.d.ts +0 -19
  160. package/model-provider/openai/chat/OpenAIChatStreamIterable.js +0 -152
  161. /package/model-provider/{openai/chat/OpenAIChatModel.test.d.ts → anthropic/AnthropicTextGenerationModel.test.d.ts} +0 -0
  162. /package/model-provider/openai/{chat/OpenAIChatMessage.cjs → OpenAIChatMessage.cjs} +0 -0
  163. /package/model-provider/openai/{chat/OpenAIChatMessage.js → OpenAIChatMessage.js} +0 -0
  164. /package/model-provider/openai/{chat/countOpenAIChatMessageTokens.d.ts → countOpenAIChatMessageTokens.d.ts} +0 -0
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.chat = exports.instruction = exports.text = void 0;
4
- const Content_js_1 = require("./Content.cjs");
4
+ const ContentPart_js_1 = require("./ContentPart.cjs");
5
+ const InvalidPromptError_js_1 = require("./InvalidPromptError.cjs");
5
6
  const START_SEGMENT = "<|im_start|>";
6
7
  const END_SEGMENT = "<|im_end|>";
7
8
  function segmentStart(role) {
@@ -40,7 +41,7 @@ function instruction() {
40
41
  return {
41
42
  stopSequences: [END_SEGMENT],
42
43
  format(prompt) {
43
- const instruction = (0, Content_js_1.validateContentIsString)(prompt.instruction, prompt);
44
+ const instruction = (0, ContentPart_js_1.validateContentIsString)(prompt.instruction, prompt);
44
45
  return (segment("system", prompt.system) +
45
46
  segment("user", instruction) +
46
47
  segmentStart("assistant") +
@@ -69,14 +70,16 @@ function chat() {
69
70
  for (const { role, content } of prompt.messages) {
70
71
  switch (role) {
71
72
  case "user": {
72
- const textContent = (0, Content_js_1.validateContentIsString)(content, prompt);
73
- text += segment("user", textContent);
73
+ text += segment("user", (0, ContentPart_js_1.validateContentIsString)(content, prompt));
74
74
  break;
75
75
  }
76
76
  case "assistant": {
77
- text += segment("assistant", content);
77
+ text += segment("assistant", (0, ContentPart_js_1.validateContentIsString)(content, prompt));
78
78
  break;
79
79
  }
80
+ case "tool": {
81
+ throw new InvalidPromptError_js_1.InvalidPromptError("Tool messages are not supported.", prompt);
82
+ }
80
83
  default: {
81
84
  const _exhaustiveCheck = role;
82
85
  throw new Error(`Unsupported role: ${_exhaustiveCheck}`);
@@ -1,4 +1,5 @@
1
- import { validateContentIsString } from "./Content.js";
1
+ import { validateContentIsString } from "./ContentPart.js";
2
+ import { InvalidPromptError } from "./InvalidPromptError.js";
2
3
  const START_SEGMENT = "<|im_start|>";
3
4
  const END_SEGMENT = "<|im_end|>";
4
5
  function segmentStart(role) {
@@ -64,14 +65,16 @@ export function chat() {
64
65
  for (const { role, content } of prompt.messages) {
65
66
  switch (role) {
66
67
  case "user": {
67
- const textContent = validateContentIsString(content, prompt);
68
- text += segment("user", textContent);
68
+ text += segment("user", validateContentIsString(content, prompt));
69
69
  break;
70
70
  }
71
71
  case "assistant": {
72
- text += segment("assistant", content);
72
+ text += segment("assistant", validateContentIsString(content, prompt));
73
73
  break;
74
74
  }
75
+ case "tool": {
76
+ throw new InvalidPromptError("Tool messages are not supported.", prompt);
77
+ }
75
78
  default: {
76
79
  const _exhaustiveCheck = role;
77
80
  throw new Error(`Unsupported role: ${_exhaustiveCheck}`);
@@ -1,2 +1,44 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ChatMessage = void 0;
4
+ exports.ChatMessage = {
5
+ user({ text }) {
6
+ return {
7
+ role: "user",
8
+ content: text,
9
+ };
10
+ },
11
+ tool({ toolResults, }) {
12
+ return {
13
+ role: "tool",
14
+ content: createToolContent({ toolResults }),
15
+ };
16
+ },
17
+ assistant({ text, toolResults, }) {
18
+ return {
19
+ role: "assistant",
20
+ content: createAssistantContent({ text, toolResults }),
21
+ };
22
+ },
23
+ };
24
+ function createToolContent({ toolResults, }) {
25
+ const toolContent = [];
26
+ for (const { result, toolCall } of toolResults ?? []) {
27
+ toolContent.push({
28
+ type: "tool-response",
29
+ id: toolCall.id,
30
+ response: result,
31
+ });
32
+ }
33
+ return toolContent;
34
+ }
35
+ function createAssistantContent({ text, toolResults, }) {
36
+ const content = [];
37
+ if (text != null) {
38
+ content.push({ type: "text", text });
39
+ }
40
+ for (const { toolCall } of toolResults ?? []) {
41
+ content.push({ type: "tool-call", ...toolCall });
42
+ }
43
+ return content;
44
+ }
@@ -1,10 +1,14 @@
1
- import { Content } from "./Content.js";
1
+ import { ToolCallResult } from "../../../tool/ToolCallResult.js";
2
+ import { ImagePart, TextPart, ToolCallPart, ToolResponsePart } from "./ContentPart.js";
2
3
  /**
3
- * A chat prompt is a combination of a system message and a list of user and assistant messages.
4
+ * A chat prompt is a combination of a system message and a list
5
+ * of user, assistant, and tool messages.
4
6
  *
5
7
  * The user messages can contain multi-modal content.
8
+ * The assistant messages can contain tool calls.
6
9
  *
7
- * Note: Not all models and prompt formats support multi-modal inputs.
10
+ * Note: Not all models and prompt formats support multi-modal inputs and tool calls.
11
+ * The validation happens at runtime.
8
12
  *
9
13
  * @example
10
14
  * ```ts
@@ -22,6 +26,9 @@ export interface ChatPrompt {
22
26
  system?: string;
23
27
  messages: Array<ChatMessage>;
24
28
  }
29
+ export type UserContent = string | Array<TextPart | ImagePart>;
30
+ export type AssistantContent = string | Array<TextPart | ToolCallPart>;
31
+ export type ToolContent = Array<ToolResponsePart>;
25
32
  /**
26
33
  * A message in a chat prompt.
27
34
  *
@@ -29,8 +36,23 @@ export interface ChatPrompt {
29
36
  */
30
37
  export type ChatMessage = {
31
38
  role: "user";
32
- content: Content;
39
+ content: UserContent;
33
40
  } | {
34
41
  role: "assistant";
35
- content: string;
42
+ content: AssistantContent;
43
+ } | {
44
+ role: "tool";
45
+ content: ToolContent;
46
+ };
47
+ export declare const ChatMessage: {
48
+ user({ text }: {
49
+ text: string;
50
+ }): ChatMessage;
51
+ tool({ toolResults, }: {
52
+ toolResults: ToolCallResult<string, unknown, unknown>[] | null;
53
+ }): ChatMessage;
54
+ assistant({ text, toolResults, }: {
55
+ text: string | null;
56
+ toolResults: ToolCallResult<string, unknown, unknown>[] | null;
57
+ }): ChatMessage;
36
58
  };
@@ -1 +1,41 @@
1
- export {};
1
+ export const ChatMessage = {
2
+ user({ text }) {
3
+ return {
4
+ role: "user",
5
+ content: text,
6
+ };
7
+ },
8
+ tool({ toolResults, }) {
9
+ return {
10
+ role: "tool",
11
+ content: createToolContent({ toolResults }),
12
+ };
13
+ },
14
+ assistant({ text, toolResults, }) {
15
+ return {
16
+ role: "assistant",
17
+ content: createAssistantContent({ text, toolResults }),
18
+ };
19
+ },
20
+ };
21
+ function createToolContent({ toolResults, }) {
22
+ const toolContent = [];
23
+ for (const { result, toolCall } of toolResults ?? []) {
24
+ toolContent.push({
25
+ type: "tool-response",
26
+ id: toolCall.id,
27
+ response: result,
28
+ });
29
+ }
30
+ return toolContent;
31
+ }
32
+ function createAssistantContent({ text, toolResults, }) {
33
+ const content = [];
34
+ if (text != null) {
35
+ content.push({ type: "text", text });
36
+ }
37
+ for (const { toolCall } of toolResults ?? []) {
38
+ content.push({ type: "tool-call", ...toolCall });
39
+ }
40
+ return content;
41
+ }
@@ -4,7 +4,7 @@ exports.validateContentIsString = void 0;
4
4
  const InvalidPromptError_js_1 = require("./InvalidPromptError.cjs");
5
5
  function validateContentIsString(content, prompt) {
6
6
  if (typeof content !== "string") {
7
- throw new InvalidPromptError_js_1.InvalidPromptError("only text prompts are are supported by this prompt template", prompt);
7
+ throw new InvalidPromptError_js_1.InvalidPromptError("Only text prompts are are supported by this prompt template.", prompt);
8
8
  }
9
9
  return content;
10
10
  }
@@ -0,0 +1,30 @@
1
+ export interface TextPart {
2
+ type: "text";
3
+ /**
4
+ * The text content.
5
+ */
6
+ text: string;
7
+ }
8
+ export interface ImagePart {
9
+ type: "image";
10
+ /**
11
+ * Base-64 encoded image.
12
+ */
13
+ base64Image: string;
14
+ /**
15
+ * Optional mime type of the image.
16
+ */
17
+ mimeType?: string;
18
+ }
19
+ export interface ToolCallPart {
20
+ type: "tool-call";
21
+ id: string;
22
+ name: string;
23
+ args: unknown;
24
+ }
25
+ export interface ToolResponsePart {
26
+ type: "tool-response";
27
+ id: string;
28
+ response: unknown;
29
+ }
30
+ export declare function validateContentIsString(content: string | unknown, prompt: unknown): string;
@@ -1,7 +1,7 @@
1
1
  import { InvalidPromptError } from "./InvalidPromptError.js";
2
2
  export function validateContentIsString(content, prompt) {
3
3
  if (typeof content !== "string") {
4
- throw new InvalidPromptError("only text prompts are are supported by this prompt template", prompt);
4
+ throw new InvalidPromptError("Only text prompts are are supported by this prompt template.", prompt);
5
5
  }
6
6
  return content;
7
7
  }
@@ -1,4 +1,4 @@
1
- import { Content } from "./Content.js";
1
+ import { ImagePart, TextPart } from "./ContentPart";
2
2
  /**
3
3
  * A single text instruction prompt. It can contain an optional system message to define
4
4
  * the role and behavior of the language model.
@@ -22,10 +22,11 @@ export interface InstructionPrompt {
22
22
  /**
23
23
  * The instruction for the model.
24
24
  */
25
- instruction: Content;
25
+ instruction: InstructionContent;
26
26
  /**
27
27
  * Response prefix that will be injected in the prompt at the beginning of the response.
28
28
  * This is useful for guiding the model by starting its response with a specific text.
29
29
  */
30
30
  responsePrefix?: string;
31
31
  }
32
+ export type InstructionContent = string | Array<TextPart | ImagePart>;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.validateLlama2Prompt = exports.chat = exports.instruction = exports.text = void 0;
4
- const Content_js_1 = require("./Content.cjs");
4
+ const ContentPart_js_1 = require("./ContentPart.cjs");
5
5
  const InvalidPromptError_js_1 = require("./InvalidPromptError.cjs");
6
6
  // see https://github.com/facebookresearch/llama/blob/6c7fe276574e78057f917549435a2554000a876d/llama/generation.py#L44
7
7
  const BEGIN_SEGMENT = "<s>";
@@ -48,7 +48,7 @@ function instruction() {
48
48
  return {
49
49
  stopSequences: [END_SEGMENT],
50
50
  format(prompt) {
51
- const instruction = (0, Content_js_1.validateContentIsString)(prompt.instruction, prompt);
51
+ const instruction = (0, ContentPart_js_1.validateContentIsString)(prompt.instruction, prompt);
52
52
  return `${BEGIN_SEGMENT}${BEGIN_INSTRUCTION}${prompt.system != null
53
53
  ? `${BEGIN_SYSTEM}${prompt.system}${END_SYSTEM}`
54
54
  : ""}${instruction}${END_INSTRUCTION}${prompt.responsePrefix ?? ""}`;
@@ -80,14 +80,17 @@ function chat() {
80
80
  for (const { role, content } of prompt.messages) {
81
81
  switch (role) {
82
82
  case "user": {
83
- const textContent = (0, Content_js_1.validateContentIsString)(content, prompt);
83
+ const textContent = (0, ContentPart_js_1.validateContentIsString)(content, prompt);
84
84
  text += `${BEGIN_SEGMENT}${BEGIN_INSTRUCTION}${textContent}${END_INSTRUCTION}`;
85
85
  break;
86
86
  }
87
87
  case "assistant": {
88
- text += `${content}${END_SEGMENT}`;
88
+ text += `${(0, ContentPart_js_1.validateContentIsString)(content, prompt)}${END_SEGMENT}`;
89
89
  break;
90
90
  }
91
+ case "tool": {
92
+ throw new InvalidPromptError_js_1.InvalidPromptError("Tool messages are not supported.", prompt);
93
+ }
91
94
  default: {
92
95
  const _exhaustiveCheck = role;
93
96
  throw new Error(`Unsupported role: ${_exhaustiveCheck}`);
@@ -1,4 +1,4 @@
1
- import { validateContentIsString } from "./Content.js";
1
+ import { validateContentIsString } from "./ContentPart.js";
2
2
  import { InvalidPromptError } from "./InvalidPromptError.js";
3
3
  // see https://github.com/facebookresearch/llama/blob/6c7fe276574e78057f917549435a2554000a876d/llama/generation.py#L44
4
4
  const BEGIN_SEGMENT = "<s>";
@@ -80,9 +80,12 @@ export function chat() {
80
80
  break;
81
81
  }
82
82
  case "assistant": {
83
- text += `${content}${END_SEGMENT}`;
83
+ text += `${validateContentIsString(content, prompt)}${END_SEGMENT}`;
84
84
  break;
85
85
  }
86
+ case "tool": {
87
+ throw new InvalidPromptError("Tool messages are not supported.", prompt);
88
+ }
86
89
  default: {
87
90
  const _exhaustiveCheck = role;
88
91
  throw new Error(`Unsupported role: ${_exhaustiveCheck}`);
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.chat = exports.instruction = exports.text = void 0;
4
- const Content_js_1 = require("./Content.cjs");
4
+ const ContentPart_js_1 = require("./ContentPart.cjs");
5
+ const InvalidPromptError_js_1 = require("./InvalidPromptError.cjs");
5
6
  const roleNames = {
6
7
  system: "System",
7
8
  user: "User",
@@ -36,7 +37,7 @@ exports.text = text;
36
37
  const instruction = () => ({
37
38
  stopSequences: [],
38
39
  format(prompt) {
39
- const instruction = (0, Content_js_1.validateContentIsString)(prompt.instruction, prompt);
40
+ const instruction = (0, ContentPart_js_1.validateContentIsString)(prompt.instruction, prompt);
40
41
  return (segment("system", prompt.system) +
41
42
  segment("user", instruction) +
42
43
  segmentStart("assistant") +
@@ -58,14 +59,17 @@ function chat() {
58
59
  for (const { role, content } of prompt.messages) {
59
60
  switch (role) {
60
61
  case "user": {
61
- const textContent = (0, Content_js_1.validateContentIsString)(content, prompt);
62
+ const textContent = (0, ContentPart_js_1.validateContentIsString)(content, prompt);
62
63
  text += segment("user", textContent);
63
64
  break;
64
65
  }
65
66
  case "assistant": {
66
- text += segment("assistant", content);
67
+ text += segment("assistant", (0, ContentPart_js_1.validateContentIsString)(content, prompt));
67
68
  break;
68
69
  }
70
+ case "tool": {
71
+ throw new InvalidPromptError_js_1.InvalidPromptError("Tool messages are not supported.", prompt);
72
+ }
69
73
  default: {
70
74
  const _exhaustiveCheck = role;
71
75
  throw new Error(`Unsupported role: ${_exhaustiveCheck}`);
@@ -1,4 +1,5 @@
1
- import { validateContentIsString } from "./Content.js";
1
+ import { validateContentIsString } from "./ContentPart.js";
2
+ import { InvalidPromptError } from "./InvalidPromptError.js";
2
3
  const roleNames = {
3
4
  system: "System",
4
5
  user: "User",
@@ -58,9 +59,12 @@ export function chat() {
58
59
  break;
59
60
  }
60
61
  case "assistant": {
61
- text += segment("assistant", content);
62
+ text += segment("assistant", validateContentIsString(content, prompt));
62
63
  break;
63
64
  }
65
+ case "tool": {
66
+ throw new InvalidPromptError("Tool messages are not supported.", prompt);
67
+ }
64
68
  default: {
65
69
  const _exhaustiveCheck = role;
66
70
  throw new Error(`Unsupported role: ${_exhaustiveCheck}`);
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.chat = exports.instruction = exports.text = void 0;
4
- const Content_js_1 = require("./Content.cjs");
4
+ const ContentPart_js_1 = require("./ContentPart.cjs");
5
+ const InvalidPromptError_js_1 = require("./InvalidPromptError.cjs");
5
6
  /**
6
7
  * Formats a text prompt as a basic text prompt. Does not change the text prompt in any way.
7
8
  */
@@ -20,7 +21,7 @@ const instruction = () => ({
20
21
  if (prompt.system != null) {
21
22
  text += `${prompt.system}\n\n`;
22
23
  }
23
- text += `${(0, Content_js_1.validateContentIsString)(prompt.instruction, prompt)}\n\n`;
24
+ text += `${(0, ContentPart_js_1.validateContentIsString)(prompt.instruction, prompt)}\n\n`;
24
25
  if (prompt.responsePrefix != null) {
25
26
  text += prompt.responsePrefix;
26
27
  }
@@ -43,13 +44,16 @@ const chat = ({ user = "user", assistant = "assistant", system, } = {}) => ({
43
44
  for (const { role, content } of prompt.messages) {
44
45
  switch (role) {
45
46
  case "user": {
46
- text += `${user}:\n${(0, Content_js_1.validateContentIsString)(content, prompt)}\n\n`;
47
+ text += `${user}:\n${(0, ContentPart_js_1.validateContentIsString)(content, prompt)}\n\n`;
47
48
  break;
48
49
  }
49
50
  case "assistant": {
50
- text += `${assistant}:\n${content}\n\n`;
51
+ text += `${assistant}:\n${(0, ContentPart_js_1.validateContentIsString)(content, prompt)}\n\n`;
51
52
  break;
52
53
  }
54
+ case "tool": {
55
+ throw new InvalidPromptError_js_1.InvalidPromptError("Tool messages are not supported.", prompt);
56
+ }
53
57
  default: {
54
58
  const _exhaustiveCheck = role;
55
59
  throw new Error(`Unsupported role: ${_exhaustiveCheck}`);
@@ -1,4 +1,5 @@
1
- import { validateContentIsString } from "./Content.js";
1
+ import { validateContentIsString } from "./ContentPart.js";
2
+ import { InvalidPromptError } from "./InvalidPromptError.js";
2
3
  /**
3
4
  * Formats a text prompt as a basic text prompt. Does not change the text prompt in any way.
4
5
  */
@@ -42,9 +43,12 @@ export const chat = ({ user = "user", assistant = "assistant", system, } = {}) =
42
43
  break;
43
44
  }
44
45
  case "assistant": {
45
- text += `${assistant}:\n${content}\n\n`;
46
+ text += `${assistant}:\n${validateContentIsString(content, prompt)}\n\n`;
46
47
  break;
47
48
  }
49
+ case "tool": {
50
+ throw new InvalidPromptError("Tool messages are not supported.", prompt);
51
+ }
48
52
  default: {
49
53
  const _exhaustiveCheck = role;
50
54
  throw new Error(`Unsupported role: ${_exhaustiveCheck}`);
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.chat = void 0;
4
- const Content_js_1 = require("./Content.cjs");
4
+ const ContentPart_js_1 = require("./ContentPart.cjs");
5
+ const InvalidPromptError_js_1 = require("./InvalidPromptError.cjs");
5
6
  // default Vicuna 1 system message
6
7
  const DEFAULT_SYSTEM_MESSAGE = "A chat between a curious user and an artificial intelligence assistant. " +
7
8
  "The assistant gives helpful, detailed, and polite answers to the user's questions.";
@@ -27,14 +28,17 @@ function chat() {
27
28
  for (const { role, content } of prompt.messages) {
28
29
  switch (role) {
29
30
  case "user": {
30
- const textContent = (0, Content_js_1.validateContentIsString)(content, prompt);
31
+ const textContent = (0, ContentPart_js_1.validateContentIsString)(content, prompt);
31
32
  text += `USER: ${textContent}\n`;
32
33
  break;
33
34
  }
34
35
  case "assistant": {
35
- text += `ASSISTANT: ${content}\n`;
36
+ text += `ASSISTANT: ${(0, ContentPart_js_1.validateContentIsString)(content, prompt)}\n`;
36
37
  break;
37
38
  }
39
+ case "tool": {
40
+ throw new InvalidPromptError_js_1.InvalidPromptError("Tool messages are not supported.", prompt);
41
+ }
38
42
  default: {
39
43
  const _exhaustiveCheck = role;
40
44
  throw new Error(`Unsupported role: ${_exhaustiveCheck}`);
@@ -1,4 +1,5 @@
1
- import { validateContentIsString } from "./Content.js";
1
+ import { validateContentIsString } from "./ContentPart.js";
2
+ import { InvalidPromptError } from "./InvalidPromptError.js";
2
3
  // default Vicuna 1 system message
3
4
  const DEFAULT_SYSTEM_MESSAGE = "A chat between a curious user and an artificial intelligence assistant. " +
4
5
  "The assistant gives helpful, detailed, and polite answers to the user's questions.";
@@ -29,9 +30,12 @@ export function chat() {
29
30
  break;
30
31
  }
31
32
  case "assistant": {
32
- text += `ASSISTANT: ${content}\n`;
33
+ text += `ASSISTANT: ${validateContentIsString(content, prompt)}\n`;
33
34
  break;
34
35
  }
36
+ case "tool": {
37
+ throw new InvalidPromptError("Tool messages are not supported.", prompt);
38
+ }
35
39
  default: {
36
40
  const _exhaustiveCheck = role;
37
41
  throw new Error(`Unsupported role: ${_exhaustiveCheck}`);
@@ -30,7 +30,7 @@ exports.VicunaPrompt = exports.TextPrompt = exports.NeuralChatPrompt = exports.L
30
30
  exports.AlpacaPrompt = __importStar(require("./AlpacaPromptTemplate.cjs"));
31
31
  exports.ChatMLPrompt = __importStar(require("./ChatMLPromptTemplate.cjs"));
32
32
  __exportStar(require("./ChatPrompt.cjs"), exports);
33
- __exportStar(require("./Content.cjs"), exports);
33
+ __exportStar(require("./ContentPart.cjs"), exports);
34
34
  __exportStar(require("./InstructionPrompt.cjs"), exports);
35
35
  __exportStar(require("./InvalidPromptError.cjs"), exports);
36
36
  exports.Llama2Prompt = __importStar(require("./Llama2PromptTemplate.cjs"));
@@ -1,7 +1,7 @@
1
1
  export * as AlpacaPrompt from "./AlpacaPromptTemplate.js";
2
2
  export * as ChatMLPrompt from "./ChatMLPromptTemplate.js";
3
3
  export * from "./ChatPrompt.js";
4
- export * from "./Content.js";
4
+ export * from "./ContentPart.js";
5
5
  export * from "./InstructionPrompt.js";
6
6
  export * from "./InvalidPromptError.js";
7
7
  export * as Llama2Prompt from "./Llama2PromptTemplate.js";
@@ -1,7 +1,7 @@
1
1
  export * as AlpacaPrompt from "./AlpacaPromptTemplate.js";
2
2
  export * as ChatMLPrompt from "./ChatMLPromptTemplate.js";
3
3
  export * from "./ChatPrompt.js";
4
- export * from "./Content.js";
4
+ export * from "./ContentPart.js";
5
5
  export * from "./InstructionPrompt.js";
6
6
  export * from "./InvalidPromptError.js";
7
7
  export * as Llama2Prompt from "./Llama2PromptTemplate.js";
@@ -5,9 +5,12 @@ const executeStreamCall_js_1 = require("../executeStreamCall.cjs");
5
5
  async function streamText(model, prompt, options) {
6
6
  const shouldTrimWhitespace = model.settings.trimWhitespace ?? true;
7
7
  let accumulatedText = "";
8
- let lastFullDelta;
9
8
  let isFirstDelta = true;
10
9
  let trailingWhitespace = "";
10
+ let resolveText;
11
+ const textPromise = new Promise((resolve) => {
12
+ resolveText = resolve;
13
+ });
11
14
  const fullResponse = await (0, executeStreamCall_js_1.executeStreamCall)({
12
15
  functionType: "stream-text",
13
16
  input: prompt,
@@ -15,39 +18,35 @@ async function streamText(model, prompt, options) {
15
18
  options,
16
19
  startStream: async (options) => model.doStreamText(prompt, options),
17
20
  processDelta: (delta) => {
18
- lastFullDelta = delta.fullDelta;
19
- let textDelta = delta.valueDelta;
20
- if (textDelta != null && textDelta.length > 0) {
21
- if (shouldTrimWhitespace) {
22
- if (isFirstDelta) {
23
- // remove leading whitespace:
24
- textDelta = textDelta.trimStart();
25
- }
26
- else {
27
- // restore trailing whitespace from previous chunk:
28
- textDelta = trailingWhitespace + textDelta;
29
- }
30
- // trim trailing whitespace and store it for the next chunk:
31
- const trailingWhitespaceMatch = textDelta.match(/\s+$/);
32
- trailingWhitespace = trailingWhitespaceMatch
33
- ? trailingWhitespaceMatch[0]
34
- : "";
35
- textDelta = textDelta.trimEnd();
36
- }
37
- isFirstDelta = false;
38
- accumulatedText += textDelta;
39
- return textDelta;
21
+ let textDelta = model.extractTextDelta(delta.deltaValue);
22
+ if (textDelta == null || textDelta.length === 0) {
23
+ return undefined;
24
+ }
25
+ if (shouldTrimWhitespace) {
26
+ textDelta = isFirstDelta
27
+ ? // remove leading whitespace:
28
+ textDelta.trimStart()
29
+ : // restore trailing whitespace from previous chunk:
30
+ trailingWhitespace + textDelta;
31
+ // trim trailing whitespace and store it for the next chunk:
32
+ const trailingWhitespaceMatch = textDelta.match(/\s+$/);
33
+ trailingWhitespace = trailingWhitespaceMatch
34
+ ? trailingWhitespaceMatch[0]
35
+ : "";
36
+ textDelta = textDelta.trimEnd();
40
37
  }
41
- return undefined;
38
+ isFirstDelta = false;
39
+ accumulatedText += textDelta;
40
+ return textDelta;
41
+ },
42
+ onDone: () => {
43
+ resolveText(accumulatedText);
42
44
  },
43
- getResult: () => ({
44
- response: lastFullDelta,
45
- value: accumulatedText,
46
- }),
47
45
  });
48
46
  return options?.fullResponse
49
47
  ? {
50
48
  textStream: fullResponse.value,
49
+ text: textPromise,
51
50
  metadata: fullResponse.metadata,
52
51
  }
53
52
  : fullResponse.value;
@@ -33,5 +33,6 @@ export declare function streamText<PROMPT>(model: TextStreamingModel<PROMPT>, pr
33
33
  fullResponse: true;
34
34
  }): Promise<{
35
35
  textStream: AsyncIterable<string>;
36
+ text: PromiseLike<string>;
36
37
  metadata: Omit<ModelCallMetadata, "durationInMs" | "finishTimestamp">;
37
38
  }>;