@copilotkit/runtime 1.1.3-feat-runtime-remote-actions.2 → 1.2.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 (75) hide show
  1. package/CHANGELOG.md +17 -13
  2. package/__snapshots__/schema/schema.graphql +0 -41
  3. package/dist/{chunk-BJ2LVHWA.mjs → chunk-736EEICU.mjs} +3 -3
  4. package/dist/{chunk-W7RRKPE2.mjs → chunk-DMO6FA25.mjs} +2 -2
  5. package/dist/{chunk-JYLUCJP7.mjs → chunk-DYF5MUAH.mjs} +2 -2
  6. package/dist/{chunk-TBZGOJJX.mjs → chunk-GEIBJJQ4.mjs} +2 -14
  7. package/dist/chunk-GEIBJJQ4.mjs.map +1 -0
  8. package/dist/chunk-PB24CCIJ.mjs +158 -0
  9. package/dist/chunk-PB24CCIJ.mjs.map +1 -0
  10. package/dist/{chunk-7FSNQXPE.mjs → chunk-Q5ZTE7WH.mjs} +158 -786
  11. package/dist/chunk-Q5ZTE7WH.mjs.map +1 -0
  12. package/dist/{chunk-73NMP3DI.mjs → chunk-URMISMK2.mjs} +2 -2
  13. package/dist/{chunk-WRPRFRSL.mjs → chunk-YMUS43FR.mjs} +2 -2
  14. package/dist/graphql/types/converted/index.d.ts +1 -1
  15. package/dist/graphql/types/converted/index.js +0 -13
  16. package/dist/graphql/types/converted/index.js.map +1 -1
  17. package/dist/graphql/types/converted/index.mjs +1 -3
  18. package/dist/{index-079752b9.d.ts → index-13aa818e.d.ts} +1 -1
  19. package/dist/{index-0476e4f7.d.ts → index-aa091e3c.d.ts} +2 -24
  20. package/dist/index.d.ts +7 -7
  21. package/dist/index.js +245 -982
  22. package/dist/index.js.map +1 -1
  23. package/dist/index.mjs +8 -8
  24. package/dist/{langserve-d6073a3b.d.ts → langserve-a54438c6.d.ts} +11 -24
  25. package/dist/lib/index.d.ts +7 -7
  26. package/dist/lib/index.js +245 -982
  27. package/dist/lib/index.js.map +1 -1
  28. package/dist/lib/index.mjs +8 -8
  29. package/dist/lib/integrations/index.d.ts +6 -6
  30. package/dist/lib/integrations/index.js +182 -437
  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 +5 -5
  34. package/dist/lib/integrations/nest/index.js +182 -437
  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 +5 -5
  38. package/dist/lib/integrations/node-express/index.js +182 -437
  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 +5 -5
  42. package/dist/lib/integrations/node-http/index.js +182 -437
  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 +3 -3
  46. package/dist/service-adapters/index.js.map +1 -1
  47. package/dist/service-adapters/index.mjs +3 -3
  48. package/dist/{copilot-runtime-d427e991.d.ts → shared-c5362338.d.ts} +38 -65
  49. package/package.json +5 -7
  50. package/src/graphql/inputs/generate-copilot-response.input.ts +0 -11
  51. package/src/graphql/inputs/message.input.ts +0 -30
  52. package/src/graphql/resolvers/copilot.resolver.ts +12 -56
  53. package/src/graphql/types/converted/index.ts +0 -15
  54. package/src/graphql/types/copilot-response.type.ts +0 -29
  55. package/src/graphql/types/enums.ts +0 -1
  56. package/src/lib/copilot-runtime.ts +231 -0
  57. package/src/lib/index.ts +1 -1
  58. package/src/lib/integrations/shared.ts +1 -1
  59. package/src/service-adapters/conversion.ts +0 -16
  60. package/src/service-adapters/events.ts +19 -101
  61. package/dist/chunk-5TYP4A3G.mjs +0 -260
  62. package/dist/chunk-5TYP4A3G.mjs.map +0 -1
  63. package/dist/chunk-7FSNQXPE.mjs.map +0 -1
  64. package/dist/chunk-TBZGOJJX.mjs.map +0 -1
  65. package/src/agents/langgraph/event-source.ts +0 -222
  66. package/src/agents/langgraph/events.ts +0 -309
  67. package/src/graphql/inputs/agent-session.input.ts +0 -13
  68. package/src/graphql/inputs/agent-state.input.ts +0 -10
  69. package/src/lib/runtime/copilot-runtime.ts +0 -360
  70. package/src/lib/runtime/remote-actions.ts +0 -241
  71. /package/dist/{chunk-BJ2LVHWA.mjs.map → chunk-736EEICU.mjs.map} +0 -0
  72. /package/dist/{chunk-W7RRKPE2.mjs.map → chunk-DMO6FA25.mjs.map} +0 -0
  73. /package/dist/{chunk-JYLUCJP7.mjs.map → chunk-DYF5MUAH.mjs.map} +0 -0
  74. /package/dist/{chunk-73NMP3DI.mjs.map → chunk-URMISMK2.mjs.map} +0 -0
  75. /package/dist/{chunk-WRPRFRSL.mjs.map → chunk-YMUS43FR.mjs.map} +0 -0
