@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.
- package/CHANGELOG.md +5 -4
- package/__snapshots__/schema/schema.graphql +10 -7
- package/dist/{chunk-FVYNRYIB.mjs → chunk-5KJYPVQJ.mjs} +307 -423
- package/dist/chunk-5KJYPVQJ.mjs.map +1 -0
- package/dist/{chunk-RFF5IIZJ.mjs → chunk-B74M7FXG.mjs} +2 -3
- package/dist/chunk-B74M7FXG.mjs.map +1 -0
- package/dist/{chunk-BACNNHHI.mjs → chunk-CGGI46KC.mjs} +2 -2
- package/dist/{chunk-YFG3Q3YH.mjs → chunk-EU52BTKR.mjs} +2 -2
- package/dist/{chunk-MQJNZYAH.mjs → chunk-KO4QCMY4.mjs} +2 -2
- package/dist/{chunk-2PK2SFRB.mjs → chunk-W7GP2EOT.mjs} +106 -221
- package/dist/chunk-W7GP2EOT.mjs.map +1 -0
- package/dist/{copilot-runtime-b15b683d.d.ts → copilot-runtime-1c5bf72b.d.ts} +2 -2
- package/dist/graphql/types/converted/index.d.ts +1 -1
- package/dist/graphql/types/converted/index.js +1 -2
- package/dist/graphql/types/converted/index.js.map +1 -1
- package/dist/graphql/types/converted/index.mjs +1 -1
- package/dist/{groq-adapter-50aa9621.d.ts → groq-adapter-b6a40422.d.ts} +1 -1
- package/dist/{index-ff3fbc33.d.ts → index-10b1c870.d.ts} +8 -7
- package/dist/index.d.ts +5 -5
- package/dist/index.js +515 -745
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +10 -6
- package/dist/index.mjs.map +1 -1
- package/dist/{langserve-8ec29cba.d.ts → langserve-6245df39.d.ts} +14 -52
- package/dist/lib/index.d.ts +4 -4
- package/dist/lib/index.js +442 -706
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/index.mjs +6 -6
- package/dist/lib/integrations/index.d.ts +4 -4
- package/dist/lib/integrations/index.js +37 -71
- package/dist/lib/integrations/index.js.map +1 -1
- package/dist/lib/integrations/index.mjs +6 -6
- package/dist/lib/integrations/nest/index.d.ts +3 -3
- package/dist/lib/integrations/nest/index.js +37 -71
- package/dist/lib/integrations/nest/index.js.map +1 -1
- package/dist/lib/integrations/nest/index.mjs +4 -4
- package/dist/lib/integrations/node-express/index.d.ts +3 -3
- package/dist/lib/integrations/node-express/index.js +37 -71
- package/dist/lib/integrations/node-express/index.js.map +1 -1
- package/dist/lib/integrations/node-express/index.mjs +4 -4
- package/dist/lib/integrations/node-http/index.d.ts +3 -3
- package/dist/lib/integrations/node-http/index.js +37 -71
- package/dist/lib/integrations/node-http/index.js.map +1 -1
- package/dist/lib/integrations/node-http/index.mjs +3 -3
- package/dist/service-adapters/index.d.ts +36 -5
- package/dist/service-adapters/index.js +106 -219
- package/dist/service-adapters/index.js.map +1 -1
- package/dist/service-adapters/index.mjs +5 -1
- package/package.json +2 -2
- package/src/agents/langgraph/event-source.ts +148 -140
- package/src/agents/langgraph/events.ts +1 -1
- package/src/graphql/inputs/forwarded-parameters.input.ts +3 -0
- package/src/graphql/inputs/message.input.ts +3 -15
- package/src/graphql/resolvers/copilot.resolver.ts +6 -32
- package/src/graphql/types/converted/index.ts +3 -4
- package/src/graphql/types/copilot-response.type.ts +3 -12
- package/src/graphql/types/enums.ts +11 -0
- package/src/lib/runtime/remote-action-constructors.ts +62 -60
- package/src/lib/runtime/remote-actions.ts +0 -1
- package/src/lib/runtime/remote-lg-action.ts +140 -161
- package/src/service-adapters/anthropic/anthropic-adapter.ts +6 -16
- package/src/service-adapters/conversion.ts +1 -2
- package/src/service-adapters/events.ts +52 -111
- package/src/service-adapters/experimental/empty/empty-adapter.ts +33 -0
- package/src/service-adapters/experimental/ollama/ollama-adapter.ts +3 -7
- package/src/service-adapters/groq/groq-adapter.ts +8 -23
- package/src/service-adapters/index.ts +7 -1
- package/src/service-adapters/langchain/utils.ts +31 -49
- package/src/service-adapters/openai/openai-adapter.ts +9 -22
- package/src/service-adapters/openai/openai-assistant-adapter.ts +8 -22
- package/src/service-adapters/unify/unify-adapter.ts +11 -28
- package/dist/chunk-2PK2SFRB.mjs.map +0 -1
- package/dist/chunk-FVYNRYIB.mjs.map +0 -1
- package/dist/chunk-RFF5IIZJ.mjs.map +0 -1
- /package/dist/{chunk-BACNNHHI.mjs.map → chunk-CGGI46KC.mjs.map} +0 -0
- /package/dist/{chunk-YFG3Q3YH.mjs.map → chunk-EU52BTKR.mjs.map} +0 -0
- /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
|
|
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:
|
|
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 =
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
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
|
-
|
|
192
|
-
method: "POST",
|
|
193
|
-
headers,
|
|
194
|
-
body: JSON.stringify({
|
|
169
|
+
langGraphAgentHandler: async ({
|
|
195
170
|
name,
|
|
171
|
+
actionInputsWithoutAgents,
|
|
196
172
|
threadId,
|
|
197
173
|
nodeName,
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
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
|
}
|
|
@@ -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 {
|
|
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 =
|
|
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
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
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:
|
|
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
|
|
474
|
-
const existingMessageIds = new Set(
|
|
475
|
-
const
|
|
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
|
-
|
|
487
|
-
|
|
488
|
-
|
|
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
|
-
|
|
501
|
-
if (
|
|
502
|
-
|
|
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
|
-
|
|
505
|
-
|
|
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.
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
}
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
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
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
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
|
-
|
|
528
|
+
// try to auto-correct and log alignment issues
|
|
529
|
+
const correctedMessages: LangGraphPlatformMessage[] = [];
|
|
556
530
|
|
|
557
|
-
for (
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
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
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
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
|
-
|
|
579
|
-
|
|
580
|
-
|
|
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
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
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
|
-
|
|
608
|
-
|
|
609
|
-
|
|
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
|
-
|
|
612
|
-
|
|
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
|
-
|
|
584
|
+
correctedMessages.push(currentMessage);
|
|
585
|
+
continue;
|
|
586
|
+
}
|
|
617
587
|
|
|
618
|
-
|
|
619
|
-
|
|
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
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
591
|
+
return {
|
|
592
|
+
...state,
|
|
593
|
+
messages: correctedMessages,
|
|
594
|
+
copilotkit: {
|
|
595
|
+
actions,
|
|
596
|
+
},
|
|
597
|
+
};
|
|
598
|
+
}
|
|
630
599
|
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
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:
|
|
620
|
+
tool_calls: [toolCall],
|
|
636
621
|
role: MessageRole.assistant,
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
continue;
|
|
622
|
+
id: message.id,
|
|
623
|
+
} satisfies LangGraphPlatformActionExecutionMessage;
|
|
640
624
|
}
|
|
641
|
-
|
|
642
|
-
// Handle ResultMessage
|
|
643
625
|
if (message.isResultMessage()) {
|
|
644
|
-
|
|
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(
|
|
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(
|
|
142
|
+
eventStream$.sendTextMessageEnd();
|
|
153
143
|
}
|
|
154
144
|
} else if (mode === "function") {
|
|
155
|
-
eventStream$.sendActionExecutionEnd(
|
|
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
|
-
|
|
31
|
+
scope: message.actionExecutionMessage.scope,
|
|
33
32
|
}),
|
|
34
33
|
);
|
|
35
34
|
} else if (message.resultMessage) {
|