@copilotkit/runtime 1.3.11-mme-fix-duplicate-messages.0 → 1.3.12-feat-langgraph-cloud-release-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/{chunk-BKYOO5BI.mjs → chunk-6A7HQSQE.mjs} +2 -2
  3. package/dist/{chunk-PJUM7AG6.mjs → chunk-BPLF4QB2.mjs} +2 -2
  4. package/dist/{chunk-QXCN452Q.mjs → chunk-IPCABAGS.mjs} +2 -2
  5. package/dist/{chunk-CYBOQ73D.mjs → chunk-RKGJG3QX.mjs} +552 -122
  6. package/dist/chunk-RKGJG3QX.mjs.map +1 -0
  7. package/dist/{chunk-CONEHHUJ.mjs → chunk-Z5LICW7Z.mjs} +35 -8
  8. package/dist/chunk-Z5LICW7Z.mjs.map +1 -0
  9. package/dist/{copilot-runtime-df3527ad.d.ts → copilot-runtime-aba7d4b4.d.ts} +27 -5
  10. package/dist/index.d.ts +1 -1
  11. package/dist/index.js +625 -168
  12. package/dist/index.js.map +1 -1
  13. package/dist/index.mjs +11 -7
  14. package/dist/index.mjs.map +1 -1
  15. package/dist/lib/index.d.ts +1 -1
  16. package/dist/lib/index.js +625 -168
  17. package/dist/lib/index.js.map +1 -1
  18. package/dist/lib/index.mjs +11 -7
  19. package/dist/lib/integrations/index.d.ts +2 -2
  20. package/dist/lib/integrations/index.js +3 -1
  21. package/dist/lib/integrations/index.js.map +1 -1
  22. package/dist/lib/integrations/index.mjs +4 -4
  23. package/dist/lib/integrations/nest/index.d.ts +1 -1
  24. package/dist/lib/integrations/nest/index.js +3 -1
  25. package/dist/lib/integrations/nest/index.js.map +1 -1
  26. package/dist/lib/integrations/nest/index.mjs +2 -2
  27. package/dist/lib/integrations/node-express/index.d.ts +1 -1
  28. package/dist/lib/integrations/node-express/index.js +3 -1
  29. package/dist/lib/integrations/node-express/index.js.map +1 -1
  30. package/dist/lib/integrations/node-express/index.mjs +2 -2
  31. package/dist/lib/integrations/node-http/index.d.ts +1 -1
  32. package/dist/lib/integrations/node-http/index.js +3 -1
  33. package/dist/lib/integrations/node-http/index.js.map +1 -1
  34. package/dist/lib/integrations/node-http/index.mjs +1 -1
  35. package/package.json +6 -4
  36. package/src/agents/langgraph/event-source.ts +22 -67
  37. package/src/lib/runtime/copilot-runtime.ts +58 -11
  38. package/src/lib/runtime/remote-action-constructors.ts +281 -0
  39. package/src/lib/runtime/remote-actions.ts +65 -159
  40. package/src/lib/runtime/remote-lg-cloud-action.ts +438 -0
  41. package/dist/chunk-CONEHHUJ.mjs.map +0 -1
  42. package/dist/chunk-CYBOQ73D.mjs.map +0 -1
  43. /package/dist/{chunk-BKYOO5BI.mjs.map → chunk-6A7HQSQE.mjs.map} +0 -0
  44. /package/dist/{chunk-PJUM7AG6.mjs.map → chunk-BPLF4QB2.mjs.map} +0 -0
  45. /package/dist/{chunk-QXCN452Q.mjs.map → chunk-IPCABAGS.mjs.map} +0 -0