@@ -1,20 +1,7 @@
1
1
  import { Action } from "@copilotkit/shared";
2
- import {
3
- of,
4
- concat,
5
- map,
6
- scan,
7
- concatMap,
8
- ReplaySubject,
9
- Subject,
10
- firstValueFrom,
11
- from,
12
- } from "rxjs";
2
+ import { of, concat, map, scan, concatMap, ReplaySubject, Subject, firstValueFrom } from "rxjs";
13
3
  import { streamLangChainResponse } from "./langchain/utils";
14
4
  import { GuardrailsResult } from "../graphql/types/guardrails-result.type";
15
- import telemetry from "../lib/telemetry-client";
16
- import { isLangGraphAgentAction } from "../lib/runtime/remote-actions";
17
- import { ActionInput } from "../graphql/inputs/action.input";
18
5
 
19
6
  export enum RuntimeEventTypes {
20
7
  TextMessageStart = "TextMessageStart",
@@ -24,10 +11,9 @@ export enum RuntimeEventTypes {
24
11
  ActionExecutionArgs = "ActionExecutionArgs",
25
12
  ActionExecutionEnd = "ActionExecutionEnd",
26
13
  ActionExecutionResult = "ActionExecutionResult",
27
- AgentStateMessage = "AgentStateMessage",
28
14
  }
29
15
 
30
- type FunctionCallScope = "client" | "server" | "passThrough";
16
+ type FunctionCallScope = "client" | "server";
31
17
 
32
18
  export type RuntimeEvent =
33
19
  | { type: RuntimeEventTypes.TextMessageStart; messageId: string }
@@ -49,17 +35,6 @@ export type RuntimeEvent =
49
35
  actionName: string;
50
36
  actionExecutionId: string;
51
37
  result: string;
52
- }
53
- | {
54
- type: RuntimeEventTypes.AgentStateMessage;
55
- threadId: string;
56
- agentName: string;
57
- nodeName: string;
58
- runId: string;
59
- active: boolean;
60
- role: string;
61
- state: string;
62
- running: boolean;
63
38
  };
64
39
 
65
40
  interface RuntimeEventWithState {
@@ -125,29 +100,6 @@ export class RuntimeEventSubject extends ReplaySubject<RuntimeEvent> {
125
100
  result,
126
101
  });
127
102
  }
