@librechat/agents 2.2.1 → 2.2.2

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 (40) hide show
  1. package/dist/cjs/graphs/Graph.cjs +8 -7
  2. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  3. package/dist/cjs/main.cjs +19 -8
  4. package/dist/cjs/main.cjs.map +1 -1
  5. package/dist/cjs/{messages.cjs → messages/core.cjs} +2 -2
  6. package/dist/cjs/messages/core.cjs.map +1 -0
  7. package/dist/cjs/messages/format.cjs +313 -0
  8. package/dist/cjs/messages/format.cjs.map +1 -0
  9. package/dist/cjs/messages/transformers.cjs +318 -0
  10. package/dist/cjs/messages/transformers.cjs.map +1 -0
  11. package/dist/cjs/messages/trimMessagesFactory.cjs +129 -0
  12. package/dist/cjs/messages/trimMessagesFactory.cjs.map +1 -0
  13. package/dist/esm/graphs/Graph.mjs +2 -1
  14. package/dist/esm/graphs/Graph.mjs.map +1 -1
  15. package/dist/esm/main.mjs +4 -1
  16. package/dist/esm/main.mjs.map +1 -1
  17. package/dist/esm/{messages.mjs → messages/core.mjs} +2 -2
  18. package/dist/esm/messages/core.mjs.map +1 -0
  19. package/dist/esm/messages/format.mjs +306 -0
  20. package/dist/esm/messages/format.mjs.map +1 -0
  21. package/dist/esm/messages/transformers.mjs +316 -0
  22. package/dist/esm/messages/transformers.mjs.map +1 -0
  23. package/dist/esm/messages/trimMessagesFactory.mjs +127 -0
  24. package/dist/esm/messages/trimMessagesFactory.mjs.map +1 -0
  25. package/dist/types/messages/format.d.ts +111 -0
  26. package/dist/types/messages/index.d.ts +4 -0
  27. package/dist/types/messages/transformers.d.ts +320 -0
  28. package/dist/types/messages/trimMessagesFactory.d.ts +37 -0
  29. package/package.json +1 -1
  30. package/src/messages/format.ts +433 -0
  31. package/src/messages/formatAgentMessages.test.ts +628 -0
  32. package/src/messages/formatMessage.test.ts +277 -0
  33. package/src/messages/index.ts +4 -0
  34. package/src/messages/transformers.ts +786 -0
  35. package/src/messages/trimMessagesFactory.test.ts +331 -0
  36. package/src/messages/trimMessagesFactory.ts +140 -0
  37. package/dist/cjs/messages.cjs.map +0 -1
  38. package/dist/esm/messages.mjs.map +0 -1
  39. /package/dist/types/{messages.d.ts → messages/core.d.ts} +0 -0
  40. /package/src/{messages.ts → messages/core.ts} +0 -0
