@copilotkit/runtime 0.0.0-0.0.0-max-changeset-10101010101010-20260109191632
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/.eslintrc.js +7 -0
- package/CHANGELOG.md +2905 -0
- package/LICENSE +21 -0
- package/README.md +76 -0
- package/__snapshots__/schema/schema.graphql +371 -0
- package/dist/index.d.ts +1495 -0
- package/dist/index.js +5644 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +5601 -0
- package/dist/index.mjs.map +1 -0
- package/dist/langgraph.d.ts +284 -0
- package/dist/langgraph.js +211 -0
- package/dist/langgraph.js.map +1 -0
- package/dist/langgraph.mjs +206 -0
- package/dist/langgraph.mjs.map +1 -0
- package/dist/v2/index.d.ts +2 -0
- package/dist/v2/index.js +22 -0
- package/dist/v2/index.js.map +1 -0
- package/dist/v2/index.mjs +5 -0
- package/dist/v2/index.mjs.map +1 -0
- package/jest.config.js +10 -0
- package/package.json +143 -0
- package/scripts/generate-gql-schema.ts +13 -0
- package/src/agents/langgraph/event-source.ts +329 -0
- package/src/agents/langgraph/events.ts +377 -0
- package/src/graphql/inputs/action.input.ts +16 -0
- package/src/graphql/inputs/agent-session.input.ts +13 -0
- package/src/graphql/inputs/agent-state.input.ts +13 -0
- package/src/graphql/inputs/cloud-guardrails.input.ts +16 -0
- package/src/graphql/inputs/cloud.input.ts +8 -0
- package/src/graphql/inputs/context-property.input.ts +10 -0
- package/src/graphql/inputs/copilot-context.input.ts +10 -0
- package/src/graphql/inputs/custom-property.input.ts +15 -0
- package/src/graphql/inputs/extensions.input.ts +21 -0
- package/src/graphql/inputs/forwarded-parameters.input.ts +22 -0
- package/src/graphql/inputs/frontend.input.ts +14 -0
- package/src/graphql/inputs/generate-copilot-response.input.ts +59 -0
- package/src/graphql/inputs/load-agent-state.input.ts +10 -0
- package/src/graphql/inputs/message.input.ts +110 -0
- package/src/graphql/inputs/meta-event.input.ts +18 -0
- package/src/graphql/message-conversion/agui-to-gql.test.ts +1263 -0
- package/src/graphql/message-conversion/agui-to-gql.ts +333 -0
- package/src/graphql/message-conversion/gql-to-agui.test.ts +1580 -0
- package/src/graphql/message-conversion/gql-to-agui.ts +278 -0
- package/src/graphql/message-conversion/index.ts +2 -0
- package/src/graphql/message-conversion/roundtrip-conversion.test.ts +526 -0
- package/src/graphql/resolvers/copilot.resolver.ts +708 -0
- package/src/graphql/resolvers/state.resolver.ts +27 -0
- package/src/graphql/types/agents-response.type.ts +19 -0
- package/src/graphql/types/base/index.ts +10 -0
- package/src/graphql/types/converted/index.ts +176 -0
- package/src/graphql/types/copilot-response.type.ts +138 -0
- package/src/graphql/types/enums.ts +38 -0
- package/src/graphql/types/extensions-response.type.ts +23 -0
- package/src/graphql/types/guardrails-result.type.ts +20 -0
- package/src/graphql/types/load-agent-state-response.type.ts +17 -0
- package/src/graphql/types/message-status.type.ts +42 -0
- package/src/graphql/types/meta-events.type.ts +71 -0
- package/src/graphql/types/response-status.type.ts +66 -0
- package/src/index.ts +4 -0
- package/src/langgraph.ts +1 -0
- package/src/lib/cloud/index.ts +4 -0
- package/src/lib/error-messages.ts +200 -0
- package/src/lib/index.ts +52 -0
- package/src/lib/integrations/index.ts +6 -0
- package/src/lib/integrations/nest/index.ts +14 -0
- package/src/lib/integrations/nextjs/app-router.ts +38 -0
- package/src/lib/integrations/nextjs/pages-router.ts +39 -0
- package/src/lib/integrations/node-express/index.ts +14 -0
- package/src/lib/integrations/node-http/index.ts +143 -0
- package/src/lib/integrations/node-http/request-handler.ts +111 -0
- package/src/lib/integrations/shared.ts +161 -0
- package/src/lib/logger.ts +28 -0
- package/src/lib/observability.ts +160 -0
- package/src/lib/runtime/__tests__/copilot-runtime-error.test.ts +169 -0
- package/src/lib/runtime/__tests__/mcp-tools-utils.test.ts +464 -0
- package/src/lib/runtime/agent-integrations/langgraph/agent.ts +209 -0
- package/src/lib/runtime/agent-integrations/langgraph/consts.ts +34 -0
- package/src/lib/runtime/agent-integrations/langgraph/index.ts +2 -0
- package/src/lib/runtime/copilot-runtime.ts +710 -0
- package/src/lib/runtime/mcp-tools-utils.ts +254 -0
- package/src/lib/runtime/retry-utils.ts +96 -0
- package/src/lib/runtime/telemetry-agent-runner.ts +139 -0
- package/src/lib/runtime/types.ts +49 -0
- package/src/lib/runtime/utils.ts +87 -0
- package/src/lib/streaming.ts +202 -0
- package/src/lib/telemetry-client.ts +64 -0
- package/src/service-adapters/anthropic/anthropic-adapter.ts +452 -0
- package/src/service-adapters/anthropic/utils.ts +152 -0
- package/src/service-adapters/bedrock/bedrock-adapter.ts +73 -0
- package/src/service-adapters/conversion.ts +67 -0
- package/src/service-adapters/empty/empty-adapter.ts +38 -0
- package/src/service-adapters/events.ts +294 -0
- package/src/service-adapters/experimental/ollama/ollama-adapter.ts +84 -0
- package/src/service-adapters/google/google-genai-adapter.test.ts +104 -0
- package/src/service-adapters/google/google-genai-adapter.ts +88 -0
- package/src/service-adapters/groq/groq-adapter.ts +203 -0
- package/src/service-adapters/index.ts +18 -0
- package/src/service-adapters/langchain/langchain-adapter.ts +111 -0
- package/src/service-adapters/langchain/langserve.ts +88 -0
- package/src/service-adapters/langchain/types.ts +14 -0
- package/src/service-adapters/langchain/utils.ts +313 -0
- package/src/service-adapters/openai/openai-adapter.ts +283 -0
- package/src/service-adapters/openai/openai-assistant-adapter.ts +344 -0
- package/src/service-adapters/openai/utils.ts +199 -0
- package/src/service-adapters/service-adapter.ts +41 -0
- package/src/service-adapters/shared/error-utils.ts +61 -0
- package/src/service-adapters/shared/index.ts +1 -0
- package/src/service-adapters/unify/unify-adapter.ts +151 -0
- package/src/utils/failed-response-status-reasons.ts +70 -0
- package/src/utils/index.ts +1 -0
- package/src/v2/index.ts +3 -0
- package/tests/global.d.ts +13 -0
- package/tests/service-adapters/anthropic/allowlist-approach.test.ts +226 -0
- package/tests/service-adapters/anthropic/anthropic-adapter.test.ts +389 -0
- package/tests/service-adapters/openai/allowlist-approach.test.ts +238 -0
- package/tests/service-adapters/openai/openai-adapter.test.ts +301 -0
- package/tests/setup.jest.ts +21 -0
- package/tests/tsconfig.json +10 -0
- package/tsconfig.json +13 -0
- package/tsup.config.ts +20 -0
- package/typedoc.json +4 -0
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
import { CopilotKitLowLevelError, isStructuredCopilotKitError } from "@copilotkit/shared";
|
|
2
|
+
import { catchError, mergeMap, ReplaySubject, scan } from "rxjs";
|
|
3
|
+
import { generateHelpfulErrorMessage } from "../../lib/streaming";
|
|
4
|
+
import {
|
|
5
|
+
RuntimeEvent,
|
|
6
|
+
RuntimeEventTypes,
|
|
7
|
+
RuntimeMetaEventName,
|
|
8
|
+
} from "../../service-adapters/events";
|
|
9
|
+
import { CustomEventNames, LangGraphEvent, LangGraphEventTypes } from "./events";
|
|
10
|
+
|
|
11
|
+
interface LangGraphEventWithState {
|
|
12
|
+
event: LangGraphEvent | null;
|
|
13
|
+
|
|
14
|
+
isMessageStart: boolean;
|
|
15
|
+
isMessageEnd: boolean;
|
|
16
|
+
isToolCallStart: boolean;
|
|
17
|
+
isToolCallEnd: boolean;
|
|
18
|
+
isToolCall: boolean;
|
|
19
|
+
|
|
20
|
+
lastMessageId: string | null;
|
|
21
|
+
lastToolCallId: string | null;
|
|
22
|
+
lastToolCallName: string | null;
|
|
23
|
+
currentContent: string | null;
|
|
24
|
+
processedToolCallIds: Set<string>;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export class RemoteLangGraphEventSource {
|
|
28
|
+
public eventStream$ = new ReplaySubject<LangGraphEvent>();
|
|
29
|
+
|
|
30
|
+
private shouldEmitToolCall(
|
|
31
|
+
shouldEmitToolCalls: string | string[] | boolean,
|
|
32
|
+
toolCallName: string,
|
|
33
|
+
) {
|
|
34
|
+
if (typeof shouldEmitToolCalls === "boolean") {
|
|
35
|
+
return shouldEmitToolCalls;
|
|
36
|
+
}
|
|
37
|
+
if (Array.isArray(shouldEmitToolCalls)) {
|
|
38
|
+
return shouldEmitToolCalls.includes(toolCallName);
|
|
39
|
+
}
|
|
40
|
+
return shouldEmitToolCalls === toolCallName;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
private getCurrentContent(event: LangGraphEvent) {
|
|
44
|
+
// @ts-expect-error -- LangGraph Platform implementation stores data outside of kwargs
|
|
45
|
+
const content = event.data?.chunk?.kwargs?.content ?? event.data?.chunk?.content;
|
|
46
|
+
|
|
47
|
+
if (!content) {
|
|
48
|
+
const toolCallChunks = this.getCurrentToolCallChunks(event) ?? [];
|
|
49
|
+
for (const chunk of toolCallChunks) {
|
|
50
|
+
if (chunk.args) {
|
|
51
|
+
return chunk.args;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (typeof content === "string") {
|
|
57
|
+
return content;
|
|
58
|
+
} else if (Array.isArray(content) && content.length > 0) {
|
|
59
|
+
return content[0].text;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
private getCurrentMessageId(event: LangGraphEvent) {
|
|
66
|
+
// @ts-expect-error -- LangGraph Platform implementation stores data outside of kwargs
|
|
67
|
+
return event.data?.chunk?.kwargs?.id ?? event.data?.chunk?.id;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
private getCurrentToolCallChunks(event: LangGraphEvent) {
|
|
71
|
+
// @ts-expect-error -- LangGraph Platform implementation stores data outside of kwargs
|
|
72
|
+
return event.data?.chunk?.kwargs?.tool_call_chunks ?? event.data?.chunk?.tool_call_chunks;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
private getResponseMetadata(event: LangGraphEvent) {
|
|
76
|
+
// @ts-expect-error -- LangGraph Platform implementation stores data outside of kwargs
|
|
77
|
+
return event.data?.chunk?.kwargs?.response_metadata ?? event.data?.chunk?.response_metadata;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
processLangGraphEvents() {
|
|
81
|
+
let lastEventWithState: LangGraphEventWithState | null = null;
|
|
82
|
+
|
|
83
|
+
return this.eventStream$.pipe(
|
|
84
|
+
scan(
|
|
85
|
+
(acc, event) => {
|
|
86
|
+
if (event.event === LangGraphEventTypes.OnChatModelStream) {
|
|
87
|
+
const prevMessageId = acc.lastMessageId;
|
|
88
|
+
acc.currentContent = this.getCurrentContent(event);
|
|
89
|
+
acc.lastMessageId = this.getCurrentMessageId(event) ?? acc.lastMessageId;
|
|
90
|
+
const toolCallChunks = this.getCurrentToolCallChunks(event) ?? [];
|
|
91
|
+
const responseMetadata = this.getResponseMetadata(event);
|
|
92
|
+
// Check if a given event is a tool call
|
|
93
|
+
const toolCallCheck = toolCallChunks && toolCallChunks.length > 0;
|
|
94
|
+
let isToolCallEnd = responseMetadata?.finish_reason === "tool_calls";
|
|
95
|
+
|
|
96
|
+
acc.isToolCallStart = toolCallChunks.some((chunk: any) => chunk.name && chunk.id);
|
|
97
|
+
acc.isMessageStart = prevMessageId !== acc.lastMessageId && !acc.isToolCallStart;
|
|
98
|
+
|
|
99
|
+
let previousRoundHadToolCall = acc.isToolCall;
|
|
100
|
+
acc.isToolCall = toolCallCheck;
|
|
101
|
+
// Previous "acc.isToolCall" was set but now it won't pass the check, it means the tool call just ended.
|
|
102
|
+
if (previousRoundHadToolCall && !toolCallCheck) {
|
|
103
|
+
isToolCallEnd = true;
|
|
104
|
+
}
|
|
105
|
+
acc.isToolCallEnd = isToolCallEnd;
|
|
106
|
+
acc.isMessageEnd = responseMetadata?.finish_reason === "stop";
|
|
107
|
+
({ name: acc.lastToolCallName, id: acc.lastToolCallId } = toolCallChunks.find(
|
|
108
|
+
(chunk: any) => chunk.name && chunk.id,
|
|
109
|
+
) ?? { name: acc.lastToolCallName, id: acc.lastToolCallId });
|
|
110
|
+
}
|
|
111
|
+
acc.event = event;
|
|
112
|
+
lastEventWithState = acc; // Capture the state
|
|
113
|
+
return acc;
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
event: null,
|
|
117
|
+
isMessageStart: false,
|
|
118
|
+
isMessageEnd: false,
|
|
119
|
+
isToolCallStart: false,
|
|
120
|
+
isToolCallEnd: false,
|
|
121
|
+
isToolCall: false,
|
|
122
|
+
lastMessageId: null,
|
|
123
|
+
lastToolCallId: null,
|
|
124
|
+
lastToolCallName: null,
|
|
125
|
+
currentContent: null,
|
|
126
|
+
processedToolCallIds: new Set<string>(),
|
|
127
|
+
} as LangGraphEventWithState,
|
|
128
|
+
),
|
|
129
|
+
mergeMap((acc): RuntimeEvent[] => {
|
|
130
|
+
const events: RuntimeEvent[] = [];
|
|
131
|
+
|
|
132
|
+
let shouldEmitMessages = true;
|
|
133
|
+
let shouldEmitToolCalls: string | string[] | boolean = true;
|
|
134
|
+
|
|
135
|
+
if (acc.event.event == LangGraphEventTypes.OnChatModelStream) {
|
|
136
|
+
if ("copilotkit:emit-tool-calls" in (acc.event.metadata || {})) {
|
|
137
|
+
shouldEmitToolCalls = acc.event.metadata["copilotkit:emit-tool-calls"];
|
|
138
|
+
}
|
|
139
|
+
if ("copilotkit:emit-messages" in (acc.event.metadata || {})) {
|
|
140
|
+
shouldEmitMessages = acc.event.metadata["copilotkit:emit-messages"];
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
if (acc.event.event === LangGraphEventTypes.OnInterrupt) {
|
|
145
|
+
events.push({
|
|
146
|
+
type: RuntimeEventTypes.MetaEvent,
|
|
147
|
+
name: RuntimeMetaEventName.LangGraphInterruptEvent,
|
|
148
|
+
value: acc.event.value,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
if (acc.event.event === LangGraphEventTypes.OnCopilotKitInterrupt) {
|
|
152
|
+
events.push({
|
|
153
|
+
type: RuntimeEventTypes.MetaEvent,
|
|
154
|
+
name: RuntimeMetaEventName.CopilotKitLangGraphInterruptEvent,
|
|
155
|
+
data: acc.event.data,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Handle CopilotKit error events with preserved semantic information
|
|
160
|
+
if (acc.event.event === LangGraphEventTypes.OnCopilotKitError) {
|
|
161
|
+
const errorData = acc.event.data.error;
|
|
162
|
+
|
|
163
|
+
// Create a structured error with the original semantic information
|
|
164
|
+
const preservedError = new CopilotKitLowLevelError({
|
|
165
|
+
error: new Error(errorData.message),
|
|
166
|
+
url: "langgraph agent",
|
|
167
|
+
message: `${errorData.type}: ${errorData.message}`,
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
// Add additional error context to the error object
|
|
171
|
+
if (errorData.status_code) {
|
|
172
|
+
(preservedError as any).statusCode = errorData.status_code;
|
|
173
|
+
}
|
|
174
|
+
if (errorData.response_data) {
|
|
175
|
+
(preservedError as any).responseData = errorData.response_data;
|
|
176
|
+
}
|
|
177
|
+
(preservedError as any).agentName = errorData.agent_name;
|
|
178
|
+
(preservedError as any).originalErrorType = errorData.type;
|
|
179
|
+
|
|
180
|
+
// Throw the structured error to be handled by the catchError operator
|
|
181
|
+
throw preservedError;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
const responseMetadata = this.getResponseMetadata(acc.event);
|
|
185
|
+
|
|
186
|
+
// Tool call ended: emit ActionExecutionEnd
|
|
187
|
+
if (
|
|
188
|
+
acc.isToolCallEnd &&
|
|
189
|
+
this.shouldEmitToolCall(shouldEmitToolCalls, acc.lastToolCallName) &&
|
|
190
|
+
acc.lastToolCallId &&
|
|
191
|
+
!acc.processedToolCallIds.has(acc.lastToolCallId)
|
|
192
|
+
) {
|
|
193
|
+
acc.processedToolCallIds.add(acc.lastToolCallId);
|
|
194
|
+
|
|
195
|
+
events.push({
|
|
196
|
+
type: RuntimeEventTypes.ActionExecutionEnd,
|
|
197
|
+
actionExecutionId: acc.lastToolCallId,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// Message ended: emit TextMessageEnd
|
|
202
|
+
else if (responseMetadata?.finish_reason === "stop" && shouldEmitMessages) {
|
|
203
|
+
events.push({
|
|
204
|
+
type: RuntimeEventTypes.TextMessageEnd,
|
|
205
|
+
messageId: acc.lastMessageId,
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
switch (acc.event!.event) {
|
|
210
|
+
//
|
|
211
|
+
// Custom events
|
|
212
|
+
//
|
|
213
|
+
case LangGraphEventTypes.OnCustomEvent:
|
|
214
|
+
//
|
|
215
|
+
// Manually emit a message
|
|
216
|
+
//
|
|
217
|
+
if (acc.event.name === CustomEventNames.CopilotKitManuallyEmitMessage) {
|
|
218
|
+
events.push({
|
|
219
|
+
type: RuntimeEventTypes.TextMessageStart,
|
|
220
|
+
messageId: acc.event.data.message_id,
|
|
221
|
+
});
|
|
222
|
+
events.push({
|
|
223
|
+
type: RuntimeEventTypes.TextMessageContent,
|
|
224
|
+
messageId: acc.event.data.message_id,
|
|
225
|
+
content: acc.event.data.message,
|
|
226
|
+
});
|
|
227
|
+
events.push({
|
|
228
|
+
type: RuntimeEventTypes.TextMessageEnd,
|
|
229
|
+
messageId: acc.event.data.message_id,
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
//
|
|
233
|
+
// Manually emit a tool call
|
|
234
|
+
//
|
|
235
|
+
else if (acc.event.name === CustomEventNames.CopilotKitManuallyEmitToolCall) {
|
|
236
|
+
events.push({
|
|
237
|
+
type: RuntimeEventTypes.ActionExecutionStart,
|
|
238
|
+
actionExecutionId: acc.event.data.id,
|
|
239
|
+
actionName: acc.event.data.name,
|
|
240
|
+
parentMessageId: acc.event.data.id,
|
|
241
|
+
});
|
|
242
|
+
events.push({
|
|
243
|
+
type: RuntimeEventTypes.ActionExecutionArgs,
|
|
244
|
+
actionExecutionId: acc.event.data.id,
|
|
245
|
+
args: JSON.stringify(acc.event.data.args),
|
|
246
|
+
});
|
|
247
|
+
events.push({
|
|
248
|
+
type: RuntimeEventTypes.ActionExecutionEnd,
|
|
249
|
+
actionExecutionId: acc.event.data.id,
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
break;
|
|
253
|
+
case LangGraphEventTypes.OnCopilotKitStateSync:
|
|
254
|
+
events.push({
|
|
255
|
+
type: RuntimeEventTypes.AgentStateMessage,
|
|
256
|
+
threadId: acc.event.thread_id,
|
|
257
|
+
role: acc.event.role,
|
|
258
|
+
agentName: acc.event.agent_name,
|
|
259
|
+
nodeName: acc.event.node_name,
|
|
260
|
+
runId: acc.event.run_id,
|
|
261
|
+
active: acc.event.active,
|
|
262
|
+
state: JSON.stringify(acc.event.state),
|
|
263
|
+
running: acc.event.running,
|
|
264
|
+
});
|
|
265
|
+
break;
|
|
266
|
+
case LangGraphEventTypes.OnChatModelStream:
|
|
267
|
+
if (
|
|
268
|
+
acc.isToolCallStart &&
|
|
269
|
+
this.shouldEmitToolCall(shouldEmitToolCalls, acc.lastToolCallName)
|
|
270
|
+
) {
|
|
271
|
+
events.push({
|
|
272
|
+
type: RuntimeEventTypes.ActionExecutionStart,
|
|
273
|
+
actionExecutionId: acc.lastToolCallId,
|
|
274
|
+
actionName: acc.lastToolCallName,
|
|
275
|
+
parentMessageId: acc.lastMessageId,
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
// Message started: emit TextMessageStart
|
|
279
|
+
else if (acc.isMessageStart && shouldEmitMessages) {
|
|
280
|
+
acc.processedToolCallIds.clear();
|
|
281
|
+
events.push({
|
|
282
|
+
type: RuntimeEventTypes.TextMessageStart,
|
|
283
|
+
messageId: acc.lastMessageId,
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// Tool call args: emit ActionExecutionArgs
|
|
288
|
+
if (
|
|
289
|
+
acc.isToolCall &&
|
|
290
|
+
acc.currentContent &&
|
|
291
|
+
this.shouldEmitToolCall(shouldEmitToolCalls, acc.lastToolCallName)
|
|
292
|
+
) {
|
|
293
|
+
events.push({
|
|
294
|
+
type: RuntimeEventTypes.ActionExecutionArgs,
|
|
295
|
+
actionExecutionId: acc.lastToolCallId,
|
|
296
|
+
args: acc.currentContent,
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
// Message content: emit TextMessageContent
|
|
300
|
+
else if (!acc.isToolCall && acc.currentContent && shouldEmitMessages) {
|
|
301
|
+
events.push({
|
|
302
|
+
type: RuntimeEventTypes.TextMessageContent,
|
|
303
|
+
messageId: acc.lastMessageId,
|
|
304
|
+
content: acc.currentContent,
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
break;
|
|
308
|
+
}
|
|
309
|
+
return events;
|
|
310
|
+
}),
|
|
311
|
+
catchError((error) => {
|
|
312
|
+
// If it's a structured CopilotKitError, re-throw it to be handled by the frontend error system
|
|
313
|
+
if (isStructuredCopilotKitError(error)) {
|
|
314
|
+
throw error;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// Determine a more helpful error message based on context
|
|
318
|
+
let helpfulMessage = generateHelpfulErrorMessage(error, "LangGraph agent connection");
|
|
319
|
+
|
|
320
|
+
// For all other errors, preserve the raw error information in a structured format
|
|
321
|
+
throw new CopilotKitLowLevelError({
|
|
322
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
323
|
+
url: "langgraph event stream",
|
|
324
|
+
message: helpfulMessage,
|
|
325
|
+
});
|
|
326
|
+
}),
|
|
327
|
+
);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
import { ActionExecutionMessage, ResultMessage, TextMessage } from "../../graphql/types/converted";
|
|
2
|
+
|
|
3
|
+
export enum LangGraphEventTypes {
|
|
4
|
+
OnChainStart = "on_chain_start",
|
|
5
|
+
OnChainStream = "on_chain_stream",
|
|
6
|
+
OnChainEnd = "on_chain_end",
|
|
7
|
+
OnChatModelStart = "on_chat_model_start",
|
|
8
|
+
OnChatModelStream = "on_chat_model_stream",
|
|
9
|
+
OnChatModelEnd = "on_chat_model_end",
|
|
10
|
+
OnToolStart = "on_tool_start",
|
|
11
|
+
OnToolEnd = "on_tool_end",
|
|
12
|
+
OnCopilotKitStateSync = "on_copilotkit_state_sync",
|
|
13
|
+
OnCopilotKitEmitMessage = "on_copilotkit_emit_message",
|
|
14
|
+
OnCopilotKitEmitToolCall = "on_copilotkit_emit_tool_call",
|
|
15
|
+
OnCustomEvent = "on_custom_event",
|
|
16
|
+
OnInterrupt = "on_interrupt",
|
|
17
|
+
OnCopilotKitInterrupt = "on_copilotkit_interrupt",
|
|
18
|
+
OnCopilotKitError = "on_copilotkit_error",
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export enum MetaEventNames {
|
|
22
|
+
LangGraphInterruptEvent = "LangGraphInterruptEvent",
|
|
23
|
+
CopilotKitLangGraphInterruptEvent = "CopilotKitLangGraphInterruptEvent",
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export enum CustomEventNames {
|
|
27
|
+
CopilotKitManuallyEmitMessage = "copilotkit_manually_emit_message",
|
|
28
|
+
CopilotKitManuallyEmitToolCall = "copilotkit_manually_emit_tool_call",
|
|
29
|
+
CopilotKitManuallyEmitIntermediateState = "copilotkit_manually_emit_intermediate_state",
|
|
30
|
+
CopilotKitExit = "copilotkit_exit",
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
type LangGraphOnCopilotKitStateSyncEvent = {
|
|
34
|
+
event: LangGraphEventTypes.OnCopilotKitStateSync;
|
|
35
|
+
thread_id: string;
|
|
36
|
+
agent_name: string;
|
|
37
|
+
node_name: string;
|
|
38
|
+
run_id: string;
|
|
39
|
+
active: boolean;
|
|
40
|
+
role: string;
|
|
41
|
+
state: any;
|
|
42
|
+
running: boolean;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
type LangGraphOnChainStartEvent = {
|
|
46
|
+
event: LangGraphEventTypes.OnChainStart;
|
|
47
|
+
run_id: string;
|
|
48
|
+
name: string;
|
|
49
|
+
tags: string[];
|
|
50
|
+
metadata: { thread_id: string };
|
|
51
|
+
data: {
|
|
52
|
+
input: any;
|
|
53
|
+
};
|
|
54
|
+
parent_ids: string[];
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
type LangGraphOnChainEndEvent = {
|
|
58
|
+
event: LangGraphEventTypes.OnChainEnd;
|
|
59
|
+
name: string;
|
|
60
|
+
run_id: string;
|
|
61
|
+
tags: string[];
|
|
62
|
+
metadata: {
|
|
63
|
+
thread_id: string;
|
|
64
|
+
langgraph_step: number;
|
|
65
|
+
langgraph_node: string;
|
|
66
|
+
langgraph_triggers: string[];
|
|
67
|
+
langgraph_task_idx: number;
|
|
68
|
+
thread_ts: string;
|
|
69
|
+
};
|
|
70
|
+
data: {
|
|
71
|
+
input: any;
|
|
72
|
+
output: any;
|
|
73
|
+
};
|
|
74
|
+
parent_ids: string[];
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
type LangGraphOnChatModelStartEvent = {
|
|
78
|
+
event: LangGraphEventTypes.OnChatModelStart;
|
|
79
|
+
name: string;
|
|
80
|
+
run_id: string;
|
|
81
|
+
tags: string[];
|
|
82
|
+
metadata: {
|
|
83
|
+
thread_id: string;
|
|
84
|
+
langgraph_step: number;
|
|
85
|
+
langgraph_node: string;
|
|
86
|
+
langgraph_triggers: string[];
|
|
87
|
+
langgraph_task_idx: number;
|
|
88
|
+
thread_ts: string;
|
|
89
|
+
ls_provider: string;
|
|
90
|
+
ls_model_name: string;
|
|
91
|
+
ls_model_type: string;
|
|
92
|
+
ls_temperature: number;
|
|
93
|
+
};
|
|
94
|
+
data: {
|
|
95
|
+
input: {
|
|
96
|
+
messages: {
|
|
97
|
+
lc: number;
|
|
98
|
+
type: string;
|
|
99
|
+
id: string[];
|
|
100
|
+
kwargs: {
|
|
101
|
+
content: string;
|
|
102
|
+
type: string;
|
|
103
|
+
id: string;
|
|
104
|
+
};
|
|
105
|
+
}[][];
|
|
106
|
+
};
|
|
107
|
+
};
|
|
108
|
+
parent_ids: string[];
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
type LangGraphOnChatModelStreamEvent = {
|
|
112
|
+
event: LangGraphEventTypes.OnChatModelStream;
|
|
113
|
+
name: string;
|
|
114
|
+
run_id: string;
|
|
115
|
+
tags: string[];
|
|
116
|
+
metadata: {
|
|
117
|
+
thread_id: string;
|
|
118
|
+
langgraph_step: number;
|
|
119
|
+
langgraph_node: string;
|
|
120
|
+
langgraph_triggers: string[];
|
|
121
|
+
langgraph_task_idx: number;
|
|
122
|
+
thread_ts: string;
|
|
123
|
+
ls_provider: string;
|
|
124
|
+
ls_model_name: string;
|
|
125
|
+
ls_model_type: string;
|
|
126
|
+
ls_temperature: number;
|
|
127
|
+
};
|
|
128
|
+
data: {
|
|
129
|
+
chunk: {
|
|
130
|
+
lc: number;
|
|
131
|
+
type: string;
|
|
132
|
+
id: string;
|
|
133
|
+
kwargs: {
|
|
134
|
+
content: string | { text: string; type: string; index: number }[];
|
|
135
|
+
additional_kwargs: {
|
|
136
|
+
tool_calls: {
|
|
137
|
+
index: number;
|
|
138
|
+
id: string;
|
|
139
|
+
function: { arguments: string; name: string };
|
|
140
|
+
type: string;
|
|
141
|
+
}[];
|
|
142
|
+
};
|
|
143
|
+
type: string;
|
|
144
|
+
id: string;
|
|
145
|
+
tool_calls: { name: string; args: {}; id: string; type: string }[];
|
|
146
|
+
tool_call_chunks: {
|
|
147
|
+
name: string;
|
|
148
|
+
args: string;
|
|
149
|
+
id: string;
|
|
150
|
+
index: number;
|
|
151
|
+
type: string;
|
|
152
|
+
}[];
|
|
153
|
+
invalid_tool_calls: any[];
|
|
154
|
+
};
|
|
155
|
+
};
|
|
156
|
+
};
|
|
157
|
+
parent_ids: string[];
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
type LangGraphOnChatModelEndEvent = {
|
|
161
|
+
event: LangGraphEventTypes.OnChatModelEnd;
|
|
162
|
+
name: string;
|
|
163
|
+
run_id: string;
|
|
164
|
+
tags: string[];
|
|
165
|
+
metadata: {
|
|
166
|
+
thread_id: string;
|
|
167
|
+
langgraph_step: number;
|
|
168
|
+
langgraph_node: string;
|
|
169
|
+
langgraph_triggers: string[];
|
|
170
|
+
langgraph_task_idx: number;
|
|
171
|
+
thread_ts: string;
|
|
172
|
+
ls_provider: string;
|
|
173
|
+
ls_model_name: string;
|
|
174
|
+
ls_model_type: string;
|
|
175
|
+
ls_temperature: number;
|
|
176
|
+
};
|
|
177
|
+
data: {
|
|
178
|
+
input: any;
|
|
179
|
+
output: {
|
|
180
|
+
generations: {
|
|
181
|
+
text: string;
|
|
182
|
+
generation_info: {
|
|
183
|
+
finish_reason: string;
|
|
184
|
+
model_name: string;
|
|
185
|
+
system_fingerprint: string;
|
|
186
|
+
};
|
|
187
|
+
type: string;
|
|
188
|
+
message: {
|
|
189
|
+
lc: number;
|
|
190
|
+
type: string;
|
|
191
|
+
id: string[];
|
|
192
|
+
kwargs: {
|
|
193
|
+
content: string;
|
|
194
|
+
additional_kwargs: {
|
|
195
|
+
tool_calls: {
|
|
196
|
+
index: number;
|
|
197
|
+
id: string;
|
|
198
|
+
function: { arguments: string; name: string };
|
|
199
|
+
type: string;
|
|
200
|
+
}[];
|
|
201
|
+
};
|
|
202
|
+
response_metadata: {
|
|
203
|
+
finish_reason: string;
|
|
204
|
+
model_name: string;
|
|
205
|
+
system_fingerprint: string;
|
|
206
|
+
};
|
|
207
|
+
type: string;
|
|
208
|
+
id: string;
|
|
209
|
+
tool_calls: { name: string; args: { query: string }; id: string; type: string }[];
|
|
210
|
+
invalid_tool_calls: any[];
|
|
211
|
+
};
|
|
212
|
+
};
|
|
213
|
+
}[][];
|
|
214
|
+
llm_output: any;
|
|
215
|
+
run: any;
|
|
216
|
+
};
|
|
217
|
+
};
|
|
218
|
+
parent_ids: string[];
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
type LangGraphOnChainStreamEvent = {
|
|
222
|
+
event: LangGraphEventTypes.OnChainStream;
|
|
223
|
+
name: string;
|
|
224
|
+
run_id: string;
|
|
225
|
+
tags: string[];
|
|
226
|
+
metadata: {
|
|
227
|
+
thread_id: string;
|
|
228
|
+
langgraph_step?: number;
|
|
229
|
+
langgraph_node?: string;
|
|
230
|
+
langgraph_triggers?: string[];
|
|
231
|
+
langgraph_task_idx?: number;
|
|
232
|
+
thread_ts?: string;
|
|
233
|
+
};
|
|
234
|
+
data: {
|
|
235
|
+
chunk: {
|
|
236
|
+
messages: {
|
|
237
|
+
lc: number;
|
|
238
|
+
type: string;
|
|
239
|
+
id: string[];
|
|
240
|
+
kwargs: {
|
|
241
|
+
content: string;
|
|
242
|
+
additional_kwargs?: {
|
|
243
|
+
tool_calls?: {
|
|
244
|
+
index: number;
|
|
245
|
+
id: string;
|
|
246
|
+
function: { arguments: string; name: string };
|
|
247
|
+
type: string;
|
|
248
|
+
}[];
|
|
249
|
+
};
|
|
250
|
+
response_metadata?: {
|
|
251
|
+
finish_reason: string;
|
|
252
|
+
model_name: string;
|
|
253
|
+
system_fingerprint: string;
|
|
254
|
+
};
|
|
255
|
+
type: string;
|
|
256
|
+
id: string;
|
|
257
|
+
tool_calls?: { name: string; args: { query: string }; id: string; type: string }[];
|
|
258
|
+
invalid_tool_calls?: any[];
|
|
259
|
+
};
|
|
260
|
+
}[];
|
|
261
|
+
};
|
|
262
|
+
};
|
|
263
|
+
parent_ids: string[];
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
type LangGraphOnToolStartEvent = {
|
|
267
|
+
event: LangGraphEventTypes.OnToolStart;
|
|
268
|
+
name: string;
|
|
269
|
+
run_id: string;
|
|
270
|
+
tags: string[];
|
|
271
|
+
metadata: {
|
|
272
|
+
thread_id: string;
|
|
273
|
+
langgraph_step: number;
|
|
274
|
+
langgraph_node: string;
|
|
275
|
+
langgraph_triggers: string[];
|
|
276
|
+
langgraph_task_idx: number;
|
|
277
|
+
thread_ts: string;
|
|
278
|
+
};
|
|
279
|
+
data: {
|
|
280
|
+
input: {
|
|
281
|
+
query: string;
|
|
282
|
+
};
|
|
283
|
+
};
|
|
284
|
+
parent_ids: string[];
|
|
285
|
+
};
|
|
286
|
+
|
|
287
|
+
type LangGraphOnToolEndEvent = {
|
|
288
|
+
event: LangGraphEventTypes.OnToolEnd;
|
|
289
|
+
name: string;
|
|
290
|
+
run_id: string;
|
|
291
|
+
tags: string[];
|
|
292
|
+
metadata: {
|
|
293
|
+
thread_id: string;
|
|
294
|
+
langgraph_step: number;
|
|
295
|
+
langgraph_node: string;
|
|
296
|
+
langgraph_triggers: string[];
|
|
297
|
+
langgraph_task_idx: number;
|
|
298
|
+
thread_ts: string;
|
|
299
|
+
};
|
|
300
|
+
data: {
|
|
301
|
+
input: {
|
|
302
|
+
query: string;
|
|
303
|
+
};
|
|
304
|
+
output: {
|
|
305
|
+
lc: number;
|
|
306
|
+
type: string;
|
|
307
|
+
id: string[];
|
|
308
|
+
kwargs: {
|
|
309
|
+
content: string[];
|
|
310
|
+
type: string;
|
|
311
|
+
name: string;
|
|
312
|
+
tool_call_id: string;
|
|
313
|
+
status: string;
|
|
314
|
+
};
|
|
315
|
+
};
|
|
316
|
+
};
|
|
317
|
+
parent_ids: string[];
|
|
318
|
+
};
|
|
319
|
+
|
|
320
|
+
type LangGraphOnCustomEvent = {
|
|
321
|
+
event: LangGraphEventTypes.OnCustomEvent;
|
|
322
|
+
run_id: string;
|
|
323
|
+
name: string;
|
|
324
|
+
tags: string[];
|
|
325
|
+
metadata: {
|
|
326
|
+
thread_id: string;
|
|
327
|
+
langgraph_step: number;
|
|
328
|
+
langgraph_node: string;
|
|
329
|
+
langgraph_triggers: string[];
|
|
330
|
+
langgraph_path: [string, string];
|
|
331
|
+
langgraph_checkpoint_ns: string;
|
|
332
|
+
checkpoint_ns: string;
|
|
333
|
+
};
|
|
334
|
+
data: any;
|
|
335
|
+
parent_ids: string[];
|
|
336
|
+
};
|
|
337
|
+
|
|
338
|
+
interface LangGraphInterruptEvent {
|
|
339
|
+
event: LangGraphEventTypes.OnInterrupt;
|
|
340
|
+
value: string;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
interface CopilotKitLangGraphInterruptEvent {
|
|
344
|
+
event: LangGraphEventTypes.OnCopilotKitInterrupt;
|
|
345
|
+
data: { value: string; messages: (TextMessage | ActionExecutionMessage | ResultMessage)[] };
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
interface CopilotKitLangGraphErrorEvent {
|
|
349
|
+
event: LangGraphEventTypes.OnCopilotKitError;
|
|
350
|
+
data: {
|
|
351
|
+
error: {
|
|
352
|
+
message: string;
|
|
353
|
+
type: string;
|
|
354
|
+
agent_name: string;
|
|
355
|
+
status_code?: number;
|
|
356
|
+
response_data?: any;
|
|
357
|
+
};
|
|
358
|
+
thread_id: string;
|
|
359
|
+
agent_name: string;
|
|
360
|
+
node_name: string;
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
export type LangGraphEvent =
|
|
365
|
+
| LangGraphOnChainStartEvent
|
|
366
|
+
| LangGraphOnChainStreamEvent
|
|
367
|
+
| LangGraphOnChainEndEvent
|
|
368
|
+
| LangGraphOnChatModelStartEvent
|
|
369
|
+
| LangGraphOnChatModelStreamEvent
|
|
370
|
+
| LangGraphOnChatModelEndEvent
|
|
371
|
+
| LangGraphOnToolStartEvent
|
|
372
|
+
| LangGraphOnToolEndEvent
|
|
373
|
+
| LangGraphOnCopilotKitStateSyncEvent
|
|
374
|
+
| LangGraphOnCustomEvent
|
|
375
|
+
| LangGraphInterruptEvent
|
|
376
|
+
| CopilotKitLangGraphInterruptEvent
|
|
377
|
+
| CopilotKitLangGraphErrorEvent;
|