@@ -0,0 +1,438 @@
1
+ import { Client } from "@langchain/langgraph-sdk";
2
+ import { randomUUID } from "node:crypto";
3
+ import { parse as parsePartialJson } from "partial-json";
4
+ import { ActionInput } from "../../graphql/inputs/action.input";
5
+ import { LangGraphCloudAgent } from "./remote-actions";
6
+ import { CopilotRequestContextProperties } from "../integrations";
7
+ import { BaseMessageInput as CopilotKitBaseMessage } from "../../graphql/types/base";
8
+ import { MessageRole } from "../../graphql/types/enums";
9
+
10
+ type State = Record<string, any>;
11
+
12
+ type ExecutionAction = Pick<ActionInput, "name" | "description"> & { parameters: string };
13
+
14
+ interface ExecutionArgs {
15
+ agent: LangGraphCloudAgent;
16
+ threadId: string;
17
+ nodeName: string;
18
+ messages: CopilotKitBaseMessage[];
19
+ state: State;
20
+ properties: CopilotRequestContextProperties;
21
+ actions: ExecutionAction[];
22
+ }
23
+
24
+ export async function execute(args: ExecutionArgs): Promise<ReadableStream<Uint8Array>> {
25
+ return new ReadableStream({
26
+ async start(controller) {
27
+ try {
28
+ await streamEvents(controller, args);
29
+ controller.close();
30
+ } catch (err) {}
31
+ },
32
+ });
33
+ }
34
+
35
+ async function streamEvents(controller: ReadableStreamDefaultController, args: ExecutionArgs) {
36
+ const {
37
+ threadId: agrsInitialThreadId,
38
+ agent,
39
+ nodeName: initialNodeName,
40
+ state: initialState,
41
+ messages,
42
+ actions,
43
+ } = args;
44
+
45
+ let nodeName = initialNodeName;
46
+ let state = initialState;
47
+ const { name, assistantId: initialAssistantId } = agent;
48
+
49
+ const client = new Client();
50
+ let initialThreadId = agrsInitialThreadId;
51
+ const wasInitiatedWithExistingThread = !!initialThreadId;
52
+ if (initialThreadId && initialThreadId.startsWith("ck-")) {
53
+ initialThreadId = initialThreadId.substring(3);
54
+ }
55
+
56
+ const assistants = await client.assistants.search();
57
+ const retrievedAssistant = assistants.find((a) => a.name === name);
58
+ const threadId = initialThreadId ?? randomUUID();
59
+ if (initialThreadId === threadId) {
60
+ await client.threads.get(threadId);
61
+ } else {
62
+ await client.threads.create({ threadId: threadId });
63
+ }
64
+
65
+ let agentState = { values: {} };
66
+ if (wasInitiatedWithExistingThread) {
67
+ agentState = await client.threads.getState(threadId);
68
+ }
69
+ const agentStateValues = agentState.values as State;
70
+ state.messages = agentStateValues.messages;
71
+ const mode = wasInitiatedWithExistingThread && nodeName != "__end__" ? "continue" : "start";
72
+ state = langGraphDefaultMergeState(state, formatMessages(messages), actions);
73
+
74
+ if (mode === "continue") {
75
+ await client.threads.updateState(threadId, { values: state, asNode: nodeName });
76
+ }
77
+
78
+ const assistantId = initialAssistantId ?? retrievedAssistant.assistant_id;
79
+ const graphInfo = await client.assistants.getGraph(assistantId);
80
+ const streamInput = mode === "start" ? state : null;
81
+
82
+ let streamingStateExtractor = new StreamingStateExtractor([]);
83
+ let prevNodeName = null;
84
+ let emitIntermediateStateUntilEnd = null;
85
+ let shouldExit = null;
86
+ let externalRunId = null;
87
+
88
+ const streamResponse = client.runs.stream(threadId, assistantId, {
89
+ input: streamInput,
90
+ streamMode: ["events", "values"],
91
+ });
92
+
93
+ const emit = (message: string) => controller.enqueue(new TextEncoder().encode(message));
94
+
95
+ let latestStateValues = {};
96
+
97
+ for await (const chunk of streamResponse) {
98
+ if (!["events", "values"].includes(chunk.event)) continue;
99
+
100
+ if (chunk.event === "values") {
101
+ latestStateValues = chunk.data;
102
+ continue;
103
+ }
104
+
105
+ const event = chunk.data;
106
+ const currentNodeName = event.name;
107
+ const eventType = event.event;
108
+ const runId = event.metadata.run_id;
109
+ externalRunId = runId;
110
+ const metadata = event.metadata;
111
+
112
+ shouldExit = shouldExit != null ? shouldExit : metadata["copilotkit:exit"];
113
+ const emitIntermediateState = metadata["copilotkit:emit-intermediate-state"];
114
+ const forceEmitIntermediateState = metadata["copilotkit:force-emit-intermediate-state"];
115
+ const manuallyEmitMessage = metadata["copilotkit:manually-emit-messages"];
116
+ const manuallyEmitToolCall = metadata["copilotkit:manually-emit-tool-calls"];
117
+ // we only want to update the node name under certain conditions
118
+ // since we don't need any internal node names to be sent to the frontend
119
+ if (graphInfo["nodes"].some((node) => node.id === currentNodeName)) {
120
+ nodeName = currentNodeName;
121
+ }
122
+
123
+ if (!nodeName) {
124
+ continue;
125
+ }
126
+
127
+ if (forceEmitIntermediateState) {
128
+ if (eventType === "on_chain_end") {
129
+ state = event.data.output;
130
+ emit(
131
+ getStateSyncEvent({
132
+ threadId,
133
+ runId,
134
+ agentName: agent.name,
135
+ nodeName,
136
+ state: event.data.output,
137
+ running: true,
138
+ active: true,
139
+ }),
140
+ );
141
+ }
142
+ continue;
143
+ }
144
+
145
+ if (manuallyEmitMessage) {
146
+ if (eventType === "on_chain_end") {
147
+ state = event.data.output;
148
+ emit(
149
+ JSON.stringify({
150
+ event: "on_copilotkit_emit_message",
151
+ message: event.data.output,
152
+ messageId: randomUUID(),
153
+ role: MessageRole.assistant,
154
+ }) + "\n",
155
+ );
156
+ }
157
+ continue;
158
+ }
159
+
160
+ if (manuallyEmitToolCall) {
161
+ if (eventType === "on_chain_end") {
162
+ state = event.data.output;
163
+ emit(
164
+ JSON.stringify({
165
+ event: "on_copilotkit_emit_tool_call",
166
+ name: event.data.output.name,
167
+ args: event.data.output.args,
168
+ id: event.data.output.id,
169
+ }) + "\n",
170
+ );
171
+ }
172
+ continue;
173
+ }
174
+
175
+ if (emitIntermediateState && emitIntermediateStateUntilEnd == null) {
176
+ emitIntermediateStateUntilEnd = nodeName;
177
+ }
178
+
179
+ if (emitIntermediateState && eventType === "on_chat_model_start") {
180
+ // reset the streaming state extractor
181
+ streamingStateExtractor = new StreamingStateExtractor(emitIntermediateState);
182
+ }
183
+
184
+ let updatedState = latestStateValues;
185
+
186
+ if (emitIntermediateState && eventType === "on_chat_model_stream") {
187
+ streamingStateExtractor.bufferToolCalls(event);
188
+ }
189
+
190
+ if (emitIntermediateStateUntilEnd !== null) {
191
+ updatedState = {
192
+ ...updatedState,
193
+ ...streamingStateExtractor.extractState(),
194
+ };
195
+ }
196
+
197
+ if (
198
+ !emitIntermediateState &&
199
+ currentNodeName === emitIntermediateStateUntilEnd &&
200
+ eventType === "on_chain_end"
201
+ ) {
202
+ // stop emitting function call state
203
+ emitIntermediateStateUntilEnd = null;
204
+ }
205
+
206
+ const exitingNode = nodeName === currentNodeName && eventType === "on_chain_end";
207
+
208
+ if (
209
+ JSON.stringify(updatedState) !== JSON.stringify(state) ||
210
+ prevNodeName != nodeName ||
211
+ exitingNode
212
+ ) {
213
+ state = updatedState;
214
+ prevNodeName = nodeName;
215
+ emit(
216
+ getStateSyncEvent({
217
+ threadId,
218
+ runId,
219
+ agentName: agent.name,
220
+ nodeName,
221
+ state,
222
+ running: true,
223
+ active: !exitingNode,
224
+ }),
225
+ );
226
+ }
227
+
228
+ emit(JSON.stringify(event) + "\n");
229
+ }
230
+
231
+ state = await client.threads.getState(threadId);
232
+ const isEndNode = state.next.length === 0;
233
+ nodeName = Object.keys(state.metadata.writes)[0];
234
+
235
+ emit(
236
+ getStateSyncEvent({
237
+ threadId,
238
+ runId: externalRunId,
239
+ agentName: agent.name,
240
+ nodeName: isEndNode ? "__end__" : nodeName,
241
+ state: state.values,
242
+ running: !shouldExit,
243
+ active: false,
244
+ }),
245
+ );
246
+
247
+ return Promise.resolve();
248
+ }
249
+
250
+ function getStateSyncEvent({
251
+ threadId,
252
+ runId,
253
+ agentName,
254
+ nodeName,
255
+ state,
256
+ running,
257
+ active,
258
+ }: {
259
+ threadId: string;
260
+ runId: string;
261
+ agentName: string;
262
+ nodeName: string;
263
+ state: State;
264
+ running: boolean;
265
+ active: boolean;
266
+ }): string {
267
+ const stateWithoutMessages = Object.keys(state).reduce((acc, key) => {
268
+ if (key !== "messages") {
269
+ acc[key] = state[key];
270
+ }
271
+ return acc;
272
+ }, {} as State);
273
+
274
+ return (
275
+ JSON.stringify({
276
+ event: "on_copilotkit_state_sync",
277
+ thread_id: threadId,
278
+ run_id: runId,
279
+ agent_name: agentName,
280
+ node_name: nodeName,
281
+ active: active,
282
+ state: stateWithoutMessages,
283
+ running: running,
284
+ role: "assistant",
285
+ }) + "\n"
286
+ );
287
+ }
288
+
289
+ class StreamingStateExtractor {
290
+ private emitIntermediateState: { [key: string]: any }[];
291
+ private toolCallBuffer: { [key: string]: string };
292
+ private currentToolCall: string | null;
293
+ private previouslyParsableState: { [key: string]: any };
294
+
295
+ constructor(emitIntermediateState: { [key: string]: any }[]) {
296
+ this.emitIntermediateState = emitIntermediateState;
297
+ this.toolCallBuffer = {};
298
+ this.currentToolCall = null;
299
+ this.previouslyParsableState = {};
300
+ }
301
+
302
+ bufferToolCalls(event: {
303
+ data: { chunk: { tool_call_chunks: { name: string | null; args: string }[] } };
304
+ }) {
305
+ if (event.data.chunk.tool_call_chunks.length > 0) {
306
+ const chunk = event.data.chunk.tool_call_chunks[0];
307
+
308
+ if (chunk.name !== null) {
309
+ this.currentToolCall = chunk.name;
310
+ this.toolCallBuffer[this.currentToolCall] = chunk.args;
311
+ } else if (this.currentToolCall !== null) {
312
+ this.toolCallBuffer[this.currentToolCall] += chunk.args;
313
+ }
314
+ }
315
+ }
316
+
317
+ getEmitStateConfig(currentToolName: string): [string | null, string | null] {
318
+ for (const config of this.emitIntermediateState) {
319
+ const stateKey = config["state_key"];
320
+ const tool = config["tool"];
321
+ const toolArgument = config["tool_argument"];
322
+
323
+ if (currentToolName === tool) {
324
+ return [toolArgument, stateKey];
325
+ }
326
+ }
327
+ return [null, null];
328
+ }
329
+
330
+ extractState(): State {
331
+ const state: State = {};
332
+
333
+ for (const [key, value] of Object.entries(this.toolCallBuffer)) {
334
+ const [argumentName, stateKey] = this.getEmitStateConfig(key);
335
+
336
+ if (stateKey === null) {
337
+ continue;
338
+ }
339
+
340
+ let parsedValue;
341
+ try {
342
+ parsedValue = parsePartialJson(value);
343
+ } catch (error) {
344
+ if (key in this.previouslyParsableState) {
345
+ parsedValue = this.previouslyParsableState[key];
346
+ } else {
347
+ continue;
348
+ }
349
+ }
350
+
351
+ this.previouslyParsableState[key] = parsedValue;
352
+
353
+ if (!argumentName) {
354
+ state[stateKey] = parsedValue;
355
+ } else {
356
+ state[stateKey] = parsedValue[argumentName];
357
+ }
358
+ }
359
+
360
+ return state;
361
+ }
362
+ }
363
+
364
+ // Start of Selection
365
+ function langGraphDefaultMergeState(
366
+ state: State,
367
+ messages: CopilotKitBaseMessage[],
368
+ actions: ExecutionAction[],
369
+ ): State {
370
+ if (messages.length > 0 && "role" in messages[0] && messages[0].role === "system") {
371
+ // remove system message
372
+ messages = messages.slice(1);
373
+ }
374
+
375
+ // merge with existing messages
376
+ const mergedMessages = state.messages || [];
377
+ const existingMessageIds = new Set(mergedMessages.map((message) => message.id));
378
+
379
+ for (const message of messages) {
380
+ if (!existingMessageIds.has(message.id)) {
381
+ mergedMessages.push(message);
382
+ }
383
+ }
384
+
385
+ return deepMerge(state, {
386
+ messages: mergedMessages,
387
+ copilotkit: {
388
+ actions,
389
+ },
390
+ });
391
+ }
392
+
393
+ function deepMerge(obj1: State, obj2: State) {
394
+ let result = { ...obj1 };
395
+ for (let key in obj2) {
396
+ if (typeof obj2[key] === "object" && !Array.isArray(obj2[key])) {
397
+ if (obj1[key]) {
398
+ result[key] = deepMerge(obj1[key], obj2[key]);
399
+ } else {
400
+ result[key] = { ...obj2[key] };
401
+ }
402
+ } else {
403
+ result[key] = obj2[key];
404
+ }
405
+ }
406
+ return result;
407
+ }
408
+
409
+ function formatMessages(messages: CopilotKitBaseMessage[]): CopilotKitBaseMessage[] {
410
+ return messages.map((message) => {
411
+ if ("content" in message) {
412
+ return message;
413
+ }
414
+ if ("arguments" in message) {
415
+ const toolCall = {
416
+ name: message["name"],
417
+ args: message["arguments"],
418
+ id: message["id"],
419
+ };
420
+ return {
421
+ ...message,
422
+ content: "",
423
+ tool_calls: [toolCall],
424
+ role: message["role"] ?? MessageRole.assistant,
425
+ };
426
+ }
427
+ if ("actionExecutionId" in message) {
428
+ return {
429
+ ...message,
430
+ content: message["result"],
431
+ name: message["actionName"],
432
+ tool_call_id: message["actionExecutionId"] as string,
433
+ role: message["role"] ?? MessageRole.user,
434
+ };
435
+ }
436
+ return message;
437
+ });
438
+ }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/runtime/copilot-runtime.ts","../src/service-adapters/conversion.ts"],"sourcesContent":["/**\n * <Callout type=\"info\">\n * This is the reference for the `CopilotRuntime` class. For more information and example code snippets, please see [Concept: Copilot Runtime](/concepts/copilot-runtime).\n * </Callout>\n *\n * ## Usage\n *\n * ```tsx\n * import { CopilotRuntime } from \"@copilotkit/runtime\";\n *\n * const copilotKit = new CopilotRuntime();\n * ```\n */\n\nimport { Action, actionParametersToJsonSchema, Parameter, randomId } from \"@copilotkit/shared\";\nimport { RemoteChain, RemoteChainParameters, CopilotServiceAdapter } from \"../../service-adapters\";\nimport { MessageInput } from \"../../graphql/inputs/message.input\";\nimport { ActionInput } from \"../../graphql/inputs/action.input\";\nimport { RuntimeEventSource } from \"../../service-adapters/events\";\nimport { convertGqlInputToMessages } from \"../../service-adapters/conversion\";\nimport { AgentStateMessage, Message } from \"../../graphql/types/converted\";\nimport { ForwardedParametersInput } from \"../../graphql/inputs/forwarded-parameters.input\";\nimport {\n setupRemoteActions,\n RemoteActionDefinition,\n LangGraphAgentAction,\n isLangGraphAgentAction,\n} from \"./remote-actions\";\nimport { GraphQLContext } from \"../integrations/shared\";\nimport { AgentSessionInput } from \"../../graphql/inputs/agent-session.input\";\nimport { from } from \"rxjs\";\nimport { AgentStateInput } from \"../../graphql/inputs/agent-state.input\";\n\ninterface CopilotRuntimeRequest {\n serviceAdapter: CopilotServiceAdapter;\n messages: MessageInput[];\n actions: ActionInput[];\n agentSession?: AgentSessionInput;\n agentStates?: AgentStateInput[];\n outputMessagesPromise: Promise<Message[]>;\n threadId?: string;\n runId?: string;\n publicApiKey?: string;\n graphqlContext: GraphQLContext;\n forwardedParameters?: ForwardedParametersInput;\n url?: string;\n}\n\ninterface CopilotRuntimeResponse {\n threadId: string;\n runId?: string;\n eventSource: RuntimeEventSource;\n serverSideActions: Action<any>[];\n actionInputsWithoutAgents: ActionInput[];\n}\n\ntype ActionsConfiguration<T extends Parameter[] | [] = []> =\n | Action<T>[]\n | ((ctx: { properties: any; url?: string }) => Action<T>[]);\n\ninterface OnBeforeRequestOptions {\n threadId?: string;\n runId?: string;\n inputMessages: Message[];\n properties: any;\n url?: string;\n}\n\ntype OnBeforeRequestHandler = (options: OnBeforeRequestOptions) => void | Promise<void>;\n\ninterface OnAfterRequestOptions {\n threadId: string;\n runId?: string;\n inputMessages: Message[];\n outputMessages: Message[];\n properties: any;\n url?: string;\n}\n\ntype OnAfterRequestHandler = (options: OnAfterRequestOptions) => void | Promise<void>;\n\ninterface Middleware {\n /**\n * A function that is called before the request is processed.\n */\n onBeforeRequest?: OnBeforeRequestHandler;\n\n /**\n * A function that is called after the request is processed.\n */\n onAfterRequest?: OnAfterRequestHandler;\n}\n\nexport interface CopilotRuntimeConstructorParams<T extends Parameter[] | [] = []> {\n /**\n * Middleware to be used by the runtime.\n *\n * ```ts\n * onBeforeRequest: (options: {\n * threadId?: string;\n * runId?: string;\n * inputMessages: Message[];\n * properties: any;\n * }) => void | Promise<void>;\n * ```\n *\n * ```ts\n * onAfterRequest: (options: {\n * threadId?: string;\n * runId?: string;\n * inputMessages: Message[];\n * outputMessages: Message[];\n * properties: any;\n * }) => void | Promise<void>;\n * ```\n */\n middleware?: Middleware;\n\n /*\n * A list of server side actions that can be executed.\n */\n actions?: ActionsConfiguration<T>;\n\n /*\n * A list of remote actions that can be executed.\n */\n remoteActions?: RemoteActionDefinition[];\n\n /*\n * An array of LangServer URLs.\n */\n langserve?: RemoteChainParameters[];\n}\n\nexport class CopilotRuntime<const T extends Parameter[] | [] = []> {\n public actions: ActionsConfiguration<T>;\n private remoteActionDefinitions: RemoteActionDefinition[];\n private langserve: Promise<Action<any>>[] = [];\n private onBeforeRequest?: OnBeforeRequestHandler;\n private onAfterRequest?: OnAfterRequestHandler;\n\n constructor(params?: CopilotRuntimeConstructorParams<T>) {\n this.actions = params?.actions || [];\n\n for (const chain of params?.langserve || []) {\n const remoteChain = new RemoteChain(chain);\n this.langserve.push(remoteChain.toAction());\n }\n\n this.remoteActionDefinitions = params?.remoteActions || [];\n\n this.onBeforeRequest = params?.middleware?.onBeforeRequest;\n this.onAfterRequest = params?.middleware?.onAfterRequest;\n }\n\n async processRuntimeRequest(request: CopilotRuntimeRequest): Promise<CopilotRuntimeResponse> {\n const {\n serviceAdapter,\n messages: rawMessages,\n actions: clientSideActionsInput,\n threadId,\n runId,\n outputMessagesPromise,\n graphqlContext,\n forwardedParameters,\n agentSession,\n url,\n } = request;\n\n if (agentSession) {\n return this.processAgentRequest(request);\n }\n\n const messages = rawMessages.filter((message) => !message.agentStateMessage);\n\n const inputMessages = convertGqlInputToMessages(messages);\n const serverSideActions = await this.getServerSideActions(request);\n\n const serverSideActionsInput: ActionInput[] = serverSideActions.map((action) => ({\n name: action.name,\n description: action.description,\n jsonSchema: JSON.stringify(actionParametersToJsonSchema(action.parameters)),\n }));\n\n const actionInputs = flattenToolCallsNoDuplicates([\n ...serverSideActionsInput,\n ...clientSideActionsInput,\n ]);\n\n await this.onBeforeRequest?.({\n threadId,\n runId,\n inputMessages,\n properties: graphqlContext.properties,\n url,\n });\n\n try {\n const eventSource = new RuntimeEventSource();\n\n const result = await serviceAdapter.process({\n messages: inputMessages,\n actions: actionInputs,\n threadId,\n runId,\n eventSource,\n forwardedParameters,\n });\n\n outputMessagesPromise\n .then((outputMessages) => {\n this.onAfterRequest?.({\n threadId: result.threadId,\n runId: result.runId,\n inputMessages,\n outputMessages,\n properties: graphqlContext.properties,\n url,\n });\n })\n .catch((_error) => {});\n\n return {\n threadId: result.threadId,\n runId: result.runId,\n eventSource,\n serverSideActions,\n actionInputsWithoutAgents: actionInputs.filter(\n (action) =>\n // TODO-AGENTS: do not exclude ALL server side actions\n !serverSideActions.find((serverSideAction) => serverSideAction.name == action.name),\n // !isLangGraphAgentAction(\n // serverSideActions.find((serverSideAction) => serverSideAction.name == action.name),\n // ),\n ),\n };\n } catch (error) {\n console.error(\"Error getting response:\", error);\n throw error;\n }\n }\n\n private async processAgentRequest(\n request: CopilotRuntimeRequest,\n ): Promise<CopilotRuntimeResponse> {\n const { messages: rawMessages, outputMessagesPromise, graphqlContext, agentSession } = request;\n const { threadId = randomId(), agentName, nodeName } = agentSession;\n const serverSideActions = await this.getServerSideActions(request);\n\n const messages = convertGqlInputToMessages(rawMessages);\n\n const agent = serverSideActions.find(\n (action) => action.name === agentName && isLangGraphAgentAction(action),\n ) as LangGraphAgentAction;\n\n if (!agent) {\n throw new Error(`Agent ${agentName} not found`);\n }\n\n const serverSideActionsInput: ActionInput[] = serverSideActions\n .filter((action) => !isLangGraphAgentAction(action))\n .map((action) => ({\n name: action.name,\n description: action.description,\n jsonSchema: JSON.stringify(actionParametersToJsonSchema(action.parameters)),\n }));\n\n const actionInputsWithoutAgents = flattenToolCallsNoDuplicates([\n ...serverSideActionsInput,\n ...request.actions,\n ]);\n\n await this.onBeforeRequest?.({\n threadId,\n runId: undefined,\n inputMessages: messages,\n properties: graphqlContext.properties,\n });\n try {\n const eventSource = new RuntimeEventSource();\n const stream = await agent.langGraphAgentHandler({\n name: agentName,\n threadId,\n nodeName,\n actionInputsWithoutAgents,\n });\n\n eventSource.stream(async (eventStream$) => {\n from(stream).subscribe({\n next: (event) => eventStream$.next(event),\n error: (err) => console.error(\"Error in stream\", err),\n complete: () => eventStream$.complete(),\n });\n });\n\n outputMessagesPromise\n .then((outputMessages) => {\n this.onAfterRequest?.({\n threadId,\n runId: undefined,\n inputMessages: messages,\n outputMessages,\n properties: graphqlContext.properties,\n });\n })\n .catch((_error) => {});\n\n return {\n threadId,\n runId: undefined,\n eventSource,\n serverSideActions: [],\n actionInputsWithoutAgents,\n };\n } catch (error) {\n console.error(\"Error getting response:\", error);\n throw error;\n }\n }\n\n private async getServerSideActions(request: CopilotRuntimeRequest): Promise<Action<any>[]> {\n const { messages: rawMessages, graphqlContext, agentStates, url } = request;\n const inputMessages = convertGqlInputToMessages(rawMessages);\n const langserveFunctions: Action<any>[] = [];\n\n for (const chainPromise of this.langserve) {\n try {\n const chain = await chainPromise;\n langserveFunctions.push(chain);\n } catch (error) {\n console.error(\"Error loading langserve chain:\", error);\n }\n }\n const remoteActions = await setupRemoteActions({\n remoteActionDefinitions: this.remoteActionDefinitions,\n graphqlContext,\n messages: inputMessages,\n agentStates,\n frontendUrl: url,\n });\n\n const configuredActions =\n typeof this.actions === \"function\"\n ? this.actions({ properties: graphqlContext.properties, url })\n : this.actions;\n\n return [...configuredActions, ...langserveFunctions, ...remoteActions];\n }\n}\n\nexport function flattenToolCallsNoDuplicates(toolsByPriority: ActionInput[]): ActionInput[] {\n let allTools: ActionInput[] = [];\n const allToolNames: string[] = [];\n for (const tool of toolsByPriority) {\n if (!allToolNames.includes(tool.name)) {\n allTools.push(tool);\n allToolNames.push(tool.name);\n }\n }\n return allTools;\n}\n","import {\n ActionExecutionMessage,\n Message,\n ResultMessage,\n TextMessage,\n AgentStateMessage,\n} from \"../graphql/types/converted\";\nimport { MessageInput } from \"../graphql/inputs/message.input\";\nimport { plainToInstance } from \"class-transformer\";\n\nexport function convertGqlInputToMessages(inputMessages: MessageInput[]): Message[] {\n const messages: Message[] = [];\n\n for (const message of inputMessages) {\n if (message.textMessage) {\n messages.push(\n plainToInstance(TextMessage, {\n id: message.id,\n createdAt: message.createdAt,\n role: message.textMessage.role,\n content: message.textMessage.content,\n }),\n );\n } else if (message.actionExecutionMessage) {\n messages.push(\n plainToInstance(ActionExecutionMessage, {\n id: message.id,\n createdAt: message.createdAt,\n name: message.actionExecutionMessage.name,\n arguments: JSON.parse(message.actionExecutionMessage.arguments),\n scope: message.actionExecutionMessage.scope,\n }),\n );\n } else if (message.resultMessage) {\n messages.push(\n plainToInstance(ResultMessage, {\n id: message.id,\n createdAt: message.createdAt,\n actionExecutionId: message.resultMessage.actionExecutionId,\n actionName: message.resultMessage.actionName,\n result: message.resultMessage.result,\n }),\n );\n } else if (message.agentStateMessage) {\n messages.push(\n plainToInstance(AgentStateMessage, {\n id: message.id,\n threadId: message.agentStateMessage.threadId,\n createdAt: message.createdAt,\n agentName: message.agentStateMessage.agentName,\n nodeName: message.agentStateMessage.nodeName,\n runId: message.agentStateMessage.runId,\n active: message.agentStateMessage.active,\n role: message.agentStateMessage.role,\n state: JSON.parse(message.agentStateMessage.state),\n running: message.agentStateMessage.running,\n }),\n );\n }\n }\n\n return messages;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAcA,SAAiBA,8BAAyCC,gBAAgB;;;ACN1E,SAASC,uBAAuB;AAEzB,SAASC,0BAA0BC,eAA6B;AACrE,QAAMC,WAAsB,CAAA;AAE5B,aAAWC,WAAWF,eAAe;AACnC,QAAIE,QAAQC,aAAa;AACvBF,eAASG,KACPC,gBAAgBC,aAAa;QAC3BC,IAAIL,QAAQK;QACZC,WAAWN,QAAQM;QACnBC,MAAMP,QAAQC,YAAYM;QAC1BC,SAASR,QAAQC,YAAYO;MAC/B,CAAA,CAAA;IAEJ,WAAWR,QAAQS,wBAAwB;AACzCV,eAASG,KACPC,gBAAgBO,wBAAwB;QACtCL,IAAIL,QAAQK;QACZC,WAAWN,QAAQM;QACnBK,MAAMX,QAAQS,uBAAuBE;QACrCC,WAAWC,KAAKC,MAAMd,QAAQS,uBAAuBG,SAAS;QAC9DG,OAAOf,QAAQS,uBAAuBM;MACxC,CAAA,CAAA;IAEJ,WAAWf,QAAQgB,eAAe;AAChCjB,eAASG,KACPC,gBAAgBc,eAAe;QAC7BZ,IAAIL,QAAQK;QACZC,WAAWN,QAAQM;QACnBY,mBAAmBlB,QAAQgB,cAAcE;QACzCC,YAAYnB,QAAQgB,cAAcG;QAClCC,QAAQpB,QAAQgB,cAAcI;MAChC,CAAA,CAAA;IAEJ,WAAWpB,QAAQqB,mBAAmB;AACpCtB,eAASG,KACPC,gBAAgBmB,mBAAmB;QACjCjB,IAAIL,QAAQK;QACZkB,UAAUvB,QAAQqB,kBAAkBE;QACpCjB,WAAWN,QAAQM;QACnBkB,WAAWxB,QAAQqB,kBAAkBG;QACrCC,UAAUzB,QAAQqB,kBAAkBI;QACpCC,OAAO1B,QAAQqB,kBAAkBK;QACjCC,QAAQ3B,QAAQqB,kBAAkBM;QAClCpB,MAAMP,QAAQqB,kBAAkBd;QAChCqB,OAAOf,KAAKC,MAAMd,QAAQqB,kBAAkBO,KAAK;QACjDC,SAAS7B,QAAQqB,kBAAkBQ;MACrC,CAAA,CAAA;IAEJ;EACF;AAEA,SAAO9B;AACT;AApDgBF;;;ADoBhB,SAASiC,YAAY;AAwGd,IAAMC,iBAAN,MAAMA;EACJC;EACCC;EACAC,YAAoC,CAAA;EACpCC;EACAC;EAERC,YAAYC,QAA6C;AA7I3D;AA8II,SAAKN,WAAUM,iCAAQN,YAAW,CAAA;AAElC,eAAWO,UAASD,iCAAQJ,cAAa,CAAA,GAAI;AAC3C,YAAMM,cAAc,IAAIC,YAAYF,KAAAA;AACpC,WAAKL,UAAUQ,KAAKF,YAAYG,SAAQ,CAAA;IAC1C;AAEA,SAAKV,2BAA0BK,iCAAQM,kBAAiB,CAAA;AAExD,SAAKT,mBAAkBG,sCAAQO,eAARP,mBAAoBH;AAC3C,SAAKC,kBAAiBE,sCAAQO,eAARP,mBAAoBF;EAC5C;EAEA,MAAMU,sBAAsBC,SAAiE;AA3J/F;AA4JI,UAAM,EACJC,gBACAC,UAAUC,aACVlB,SAASmB,wBACTC,UACAC,OACAC,uBACAC,gBACAC,qBACAC,cACAC,IAAG,IACDX;AAEJ,QAAIU,cAAc;AAChB,aAAO,KAAKE,oBAAoBZ,OAAAA;IAClC;AAEA,UAAME,WAAWC,YAAYU,OAAO,CAACC,YAAY,CAACA,QAAQC,iBAAiB;AAE3E,UAAMC,gBAAgBC,0BAA0Bf,QAAAA;AAChD,UAAMgB,oBAAoB,MAAM,KAAKC,qBAAqBnB,OAAAA;AAE1D,UAAMoB,yBAAwCF,kBAAkBG,IAAI,CAACC,YAAY;MAC/EC,MAAMD,OAAOC;MACbC,aAAaF,OAAOE;MACpBC,YAAYC,KAAKC,UAAUC,6BAA6BN,OAAOO,UAAU,CAAA;IAC3E,EAAA;AAEA,UAAMC,eAAeC,6BAA6B;SAC7CX;SACAhB;KACJ;AAED,YAAM,UAAKhB,oBAAL,8BAAuB;MAC3BiB;MACAC;MACAU;MACAgB,YAAYxB,eAAewB;MAC3BrB;IACF;AAEA,QAAI;AACF,YAAMsB,cAAc,IAAIC,mBAAAA;AAExB,YAAMC,SAAS,MAAMlC,eAAemC,QAAQ;QAC1ClC,UAAUc;QACV/B,SAAS6C;QACTzB;QACAC;QACA2B;QACAxB;MACF,CAAA;AAEAF,4BACG8B,KAAK,CAACC,mBAAAA;AAlNf,YAAAC;AAmNU,SAAAA,MAAA,KAAKlD,mBAAL,gBAAAkD,IAAA,WAAsB;UACpBlC,UAAU8B,OAAO9B;UACjBC,OAAO6B,OAAO7B;UACdU;UACAsB;UACAN,YAAYxB,eAAewB;UAC3BrB;QACF;MACF,CAAA,EACC6B,MAAM,CAACC,WAAAA;MAAY,CAAA;AAEtB,aAAO;QACLpC,UAAU8B,OAAO9B;QACjBC,OAAO6B,OAAO7B;QACd2B;QACAf;QACAwB,2BAA2BZ,aAAajB,OACtC,CAACS;;UAEC,CAACJ,kBAAkByB,KAAK,CAACC,qBAAqBA,iBAAiBrB,QAAQD,OAAOC,IAAI;SAAA;MAKxF;IACF,SAASsB,OAAP;AACAC,cAAQD,MAAM,2BAA2BA,KAAAA;AACzC,YAAMA;IACR;EACF;EAEA,MAAcjC,oBACZZ,SACiC;AApPrC;AAqPI,UAAM,EAAEE,UAAUC,aAAaI,uBAAuBC,gBAAgBE,aAAY,IAAKV;AACvF,UAAM,EAAEK,WAAW0C,SAAAA,GAAYC,WAAWC,SAAQ,IAAKvC;AACvD,UAAMQ,oBAAoB,MAAM,KAAKC,qBAAqBnB,OAAAA;AAE1D,UAAME,WAAWe,0BAA0Bd,WAAAA;AAE3C,UAAM+C,QAAQhC,kBAAkByB,KAC9B,CAACrB,WAAWA,OAAOC,SAASyB,aAAaG,uBAAuB7B,MAAAA,CAAAA;AAGlE,QAAI,CAAC4B,OAAO;AACV,YAAM,IAAIE,MAAM,SAASJ,qBAAqB;IAChD;AAEA,UAAM5B,yBAAwCF,kBAC3CL,OAAO,CAACS,WAAW,CAAC6B,uBAAuB7B,MAAAA,CAAAA,EAC3CD,IAAI,CAACC,YAAY;MAChBC,MAAMD,OAAOC;MACbC,aAAaF,OAAOE;MACpBC,YAAYC,KAAKC,UAAUC,6BAA6BN,OAAOO,UAAU,CAAA;IAC3E,EAAA;AAEF,UAAMa,4BAA4BX,6BAA6B;SAC1DX;SACApB,QAAQf;KACZ;AAED,YAAM,UAAKG,oBAAL,8BAAuB;MAC3BiB;MACAC,OAAO+C;MACPrC,eAAed;MACf8B,YAAYxB,eAAewB;IAC7B;AACA,QAAI;AACF,YAAMC,cAAc,IAAIC,mBAAAA;AACxB,YAAMoB,SAAS,MAAMJ,MAAMK,sBAAsB;QAC/ChC,MAAMyB;QACN3C;QACA4C;QACAP;MACF,CAAA;AAEAT,kBAAYqB,OAAO,OAAOE,iBAAAA;AACxBC,aAAKH,MAAAA,EAAQI,UAAU;UACrBC,MAAM,CAACC,UAAUJ,aAAaG,KAAKC,KAAAA;UACnCf,OAAO,CAACgB,QAAQf,QAAQD,MAAM,mBAAmBgB,GAAAA;UACjDC,UAAU,MAAMN,aAAaM,SAAQ;QACvC,CAAA;MACF,CAAA;AAEAvD,4BACG8B,KAAK,CAACC,mBAAAA;AAxSf,YAAAC;AAySU,SAAAA,MAAA,KAAKlD,mBAAL,gBAAAkD,IAAA,WAAsB;UACpBlC;UACAC,OAAO+C;UACPrC,eAAed;UACfoC;UACAN,YAAYxB,eAAewB;QAC7B;MACF,CAAA,EACCQ,MAAM,CAACC,WAAAA;MAAY,CAAA;AAEtB,aAAO;QACLpC;QACAC,OAAO+C;QACPpB;QACAf,mBAAmB,CAAA;QACnBwB;MACF;IACF,SAASG,OAAP;AACAC,cAAQD,MAAM,2BAA2BA,KAAAA;AACzC,YAAMA;IACR;EACF;EAEA,MAAc1B,qBAAqBnB,SAAwD;AACzF,UAAM,EAAEE,UAAUC,aAAaK,gBAAgBuD,aAAapD,IAAG,IAAKX;AACpE,UAAMgB,gBAAgBC,0BAA0Bd,WAAAA;AAChD,UAAM6D,qBAAoC,CAAA;AAE1C,eAAWC,gBAAgB,KAAK9E,WAAW;AACzC,UAAI;AACF,cAAMK,QAAQ,MAAMyE;AACpBD,2BAAmBrE,KAAKH,KAAAA;MAC1B,SAASqD,OAAP;AACAC,gBAAQD,MAAM,kCAAkCA,KAAAA;MAClD;IACF;AACA,UAAMhD,gBAAgB,MAAMqE,mBAAmB;MAC7ChF,yBAAyB,KAAKA;MAC9BsB;MACAN,UAAUc;MACV+C;MACAI,aAAaxD;IACf,CAAA;AAEA,UAAMyD,oBACJ,OAAO,KAAKnF,YAAY,aACpB,KAAKA,QAAQ;MAAE+C,YAAYxB,eAAewB;MAAYrB;IAAI,CAAA,IAC1D,KAAK1B;AAEX,WAAO;SAAImF;SAAsBJ;SAAuBnE;;EAC1D;AACF;AAtNab;AAwNN,SAAS+C,6BAA6BsC,iBAA8B;AACzE,MAAIC,WAA0B,CAAA;AAC9B,QAAMC,eAAyB,CAAA;AAC/B,aAAWC,QAAQH,iBAAiB;AAClC,QAAI,CAACE,aAAaE,SAASD,KAAKjD,IAAI,GAAG;AACrC+C,eAAS3E,KAAK6E,IAAAA;AACdD,mBAAa5E,KAAK6E,KAAKjD,IAAI;IAC7B;EACF;AACA,SAAO+C;AACT;AAVgBvC;","names":["actionParametersToJsonSchema","randomId","plainToInstance","convertGqlInputToMessages","inputMessages","messages","message","textMessage","push","plainToInstance","TextMessage","id","createdAt","role","content","actionExecutionMessage","ActionExecutionMessage","name","arguments","JSON","parse","scope","resultMessage","ResultMessage","actionExecutionId","actionName","result","agentStateMessage","AgentStateMessage","threadId","agentName","nodeName","runId","active","state","running","from","CopilotRuntime","actions","remoteActionDefinitions","langserve","onBeforeRequest","onAfterRequest","constructor","params","chain","remoteChain","RemoteChain","push","toAction","remoteActions","middleware","processRuntimeRequest","request","serviceAdapter","messages","rawMessages","clientSideActionsInput","threadId","runId","outputMessagesPromise","graphqlContext","forwardedParameters","agentSession","url","processAgentRequest","filter","message","agentStateMessage","inputMessages","convertGqlInputToMessages","serverSideActions","getServerSideActions","serverSideActionsInput","map","action","name","description","jsonSchema","JSON","stringify","actionParametersToJsonSchema","parameters","actionInputs","flattenToolCallsNoDuplicates","properties","eventSource","RuntimeEventSource","result","process","then","outputMessages","_a","catch","_error","actionInputsWithoutAgents","find","serverSideAction","error","console","randomId","agentName","nodeName","agent","isLangGraphAgentAction","Error","undefined","stream","langGraphAgentHandler","eventStream$","from","subscribe","next","event","err","complete","agentStates","langserveFunctions","chainPromise","setupRemoteActions","frontendUrl","configuredActions","toolsByPriority","allTools","allToolNames","tool","includes"]}