@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.
- package/dist/agents.d.ts +1 -1
- package/dist/caches.d.ts +1 -1
- package/dist/language_models/chat_models.d.ts +14 -3
- package/dist/messages/ai.cjs +213 -0
- package/dist/messages/ai.d.ts +37 -0
- package/dist/messages/ai.js +207 -0
- package/dist/messages/base.cjs +212 -0
- package/dist/messages/base.d.ts +137 -0
- package/dist/messages/base.js +201 -0
- package/dist/messages/chat.cjs +71 -0
- package/dist/messages/chat.d.ts +28 -0
- package/dist/messages/chat.js +66 -0
- package/dist/messages/function.cjs +46 -0
- package/dist/messages/function.d.ts +24 -0
- package/dist/messages/function.js +41 -0
- package/dist/messages/human.cjs +36 -0
- package/dist/messages/human.d.ts +17 -0
- package/dist/messages/human.js +31 -0
- package/dist/messages/index.cjs +27 -633
- package/dist/messages/index.d.ts +8 -273
- package/dist/messages/index.js +10 -611
- package/dist/messages/system.cjs +36 -0
- package/dist/messages/system.d.ts +17 -0
- package/dist/messages/system.js +31 -0
- package/dist/messages/tool.cjs +101 -0
- package/dist/messages/tool.d.ts +101 -0
- package/dist/messages/tool.js +95 -0
- package/dist/messages/utils.cjs +172 -0
- package/dist/messages/utils.d.ts +31 -0
- package/dist/messages/utils.js +163 -0
- package/dist/output_parsers/json.cjs +6 -93
- package/dist/output_parsers/json.d.ts +2 -2
- package/dist/output_parsers/json.js +2 -88
- package/dist/output_parsers/openai_tools/json_output_tools_parsers.cjs +79 -13
- package/dist/output_parsers/openai_tools/json_output_tools_parsers.d.ts +18 -0
- package/dist/output_parsers/openai_tools/json_output_tools_parsers.js +75 -12
- package/dist/output_parsers/transform.cjs +7 -6
- package/dist/output_parsers/transform.d.ts +1 -1
- package/dist/output_parsers/transform.js +3 -2
- package/dist/prompts/chat.cjs +1 -1
- package/dist/prompts/chat.js +1 -1
- package/dist/utils/function_calling.cjs +18 -6
- package/dist/utils/function_calling.d.ts +2 -1
- package/dist/utils/function_calling.js +16 -5
- package/dist/utils/json.cjs +93 -0
- package/dist/utils/json.d.ts +2 -0
- package/dist/utils/json.js +88 -0
- package/dist/utils/testing/index.cjs +3 -0
- package/dist/utils/testing/index.js +3 -0
- package/messages/tool.cjs +1 -0
- package/messages/tool.d.cts +1 -0
- package/messages/tool.d.ts +1 -0
- package/messages/tool.js +1 -0
- 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
|
+
}
|