@langgraph-js/sdk 1.11.0 → 1.12.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.
@@ -35,6 +35,7 @@ export type RenderMessage = Message & {
35
35
  };
36
36
  }[];
37
37
  };
38
+ sub_agent_messages?: RenderMessage[];
38
39
  usage_metadata?: {
39
40
  total_tokens: number;
40
41
  input_tokens: number;
@@ -91,6 +92,8 @@ export declare class LangGraphClient extends Client {
91
92
  private streamingCallbacks;
92
93
  tools: ToolManager;
93
94
  stopController: AbortController | null;
95
+ /** 用于存储 subAgent 状态数据的键 */
96
+ subAgentsKey: string;
94
97
  constructor(config: LangGraphClientConfig);
95
98
  availableAssistants: Assistant[];
96
99
  private listAssistants;
@@ -130,6 +133,8 @@ export declare class LangGraphClient extends Client {
130
133
  * @en Messages used for streaming rendering in the UI.
131
134
  */
132
135
  get renderMessage(): RenderMessage[];
136
+ /** 转换 subAgent 消息为工具的子消息 */
137
+ private convertSubAgentMessages;
133
138
  /**
134
139
  * @zh 为消息附加额外的信息,如耗时、唯一 ID 等。
135
140
  * @en Attaches additional information to messages, such as spend time, unique ID, etc.
@@ -32,6 +32,8 @@ export class LangGraphClient extends Client {
32
32
  this.streamingCallbacks = new Set();
33
33
  this.tools = new ToolManager();
34
34
  this.stopController = null;
35
+ /** 用于存储 subAgent 状态数据的键 */
36
+ this.subAgentsKey = "task_store";
35
37
  this.availableAssistants = [];
36
38
  this.streamingMessage = [];
37
39
  /** 图发过来的更新信息 */
@@ -225,7 +227,56 @@ export class LangGraphClient extends Client {
225
227
  result.unshift(message);
226
228
  }
227
229
  }
228
- return this.attachInfoForMessage(this.composeToolMessages(result));
230
+ return this.convertSubAgentMessages(this.attachInfoForMessage(this.composeToolMessages(result)));
231
+ }
232
+ /** 转换 subAgent 消息为工具的子消息 */
233
+ convertSubAgentMessages(messages) {
234
+ const origin_task_store = this.graphState[this.subAgentsKey];
235
+ if (!origin_task_store)
236
+ return messages;
237
+ const task_store = JSON.parse(JSON.stringify(origin_task_store));
238
+ console.log(messages);
239
+ /** 获取 subAgent 消息的 id,用于流式过程中对数据进行标记 */
240
+ messages
241
+ .filter((i) => {
242
+ var _a;
243
+ return (_a = i.node_name) === null || _a === void 0 ? void 0 : _a.startsWith("subagent_");
244
+ })
245
+ .forEach((i) => {
246
+ const tool_call_id = i.node_name.replace("subagent_", "");
247
+ const store = task_store[tool_call_id];
248
+ if (store) {
249
+ // 根据 id 进行去重
250
+ const exists = store.messages.some((msg) => msg.id === i.id);
251
+ if (!exists) {
252
+ store.messages.push(i);
253
+ }
254
+ }
255
+ else {
256
+ task_store[tool_call_id] = {
257
+ messages: [i],
258
+ };
259
+ }
260
+ });
261
+ const ignoreIds = new Set();
262
+ Object.values(task_store).forEach((task) => {
263
+ task.messages.forEach((message) => {
264
+ ignoreIds.add(message.id);
265
+ });
266
+ });
267
+ const result = [];
268
+ for (const message of messages) {
269
+ if (message.type === "tool" && message.tool_call_id) {
270
+ const task = task_store[message.tool_call_id];
271
+ if (task) {
272
+ message.sub_agent_messages = this.attachInfoForMessage(this.composeToolMessages(task.messages));
273
+ }
274
+ }
275
+ if (message.id && ignoreIds.has(message.id))
276
+ continue;
277
+ result.push(message);
278
+ }
279
+ return result;
229
280
  }
230
281
  /**
231
282
  * @zh 为消息附加额外的信息,如耗时、唯一 ID 等。
package/dist/TestKit.d.ts CHANGED
@@ -158,6 +158,7 @@ export declare class TestLangGraphChat {
158
158
  };
159
159
  }[];
160
160
  };
161
+ sub_agent_messages?: RenderMessage[];
161
162
  usage_metadata?: {
162
163
  total_tokens: number;
163
164
  input_tokens: number;
@@ -182,6 +183,7 @@ export declare class TestLangGraphChat {
182
183
  };
183
184
  }[];
184
185
  };
186
+ sub_agent_messages?: RenderMessage[];
185
187
  usage_metadata?: {
186
188
  total_tokens: number;
187
189
  input_tokens: number;
@@ -206,6 +208,7 @@ export declare class TestLangGraphChat {
206
208
  };
207
209
  }[];
208
210
  };
211
+ sub_agent_messages?: RenderMessage[];
209
212
  usage_metadata?: {
210
213
  total_tokens: number;
211
214
  input_tokens: number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@langgraph-js/sdk",
3
- "version": "1.11.0",
3
+ "version": "1.12.0",
4
4
  "description": "The UI SDK for LangGraph - seamlessly integrate your AI agents with frontend interfaces",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -35,6 +35,7 @@ export type RenderMessage = Message & {
35
35
  };
36
36
  }[];
37
37
  };
38
+ sub_agent_messages?: RenderMessage[];
38
39
  usage_metadata?: {
39
40
  total_tokens: number;
40
41
  input_tokens: number;
@@ -102,6 +103,8 @@ export class LangGraphClient extends Client {
102
103
  private streamingCallbacks: Set<StreamingUpdateCallback> = new Set();
103
104
  tools: ToolManager = new ToolManager();
104
105
  stopController: AbortController | null = null;
106
+ /** 用于存储 subAgent 状态数据的键 */
107
+ subAgentsKey = "task_store";
105
108
 
106
109
  constructor(config: LangGraphClientConfig) {
107
110
  super(config);
@@ -296,7 +299,54 @@ export class LangGraphClient extends Client {
296
299
  }
297
300
  }
298
301
 
299
- return this.attachInfoForMessage(this.composeToolMessages(result as RenderMessage[]));
302
+ return this.convertSubAgentMessages(this.attachInfoForMessage(this.composeToolMessages(result as RenderMessage[])));
303
+ }
304
+ /** 转换 subAgent 消息为工具的子消息 */
305
+ private convertSubAgentMessages(messages: RenderMessage[]) {
306
+ const origin_task_store = this.graphState[this.subAgentsKey];
307
+ if (!origin_task_store) return messages;
308
+
309
+ const task_store = JSON.parse(JSON.stringify(origin_task_store));
310
+ console.log(messages);
311
+ /** 获取 subAgent 消息的 id,用于流式过程中对数据进行标记 */
312
+ messages
313
+ .filter((i) => {
314
+ return i.node_name?.startsWith("subagent_");
315
+ })
316
+ .forEach((i) => {
317
+ const tool_call_id = i.node_name!.replace("subagent_", "");
318
+ const store = task_store[tool_call_id];
319
+ if (store) {
320
+ // 根据 id 进行去重
321
+ const exists = (store.messages as RenderMessage[]).some((msg) => msg.id === i.id);
322
+ if (!exists) {
323
+ (store.messages as RenderMessage[]).push(i);
324
+ }
325
+ } else {
326
+ task_store[tool_call_id] = {
327
+ messages: [i],
328
+ };
329
+ }
330
+ });
331
+
332
+ const ignoreIds = new Set<string>();
333
+ Object.values(task_store).forEach((task: any) => {
334
+ task.messages.forEach((message: RenderMessage) => {
335
+ ignoreIds.add(message.id!);
336
+ });
337
+ });
338
+ const result: RenderMessage[] = [];
339
+ for (const message of messages) {
340
+ if (message.type === "tool" && message.tool_call_id) {
341
+ const task = task_store[message.tool_call_id];
342
+ if (task) {
343
+ message.sub_agent_messages = this.attachInfoForMessage(this.composeToolMessages(task.messages));
344
+ }
345
+ }
346
+ if (message.id && ignoreIds.has(message.id)) continue;
347
+ result.push(message);
348
+ }
349
+ return result;
300
350
  }
301
351
  /**
302
352
  * @zh 为消息附加额外的信息,如耗时、唯一 ID 等。