@langchain/core 0.1.55 → 0.1.57

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 (54) hide show
  1. package/dist/agents.d.ts +1 -1
  2. package/dist/caches.d.ts +1 -1
  3. package/dist/language_models/chat_models.d.ts +14 -3
  4. package/dist/messages/ai.cjs +213 -0
  5. package/dist/messages/ai.d.ts +37 -0
  6. package/dist/messages/ai.js +207 -0
  7. package/dist/messages/base.cjs +212 -0
  8. package/dist/messages/base.d.ts +137 -0
  9. package/dist/messages/base.js +201 -0
  10. package/dist/messages/chat.cjs +71 -0
  11. package/dist/messages/chat.d.ts +28 -0
  12. package/dist/messages/chat.js +66 -0
  13. package/dist/messages/function.cjs +46 -0
  14. package/dist/messages/function.d.ts +24 -0
  15. package/dist/messages/function.js +41 -0
  16. package/dist/messages/human.cjs +36 -0
  17. package/dist/messages/human.d.ts +17 -0
  18. package/dist/messages/human.js +31 -0
  19. package/dist/messages/index.cjs +27 -633
  20. package/dist/messages/index.d.ts +8 -273
  21. package/dist/messages/index.js +10 -611
  22. package/dist/messages/system.cjs +36 -0
  23. package/dist/messages/system.d.ts +17 -0
  24. package/dist/messages/system.js +31 -0
  25. package/dist/messages/tool.cjs +101 -0
  26. package/dist/messages/tool.d.ts +101 -0
  27. package/dist/messages/tool.js +95 -0
  28. package/dist/messages/utils.cjs +172 -0
  29. package/dist/messages/utils.d.ts +31 -0
  30. package/dist/messages/utils.js +163 -0
  31. package/dist/output_parsers/json.cjs +6 -93
  32. package/dist/output_parsers/json.d.ts +2 -2
  33. package/dist/output_parsers/json.js +2 -88
  34. package/dist/output_parsers/openai_tools/json_output_tools_parsers.cjs +79 -13
  35. package/dist/output_parsers/openai_tools/json_output_tools_parsers.d.ts +18 -0
  36. package/dist/output_parsers/openai_tools/json_output_tools_parsers.js +75 -12
  37. package/dist/output_parsers/transform.cjs +7 -6
  38. package/dist/output_parsers/transform.d.ts +1 -1
  39. package/dist/output_parsers/transform.js +3 -2
  40. package/dist/prompts/chat.cjs +1 -1
  41. package/dist/prompts/chat.js +1 -1
  42. package/dist/utils/function_calling.cjs +18 -6
  43. package/dist/utils/function_calling.d.ts +2 -1
  44. package/dist/utils/function_calling.js +16 -5
  45. package/dist/utils/json.cjs +93 -0
  46. package/dist/utils/json.d.ts +2 -0
  47. package/dist/utils/json.js +88 -0
  48. package/dist/utils/testing/index.cjs +3 -0
  49. package/dist/utils/testing/index.js +3 -0
  50. package/messages/tool.cjs +1 -0
  51. package/messages/tool.d.cts +1 -0
  52. package/messages/tool.d.ts +1 -0
  53. package/messages/tool.js +1 -0
  54. package/package.json +14 -1
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defaultToolCallParser = exports.ToolMessageChunk = exports.ToolMessage = void 0;
4
+ const base_js_1 = require("./base.cjs");
5
+ /**
6
+ * Represents a tool message in a conversation.
7
+ */
8
+ class ToolMessage extends base_js_1.BaseMessage {
9
+ static lc_name() {
10
+ return "ToolMessage";
11
+ }
12
+ get lc_aliases() {
13
+ // exclude snake case conversion to pascal case
14
+ return { tool_call_id: "tool_call_id" };
15
+ }
16
+ constructor(fields, tool_call_id, name) {
17
+ if (typeof fields === "string") {
18
+ // eslint-disable-next-line no-param-reassign, @typescript-eslint/no-non-null-assertion
19
+ fields = { content: fields, name, tool_call_id: tool_call_id };
20
+ }
21
+ super(fields);
22
+ Object.defineProperty(this, "tool_call_id", {
23
+ enumerable: true,
24
+ configurable: true,
25
+ writable: true,
26
+ value: void 0
27
+ });
28
+ this.tool_call_id = fields.tool_call_id;
29
+ }
30
+ _getType() {
31
+ return "tool";
32
+ }
33
+ static isInstance(message) {
34
+ return message._getType() === "tool";
35
+ }
36
+ }
37
+ exports.ToolMessage = ToolMessage;
38
+ /**
39
+ * Represents a chunk of a tool message, which can be concatenated
40
+ * with other tool message chunks.
41
+ */
42
+ class ToolMessageChunk extends base_js_1.BaseMessageChunk {
43
+ constructor(fields) {
44
+ super(fields);
45
+ Object.defineProperty(this, "tool_call_id", {
46
+ enumerable: true,
47
+ configurable: true,
48
+ writable: true,
49
+ value: void 0
50
+ });
51
+ this.tool_call_id = fields.tool_call_id;
52
+ }
53
+ static lc_name() {
54
+ return "ToolMessageChunk";
55
+ }
56
+ _getType() {
57
+ return "tool";
58
+ }
59
+ concat(chunk) {
60
+ return new ToolMessageChunk({
61
+ content: (0, base_js_1.mergeContent)(this.content, chunk.content),
62
+ additional_kwargs: (0, base_js_1._mergeDicts)(this.additional_kwargs, chunk.additional_kwargs),
63
+ response_metadata: (0, base_js_1._mergeDicts)(this.response_metadata, chunk.response_metadata),
64
+ tool_call_id: this.tool_call_id,
65
+ });
66
+ }
67
+ }
68
+ exports.ToolMessageChunk = ToolMessageChunk;
69
+ function defaultToolCallParser(
70
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
71
+ rawToolCalls) {
72
+ const toolCalls = [];
73
+ const invalidToolCalls = [];
74
+ for (const toolCall of rawToolCalls) {
75
+ if (!toolCall.function) {
76
+ continue;
77
+ }
78
+ else {
79
+ const functionName = toolCall.function.name;
80
+ try {
81
+ const functionArgs = JSON.parse(toolCall.function.arguments);
82
+ const parsed = {
83
+ name: functionName || "",
84
+ args: functionArgs || {},
85
+ id: toolCall.id,
86
+ };
87
+ toolCalls.push(parsed);
88
+ }
89
+ catch (error) {
90
+ invalidToolCalls.push({
91
+ name: functionName,
92
+ args: toolCall.function.arguments,
93
+ id: toolCall.id,
94
+ error: "Malformed args.",
95
+ });
96
+ }
97
+ }
98
+ }
99
+ return [toolCalls, invalidToolCalls];
100
+ }
101
+ exports.defaultToolCallParser = defaultToolCallParser;
@@ -0,0 +1,101 @@
1
+ import { BaseMessage, BaseMessageChunk, type BaseMessageFields, type MessageType } from "./base.js";
2
+ export interface ToolMessageFieldsWithToolCallId extends BaseMessageFields {
3
+ tool_call_id: string;
4
+ }
5
+ /**
6
+ * Represents a tool message in a conversation.
7
+ */
8
+ export declare class ToolMessage extends BaseMessage {
9
+ static lc_name(): string;
10
+ get lc_aliases(): Record<string, string>;
11
+ tool_call_id: string;
12
+ constructor(fields: ToolMessageFieldsWithToolCallId);
13
+ constructor(fields: string | BaseMessageFields, tool_call_id: string, name?: string);
14
+ _getType(): MessageType;
15
+ static isInstance(message: BaseMessage): message is ToolMessage;
16
+ }
17
+ /**
18
+ * Represents a chunk of a tool message, which can be concatenated
19
+ * with other tool message chunks.
20
+ */
21
+ export declare class ToolMessageChunk extends BaseMessageChunk {
22
+ tool_call_id: string;
23
+ constructor(fields: ToolMessageFieldsWithToolCallId);
24
+ static lc_name(): string;
25
+ _getType(): MessageType;
26
+ concat(chunk: ToolMessageChunk): ToolMessageChunk;
27
+ }
28
+ /**
29
+ * A call to a tool.
30
+ * @property {string} name - The name of the tool to be called
31
+ * @property {Record<string, any>} args - The arguments to the tool call
32
+ * @property {string} [id] - If provided, an identifier associated with the tool call
33
+ */
34
+ export type ToolCall = {
35
+ name: string;
36
+ args: Record<string, any>;
37
+ id?: string;
38
+ };
39
+ /**
40
+ * A chunk of a tool call (e.g., as part of a stream).
41
+ * When merging ToolCallChunks (e.g., via AIMessageChunk.__add__),
42
+ * all string attributes are concatenated. Chunks are only merged if their
43
+ * values of `index` are equal and not None.
44
+ *
45
+ * @example
46
+ * ```ts
47
+ * const leftChunks = [
48
+ * {
49
+ * name: "foo",
50
+ * args: '{"a":',
51
+ * index: 0
52
+ * }
53
+ * ];
54
+ *
55
+ * const leftAIMessageChunk = new AIMessageChunk({
56
+ * content: "",
57
+ * tool_call_chunks: leftChunks
58
+ * });
59
+ *
60
+ * const rightChunks = [
61
+ * {
62
+ * name: undefined,
63
+ * args: '1}',
64
+ * index: 0
65
+ * }
66
+ * ];
67
+ *
68
+ * const rightAIMessageChunk = new AIMessageChunk({
69
+ * content: "",
70
+ * tool_call_chunks: rightChunks
71
+ * });
72
+ *
73
+ * const result = leftAIMessageChunk.concat(rightAIMessageChunk);
74
+ * // result.tool_call_chunks is equal to:
75
+ * // [
76
+ * // {
77
+ * // name: "foo",
78
+ * // args: '{"a":1}'
79
+ * // index: 0
80
+ * // }
81
+ * // ]
82
+ * ```
83
+ *
84
+ * @property {string} [name] - If provided, a substring of the name of the tool to be called
85
+ * @property {string} [args] - If provided, a JSON substring of the arguments to the tool call
86
+ * @property {string} [id] - If provided, a substring of an identifier for the tool call
87
+ * @property {number} [index] - If provided, the index of the tool call in a sequence
88
+ */
89
+ export type ToolCallChunk = {
90
+ name?: string;
91
+ args?: string;
92
+ id?: string;
93
+ index?: number;
94
+ };
95
+ export type InvalidToolCall = {
96
+ name?: string;
97
+ args?: string;
98
+ id?: string;
99
+ error?: string;
100
+ };
101
+ export declare function defaultToolCallParser(rawToolCalls: Record<string, any>[]): [ToolCall[], InvalidToolCall[]];
@@ -0,0 +1,95 @@
1
+ import { BaseMessage, BaseMessageChunk, mergeContent, _mergeDicts, } from "./base.js";
2
+ /**
3
+ * Represents a tool message in a conversation.
4
+ */
5
+ export class ToolMessage extends BaseMessage {
6
+ static lc_name() {
7
+ return "ToolMessage";
8
+ }
9
+ get lc_aliases() {
10
+ // exclude snake case conversion to pascal case
11
+ return { tool_call_id: "tool_call_id" };
12
+ }
13
+ constructor(fields, tool_call_id, name) {
14
+ if (typeof fields === "string") {
15
+ // eslint-disable-next-line no-param-reassign, @typescript-eslint/no-non-null-assertion
16
+ fields = { content: fields, name, tool_call_id: tool_call_id };
17
+ }
18
+ super(fields);
19
+ Object.defineProperty(this, "tool_call_id", {
20
+ enumerable: true,
21
+ configurable: true,
22
+ writable: true,
23
+ value: void 0
24
+ });
25
+ this.tool_call_id = fields.tool_call_id;
26
+ }
27
+ _getType() {
28
+ return "tool";
29
+ }
30
+ static isInstance(message) {
31
+ return message._getType() === "tool";
32
+ }
33
+ }
34
+ /**
35
+ * Represents a chunk of a tool message, which can be concatenated
36
+ * with other tool message chunks.
37
+ */
38
+ export class ToolMessageChunk extends BaseMessageChunk {
39
+ constructor(fields) {
40
+ super(fields);
41
+ Object.defineProperty(this, "tool_call_id", {
42
+ enumerable: true,
43
+ configurable: true,
44
+ writable: true,
45
+ value: void 0
46
+ });
47
+ this.tool_call_id = fields.tool_call_id;
48
+ }
49
+ static lc_name() {
50
+ return "ToolMessageChunk";
51
+ }
52
+ _getType() {
53
+ return "tool";
54
+ }
55
+ concat(chunk) {
56
+ return new ToolMessageChunk({
57
+ content: mergeContent(this.content, chunk.content),
58
+ additional_kwargs: _mergeDicts(this.additional_kwargs, chunk.additional_kwargs),
59
+ response_metadata: _mergeDicts(this.response_metadata, chunk.response_metadata),
60
+ tool_call_id: this.tool_call_id,
61
+ });
62
+ }
63
+ }
64
+ export function defaultToolCallParser(
65
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
66
+ rawToolCalls) {
67
+ const toolCalls = [];
68
+ const invalidToolCalls = [];
69
+ for (const toolCall of rawToolCalls) {
70
+ if (!toolCall.function) {
71
+ continue;
72
+ }
73
+ else {
74
+ const functionName = toolCall.function.name;
75
+ try {
76
+ const functionArgs = JSON.parse(toolCall.function.arguments);
77
+ const parsed = {
78
+ name: functionName || "",
79
+ args: functionArgs || {},
80
+ id: toolCall.id,
81
+ };
82
+ toolCalls.push(parsed);
83
+ }
84
+ catch (error) {
85
+ invalidToolCalls.push({
86
+ name: functionName,
87
+ args: toolCall.function.arguments,
88
+ id: toolCall.id,
89
+ error: "Malformed args.",
90
+ });
91
+ }
92
+ }
93
+ }
94
+ return [toolCalls, invalidToolCalls];
95
+ }
@@ -0,0 +1,172 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.convertToChunk = exports.mapChatMessagesToStoredMessages = exports.mapStoredMessagesToChatMessages = exports.mapStoredMessageToChatMessage = exports.getBufferString = exports.coerceMessageLikeToMessage = void 0;
4
+ const base_js_1 = require("./base.cjs");
5
+ const human_js_1 = require("./human.cjs");
6
+ const ai_js_1 = require("./ai.cjs");
7
+ const system_js_1 = require("./system.cjs");
8
+ const chat_js_1 = require("./chat.cjs");
9
+ const function_js_1 = require("./function.cjs");
10
+ const tool_js_1 = require("./tool.cjs");
11
+ function coerceMessageLikeToMessage(messageLike) {
12
+ if (typeof messageLike === "string") {
13
+ return new human_js_1.HumanMessage(messageLike);
14
+ }
15
+ else if ((0, base_js_1.isBaseMessage)(messageLike)) {
16
+ return messageLike;
17
+ }
18
+ const [type, content] = messageLike;
19
+ if (type === "human" || type === "user") {
20
+ return new human_js_1.HumanMessage({ content });
21
+ }
22
+ else if (type === "ai" || type === "assistant") {
23
+ return new ai_js_1.AIMessage({ content });
24
+ }
25
+ else if (type === "system") {
26
+ return new system_js_1.SystemMessage({ content });
27
+ }
28
+ else {
29
+ throw new Error(`Unable to coerce message from array: only human, AI, or system message coercion is currently supported.`);
30
+ }
31
+ }
32
+ exports.coerceMessageLikeToMessage = coerceMessageLikeToMessage;
33
+ /**
34
+ * This function is used by memory classes to get a string representation
35
+ * of the chat message history, based on the message content and role.
36
+ */
37
+ function getBufferString(messages, humanPrefix = "Human", aiPrefix = "AI") {
38
+ const string_messages = [];
39
+ for (const m of messages) {
40
+ let role;
41
+ if (m._getType() === "human") {
42
+ role = humanPrefix;
43
+ }
44
+ else if (m._getType() === "ai") {
45
+ role = aiPrefix;
46
+ }
47
+ else if (m._getType() === "system") {
48
+ role = "System";
49
+ }
50
+ else if (m._getType() === "function") {
51
+ role = "Function";
52
+ }
53
+ else if (m._getType() === "tool") {
54
+ role = "Tool";
55
+ }
56
+ else if (m._getType() === "generic") {
57
+ role = m.role;
58
+ }
59
+ else {
60
+ throw new Error(`Got unsupported message type: ${m._getType()}`);
61
+ }
62
+ const nameStr = m.name ? `${m.name}, ` : "";
63
+ string_messages.push(`${role}: ${nameStr}${m.content}`);
64
+ }
65
+ return string_messages.join("\n");
66
+ }
67
+ exports.getBufferString = getBufferString;
68
+ /**
69
+ * Maps messages from an older format (V1) to the current `StoredMessage`
70
+ * format. If the message is already in the `StoredMessage` format, it is
71
+ * returned as is. Otherwise, it transforms the V1 message into a
72
+ * `StoredMessage`. This function is important for maintaining
73
+ * compatibility with older message formats.
74
+ */
75
+ function mapV1MessageToStoredMessage(message) {
76
+ // TODO: Remove this mapper when we deprecate the old message format.
77
+ if (message.data !== undefined) {
78
+ return message;
79
+ }
80
+ else {
81
+ const v1Message = message;
82
+ return {
83
+ type: v1Message.type,
84
+ data: {
85
+ content: v1Message.text,
86
+ role: v1Message.role,
87
+ name: undefined,
88
+ tool_call_id: undefined,
89
+ },
90
+ };
91
+ }
92
+ }
93
+ function mapStoredMessageToChatMessage(message) {
94
+ const storedMessage = mapV1MessageToStoredMessage(message);
95
+ switch (storedMessage.type) {
96
+ case "human":
97
+ return new human_js_1.HumanMessage(storedMessage.data);
98
+ case "ai":
99
+ return new ai_js_1.AIMessage(storedMessage.data);
100
+ case "system":
101
+ return new system_js_1.SystemMessage(storedMessage.data);
102
+ case "function":
103
+ if (storedMessage.data.name === undefined) {
104
+ throw new Error("Name must be defined for function messages");
105
+ }
106
+ return new function_js_1.FunctionMessage(storedMessage.data);
107
+ case "tool":
108
+ if (storedMessage.data.tool_call_id === undefined) {
109
+ throw new Error("Tool call ID must be defined for tool messages");
110
+ }
111
+ return new tool_js_1.ToolMessage(storedMessage.data);
112
+ case "chat": {
113
+ if (storedMessage.data.role === undefined) {
114
+ throw new Error("Role must be defined for chat messages");
115
+ }
116
+ return new chat_js_1.ChatMessage(storedMessage.data);
117
+ }
118
+ default:
119
+ throw new Error(`Got unexpected type: ${storedMessage.type}`);
120
+ }
121
+ }
122
+ exports.mapStoredMessageToChatMessage = mapStoredMessageToChatMessage;
123
+ /**
124
+ * Transforms an array of `StoredMessage` instances into an array of
125
+ * `BaseMessage` instances. It uses the `mapV1MessageToStoredMessage`
126
+ * function to ensure all messages are in the `StoredMessage` format, then
127
+ * creates new instances of the appropriate `BaseMessage` subclass based
128
+ * on the type of each message. This function is used to prepare stored
129
+ * messages for use in a chat context.
130
+ */
131
+ function mapStoredMessagesToChatMessages(messages) {
132
+ return messages.map(mapStoredMessageToChatMessage);
133
+ }
134
+ exports.mapStoredMessagesToChatMessages = mapStoredMessagesToChatMessages;
135
+ /**
136
+ * Transforms an array of `BaseMessage` instances into an array of
137
+ * `StoredMessage` instances. It does this by calling the `toDict` method
138
+ * on each `BaseMessage`, which returns a `StoredMessage`. This function
139
+ * is used to prepare chat messages for storage.
140
+ */
141
+ function mapChatMessagesToStoredMessages(messages) {
142
+ return messages.map((message) => message.toDict());
143
+ }
144
+ exports.mapChatMessagesToStoredMessages = mapChatMessagesToStoredMessages;
145
+ function convertToChunk(message) {
146
+ const type = message._getType();
147
+ if (type === "human") {
148
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
149
+ return new human_js_1.HumanMessageChunk({ ...message });
150
+ }
151
+ else if (type === "ai") {
152
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
153
+ return new ai_js_1.AIMessageChunk({ ...message });
154
+ }
155
+ else if (type === "system") {
156
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
157
+ return new system_js_1.SystemMessageChunk({ ...message });
158
+ }
159
+ else if (type === "function") {
160
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
161
+ return new function_js_1.FunctionMessageChunk({ ...message });
162
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
163
+ }
164
+ else if (chat_js_1.ChatMessage.isInstance(message)) {
165
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
166
+ return new chat_js_1.ChatMessageChunk({ ...message });
167
+ }
168
+ else {
169
+ throw new Error("Unknown message type.");
170
+ }
171
+ }
172
+ exports.convertToChunk = convertToChunk;
@@ -0,0 +1,31 @@
1
+ import { BaseMessageLike, BaseMessage, StoredMessage } from "./base.js";
2
+ import { HumanMessage, HumanMessageChunk } from "./human.js";
3
+ import { AIMessage, AIMessageChunk } from "./ai.js";
4
+ import { SystemMessage, SystemMessageChunk } from "./system.js";
5
+ import { ChatMessage, ChatMessageChunk } from "./chat.js";
6
+ import { FunctionMessage, FunctionMessageChunk } from "./function.js";
7
+ import { ToolMessage } from "./tool.js";
8
+ export declare function coerceMessageLikeToMessage(messageLike: BaseMessageLike): BaseMessage;
9
+ /**
10
+ * This function is used by memory classes to get a string representation
11
+ * of the chat message history, based on the message content and role.
12
+ */
13
+ export declare function getBufferString(messages: BaseMessage[], humanPrefix?: string, aiPrefix?: string): string;
14
+ export declare function mapStoredMessageToChatMessage(message: StoredMessage): ToolMessage | AIMessage | ChatMessage | FunctionMessage | HumanMessage | SystemMessage;
15
+ /**
16
+ * Transforms an array of `StoredMessage` instances into an array of
17
+ * `BaseMessage` instances. It uses the `mapV1MessageToStoredMessage`
18
+ * function to ensure all messages are in the `StoredMessage` format, then
19
+ * creates new instances of the appropriate `BaseMessage` subclass based
20
+ * on the type of each message. This function is used to prepare stored
21
+ * messages for use in a chat context.
22
+ */
23
+ export declare function mapStoredMessagesToChatMessages(messages: StoredMessage[]): BaseMessage[];
24
+ /**
25
+ * Transforms an array of `BaseMessage` instances into an array of
26
+ * `StoredMessage` instances. It does this by calling the `toDict` method
27
+ * on each `BaseMessage`, which returns a `StoredMessage`. This function
28
+ * is used to prepare chat messages for storage.
29
+ */
30
+ export declare function mapChatMessagesToStoredMessages(messages: BaseMessage[]): StoredMessage[];
31
+ export declare function convertToChunk(message: BaseMessage): AIMessageChunk | ChatMessageChunk | FunctionMessageChunk | HumanMessageChunk | SystemMessageChunk;
@@ -0,0 +1,163 @@
1
+ import { isBaseMessage, } from "./base.js";
2
+ import { HumanMessage, HumanMessageChunk } from "./human.js";
3
+ import { AIMessage, AIMessageChunk } from "./ai.js";
4
+ import { SystemMessage, SystemMessageChunk } from "./system.js";
5
+ import { ChatMessage, ChatMessageChunk, } from "./chat.js";
6
+ import { FunctionMessage, FunctionMessageChunk, } from "./function.js";
7
+ import { ToolMessage } from "./tool.js";
8
+ export function coerceMessageLikeToMessage(messageLike) {
9
+ if (typeof messageLike === "string") {
10
+ return new HumanMessage(messageLike);
11
+ }
12
+ else if (isBaseMessage(messageLike)) {
13
+ return messageLike;
14
+ }
15
+ const [type, content] = messageLike;
16
+ if (type === "human" || type === "user") {
17
+ return new HumanMessage({ content });
18
+ }
19
+ else if (type === "ai" || type === "assistant") {
20
+ return new AIMessage({ content });
21
+ }
22
+ else if (type === "system") {
23
+ return new SystemMessage({ content });
24
+ }
25
+ else {
26
+ throw new Error(`Unable to coerce message from array: only human, AI, or system message coercion is currently supported.`);
27
+ }
28
+ }
29
+ /**
30
+ * This function is used by memory classes to get a string representation
31
+ * of the chat message history, based on the message content and role.
32
+ */
33
+ export function getBufferString(messages, humanPrefix = "Human", aiPrefix = "AI") {
34
+ const string_messages = [];
35
+ for (const m of messages) {
36
+ let role;
37
+ if (m._getType() === "human") {
38
+ role = humanPrefix;
39
+ }
40
+ else if (m._getType() === "ai") {
41
+ role = aiPrefix;
42
+ }
43
+ else if (m._getType() === "system") {
44
+ role = "System";
45
+ }
46
+ else if (m._getType() === "function") {
47
+ role = "Function";
48
+ }
49
+ else if (m._getType() === "tool") {
50
+ role = "Tool";
51
+ }
52
+ else if (m._getType() === "generic") {
53
+ role = m.role;
54
+ }
55
+ else {
56
+ throw new Error(`Got unsupported message type: ${m._getType()}`);
57
+ }
58
+ const nameStr = m.name ? `${m.name}, ` : "";
59
+ string_messages.push(`${role}: ${nameStr}${m.content}`);
60
+ }
61
+ return string_messages.join("\n");
62
+ }
63
+ /**
64
+ * Maps messages from an older format (V1) to the current `StoredMessage`
65
+ * format. If the message is already in the `StoredMessage` format, it is
66
+ * returned as is. Otherwise, it transforms the V1 message into a
67
+ * `StoredMessage`. This function is important for maintaining
68
+ * compatibility with older message formats.
69
+ */
70
+ function mapV1MessageToStoredMessage(message) {
71
+ // TODO: Remove this mapper when we deprecate the old message format.
72
+ if (message.data !== undefined) {
73
+ return message;
74
+ }
75
+ else {
76
+ const v1Message = message;
77
+ return {
78
+ type: v1Message.type,
79
+ data: {
80
+ content: v1Message.text,
81
+ role: v1Message.role,
82
+ name: undefined,
83
+ tool_call_id: undefined,
84
+ },
85
+ };
86
+ }
87
+ }
88
+ export function mapStoredMessageToChatMessage(message) {
89
+ const storedMessage = mapV1MessageToStoredMessage(message);
90
+ switch (storedMessage.type) {
91
+ case "human":
92
+ return new HumanMessage(storedMessage.data);
93
+ case "ai":
94
+ return new AIMessage(storedMessage.data);
95
+ case "system":
96
+ return new SystemMessage(storedMessage.data);
97
+ case "function":
98
+ if (storedMessage.data.name === undefined) {
99
+ throw new Error("Name must be defined for function messages");
100
+ }
101
+ return new FunctionMessage(storedMessage.data);
102
+ case "tool":
103
+ if (storedMessage.data.tool_call_id === undefined) {
104
+ throw new Error("Tool call ID must be defined for tool messages");
105
+ }
106
+ return new ToolMessage(storedMessage.data);
107
+ case "chat": {
108
+ if (storedMessage.data.role === undefined) {
109
+ throw new Error("Role must be defined for chat messages");
110
+ }
111
+ return new ChatMessage(storedMessage.data);
112
+ }
113
+ default:
114
+ throw new Error(`Got unexpected type: ${storedMessage.type}`);
115
+ }
116
+ }
117
+ /**
118
+ * Transforms an array of `StoredMessage` instances into an array of
119
+ * `BaseMessage` instances. It uses the `mapV1MessageToStoredMessage`
120
+ * function to ensure all messages are in the `StoredMessage` format, then
121
+ * creates new instances of the appropriate `BaseMessage` subclass based
122
+ * on the type of each message. This function is used to prepare stored
123
+ * messages for use in a chat context.
124
+ */
125
+ export function mapStoredMessagesToChatMessages(messages) {
126
+ return messages.map(mapStoredMessageToChatMessage);
127
+ }
128
+ /**
129
+ * Transforms an array of `BaseMessage` instances into an array of
130
+ * `StoredMessage` instances. It does this by calling the `toDict` method
131
+ * on each `BaseMessage`, which returns a `StoredMessage`. This function
132
+ * is used to prepare chat messages for storage.
133
+ */
134
+ export function mapChatMessagesToStoredMessages(messages) {
135
+ return messages.map((message) => message.toDict());
136
+ }
137
+ export function convertToChunk(message) {
138
+ const type = message._getType();
139
+ if (type === "human") {
140
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
141
+ return new HumanMessageChunk({ ...message });
142
+ }
143
+ else if (type === "ai") {
144
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
145
+ return new AIMessageChunk({ ...message });
146
+ }
147
+ else if (type === "system") {
148
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
149
+ return new SystemMessageChunk({ ...message });
150
+ }
151
+ else if (type === "function") {
152
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
153
+ return new FunctionMessageChunk({ ...message });
154
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
155
+ }
156
+ else if (ChatMessage.isInstance(message)) {
157
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
158
+ return new ChatMessageChunk({ ...message });
159
+ }
160
+ else {
161
+ throw new Error("Unknown message type.");
162
+ }
163
+ }