@copilotkit/runtime 1.4.8-coagents-v0-3.1 → 1.4.8-next.1

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 (77) hide show
  1. package/CHANGELOG.md +5 -4
  2. package/__snapshots__/schema/schema.graphql +10 -7
  3. package/dist/{chunk-FVYNRYIB.mjs → chunk-5KJYPVQJ.mjs} +307 -423
  4. package/dist/chunk-5KJYPVQJ.mjs.map +1 -0
  5. package/dist/{chunk-RFF5IIZJ.mjs → chunk-B74M7FXG.mjs} +2 -3
  6. package/dist/chunk-B74M7FXG.mjs.map +1 -0
  7. package/dist/{chunk-BACNNHHI.mjs → chunk-CGGI46KC.mjs} +2 -2
  8. package/dist/{chunk-YFG3Q3YH.mjs → chunk-EU52BTKR.mjs} +2 -2
  9. package/dist/{chunk-MQJNZYAH.mjs → chunk-KO4QCMY4.mjs} +2 -2
  10. package/dist/{chunk-2PK2SFRB.mjs → chunk-W7GP2EOT.mjs} +106 -221
  11. package/dist/chunk-W7GP2EOT.mjs.map +1 -0
  12. package/dist/{copilot-runtime-b15b683d.d.ts → copilot-runtime-1c5bf72b.d.ts} +2 -2
  13. package/dist/graphql/types/converted/index.d.ts +1 -1
  14. package/dist/graphql/types/converted/index.js +1 -2
  15. package/dist/graphql/types/converted/index.js.map +1 -1
  16. package/dist/graphql/types/converted/index.mjs +1 -1
  17. package/dist/{groq-adapter-50aa9621.d.ts → groq-adapter-b6a40422.d.ts} +1 -1
  18. package/dist/{index-ff3fbc33.d.ts → index-10b1c870.d.ts} +8 -7
  19. package/dist/index.d.ts +5 -5
  20. package/dist/index.js +515 -745
  21. package/dist/index.js.map +1 -1
  22. package/dist/index.mjs +10 -6
  23. package/dist/index.mjs.map +1 -1
  24. package/dist/{langserve-8ec29cba.d.ts → langserve-6245df39.d.ts} +14 -52
  25. package/dist/lib/index.d.ts +4 -4
  26. package/dist/lib/index.js +442 -706
  27. package/dist/lib/index.js.map +1 -1
  28. package/dist/lib/index.mjs +6 -6
  29. package/dist/lib/integrations/index.d.ts +4 -4
  30. package/dist/lib/integrations/index.js +37 -71
  31. package/dist/lib/integrations/index.js.map +1 -1
  32. package/dist/lib/integrations/index.mjs +6 -6
  33. package/dist/lib/integrations/nest/index.d.ts +3 -3
  34. package/dist/lib/integrations/nest/index.js +37 -71
  35. package/dist/lib/integrations/nest/index.js.map +1 -1
  36. package/dist/lib/integrations/nest/index.mjs +4 -4
  37. package/dist/lib/integrations/node-express/index.d.ts +3 -3
  38. package/dist/lib/integrations/node-express/index.js +37 -71
  39. package/dist/lib/integrations/node-express/index.js.map +1 -1
  40. package/dist/lib/integrations/node-express/index.mjs +4 -4
  41. package/dist/lib/integrations/node-http/index.d.ts +3 -3
  42. package/dist/lib/integrations/node-http/index.js +37 -71
  43. package/dist/lib/integrations/node-http/index.js.map +1 -1
  44. package/dist/lib/integrations/node-http/index.mjs +3 -3
  45. package/dist/service-adapters/index.d.ts +36 -5
  46. package/dist/service-adapters/index.js +106 -219
  47. package/dist/service-adapters/index.js.map +1 -1
  48. package/dist/service-adapters/index.mjs +5 -1
  49. package/package.json +2 -2
  50. package/src/agents/langgraph/event-source.ts +148 -140
  51. package/src/agents/langgraph/events.ts +1 -1
  52. package/src/graphql/inputs/forwarded-parameters.input.ts +3 -0
  53. package/src/graphql/inputs/message.input.ts +3 -15
  54. package/src/graphql/resolvers/copilot.resolver.ts +6 -32
  55. package/src/graphql/types/converted/index.ts +3 -4
  56. package/src/graphql/types/copilot-response.type.ts +3 -12
  57. package/src/graphql/types/enums.ts +11 -0
  58. package/src/lib/runtime/remote-action-constructors.ts +62 -60
  59. package/src/lib/runtime/remote-actions.ts +0 -1
  60. package/src/lib/runtime/remote-lg-action.ts +140 -161
  61. package/src/service-adapters/anthropic/anthropic-adapter.ts +6 -16
  62. package/src/service-adapters/conversion.ts +1 -2
  63. package/src/service-adapters/events.ts +52 -111
  64. package/src/service-adapters/experimental/empty/empty-adapter.ts +33 -0
  65. package/src/service-adapters/experimental/ollama/ollama-adapter.ts +3 -7
  66. package/src/service-adapters/groq/groq-adapter.ts +8 -23
  67. package/src/service-adapters/index.ts +7 -1
  68. package/src/service-adapters/langchain/utils.ts +31 -49
  69. package/src/service-adapters/openai/openai-adapter.ts +9 -22
  70. package/src/service-adapters/openai/openai-assistant-adapter.ts +8 -22
  71. package/src/service-adapters/unify/unify-adapter.ts +11 -28
  72. package/dist/chunk-2PK2SFRB.mjs.map +0 -1
  73. package/dist/chunk-FVYNRYIB.mjs.map +0 -1
  74. package/dist/chunk-RFF5IIZJ.mjs.map +0 -1
  75. /package/dist/{chunk-BACNNHHI.mjs.map → chunk-CGGI46KC.mjs.map} +0 -0
  76. /package/dist/{chunk-YFG3Q3YH.mjs.map → chunk-EU52BTKR.mjs.map} +0 -0
  77. /package/dist/{chunk-MQJNZYAH.mjs.map → chunk-KO4QCMY4.mjs.map} +0 -0
