@cloudbase/agent-adapter-langgraph 0.0.11 → 0.0.13
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/CHANGELOG.md +12 -0
- package/README.md +85 -74
- package/dist/index.d.mts +9 -1
- package/dist/index.d.ts +9 -1
- package/dist/index.js +359 -159
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +356 -158
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -3
package/dist/index.js
CHANGED
|
@@ -34,7 +34,9 @@ __export(index_exports, {
|
|
|
34
34
|
ClientStateAnnotation: () => ClientStateAnnotation,
|
|
35
35
|
LanggraphAgent: () => LanggraphAgent,
|
|
36
36
|
TDAISaver: () => TDAISaver,
|
|
37
|
-
TDAIStore: () => TDAIStore
|
|
37
|
+
TDAIStore: () => TDAIStore,
|
|
38
|
+
createConsoleLogger: () => import_agent_shared2.createConsoleLogger,
|
|
39
|
+
noopLogger: () => import_agent_shared2.noopLogger
|
|
38
40
|
});
|
|
39
41
|
module.exports = __toCommonJS(index_exports);
|
|
40
42
|
|
|
@@ -91,6 +93,7 @@ function convertJsonSchemaToZodSchema(jsonSchema, required) {
|
|
|
91
93
|
}
|
|
92
94
|
|
|
93
95
|
// src/agent.ts
|
|
96
|
+
var import_agent_shared = require("@cloudbase/agent-shared");
|
|
94
97
|
var ClientPropertiesAnnotation = import_langgraph.Annotation.Root({
|
|
95
98
|
tools: import_langgraph.Annotation
|
|
96
99
|
});
|
|
@@ -102,6 +105,8 @@ var LanggraphAgent = class extends import_client.AbstractAgent {
|
|
|
102
105
|
constructor(agentConfig) {
|
|
103
106
|
super(agentConfig);
|
|
104
107
|
this.compiledWorkflow = agentConfig.compiledWorkflow;
|
|
108
|
+
const baseLogger = agentConfig.logger ?? import_agent_shared.noopLogger;
|
|
109
|
+
this.logger = baseLogger.child?.({ component: "langgraph-agent" }) ?? baseLogger;
|
|
105
110
|
}
|
|
106
111
|
run(input) {
|
|
107
112
|
return new import_rxjs.Observable((subscriber) => {
|
|
@@ -110,12 +115,29 @@ var LanggraphAgent = class extends import_client.AbstractAgent {
|
|
|
110
115
|
}
|
|
111
116
|
async _run(subscriber, input) {
|
|
112
117
|
const { messages, runId, threadId } = input;
|
|
113
|
-
|
|
118
|
+
const logger = this.logger.child?.({ runId, threadId }) ?? this.logger;
|
|
119
|
+
logger.info?.("Run started");
|
|
120
|
+
const runStartedEvent = {
|
|
114
121
|
type: import_client.EventType.RUN_STARTED,
|
|
115
122
|
threadId,
|
|
116
123
|
runId
|
|
117
|
-
}
|
|
118
|
-
|
|
124
|
+
};
|
|
125
|
+
logger.trace?.({ aguiEvent: runStartedEvent }, "Emitting AGUI event");
|
|
126
|
+
subscriber.next(runStartedEvent);
|
|
127
|
+
const isResume = !!input.forwardedProps?.resume;
|
|
128
|
+
const lastUserMessage = messages.filter((m) => m.role === "user").pop();
|
|
129
|
+
logger.debug?.(
|
|
130
|
+
{
|
|
131
|
+
isResume,
|
|
132
|
+
messageCount: messages.length,
|
|
133
|
+
toolCount: input.tools?.length ?? 0,
|
|
134
|
+
tools: input.tools?.map((t) => t.name),
|
|
135
|
+
lastUserMessage: typeof lastUserMessage?.content === "string" ? lastUserMessage.content.slice(0, 200) : void 0
|
|
136
|
+
},
|
|
137
|
+
"Preparing stream input"
|
|
138
|
+
);
|
|
139
|
+
logger.trace?.({ messages, tools: input.tools }, "Full input messages");
|
|
140
|
+
const streamEventInput = isResume ? new import_langgraph.Command({
|
|
119
141
|
resume: JSON.stringify(input.forwardedProps?.resume?.payload)
|
|
120
142
|
}) : {
|
|
121
143
|
messages: aguiMessagesToLangChain(messages),
|
|
@@ -135,6 +157,7 @@ var LanggraphAgent = class extends import_client.AbstractAgent {
|
|
|
135
157
|
thread_id: threadId
|
|
136
158
|
}
|
|
137
159
|
});
|
|
160
|
+
logger.debug?.("Stream created, starting event processing");
|
|
138
161
|
const chatModelRuns = [];
|
|
139
162
|
const handledToolCallIds = /* @__PURE__ */ new Set();
|
|
140
163
|
for (const msg of messages) {
|
|
@@ -142,202 +165,375 @@ var LanggraphAgent = class extends import_client.AbstractAgent {
|
|
|
142
165
|
handledToolCallIds.add(msg.toolCallId);
|
|
143
166
|
}
|
|
144
167
|
}
|
|
168
|
+
if (handledToolCallIds.size > 0) {
|
|
169
|
+
logger.debug?.(
|
|
170
|
+
{ count: handledToolCallIds.size },
|
|
171
|
+
"Pre-populated handled tool call IDs from input messages"
|
|
172
|
+
);
|
|
173
|
+
}
|
|
145
174
|
let interrupt;
|
|
146
175
|
let currentToolCall = null;
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
let chatModelRun = chatModelRuns.find(
|
|
157
|
-
(run) => run.runId === event.run_id
|
|
176
|
+
let eventCount = 0;
|
|
177
|
+
let toolCallCount = 0;
|
|
178
|
+
let textChunkCount = 0;
|
|
179
|
+
try {
|
|
180
|
+
for await (const event of stream) {
|
|
181
|
+
eventCount++;
|
|
182
|
+
logger.trace?.(
|
|
183
|
+
{ eventType: event.event, eventCount, langGraphEvent: event },
|
|
184
|
+
"Processing stream event"
|
|
158
185
|
);
|
|
159
|
-
if (
|
|
160
|
-
subscriber.next({
|
|
161
|
-
type: import_client.EventType.RUN_ERROR,
|
|
162
|
-
message: `Received a message from an unknown chat model run. Run Id: ${event.run_id}`
|
|
163
|
-
});
|
|
186
|
+
if (event.event.startsWith("ChannelWrite<")) {
|
|
164
187
|
continue;
|
|
165
188
|
}
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
role: "assistant"
|
|
173
|
-
});
|
|
174
|
-
} else if (chatModelRun.messageId !== chunkId) {
|
|
175
|
-
subscriber.next({
|
|
176
|
-
type: import_client.EventType.RUN_ERROR,
|
|
177
|
-
message: `Received a message of unknown message id from current run. Run Id: ${event.run_id} Message Id from current run: ${chatModelRun.messageId} Message Id from received message: ${chunkId}`
|
|
178
|
-
});
|
|
189
|
+
if (event.event === "on_chat_model_start") {
|
|
190
|
+
logger.debug?.(
|
|
191
|
+
{ chatModelRunId: event.run_id },
|
|
192
|
+
"Chat model started"
|
|
193
|
+
);
|
|
194
|
+
chatModelRuns.push({ runId: event.run_id });
|
|
179
195
|
continue;
|
|
180
196
|
}
|
|
181
|
-
if (
|
|
182
|
-
const
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
197
|
+
if (event.event === "on_chat_model_stream") {
|
|
198
|
+
const chatModelRun = chatModelRuns.find(
|
|
199
|
+
(run) => run.runId === event.run_id
|
|
200
|
+
);
|
|
201
|
+
if (!chatModelRun) {
|
|
202
|
+
logger.warn?.(
|
|
203
|
+
{ chatModelRunId: event.run_id },
|
|
204
|
+
"Received message from unknown chat model run"
|
|
205
|
+
);
|
|
206
|
+
subscriber.next({
|
|
207
|
+
type: import_client.EventType.RUN_ERROR,
|
|
208
|
+
message: `Received a message from an unknown chat model run. Run Id: ${event.run_id}`
|
|
209
|
+
});
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
const chunkId = event.data.chunk.id;
|
|
213
|
+
if (!chatModelRun.messageId) {
|
|
214
|
+
chatModelRun.messageId = chunkId;
|
|
215
|
+
const textStartEvent = {
|
|
216
|
+
messageId: chunkId,
|
|
217
|
+
type: import_client.EventType.TEXT_MESSAGE_START,
|
|
218
|
+
role: "assistant"
|
|
219
|
+
};
|
|
220
|
+
logger.debug?.({ messageId: chunkId }, "Text message started");
|
|
221
|
+
logger.trace?.(
|
|
222
|
+
{ aguiEvent: textStartEvent },
|
|
223
|
+
"Emitting AGUI event"
|
|
224
|
+
);
|
|
225
|
+
subscriber.next(textStartEvent);
|
|
226
|
+
} else if (chatModelRun.messageId !== chunkId) {
|
|
227
|
+
logger.warn?.(
|
|
228
|
+
{
|
|
229
|
+
expectedMessageId: chatModelRun.messageId,
|
|
230
|
+
receivedMessageId: chunkId,
|
|
231
|
+
chatModelRunId: event.run_id
|
|
232
|
+
},
|
|
233
|
+
"Received message with unexpected ID"
|
|
234
|
+
);
|
|
235
|
+
subscriber.next({
|
|
236
|
+
type: import_client.EventType.RUN_ERROR,
|
|
237
|
+
message: `Received a message of unknown message id from current run. Run Id: ${event.run_id} Message Id from current run: ${chatModelRun.messageId} Message Id from received message: ${chunkId}`
|
|
238
|
+
});
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
if (Array.isArray(event.data.chunk?.tool_call_chunks) && event.data.chunk?.tool_call_chunks?.length > 0) {
|
|
242
|
+
const parentMessageId = chatModelRun.messageId;
|
|
243
|
+
event.data.chunk.tool_call_chunks.map((x) => ({
|
|
244
|
+
...x,
|
|
245
|
+
args: typeof x.args === "string" ? x.args : x.args ? JSON.stringify(x.args) : ""
|
|
246
|
+
})).forEach((toolCall) => {
|
|
247
|
+
if (currentToolCall) {
|
|
248
|
+
if (toolCall.id && currentToolCall.id !== toolCall.id) {
|
|
249
|
+
const toolEndEvent = {
|
|
196
250
|
toolCallId: currentToolCall.id,
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
251
|
+
type: import_client.EventType.TOOL_CALL_END
|
|
252
|
+
};
|
|
253
|
+
logger.debug?.(
|
|
254
|
+
{
|
|
255
|
+
toolCallId: currentToolCall.id,
|
|
256
|
+
toolCallName: currentToolCall.name
|
|
257
|
+
},
|
|
258
|
+
"Tool call ended"
|
|
259
|
+
);
|
|
260
|
+
logger.trace?.(
|
|
261
|
+
{ aguiEvent: toolEndEvent },
|
|
262
|
+
"Emitting AGUI event"
|
|
263
|
+
);
|
|
264
|
+
subscriber.next(toolEndEvent);
|
|
265
|
+
if (toolCall.name && toolCall.id) {
|
|
266
|
+
currentToolCall = toolCall;
|
|
267
|
+
toolCallCount++;
|
|
268
|
+
const toolStartEvent = {
|
|
269
|
+
toolCallId: currentToolCall.id,
|
|
270
|
+
toolCallName: currentToolCall.name,
|
|
271
|
+
parentMessageId,
|
|
272
|
+
type: import_client.EventType.TOOL_CALL_START
|
|
273
|
+
};
|
|
274
|
+
logger.debug?.(
|
|
275
|
+
{
|
|
276
|
+
toolCallId: toolCall.id,
|
|
277
|
+
toolCallName: toolCall.name
|
|
278
|
+
},
|
|
279
|
+
"Tool call started"
|
|
280
|
+
);
|
|
281
|
+
logger.trace?.(
|
|
282
|
+
{ aguiEvent: toolStartEvent },
|
|
283
|
+
"Emitting AGUI event"
|
|
284
|
+
);
|
|
285
|
+
subscriber.next(toolStartEvent);
|
|
286
|
+
if (currentToolCall.args) {
|
|
287
|
+
const toolArgsEvent = {
|
|
288
|
+
toolCallId: currentToolCall.id,
|
|
289
|
+
delta: currentToolCall.args,
|
|
290
|
+
type: import_client.EventType.TOOL_CALL_ARGS
|
|
291
|
+
};
|
|
292
|
+
logger.trace?.(
|
|
293
|
+
{ aguiEvent: toolArgsEvent },
|
|
294
|
+
"Emitting AGUI event"
|
|
295
|
+
);
|
|
296
|
+
subscriber.next(toolArgsEvent);
|
|
297
|
+
if (isValidJson(currentToolCall.args)) {
|
|
298
|
+
const toolEndEvent2 = {
|
|
299
|
+
toolCallId: currentToolCall.id,
|
|
300
|
+
type: import_client.EventType.TOOL_CALL_END
|
|
301
|
+
};
|
|
302
|
+
logger.debug?.(
|
|
303
|
+
{ toolCallId: currentToolCall.id },
|
|
304
|
+
"Tool call ended (args complete)"
|
|
305
|
+
);
|
|
306
|
+
logger.trace?.(
|
|
307
|
+
{ aguiEvent: toolEndEvent2 },
|
|
308
|
+
"Emitting AGUI event"
|
|
309
|
+
);
|
|
310
|
+
subscriber.next(toolEndEvent2);
|
|
311
|
+
currentToolCall = null;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
} else {
|
|
316
|
+
if (toolCall.args) {
|
|
317
|
+
currentToolCall.args += toolCall.args;
|
|
318
|
+
const toolArgsEvent = {
|
|
203
319
|
toolCallId: currentToolCall.id,
|
|
204
|
-
delta:
|
|
320
|
+
delta: toolCall.args,
|
|
205
321
|
type: import_client.EventType.TOOL_CALL_ARGS
|
|
206
|
-
}
|
|
322
|
+
};
|
|
323
|
+
logger.trace?.(
|
|
324
|
+
{ aguiEvent: toolArgsEvent },
|
|
325
|
+
"Emitting AGUI event"
|
|
326
|
+
);
|
|
327
|
+
subscriber.next(toolArgsEvent);
|
|
207
328
|
if (isValidJson(currentToolCall.args)) {
|
|
208
|
-
|
|
329
|
+
const toolEndEvent = {
|
|
209
330
|
toolCallId: currentToolCall.id,
|
|
210
331
|
type: import_client.EventType.TOOL_CALL_END
|
|
211
|
-
}
|
|
332
|
+
};
|
|
333
|
+
logger.debug?.(
|
|
334
|
+
{ toolCallId: currentToolCall.id },
|
|
335
|
+
"Tool call ended (args complete)"
|
|
336
|
+
);
|
|
337
|
+
logger.trace?.(
|
|
338
|
+
{ aguiEvent: toolEndEvent },
|
|
339
|
+
"Emitting AGUI event"
|
|
340
|
+
);
|
|
341
|
+
subscriber.next(toolEndEvent);
|
|
212
342
|
currentToolCall = null;
|
|
213
343
|
}
|
|
214
344
|
}
|
|
215
345
|
}
|
|
216
346
|
} else {
|
|
217
|
-
if (toolCall.
|
|
218
|
-
currentToolCall
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
delta: toolCall.args,
|
|
222
|
-
type: import_client.EventType.TOOL_CALL_ARGS
|
|
223
|
-
});
|
|
224
|
-
if (isValidJson(currentToolCall.args)) {
|
|
225
|
-
subscriber.next({
|
|
226
|
-
toolCallId: currentToolCall.id,
|
|
227
|
-
type: import_client.EventType.TOOL_CALL_END
|
|
228
|
-
});
|
|
229
|
-
currentToolCall = null;
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
} else {
|
|
234
|
-
if (toolCall.name && toolCall.id) {
|
|
235
|
-
currentToolCall = toolCall;
|
|
236
|
-
subscriber.next({
|
|
237
|
-
toolCallId: toolCall.id,
|
|
238
|
-
toolCallName: toolCall.name,
|
|
239
|
-
parentMessageId,
|
|
240
|
-
type: import_client.EventType.TOOL_CALL_START
|
|
241
|
-
});
|
|
242
|
-
if (toolCall.args) {
|
|
243
|
-
subscriber.next({
|
|
347
|
+
if (toolCall.name && toolCall.id) {
|
|
348
|
+
currentToolCall = toolCall;
|
|
349
|
+
toolCallCount++;
|
|
350
|
+
const toolStartEvent = {
|
|
244
351
|
toolCallId: toolCall.id,
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
352
|
+
toolCallName: toolCall.name,
|
|
353
|
+
parentMessageId,
|
|
354
|
+
type: import_client.EventType.TOOL_CALL_START
|
|
355
|
+
};
|
|
356
|
+
logger.debug?.(
|
|
357
|
+
{ toolCallId: toolCall.id, toolCallName: toolCall.name },
|
|
358
|
+
"Tool call started"
|
|
359
|
+
);
|
|
360
|
+
logger.trace?.(
|
|
361
|
+
{ aguiEvent: toolStartEvent },
|
|
362
|
+
"Emitting AGUI event"
|
|
363
|
+
);
|
|
364
|
+
subscriber.next(toolStartEvent);
|
|
365
|
+
if (toolCall.args) {
|
|
366
|
+
const toolArgsEvent = {
|
|
250
367
|
toolCallId: toolCall.id,
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
368
|
+
delta: toolCall.args,
|
|
369
|
+
type: import_client.EventType.TOOL_CALL_ARGS
|
|
370
|
+
};
|
|
371
|
+
logger.trace?.(
|
|
372
|
+
{ aguiEvent: toolArgsEvent },
|
|
373
|
+
"Emitting AGUI event"
|
|
374
|
+
);
|
|
375
|
+
subscriber.next(toolArgsEvent);
|
|
376
|
+
if (isValidJson(toolCall.args)) {
|
|
377
|
+
const toolEndEvent = {
|
|
378
|
+
toolCallId: toolCall.id,
|
|
379
|
+
type: import_client.EventType.TOOL_CALL_END
|
|
380
|
+
};
|
|
381
|
+
logger.debug?.(
|
|
382
|
+
{ toolCallId: toolCall.id },
|
|
383
|
+
"Tool call ended (args complete)"
|
|
384
|
+
);
|
|
385
|
+
logger.trace?.(
|
|
386
|
+
{ aguiEvent: toolEndEvent },
|
|
387
|
+
"Emitting AGUI event"
|
|
388
|
+
);
|
|
389
|
+
subscriber.next(toolEndEvent);
|
|
390
|
+
currentToolCall = null;
|
|
391
|
+
}
|
|
254
392
|
}
|
|
255
393
|
}
|
|
256
394
|
}
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
const delta = event.data.chunk.content;
|
|
398
|
+
if (typeof delta === "string" && delta) {
|
|
399
|
+
textChunkCount++;
|
|
400
|
+
const textContentEvent = {
|
|
401
|
+
messageId: chatModelRun.messageId,
|
|
402
|
+
type: import_client.EventType.TEXT_MESSAGE_CONTENT,
|
|
403
|
+
delta
|
|
404
|
+
};
|
|
405
|
+
logger.trace?.(
|
|
406
|
+
{ aguiEvent: textContentEvent },
|
|
407
|
+
"Emitting AGUI event"
|
|
408
|
+
);
|
|
409
|
+
subscriber.next(textContentEvent);
|
|
410
|
+
}
|
|
411
|
+
continue;
|
|
267
412
|
}
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
(
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
413
|
+
if (event.event === "on_chat_model_end") {
|
|
414
|
+
const chatModelRun = chatModelRuns.find(
|
|
415
|
+
(run) => run.runId === event.run_id
|
|
416
|
+
);
|
|
417
|
+
if (!chatModelRun) {
|
|
418
|
+
logger.warn?.(
|
|
419
|
+
{ chatModelRunId: event.run_id },
|
|
420
|
+
"Received on_chat_model_end from unknown run"
|
|
421
|
+
);
|
|
422
|
+
subscriber.next({
|
|
423
|
+
type: import_client.EventType.RUN_ERROR,
|
|
424
|
+
message: `Received a on_chat_model_end event from an unknown chat model run. Run Id: ${event.run_id}`
|
|
425
|
+
});
|
|
426
|
+
continue;
|
|
427
|
+
}
|
|
428
|
+
const textEndEvent = {
|
|
429
|
+
type: import_client.EventType.TEXT_MESSAGE_END,
|
|
430
|
+
messageId: chatModelRun.messageId
|
|
431
|
+
};
|
|
432
|
+
logger.debug?.(
|
|
433
|
+
{ messageId: chatModelRun.messageId },
|
|
434
|
+
"Text message ended"
|
|
435
|
+
);
|
|
436
|
+
logger.trace?.({ aguiEvent: textEndEvent }, "Emitting AGUI event");
|
|
437
|
+
subscriber.next(textEndEvent);
|
|
279
438
|
continue;
|
|
280
439
|
}
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
if (!handledToolCallIds.has(toolMessage.tool_call_id)) {
|
|
291
|
-
if (!toolMessage.id) {
|
|
292
|
-
toolMessage.id = crypto.randomUUID();
|
|
293
|
-
if (toolMessage.lc_kwargs) {
|
|
294
|
-
toolMessage.lc_kwargs.id = toolMessage.id;
|
|
440
|
+
if (event.event === "on_tool_end") {
|
|
441
|
+
const toolMessage = event.data.output;
|
|
442
|
+
if (toolMessage && toolMessage.tool_call_id) {
|
|
443
|
+
if (!handledToolCallIds.has(toolMessage.tool_call_id)) {
|
|
444
|
+
if (!toolMessage.id) {
|
|
445
|
+
toolMessage.id = crypto.randomUUID();
|
|
446
|
+
if (toolMessage.lc_kwargs) {
|
|
447
|
+
toolMessage.lc_kwargs.id = toolMessage.id;
|
|
448
|
+
}
|
|
295
449
|
}
|
|
450
|
+
const toolResultEvent = {
|
|
451
|
+
toolCallId: toolMessage.tool_call_id,
|
|
452
|
+
type: import_client.EventType.TOOL_CALL_RESULT,
|
|
453
|
+
content: typeof toolMessage.content === "string" ? toolMessage.content : JSON.stringify(toolMessage.content),
|
|
454
|
+
messageId: toolMessage.id
|
|
455
|
+
};
|
|
456
|
+
logger.debug?.(
|
|
457
|
+
{
|
|
458
|
+
toolCallId: toolMessage.tool_call_id,
|
|
459
|
+
messageId: toolMessage.id
|
|
460
|
+
},
|
|
461
|
+
"Tool call result received"
|
|
462
|
+
);
|
|
463
|
+
logger.trace?.(
|
|
464
|
+
{ aguiEvent: toolResultEvent },
|
|
465
|
+
"Emitting AGUI event"
|
|
466
|
+
);
|
|
467
|
+
subscriber.next(toolResultEvent);
|
|
468
|
+
handledToolCallIds.add(toolMessage.tool_call_id);
|
|
469
|
+
} else {
|
|
470
|
+
logger.trace?.(
|
|
471
|
+
{ toolCallId: toolMessage.tool_call_id },
|
|
472
|
+
"Skipping duplicate tool call result"
|
|
473
|
+
);
|
|
296
474
|
}
|
|
297
|
-
subscriber.next({
|
|
298
|
-
toolCallId: toolMessage.tool_call_id,
|
|
299
|
-
type: import_client.EventType.TOOL_CALL_RESULT,
|
|
300
|
-
content: typeof toolMessage.content === "string" ? toolMessage.content : JSON.stringify(toolMessage.content),
|
|
301
|
-
messageId: toolMessage.id
|
|
302
|
-
});
|
|
303
|
-
handledToolCallIds.add(toolMessage.tool_call_id);
|
|
304
475
|
}
|
|
476
|
+
continue;
|
|
477
|
+
}
|
|
478
|
+
if (event.event === "on_chain_stream" && event.data.chunk?.__interrupt__ && Array.isArray(event.data.chunk.__interrupt__) && event.data.chunk.__interrupt__.length > 0) {
|
|
479
|
+
const rawInterrupt = event.data.chunk.__interrupt__[0];
|
|
480
|
+
logger.debug?.(
|
|
481
|
+
{ interruptId: rawInterrupt.id },
|
|
482
|
+
"Interrupt received"
|
|
483
|
+
);
|
|
484
|
+
interrupt = {
|
|
485
|
+
id: rawInterrupt.id,
|
|
486
|
+
// TODO: replace with actual reason
|
|
487
|
+
reason: "agent requested interrupt",
|
|
488
|
+
payload: rawInterrupt.value
|
|
489
|
+
};
|
|
305
490
|
}
|
|
306
|
-
continue;
|
|
307
491
|
}
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
492
|
+
const stats = { eventCount, toolCallCount, textChunkCount };
|
|
493
|
+
if (interrupt) {
|
|
494
|
+
const runFinishedEvent = {
|
|
495
|
+
type: import_client.EventType.RUN_FINISHED,
|
|
496
|
+
threadId,
|
|
497
|
+
runId,
|
|
498
|
+
outcome: "interrupt",
|
|
499
|
+
interrupt
|
|
500
|
+
};
|
|
501
|
+
logger.info?.(
|
|
502
|
+
{ outcome: "interrupt", interruptId: interrupt.id, ...stats },
|
|
503
|
+
"Run finished with interrupt"
|
|
504
|
+
);
|
|
505
|
+
logger.trace?.({ aguiEvent: runFinishedEvent }, "Emitting AGUI event");
|
|
506
|
+
subscriber.next(runFinishedEvent);
|
|
507
|
+
} else {
|
|
508
|
+
const runFinishedEvent = {
|
|
509
|
+
type: import_client.EventType.RUN_FINISHED,
|
|
510
|
+
threadId,
|
|
511
|
+
runId
|
|
315
512
|
};
|
|
513
|
+
logger.info?.({ outcome: "complete", ...stats }, "Run finished");
|
|
514
|
+
logger.trace?.({ aguiEvent: runFinishedEvent }, "Emitting AGUI event");
|
|
515
|
+
subscriber.next(runFinishedEvent);
|
|
316
516
|
}
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
runId,
|
|
323
|
-
outcome: "interrupt",
|
|
324
|
-
interrupt
|
|
325
|
-
});
|
|
326
|
-
} else {
|
|
517
|
+
} catch (error) {
|
|
518
|
+
logger.error?.(
|
|
519
|
+
{ err: error, eventCount, toolCallCount, textChunkCount },
|
|
520
|
+
"Error during stream processing"
|
|
521
|
+
);
|
|
327
522
|
subscriber.next({
|
|
328
|
-
type: import_client.EventType.
|
|
329
|
-
|
|
330
|
-
runId
|
|
523
|
+
type: import_client.EventType.RUN_ERROR,
|
|
524
|
+
message: error instanceof Error ? error.message : String(error)
|
|
331
525
|
});
|
|
332
526
|
}
|
|
333
527
|
subscriber.complete();
|
|
334
528
|
}
|
|
335
529
|
clone() {
|
|
336
530
|
const workflow = this.compiledWorkflow;
|
|
531
|
+
const logger = this.logger;
|
|
337
532
|
this.compiledWorkflow = void 0;
|
|
338
533
|
const cloned = super.clone();
|
|
339
534
|
this.compiledWorkflow = workflow;
|
|
340
535
|
cloned.compiledWorkflow = workflow;
|
|
536
|
+
cloned.logger = logger;
|
|
341
537
|
return cloned;
|
|
342
538
|
}
|
|
343
539
|
};
|
|
@@ -389,8 +585,7 @@ function aguiMessagesToLangChain(messages) {
|
|
|
389
585
|
id: message.id
|
|
390
586
|
};
|
|
391
587
|
default:
|
|
392
|
-
|
|
393
|
-
throw new Error("message role is not supported.");
|
|
588
|
+
throw new Error(`Message role ${message.role} is not supported.`);
|
|
394
589
|
}
|
|
395
590
|
});
|
|
396
591
|
}
|
|
@@ -1078,12 +1273,17 @@ var TDAIStore = class extends import_langgraph3.BaseStore {
|
|
|
1078
1273
|
}
|
|
1079
1274
|
}
|
|
1080
1275
|
};
|
|
1276
|
+
|
|
1277
|
+
// src/index.ts
|
|
1278
|
+
var import_agent_shared2 = require("@cloudbase/agent-shared");
|
|
1081
1279
|
// Annotate the CommonJS export names for ESM import in node:
|
|
1082
1280
|
0 && (module.exports = {
|
|
1083
1281
|
ClientPropertiesAnnotation,
|
|
1084
1282
|
ClientStateAnnotation,
|
|
1085
1283
|
LanggraphAgent,
|
|
1086
1284
|
TDAISaver,
|
|
1087
|
-
TDAIStore
|
|
1285
|
+
TDAIStore,
|
|
1286
|
+
createConsoleLogger,
|
|
1287
|
+
noopLogger
|
|
1088
1288
|
});
|
|
1089
1289
|
//# sourceMappingURL=index.js.map
|