@@ -0,0 +1,277 @@
1
+ import { HumanMessage, AIMessage, SystemMessage } from '@langchain/core/messages';
2
+ import { formatMessage, formatLangChainMessages, formatFromLangChain } from './format';
3
+
4
+ const NO_PARENT = '00000000-0000-0000-0000-000000000000';
5
+
6
+ describe('formatMessage', () => {
7
+ it('formats user message', () => {
8
+ const input = {
9
+ message: {
10
+ sender: 'user',
11
+ text: 'Hello',
12
+ },
13
+ userName: 'John',
14
+ };
15
+ const result = formatMessage(input);
16
+ expect(result).toEqual({
17
+ role: 'user',
18
+ content: 'Hello',
19
+ name: 'John',
20
+ });
21
+ });
22
+
23
+ it('sanitizes the name by replacing invalid characters (per OpenAI)', () => {
24
+ const input = {
25
+ message: {
26
+ sender: 'user',
27
+ text: 'Hello',
28
+ },
29
+ userName: ' John$Doe@Example! ',
30
+ };
31
+ const result = formatMessage(input);
32
+ expect(result).toEqual({
33
+ role: 'user',
34
+ content: 'Hello',
35
+ name: '_John_Doe_Example__',
36
+ });
37
+ });
38
+
39
+ it('trims the name to a maximum length of 64 characters', () => {
40
+ const longName = 'a'.repeat(100);
41
+ const input = {
42
+ message: {
43
+ sender: 'user',
44
+ text: 'Hello',
45
+ },
46
+ userName: longName,
47
+ };
48
+ const result = formatMessage(input);
49
+ expect(result.name?.length).toBe(64);
50
+ expect(result.name).toBe('a'.repeat(64));
51
+ });
52
+
53
+ it('formats a realistic user message', () => {
54
+ const input = {
55
+ message: {
56
+ _id: '6512cdfb92cbf69fea615331',
57
+ messageId: 'b620bf73-c5c3-4a38-b724-76886aac24c4',
58
+ __v: 0,
59
+ conversationId: '5c23d24f-941f-4aab-85df-127b596c8aa5',
60
+ createdAt: Date.now(),
61
+ error: false,
62
+ finish_reason: null,
63
+ isCreatedByUser: true,
64
+ model: null,
65
+ parentMessageId: NO_PARENT,
66
+ sender: 'User',
67
+ text: 'hi',
68
+ tokenCount: 5,
69
+ unfinished: false,
70
+ updatedAt: Date.now(),
71
+ user: '6512cdf475f05c86d44c31d2',
72
+ },
73
+ userName: 'John',
74
+ };
75
+ const result = formatMessage(input);
76
+ expect(result).toEqual({
77
+ role: 'user',
78
+ content: 'hi',
79
+ name: 'John',
80
+ });
81
+ });
82
+
83
+ it('formats assistant message', () => {
84
+ const input = {
85
+ message: {
86
+ sender: 'assistant',
87
+ text: 'Hi there',
88
+ },
89
+ assistantName: 'Assistant',
90
+ };
91
+ const result = formatMessage(input);
92
+ expect(result).toEqual({
93
+ role: 'assistant',
94
+ content: 'Hi there',
95
+ name: 'Assistant',
96
+ });
97
+ });
98
+
99
+ it('formats system message', () => {
100
+ const input = {
101
+ message: {
102
+ role: 'system',
103
+ text: 'Hi there',
104
+ },
105
+ };
106
+ const result = formatMessage(input);
107
+ expect(result).toEqual({
108
+ role: 'system',
109
+ content: 'Hi there',
110
+ });
111
+ });
112
+
113
+ it('formats user message with langChain', () => {
114
+ const input = {
115
+ message: {
116
+ sender: 'user',
117
+ text: 'Hello',
118
+ },
119
+ userName: 'John',
120
+ langChain: true,
121
+ };
122
+ const result = formatMessage(input);
123
+ expect(result).toBeInstanceOf(HumanMessage);
124
+ expect(result.lc_kwargs.content).toEqual(input.message.text);
125
+ expect(result.lc_kwargs.name).toEqual(input.userName);
126
+ });
127
+
128
+ it('formats assistant message with langChain', () => {
129
+ const input = {
130
+ message: {
131
+ sender: 'assistant',
132
+ text: 'Hi there',
133
+ },
134
+ assistantName: 'Assistant',
135
+ langChain: true,
136
+ };
137
+ const result = formatMessage(input);
138
+ expect(result).toBeInstanceOf(AIMessage);
139
+ expect(result.lc_kwargs.content).toEqual(input.message.text);
140
+ expect(result.lc_kwargs.name).toEqual(input.assistantName);
141
+ });
142
+
143
+ it('formats system message with langChain', () => {
144
+ const input = {
145
+ message: {
146
+ role: 'system',
147
+ text: 'This is a system message.',
148
+ },
149
+ langChain: true,
150
+ };
151
+ const result = formatMessage(input);
152
+ expect(result).toBeInstanceOf(SystemMessage);
153
+ expect(result.lc_kwargs.content).toEqual(input.message.text);
154
+ });
155
+
156
+ it('formats langChain messages into OpenAI payload format', () => {
157
+ const human = {
158
+ message: new HumanMessage({
159
+ content: 'Hello',
160
+ }),
161
+ };
162
+ const system = {
163
+ message: new SystemMessage({
164
+ content: 'Hello',
165
+ }),
166
+ };
167
+ const ai = {
168
+ message: new AIMessage({
169
+ content: 'Hello',
170
+ }),
171
+ };
172
+ const humanResult = formatMessage(human);
173
+ const systemResult = formatMessage(system);
174
+ const aiResult = formatMessage(ai);
175
+ expect(humanResult).toEqual({
176
+ role: 'user',
177
+ content: 'Hello',
178
+ });
179
+ expect(systemResult).toEqual({
180
+ role: 'system',
181
+ content: 'Hello',
182
+ });
183
+ expect(aiResult).toEqual({
184
+ role: 'assistant',
185
+ content: 'Hello',
186
+ });
187
+ });
188
+ });
189
+
190
+ describe('formatLangChainMessages', () => {
191
+ it('formats an array of messages for LangChain', () => {
192
+ const messages = [
193
+ {
194
+ role: 'system',
195
+ content: 'This is a system message',
196
+ },
197
+ {
198
+ sender: 'user',
199
+ text: 'Hello',
200
+ },
201
+ {
202
+ sender: 'assistant',
203
+ text: 'Hi there',
204
+ },
205
+ ];
206
+ const formatOptions = {
207
+ userName: 'John',
208
+ assistantName: 'Assistant',
209
+ };
210
+ const result = formatLangChainMessages(messages, formatOptions);
211
+ expect(result).toHaveLength(3);
212
+ expect(result[0]).toBeInstanceOf(SystemMessage);
213
+ expect(result[1]).toBeInstanceOf(HumanMessage);
214
+ expect(result[2]).toBeInstanceOf(AIMessage);
215
+
216
+ expect(result[0].lc_kwargs.content).toEqual(messages[0].content);
217
+ expect(result[1].lc_kwargs.content).toEqual(messages[1].text);
218
+ expect(result[2].lc_kwargs.content).toEqual(messages[2].text);
219
+
220
+ expect(result[1].lc_kwargs.name).toEqual(formatOptions.userName);
221
+ expect(result[2].lc_kwargs.name).toEqual(formatOptions.assistantName);
222
+ });
223
+
224
+ describe('formatFromLangChain', () => {
225
+ it('should merge kwargs and additional_kwargs', () => {
226
+ const message = {
227
+ kwargs: {
228
+ content: 'some content',
229
+ name: 'dan',
230
+ additional_kwargs: {
231
+ function_call: {
232
+ name: 'dall-e',
233
+ arguments: '{\n "input": "Subject: hedgehog, Style: cute"\n}',
234
+ },
235
+ },
236
+ },
237
+ };
238
+
239
+ const expected = {
240
+ content: 'some content',
241
+ name: 'dan',
242
+ function_call: {
243
+ name: 'dall-e',
244
+ arguments: '{\n "input": "Subject: hedgehog, Style: cute"\n}',
245
+ },
246
+ };
247
+
248
+ expect(formatFromLangChain(message)).toEqual(expected);
249
+ });
250
+
251
+ it('should handle messages without additional_kwargs', () => {
252
+ const message = {
253
+ kwargs: {
254
+ content: 'some content',
255
+ name: 'dan',
256
+ },
257
+ };
258
+
259
+ const expected = {
260
+ content: 'some content',
261
+ name: 'dan',
262
+ };
263
+
264
+ expect(formatFromLangChain(message)).toEqual(expected);
265
+ });
266
+
267
+ it('should handle empty messages', () => {
268
+ const message = {
269
+ kwargs: {},
270
+ };
271
+
272
+ const expected = {};
273
+
274
+ expect(formatFromLangChain(message)).toEqual(expected);
275
+ });
276
+ });
277
+ });
@@ -0,0 +1,4 @@
1
+ export * from './core';
2
+ export * from './format';
3
+ export * from './transformers';
4
+ export * from './trimMessagesFactory';