@@ -40,7 +40,6 @@ export function constructLGCRemoteAction({
40
40
  actionInputsWithoutAgents,
41
41
  threadId,
42
42
  nodeName,
43
- additionalMessages = [],
44
43
  }: LangGraphAgentHandlerParams): Promise<Observable<RuntimeEvent>> => {
45
44
  logger.debug({ actionName: agent.name }, "Executing LangGraph Platform agent");
46
45
 
@@ -67,7 +66,7 @@ export function constructLGCRemoteAction({
67
66
  agent,
68
67
  threadId,
69
68
  nodeName,
70
- messages: [...messages, ...additionalMessages],
69
+ messages,
71
70
  state,
72
71
  properties: graphqlContext.properties,
73
72
  actions: actionInputsWithoutAgents.map((action) => ({
@@ -110,6 +109,8 @@ export function constructRemoteActions({
110
109
  messages: Message[];
111
110
  agentStates?: AgentStateInput[];
112
111
  }): Action<any>[] {
112
+ const totalAgents = Array.isArray(json["agents"]) ? json["agents"].length : 0;
113
+
113
114
  const actions = json["actions"].map((action) => ({
114
115
  name: action.name,
115
116
  description: action.description,
@@ -121,7 +122,7 @@ export function constructRemoteActions({
121
122
  telemetry.capture("oss.runtime.remote_action_executed", {
122
123
  agentExecution: false,
123
124
  type: "self-hosted",
124
- agentsAmount: json["agents"].length,
125
+ agentsAmount: totalAgents,
125
126
  });
126
127
 
127
128
  try {
@@ -158,67 +159,68 @@ export function constructRemoteActions({
158
159
  },
159
160
  }));
160
161
 
161
- const agents = json["agents"].map((agent) => ({
162
- name: agent.name,
163
- description: agent.description,
164
- parameters: [],
165
- handler: async (_args: any) => {},
166
-
167
- langGraphAgentHandler: async ({
168
- name,
169
- actionInputsWithoutAgents,
170
- threadId,
171
- nodeName,
172
- additionalMessages = [],
173
- }: LangGraphAgentHandlerParams): Promise<Observable<RuntimeEvent>> => {
174
- logger.debug({ actionName: agent.name }, "Executing remote agent");
175
-
176
- const headers = createHeaders(onBeforeRequest, graphqlContext);
177
- telemetry.capture("oss.runtime.remote_action_executed", {
178
- agentExecution: true,
179
- type: "self-hosted",
180
- agentsAmount: json["agents"].length,
181
- });
182
-
183
- let state = {};
184
- if (agentStates) {
185
- const jsonState = agentStates.find((state) => state.agentName === name)?.state;
186
- if (jsonState) {
187
- state = JSON.parse(jsonState);
188
- }
189
- }
162
+ const agents = totalAgents
163
+ ? json["agents"].map((agent) => ({
164
+ name: agent.name,
165
+ description: agent.description,
166
+ parameters: [],
167
+ handler: async (_args: any) => {},
190
168
 
191
- const response = await fetch(`${url}/agents/execute`, {
192
- method: "POST",
193
- headers,
194
- body: JSON.stringify({
169
+ langGraphAgentHandler: async ({
195
170
  name,
171
+ actionInputsWithoutAgents,
196
172
  threadId,
197
173
  nodeName,
198
- messages: [...messages, ...additionalMessages],
199
- state,
200
- properties: graphqlContext.properties,
201
- actions: actionInputsWithoutAgents.map((action) => ({
202
- name: action.name,
203
- description: action.description,
204
- parameters: JSON.parse(action.jsonSchema),
205
- })),
206
- }),
207
- });
208
-
209
- if (!response.ok) {
210
- logger.error(
211
- { url, status: response.status, body: await response.text() },
212
- "Failed to execute remote agent",
213
- );
214
- throw new Error("Failed to execute remote agent");
215
- }
216
-
217
- const eventSource = new RemoteLangGraphEventSource();
218
- streamResponse(response.body!, eventSource.eventStream$);
219
- return eventSource.processLangGraphEvents();
220
- },
221
- }));
174
+ }: LangGraphAgentHandlerParams): Promise<Observable<RuntimeEvent>> => {
175
+ logger.debug({ actionName: agent.name }, "Executing remote agent");
176
+
177
+ const headers = createHeaders(onBeforeRequest, graphqlContext);
178
+ telemetry.capture("oss.runtime.remote_action_executed", {
179
+ agentExecution: true,
180
+ type: "self-hosted",
181
+ agentsAmount: json["agents"].length,
182
+ });
183
+
184
+ let state = {};
185
+ if (agentStates) {
186
+ const jsonState = agentStates.find((state) => state.agentName === name)?.state;
187
+ if (jsonState) {
188
+ state = JSON.parse(jsonState);
189
+ }
190
+ }
191
+
192
+ const response = await fetch(`${url}/agents/execute`, {
193
+ method: "POST",
194
+ headers,
195
+ body: JSON.stringify({
196
+ name,
197
+ threadId,
198
+ nodeName,
199
+ messages,
200
+ state,
201
+ properties: graphqlContext.properties,
202
+ actions: actionInputsWithoutAgents.map((action) => ({
203
+ name: action.name,
204
+ description: action.description,
205
+ parameters: JSON.parse(action.jsonSchema),
206
+ })),
207
+ }),
208
+ });
209
+
210
+ if (!response.ok) {
211
+ logger.error(
212
+ { url, status: response.status, body: await response.text() },
213
+ "Failed to execute remote agent",
214
+ );
215
+ throw new Error("Failed to execute remote agent");
216
+ }
217
+
218
+ const eventSource = new RemoteLangGraphEventSource();
219
+ streamResponse(response.body!, eventSource.eventStream$);
220
+ return eventSource.processLangGraphEvents();
221
+ },
222
+ }))
223
+ : [];
222
224
 
223
225
  return [...actions, ...agents];
224
226
  }
@@ -53,7 +53,6 @@ export type LangGraphAgentHandlerParams = {
53
53
  actionInputsWithoutAgents: ActionInput[];
54
54
  threadId?: string;
55
55
  nodeName?: string;
56
- additionalMessages?: Message[];
57
56
  };
58
57
 
59
58
  export type LangGraphAgentAction = Action<any> & {
@@ -5,7 +5,7 @@ import { Logger } from "pino";
5
5
  import { ActionInput } from "../../graphql/inputs/action.input";
6
6
  import { LangGraphPlatformAgent, LangGraphPlatformEndpoint } from "./remote-actions";
7
7
  import { CopilotRequestContextProperties } from "../integrations";
8
- import { ActionExecutionMessage, Message, MessageType } from "../../graphql/types/converted";
8
+ import { Message, MessageType } from "../../graphql/types/converted";
9
9
  import { MessageRole } from "../../graphql/types/enums";
10
10
  import { CustomEventNames, LangGraphEventTypes } from "../../agents/langgraph/events";
11
11
  import telemetry from "../telemetry-client";
@@ -112,7 +112,7 @@ async function streamEvents(controller: ReadableStreamDefaultController, args: E
112
112
  const mode = wasInitiatedWithExistingThread && nodeName != "__end__" ? "continue" : "start";
113
113
  let formattedMessages = [];
114
114
  try {
115
- formattedMessages = copilotkitMessagesToLangChain(messages);
115
+ formattedMessages = formatMessages(messages);
116
116
  } catch (e) {
117
117
  logger.error(e, `Error event thrown: ${e.message}`);
118
118
  }
@@ -319,7 +319,6 @@ async function streamEvents(controller: ReadableStreamDefaultController, args: E
319
319
  state: state.values,
320
320
  running: !shouldExit,
321
321
  active: false,
322
- includeMessages: true,
323
322
  }),
324
323
  );
325
324
 
@@ -342,7 +341,6 @@ function getStateSyncEvent({
342
341
  state,
343
342
  running,
344
343
  active,
345
- includeMessages = false,
346
344
  }: {
347
345
  threadId: string;
348
346
  runId: string;
@@ -351,21 +349,13 @@ function getStateSyncEvent({
351
349
  state: State;
352
350
  running: boolean;
353
351
  active: boolean;
354
- includeMessages?: boolean;
355
352
  }): string {
356
- if (!includeMessages) {
357
- state = Object.keys(state).reduce((acc, key) => {
358
- if (key !== "messages") {
359
- acc[key] = state[key];
360
- }
361
- return acc;
362
- }, {} as State);
363
- } else {
364
- state = {
365
- ...state,
366
- messages: langchainMessagesToCopilotKit(state.messages || []),
367
- };
368
- }
353
+ const stateWithoutMessages = Object.keys(state).reduce((acc, key) => {
354
+ if (key !== "messages") {
355
+ acc[key] = state[key];
356
+ }
357
+ return acc;
358
+ }, {} as State);
369
359
 
370
360
  return (
371
361
  JSON.stringify({
@@ -375,7 +365,7 @@ function getStateSyncEvent({
375
365
  agent_name: agentName,
376
366
  node_name: nodeName,
377
367
  active: active,
378
- state: state,
368
+ state: stateWithoutMessages,
379
369
  running: running,
380
370
  role: "assistant",
381
371
  }) + "\n"
@@ -470,190 +460,179 @@ function langGraphDefaultMergeState(
470
460
  }
471
461
 
472
462
  // merge with existing messages
473
- const existingMessages: LangGraphPlatformMessage[] = state.messages || [];
474
- const existingMessageIds = new Set(existingMessages.map((message) => message.id));
475
- const newMessages = messages.filter((message) => !existingMessageIds.has(message.id));
476
-
477
- return {
478
- ...state,
479
- messages: newMessages,
480
- copilotkit: {
481
- actions,
482
- },
483
- };
484
- }
463
+ const mergedMessages: LangGraphPlatformMessage[] = state.messages || [];
464
+ const existingMessageIds = new Set(mergedMessages.map((message) => message.id));
465
+ const existingToolCallResults = new Set<string>();
485
466
 
486
- function langchainMessagesToCopilotKit(messages: any[]): any[] {
487
- const result: any[] = [];
488
- const tool_call_names: Record<string, string> = {};
489
-
490
- // First pass: gather all tool call names from AI messages
491
- for (const message of messages) {
492
- if (message.type === "ai") {
493
- for (const tool_call of message.tool_calls) {
494
- tool_call_names[tool_call.id] = tool_call.name;
495
- }
467
+ for (const message of mergedMessages) {
468
+ if ("tool_call_id" in message) {
469
+ existingToolCallResults.add(message.tool_call_id);
496
470
  }
497
471
  }
498
472
 
499
473
  for (const message of messages) {
500
- let content: any = message.content;
501
- if (content instanceof Array) {
502
- content = content[0];
474
+ // filter tool calls to activate the agent itself
475
+ if (
476
+ "tool_calls" in message &&
477
+ message.tool_calls.length > 0 &&
478
+ message.tool_calls[0].name === agentName
479
+ ) {
480
+ continue;
503
481
  }
504
- if (content instanceof Object) {
505
- content = content.text;
482
+
483
+ // filter results from activating the agent
484
+ if ("name" in message && message.name === agentName) {
485
+ continue;
506
486
  }
507
487
 
508
- if (message.type === "human") {
509
- result.push({
510
- role: "user",
511
- content: content,
512
- id: message.id,
513
- });
514
- } else if (message.type === "system") {
515
- result.push({
516
- role: "system",
517
- content: content,
518
- id: message.id,
519
- });
520
- } else if (message.type === "ai") {
521
- if (message.tool_calls && message.tool_calls.length > 0) {
522
- for (const tool_call of message.tool_calls) {
523
- result.push({
524
- id: tool_call.id,
525
- name: tool_call.name,
526
- arguments: tool_call.args,
527
- parentMessageId: message.id,
528
- });
488
+ if (!existingMessageIds.has(message.id)) {
489
+ // skip duplicate tool call results
490
+ if ("tool_call_id" in message && existingToolCallResults.has(message.tool_call_id)) {
491
+ console.warn("Warning: Duplicate tool call result, skipping:", message.tool_call_id);
492
+ continue;
493
+ }
494
+
495
+ mergedMessages.push(message);
496
+ } else {
497
+ // Replace the message with the existing one
498
+ for (let i = 0; i < mergedMessages.length; i++) {
499
+ if (mergedMessages[i].id === message.id && message.role === "assistant") {
500
+ if (
501
+ ("tool_calls" in mergedMessages[i] || "additional_kwargs" in mergedMessages[i]) &&
502
+ mergedMessages[i].content
503
+ ) {
504
+ // @ts-expect-error -- message did not have a tool call, now it will
505
+ message.tool_calls = mergedMessages[i]["tool_calls"];
506
+ message.additional_kwargs = mergedMessages[i].additional_kwargs;
507
+ }
508
+ mergedMessages[i] = message;
529
509
  }
530
- } else {
531
- result.push({
532
- role: "assistant",
533
- content: content,
534
- id: message.id,
535
- parentMessageId: message.id,
536
- });
537
510
  }
538
- } else if (message.type === "tool") {
539
- const actionName = tool_call_names[message.tool_call_id] || message.name || "";
540
- result.push({
541
- actionExecutionId: message.tool_call_id,
542
- actionName: actionName,
543
- result: content,
544
- id: message.id,
545
- });
546
511
  }
547
512
  }
548
- const resultsDict: Record<string, any> = {};
549
- for (const msg of result) {
550
- if (msg.actionExecutionId) {
551
- resultsDict[msg.actionExecutionId] = msg;
513
+
514
+ // fix wrong tool call ids
515
+ for (let i = 0; i < mergedMessages.length - 1; i++) {
516
+ const currentMessage = mergedMessages[i];
517
+ const nextMessage = mergedMessages[i + 1];
518
+
519
+ if (
520
+ "tool_calls" in currentMessage &&
521
+ currentMessage.tool_calls.length > 0 &&
522
+ "tool_call_id" in nextMessage
523
+ ) {
524
+ nextMessage.tool_call_id = currentMessage.tool_calls[0].id;
552
525
  }
553
526
  }
554
527
 
555
- const reorderedResult: Message[] = [];
528
+ // try to auto-correct and log alignment issues
529
+ const correctedMessages: LangGraphPlatformMessage[] = [];
556
530
 
557
- for (const msg of result) {
558
- // If it's not a tool result, just append it
559
- if (!("actionExecutionId" in msg)) {
560
- reorderedResult.push(msg);
561
- }
531
+ for (let i = 0; i < mergedMessages.length; i++) {
532
+ const currentMessage = mergedMessages[i];
533
+ const nextMessage = mergedMessages[i + 1] || null;
534
+ const prevMessage = mergedMessages[i - 1] || null;
562
535
 
563
- // If the message has arguments (i.e., is a tool call invocation),
564
- // append the corresponding result right after it
565
- if ("arguments" in msg) {
566
- const msgId = msg.id;
567
- if (msgId in resultsDict) {
568
- reorderedResult.push(resultsDict[msgId]);
569
- } else {
570
- console.warn("Tool call result message not found for id:", msgId);
536
+ if ("tool_calls" in currentMessage && currentMessage.tool_calls.length > 0) {
537
+ if (!nextMessage) {
538
+ console.warn(
539
+ "No next message to auto-correct tool call, skipping:",
540
+ currentMessage.tool_calls[0].id,
541
+ );
542
+ continue;
571
543
  }
572
- }
573
- }
574
-
575
- return reorderedResult;
576
- }
577
544
 
578
- function copilotkitMessagesToLangChain(messages: Message[]): LangGraphPlatformMessage[] {
579
- const result: LangGraphPlatformMessage[] = [];
580
- const processedActionExecutions = new Set<string>();
545
+ if (
546
+ !("tool_call_id" in nextMessage) ||
547
+ nextMessage.tool_call_id !== currentMessage.tool_calls[0].id
548
+ ) {
549
+ const toolMessage = mergedMessages.find(
550
+ (m) => "tool_call_id" in m && m.tool_call_id === currentMessage.tool_calls[0].id,
551
+ );
581
552
 
582
- for (const message of messages) {
583
- // Handle TextMessage
584
- if (message.isTextMessage()) {
585
- if (message.role === "user") {
586
- // Human message
587
- result.push({
588
- ...message,
589
- role: MessageRole.user,
590
- });
591
- } else if (message.role === "system") {
592
- // System message
593
- result.push({
594
- ...message,
595
- role: MessageRole.system,
596
- });
597
- } else if (message.role === "assistant") {
598
- // Assistant message
599
- result.push({
600
- ...message,
601
- role: MessageRole.assistant,
602
- });
553
+ if (toolMessage) {
554
+ console.warn(
555
+ "Auto-corrected tool call alignment issue:",
556
+ currentMessage.tool_calls[0].id,
557
+ );
558
+ correctedMessages.push(currentMessage, toolMessage);
559
+ continue;
560
+ } else {
561
+ console.warn(
562
+ "No corresponding tool call result found for tool call, skipping:",
563
+ currentMessage.tool_calls[0].id,
564
+ );
565
+ continue;
566
+ }
603
567
  }
568
+
569
+ correctedMessages.push(currentMessage);
604
570
  continue;
605
571
  }
606
572
 
607
- // Handle ActionExecutionMessage (multiple tool calls per parentMessageId)
608
- if (message.isActionExecutionMessage()) {
609
- const messageId = message.parentMessageId ?? message.id;
573
+ if ("tool_call_id" in currentMessage) {
574
+ if (!prevMessage || !("tool_calls" in prevMessage)) {
575
+ console.warn("No previous tool call, skipping tool call result:", currentMessage.id);
576
+ continue;
577
+ }
610
578
 
611
- // If we've already processed this action execution group, skip
612
- if (processedActionExecutions.has(messageId)) {
579
+ if (prevMessage.tool_calls && prevMessage.tool_calls[0].id !== currentMessage.tool_call_id) {
580
+ console.warn("Tool call id is incorrect, skipping tool call result:", currentMessage.id);
613
581
  continue;
614
582
  }
615
583
 
616
- processedActionExecutions.add(messageId);
584
+ correctedMessages.push(currentMessage);
585
+ continue;
586
+ }
617
587
 
618
- // Gather all tool calls related to this messageId
619
- const relatedActionExecutions = messages.filter(
620
- (m) =>
621
- m.isActionExecutionMessage() &&
622
- ((m.parentMessageId && m.parentMessageId === messageId) || m.id === messageId),
623
- ) as ActionExecutionMessage[];
588
+ correctedMessages.push(currentMessage);
589
+ }
624
590
 
625
- const tool_calls: ToolCall[] = relatedActionExecutions.map((m) => ({
626
- name: m.name,
627
- args: m.arguments,
628
- id: m.id,
629
- }));
591
+ return {
592
+ ...state,
593
+ messages: correctedMessages,
594
+ copilotkit: {
595
+ actions,
596
+ },
597
+ };
598
+ }
630
599
 
631
- result.push({
632
- id: messageId,
633
- type: "ActionExecutionMessage",
600
+ function formatMessages(messages: Message[]): LangGraphPlatformMessage[] {
601
+ return messages.map((message) => {
602
+ if (message.isTextMessage() && message.role === "assistant") {
603
+ return message;
604
+ }
605
+ if (message.isTextMessage() && message.role === "system") {
606
+ return message;
607
+ }
608
+ if (message.isTextMessage() && message.role === "user") {
609
+ return message;
610
+ }
611
+ if (message.isActionExecutionMessage()) {
612
+ const toolCall: ToolCall = {
613
+ name: message.name,
614
+ args: message.arguments,
615
+ id: message.id,
616
+ };
617
+ return {
618
+ type: message.type,
634
619
  content: "",
635
- tool_calls: tool_calls,
620
+ tool_calls: [toolCall],
636
621
  role: MessageRole.assistant,
637
- } satisfies LangGraphPlatformActionExecutionMessage);
638
-
639
- continue;
622
+ id: message.id,
623
+ } satisfies LangGraphPlatformActionExecutionMessage;
640
624
  }
641
-
642
- // Handle ResultMessage
643
625
  if (message.isResultMessage()) {
644
- result.push({
626
+ return {
645
627
  type: message.type,
646
628
  content: message.result,
647
629
  id: message.id,
648
630
  tool_call_id: message.actionExecutionId,
649
631
  name: message.actionName,
650
632
  role: MessageRole.tool,
651
- } satisfies LangGraphPlatformResultMessage);
652
- continue;
633
+ } satisfies LangGraphPlatformResultMessage;
653
634
  }
654
635
 
655
636
  throw new Error(`Unknown message type ${message.type}`);
656
- }
657
-
658
- return result;
637
+ });
659
638
  }
@@ -120,11 +120,7 @@ export class AnthropicAdapter implements CopilotServiceAdapter {
120
120
  mode = "message";
121
121
  } else if (chunk.content_block.type === "tool_use") {
122
122
  currentToolCallId = chunk.content_block.id;
123
- eventStream$.sendActionExecutionStart({
124
- actionExecutionId: currentToolCallId,
125
- actionName: chunk.content_block.name,
126
- parentMessageId: currentMessageId,
127
- });
123
+ eventStream$.sendActionExecutionStart(currentToolCallId, chunk.content_block.name);
128
124
  mode = "function";
129
125
  }
130
126
  } else if (chunk.type === "content_block_delta") {
@@ -132,27 +128,21 @@ export class AnthropicAdapter implements CopilotServiceAdapter {
132
128
  const text = filterThinkingTextBuffer.onTextChunk(chunk.delta.text);
133
129
  if (text.length > 0) {
134
130
  if (!didOutputText) {
135
- eventStream$.sendTextMessageStart({ messageId: currentMessageId });
131
+ eventStream$.sendTextMessageStart(currentMessageId);
136
132
  didOutputText = true;
137
133
  }
138
- eventStream$.sendTextMessageContent({
139
- messageId: currentMessageId,
140
- content: text,
141
- });
134
+ eventStream$.sendTextMessageContent(text);
142
135
  }
143
136
  } else if (chunk.delta.type === "input_json_delta") {
144
- eventStream$.sendActionExecutionArgs({
145
- actionExecutionId: currentToolCallId,
146
- args: chunk.delta.partial_json,
147
- });
137
+ eventStream$.sendActionExecutionArgs(chunk.delta.partial_json);
148
138
  }
149
139
  } else if (chunk.type === "content_block_stop") {
150
140
  if (mode === "message") {
151
141
  if (didOutputText) {
152
- eventStream$.sendTextMessageEnd({ messageId: currentMessageId });
142
+ eventStream$.sendTextMessageEnd();
153
143
  }
154
144
  } else if (mode === "function") {
155
- eventStream$.sendActionExecutionEnd({ actionExecutionId: currentToolCallId });
145
+ eventStream$.sendActionExecutionEnd();
156
146
  }
157
147
  }
158
148
  }
@@ -19,7 +19,6 @@ export function convertGqlInputToMessages(inputMessages: MessageInput[]): Messag
19
19
  createdAt: message.createdAt,
20
20
  role: message.textMessage.role,
21
21
  content: message.textMessage.content,
22
- parentMessageId: message.textMessage.parentMessageId,
23
22
  }),
24
23
  );
25
24
  } else if (message.actionExecutionMessage) {
@@ -29,7 +28,7 @@ export function convertGqlInputToMessages(inputMessages: MessageInput[]): Messag
29
28
  createdAt: message.createdAt,
30
29
  name: message.actionExecutionMessage.name,
31
30
  arguments: JSON.parse(message.actionExecutionMessage.arguments),
32
- parentMessageId: message.actionExecutionMessage.parentMessageId,
31
+ scope: message.actionExecutionMessage.scope,
33
32
  }),
34
33
  );
35
34
  } else if (message.resultMessage) {