128
-
129
- sendAgentStateMessage(
130
- threadId: string,
131
- agentName: string,
132
- nodeName: string,
133
- runId: string,
134
- active: boolean,
135
- role: string,
136
- state: string,
137
- running: boolean,
138
- ) {
139
- this.next({
140
- type: RuntimeEventTypes.AgentStateMessage,
141
- threadId,
142
- agentName,
143
- nodeName,
144
- runId,
145
- active,
146
- role,
147
- state,
148
- running,
149
- });
150
- }
151
103
  }
152
104
 
153
105
  export class RuntimeEventSource {
@@ -158,14 +110,12 @@ export class RuntimeEventSource {
158
110
  this.callback = callback;
159
111
  }
160
112
 
161
- processRuntimeEvents({
162
- serverSideActions,
113
+ process({
114
+ serversideActions,
163
115
  guardrailsResult$,
164
- actionInputsWithoutAgents,
165
116
  }: {
166
- serverSideActions: Action<any>[];
117
+ serversideActions: Action<any>[];
167
118
  guardrailsResult$?: Subject<GuardrailsResult>;
168
- actionInputsWithoutAgents: ActionInput[];
169
119
  }) {
170
120
  this.callback(this.eventStream$).catch((error) => {
171
121
  console.error("Error in event source callback", error);
@@ -174,35 +124,27 @@ export class RuntimeEventSource {
174
124
  // mark tools for server side execution
175
125
  map((event) => {
176
126
  if (event.type === RuntimeEventTypes.ActionExecutionStart) {
177
- if (event.scope !== "passThrough") {
178
- event.scope = serverSideActions.find((action) => action.name === event.actionName)
179
- ? "server"
180
- : "client";
181
- }
127
+ event.scope = serversideActions.find((action) => action.name === event.actionName)
128
+ ? "server"
129
+ : "client";
182
130
  }
183
131
  return event;
184
132
  }),
185
133
  // track state
186
134
  scan(
187
135
  (acc, event) => {
188
- // It seems like this is needed so that rxjs recognizes the object has changed
189
- // This fixes an issue where action were executed multiple times
190
- // Not investigating further for now (Markus)
191
- acc = { ...acc };
192
-
193
136
  if (event.type === RuntimeEventTypes.ActionExecutionStart) {
194
137
  acc.callActionServerSide = event.scope === "server";
195
138
  acc.args = "";
196
139
  acc.actionExecutionId = event.actionExecutionId;
197
140
  if (acc.callActionServerSide) {
198
- acc.action = serverSideActions.find((action) => action.name === event.actionName);
141
+ acc.action = serversideActions.find((action) => action.name === event.actionName);
199
142
  }
200
143
  } else if (event.type === RuntimeEventTypes.ActionExecutionArgs) {
201
144
  acc.args += event.args;
202
145
  }
203
146
 
204
147
  acc.event = event;
205
-
206
148
  return acc;
207
149
  },
208
150
  {
@@ -225,12 +167,9 @@ export class RuntimeEventSource {
225
167
  eventWithState.action!,
226
168
  eventWithState.args,
227
169
  eventWithState.actionExecutionId,
228
- actionInputsWithoutAgents,
229
170
  ).catch((error) => {
230
171
  console.error(error);
231
172
  });
232
-
233
- telemetry.capture("oss.runtime.server_action_executed", {});
234
173
  return concat(of(eventWithState.event!), toolCallEventStream$);
235
174
  } else {
236
175
  return of(eventWithState.event!);
@@ -246,7 +185,6 @@ async function executeAction(
246
185
  action: Action<any>,
247
186
  actionArguments: string,
248
187
  actionExecutionId: string,
249
- actionInputsWithoutAgents: ActionInput[],
250
188
  ) {
251
189
  if (guardrailsResult$) {
252
190
  const { status } = await firstValueFrom(guardrailsResult$);
@@ -263,35 +201,15 @@ async function executeAction(
263
201
  args = JSON.parse(actionArguments);
264
202
  }
265
203
 
266
- // handle LangGraph agents
267
- if (isLangGraphAgentAction(action)) {
268
- eventStream$.sendActionExecutionResult(
269
- actionExecutionId,
270
- action.name,
271
- `${action.name} agent started`,
272
- );
273
- const stream = await action.langGraphAgentHandler({
274
- name: action.name,
275
- actionInputsWithoutAgents,
276
- });
277
-
278
- // forward to eventStream$
279
- from(stream).subscribe({
280
- next: (event) => eventStream$.next(event),
281
- error: (err) => console.error("Error in stream", err),
282
- complete: () => eventStream$.complete(),
283
- });
284
- } else {
285
- // call the function
286
- const result = await action.handler?.(args);
204
+ // call the function
205
+ const result = await action.handler(args);
287
206
 
288
- await streamLangChainResponse({
289
- result,
290
- eventStream$,
291
- actionExecution: {
292
- name: action.name,
293
- id: actionExecutionId,
294
- },
295
- });
296
- }
207
+ await streamLangChainResponse({
208
+ result,
209
+ eventStream$,
210
+ actionExecution: {
211
+ name: action.name,
212
+ id: actionExecutionId,
213
+ },
214
+ });
297
215
  }
@@ -1,260 +0,0 @@
1
- import {
2
- RemoteChain
3
- } from "./chunk-BJ2LVHWA.mjs";
4
- import {
5
- RuntimeEventSource,
6
- isLangGraphAgentAction,
7
- setupRemoteActions
8
- } from "./chunk-7FSNQXPE.mjs";
9
- import {
10
- ActionExecutionMessage,
11
- AgentStateMessage,
12
- ResultMessage,
13
- TextMessage
14
- } from "./chunk-TBZGOJJX.mjs";
15
- import {
16
- __name
17
- } from "./chunk-44O2JGUY.mjs";
18
-
19
- // src/lib/runtime/copilot-runtime.ts
20
- import { actionParametersToJsonSchema, randomId } from "@copilotkit/shared";
21
-
22
- // src/service-adapters/conversion.ts
23
- import { plainToInstance } from "class-transformer";
24
- function convertGqlInputToMessages(inputMessages) {
25
- const messages = [];
26
- for (const message of inputMessages) {
27
- if (message.textMessage) {
28
- messages.push(plainToInstance(TextMessage, {
29
- id: message.id,
30
- createdAt: message.createdAt,
31
- role: message.textMessage.role,
32
- content: message.textMessage.content
33
- }));
34
- } else if (message.actionExecutionMessage) {
35
- messages.push(plainToInstance(ActionExecutionMessage, {
36
- id: message.id,
37
- createdAt: message.createdAt,
38
- name: message.actionExecutionMessage.name,
39
- arguments: JSON.parse(message.actionExecutionMessage.arguments),
40
- scope: message.actionExecutionMessage.scope
41
- }));
42
- } else if (message.resultMessage) {
43
- messages.push(plainToInstance(ResultMessage, {
44
- id: message.id,
45
- createdAt: message.createdAt,
46
- actionExecutionId: message.resultMessage.actionExecutionId,
47
- actionName: message.resultMessage.actionName,
48
- result: message.resultMessage.result
49
- }));
50
- } else if (message.agentStateMessage) {
51
- messages.push(plainToInstance(AgentStateMessage, {
52
- id: message.id,
53
- threadId: message.agentStateMessage.threadId,
54
- createdAt: message.createdAt,
55
- agentName: message.agentStateMessage.agentName,
56
- nodeName: message.agentStateMessage.nodeName,
57
- runId: message.agentStateMessage.runId,
58
- active: message.agentStateMessage.active,
59
- role: message.agentStateMessage.role,
60
- state: JSON.parse(message.agentStateMessage.state),
61
- running: message.agentStateMessage.running
62
- }));
63
- }
64
- }
65
- return messages;
66
- }
67
- __name(convertGqlInputToMessages, "convertGqlInputToMessages");
68
-
69
- // src/lib/runtime/copilot-runtime.ts
70
- import { from } from "rxjs";
71
- var CopilotRuntime = class {
72
- actions;
73
- remoteActionDefinitions;
74
- langserve = [];
75
- onBeforeRequest;
76
- onAfterRequest;
77
- constructor(params) {
78
- var _a, _b;
79
- this.actions = (params == null ? void 0 : params.actions) || [];
80
- for (const chain of (params == null ? void 0 : params.langserve) || []) {
81
- const remoteChain = new RemoteChain(chain);
82
- this.langserve.push(remoteChain.toAction());
83
- }
84
- this.remoteActionDefinitions = (params == null ? void 0 : params.remoteActions) || [];
85
- this.onBeforeRequest = (_a = params == null ? void 0 : params.middleware) == null ? void 0 : _a.onBeforeRequest;
86
- this.onAfterRequest = (_b = params == null ? void 0 : params.middleware) == null ? void 0 : _b.onAfterRequest;
87
- }
88
- async processRuntimeRequest(request) {
89
- var _a;
90
- const { serviceAdapter, messages: rawMessages, actions: clientSideActionsInput, threadId, runId, outputMessagesPromise, graphqlContext, forwardedParameters, agentSession, url } = request;
91
- if (agentSession) {
92
- return this.processAgentRequest(request);
93
- }
94
- const messages = rawMessages.filter((message) => !message.agentStateMessage);
95
- const inputMessages = convertGqlInputToMessages(messages);
96
- const serverSideActions = await this.getServerSideActions(request);
97
- const serverSideActionsInput = serverSideActions.map((action) => ({
98
- name: action.name,
99
- description: action.description,
100
- jsonSchema: JSON.stringify(actionParametersToJsonSchema(action.parameters))
101
- }));
102
- const actionInputs = flattenToolCallsNoDuplicates([
103
- ...serverSideActionsInput,
104
- ...clientSideActionsInput
105
- ]);
106
- await ((_a = this.onBeforeRequest) == null ? void 0 : _a.call(this, {
107
- threadId,
108
- runId,
109
- inputMessages,
110
- properties: graphqlContext.properties,
111
- url
112
- }));
113
- try {
114
- const eventSource = new RuntimeEventSource();
115
- const result = await serviceAdapter.process({
116
- messages: inputMessages,
117
- actions: actionInputs,
118
- threadId,
119
- runId,
120
- eventSource,
121
- forwardedParameters
122
- });
123
- outputMessagesPromise.then((outputMessages) => {
124
- var _a2;
125
- (_a2 = this.onAfterRequest) == null ? void 0 : _a2.call(this, {
126
- threadId: result.threadId,
127
- runId: result.runId,
128
- inputMessages,
129
- outputMessages,
130
- properties: graphqlContext.properties,
131
- url
132
- });
133
- }).catch((_error) => {
134
- });
135
- return {
136
- threadId: result.threadId,
137
- runId: result.runId,
138
- eventSource,
139
- serverSideActions,
140
- actionInputsWithoutAgents: actionInputs.filter((action) => (
141
- // TODO-AGENTS: do not exclude ALL server side actions
142
- !serverSideActions.find((serverSideAction) => serverSideAction.name == action.name)
143
- ))
144
- };
145
- } catch (error) {
146
- console.error("Error getting response:", error);
147
- throw error;
148
- }
149
- }
150
- async processAgentRequest(request) {
151
- var _a;
152
- const { messages: rawMessages, outputMessagesPromise, graphqlContext, agentSession } = request;
153
- const { threadId = randomId(), agentName, nodeName } = agentSession;
154
- const serverSideActions = await this.getServerSideActions(request);
155
- const messages = convertGqlInputToMessages(rawMessages);
156
- const agent = serverSideActions.find((action) => action.name === agentName && isLangGraphAgentAction(action));
157
- if (!agent) {
158
- throw new Error(`Agent ${agentName} not found`);
159
- }
160
- const serverSideActionsInput = serverSideActions.filter((action) => !isLangGraphAgentAction(action)).map((action) => ({
161
- name: action.name,
162
- description: action.description,
163
- jsonSchema: JSON.stringify(actionParametersToJsonSchema(action.parameters))
164
- }));
165
- const actionInputsWithoutAgents = flattenToolCallsNoDuplicates([
166
- ...serverSideActionsInput,
167
- ...request.actions
168
- ]);
169
- await ((_a = this.onBeforeRequest) == null ? void 0 : _a.call(this, {
170
- threadId,
171
- runId: void 0,
172
- inputMessages: messages,
173
- properties: graphqlContext.properties
174
- }));
175
- try {
176
- const eventSource = new RuntimeEventSource();
177
- const stream = await agent.langGraphAgentHandler({
178
- name: agentName,
179
- threadId,
180
- nodeName,
181
- actionInputsWithoutAgents
182
- });
183
- eventSource.stream(async (eventStream$) => {
184
- from(stream).subscribe({
185
- next: (event) => eventStream$.next(event),
186
- error: (err) => console.error("Error in stream", err),
187
- complete: () => eventStream$.complete()
188
- });
189
- });
190
- outputMessagesPromise.then((outputMessages) => {
191
- var _a2;
192
- (_a2 = this.onAfterRequest) == null ? void 0 : _a2.call(this, {
193
- threadId,
194
- runId: void 0,
195
- inputMessages: messages,
196
- outputMessages,
197
- properties: graphqlContext.properties
198
- });
199
- }).catch((_error) => {
200
- });
201
- return {
202
- threadId,
203
- runId: void 0,
204
- eventSource,
205
- serverSideActions: [],
206
- actionInputsWithoutAgents
207
- };
208
- } catch (error) {
209
- console.error("Error getting response:", error);
210
- throw error;
211
- }
212
- }
213
- async getServerSideActions(request) {
214
- const { messages: rawMessages, graphqlContext, agentStates, url } = request;
215
- const inputMessages = convertGqlInputToMessages(rawMessages);
216
- const langserveFunctions = [];
217
- for (const chainPromise of this.langserve) {
218
- try {
219
- const chain = await chainPromise;
220
- langserveFunctions.push(chain);
221
- } catch (error) {
222
- console.error("Error loading langserve chain:", error);
223
- }
224
- }
225
- const remoteActions = await setupRemoteActions({
226
- remoteActionDefinitions: this.remoteActionDefinitions,
227
- graphqlContext,
228
- messages: inputMessages,
229
- agentStates
230
- });
231
- const configuredActions = typeof this.actions === "function" ? this.actions({
232
- properties: graphqlContext.properties,
233
- url
234
- }) : this.actions;
235
- return [
236
- ...configuredActions,
237
- ...langserveFunctions,
238
- ...remoteActions
239
- ];
240
- }
241
- };
242
- __name(CopilotRuntime, "CopilotRuntime");
243
- function flattenToolCallsNoDuplicates(toolsByPriority) {
244
- let allTools = [];
245
- const allToolNames = [];
246
- for (const tool of toolsByPriority) {
247
- if (!allToolNames.includes(tool.name)) {
248
- allTools.push(tool);
249
- allToolNames.push(tool.name);
250
- }
251
- }
252
- return allTools;
253
- }
254
- __name(flattenToolCallsNoDuplicates, "flattenToolCallsNoDuplicates");
255
-
256
- export {
257
- CopilotRuntime,
258
- flattenToolCallsNoDuplicates
259
- };
260
- //# sourceMappingURL=chunk-5TYP4A3G.mjs.map
@@ -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 });\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":"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","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","configuredActions","toolsByPriority","allTools","allToolNames","tool","includes"]}