@copilotkit/runtime 1.3.12-lgc-alpha-1.0 → 1.3.13

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 (56) hide show
  1. package/CHANGELOG.md +12 -3
  2. package/dist/{chunk-6HXQC7IT.mjs → chunk-3LFBIWWK.mjs} +9 -36
  3. package/dist/chunk-3LFBIWWK.mjs.map +1 -0
  4. package/dist/{chunk-E6ZFCM3B.mjs → chunk-76K222WC.mjs} +133 -561
  5. package/dist/chunk-76K222WC.mjs.map +1 -0
  6. package/dist/{chunk-V7SK6QZN.mjs → chunk-CPAHDRLS.mjs} +36 -9
  7. package/dist/chunk-CPAHDRLS.mjs.map +1 -0
  8. package/dist/{chunk-TM7ZRU3M.mjs → chunk-DEZQR4EM.mjs} +2 -2
  9. package/dist/{chunk-XMDH5MKI.mjs → chunk-MCUYYSCJ.mjs} +2 -2
  10. package/dist/{chunk-6B3NPPSR.mjs → chunk-SPZSO3T3.mjs} +2 -2
  11. package/dist/{chunk-7MQDBRXJ.mjs → chunk-Y6RQG5HF.mjs} +2 -2
  12. package/dist/{copilot-runtime-aba7d4b4.d.ts → copilot-runtime-df3527ad.d.ts} +5 -27
  13. package/dist/index.d.ts +1 -1
  14. package/dist/index.js +213 -641
  15. package/dist/index.js.map +1 -1
  16. package/dist/index.mjs +9 -13
  17. package/dist/index.mjs.map +1 -1
  18. package/dist/lib/index.d.ts +1 -1
  19. package/dist/lib/index.js +213 -641
  20. package/dist/lib/index.js.map +1 -1
  21. package/dist/lib/index.mjs +9 -13
  22. package/dist/lib/integrations/index.d.ts +2 -2
  23. package/dist/lib/integrations/index.js +4 -5
  24. package/dist/lib/integrations/index.js.map +1 -1
  25. package/dist/lib/integrations/index.mjs +5 -5
  26. package/dist/lib/integrations/nest/index.d.ts +1 -1
  27. package/dist/lib/integrations/nest/index.js +4 -5
  28. package/dist/lib/integrations/nest/index.js.map +1 -1
  29. package/dist/lib/integrations/nest/index.mjs +3 -3
  30. package/dist/lib/integrations/node-express/index.d.ts +1 -1
  31. package/dist/lib/integrations/node-express/index.js +4 -5
  32. package/dist/lib/integrations/node-express/index.js.map +1 -1
  33. package/dist/lib/integrations/node-express/index.mjs +3 -3
  34. package/dist/lib/integrations/node-http/index.d.ts +1 -1
  35. package/dist/lib/integrations/node-http/index.js +4 -5
  36. package/dist/lib/integrations/node-http/index.js.map +1 -1
  37. package/dist/lib/integrations/node-http/index.mjs +2 -2
  38. package/dist/service-adapters/index.js +35 -8
  39. package/dist/service-adapters/index.js.map +1 -1
  40. package/dist/service-adapters/index.mjs +2 -2
  41. package/package.json +6 -7
  42. package/src/agents/langgraph/event-source.ts +67 -22
  43. package/src/lib/runtime/copilot-runtime.ts +11 -58
  44. package/src/lib/runtime/remote-actions.ts +159 -65
  45. package/src/service-adapters/events.ts +5 -1
  46. package/src/service-adapters/langchain/utils.test.ts +169 -0
  47. package/src/service-adapters/langchain/utils.ts +41 -8
  48. package/dist/chunk-6HXQC7IT.mjs.map +0 -1
  49. package/dist/chunk-E6ZFCM3B.mjs.map +0 -1
  50. package/dist/chunk-V7SK6QZN.mjs.map +0 -1
  51. package/src/lib/runtime/remote-action-constructors.ts +0 -283
  52. package/src/lib/runtime/remote-lg-cloud-action.ts +0 -441
  53. /package/dist/{chunk-TM7ZRU3M.mjs.map → chunk-DEZQR4EM.mjs.map} +0 -0
  54. /package/dist/{chunk-XMDH5MKI.mjs.map → chunk-MCUYYSCJ.mjs.map} +0 -0
  55. /package/dist/{chunk-6B3NPPSR.mjs.map → chunk-SPZSO3T3.mjs.map} +0 -0
  56. /package/dist/{chunk-7MQDBRXJ.mjs.map → chunk-Y6RQG5HF.mjs.map} +0 -0
@@ -0,0 +1,169 @@
1
+ import { z } from "zod";
2
+ import { convertJsonSchemaToZodSchema } from "./utils";
3
+ import { zodToJsonSchema } from "zod-to-json-schema";
4
+
5
+ describe("convertJsonSchemaToZodSchema", () => {
6
+ it("should convert a simple JSON schema to a Zod schema", () => {
7
+ const jsonSchema = {
8
+ type: "object",
9
+ properties: {
10
+ name: { type: "string" },
11
+ age: { type: "number" },
12
+ },
13
+ required: ["name", "age"],
14
+ };
15
+
16
+ const expectedSchema = z.object({
17
+ name: z.string(),
18
+ age: z.number(),
19
+ });
20
+
21
+ const result = convertJsonSchemaToZodSchema(jsonSchema, true);
22
+ const resultSchemaJson = zodToJsonSchema(result);
23
+ const expectedSchemaJson = zodToJsonSchema(expectedSchema);
24
+
25
+ expect(resultSchemaJson).toStrictEqual(expectedSchemaJson);
26
+ });
27
+
28
+ it("should convert a JSON schema with nested objects to a Zod schema", () => {
29
+ const jsonSchema = {
30
+ type: "object",
31
+ properties: {
32
+ name: { type: "string" },
33
+ address: {
34
+ type: "object",
35
+ properties: {
36
+ street: { type: "string" },
37
+ city: { type: "string" },
38
+ },
39
+ required: ["street", "city"],
40
+ },
41
+ },
42
+ required: ["name", "address"],
43
+ };
44
+
45
+ const expectedSchema = z.object({
46
+ name: z.string(),
47
+ address: z.object({
48
+ street: z.string(),
49
+ city: z.string(),
50
+ }),
51
+ });
52
+
53
+ const result = convertJsonSchemaToZodSchema(jsonSchema, true);
54
+ const resultSchemaJson = zodToJsonSchema(result);
55
+ const expectedSchemaJson = zodToJsonSchema(expectedSchema);
56
+
57
+ expect(resultSchemaJson).toStrictEqual(expectedSchemaJson);
58
+ });
59
+
60
+ it("should convert a JSON schema with arrays to a Zod schema", () => {
61
+ const jsonSchema = {
62
+ type: "object",
63
+ properties: {
64
+ names: {
65
+ type: "array",
66
+ items: { type: "string" },
67
+ },
68
+ },
69
+ required: ["names"],
70
+ };
71
+
72
+ const expectedSchema = z.object({
73
+ names: z.array(z.string()),
74
+ });
75
+
76
+ const result = convertJsonSchemaToZodSchema(jsonSchema, true);
77
+ const resultSchemaJson = zodToJsonSchema(result);
78
+ const expectedSchemaJson = zodToJsonSchema(expectedSchema);
79
+
80
+ expect(resultSchemaJson).toStrictEqual(expectedSchemaJson);
81
+ });
82
+
83
+ it("should convert a JSON schema with optional properties to a Zod schema", () => {
84
+ const jsonSchema = {
85
+ type: "object",
86
+ properties: {
87
+ name: { type: "string" },
88
+ age: { type: "number", required: false },
89
+ },
90
+ };
91
+
92
+ const expectedSchema = z
93
+ .object({
94
+ name: z.string().optional(),
95
+ age: z.number().optional(),
96
+ })
97
+ .optional();
98
+
99
+ const result = convertJsonSchemaToZodSchema(jsonSchema, false);
100
+
101
+ console.log(convertJsonSchemaToZodSchema(jsonSchema, false));
102
+
103
+ const resultSchemaJson = zodToJsonSchema(result);
104
+ const expectedSchemaJson = zodToJsonSchema(expectedSchema);
105
+
106
+ expect(resultSchemaJson).toStrictEqual(expectedSchemaJson);
107
+ });
108
+
109
+ it("should convert a JSON schema with different types to a Zod schema", () => {
110
+ const jsonSchema = {
111
+ type: "object",
112
+ properties: {
113
+ name: { type: "string" },
114
+ age: { type: "number" },
115
+ isAdmin: { type: "boolean" },
116
+ },
117
+ required: ["name", "age", "isAdmin"],
118
+ };
119
+
120
+ const expectedSchema = z.object({
121
+ name: z.string(),
122
+ age: z.number(),
123
+ isAdmin: z.boolean(),
124
+ });
125
+
126
+ const result = convertJsonSchemaToZodSchema(jsonSchema, true);
127
+ const resultSchemaJson = zodToJsonSchema(result);
128
+ const expectedSchemaJson = zodToJsonSchema(expectedSchema);
129
+
130
+ expect(resultSchemaJson).toStrictEqual(expectedSchemaJson);
131
+ });
132
+
133
+ it("should handle edge case where JSON schema has no properties", () => {
134
+ const jsonSchema = {
135
+ type: "object",
136
+ };
137
+
138
+ const expectedSchema = z.object({});
139
+
140
+ const result = convertJsonSchemaToZodSchema(jsonSchema, true);
141
+ const resultSchemaJson = zodToJsonSchema(result);
142
+ const expectedSchemaJson = zodToJsonSchema(expectedSchema);
143
+
144
+ expect(resultSchemaJson).toStrictEqual(expectedSchemaJson);
145
+ });
146
+
147
+ it("should handle edge case where JSON schema has no required properties", () => {
148
+ const jsonSchema = {
149
+ type: "object",
150
+ properties: {
151
+ name: { type: "string" },
152
+ age: { type: "number" },
153
+ },
154
+ };
155
+
156
+ const expectedSchema = z
157
+ .object({
158
+ name: z.string().optional(),
159
+ age: z.number().optional(),
160
+ })
161
+ .optional();
162
+
163
+ const result = convertJsonSchemaToZodSchema(jsonSchema, false);
164
+ const resultSchemaJson = zodToJsonSchema(result);
165
+ const expectedSchemaJson = zodToJsonSchema(expectedSchema);
166
+
167
+ expect(resultSchemaJson).toStrictEqual(expectedSchemaJson);
168
+ });
169
+ });
@@ -51,6 +51,11 @@ export function convertMessageToLangChainMessage(message: Message): BaseMessage
51
51
  export function convertJsonSchemaToZodSchema(jsonSchema: any, required: boolean): z.ZodSchema {
52
52
  if (jsonSchema.type === "object") {
53
53
  const spec: { [key: string]: z.ZodSchema } = {};
54
+
55
+ if (!jsonSchema.properties || !Object.keys(jsonSchema.properties).length) {
56
+ return !required ? z.object(spec).optional() : z.object(spec);
57
+ }
58
+
54
59
  for (const [key, value] of Object.entries(jsonSchema.properties)) {
55
60
  spec[key] = convertJsonSchemaToZodSchema(
56
61
  value,
@@ -58,20 +63,20 @@ export function convertJsonSchemaToZodSchema(jsonSchema: any, required: boolean)
58
63
  );
59
64
  }
60
65
  let schema = z.object(spec);
61
- return !required ? schema.optional() : schema;
66
+ return required ? schema : schema.optional();
62
67
  } else if (jsonSchema.type === "string") {
63
68
  let schema = z.string().describe(jsonSchema.description);
64
- return !required ? schema.optional() : schema;
69
+ return required ? schema : schema.optional();
65
70
  } else if (jsonSchema.type === "number") {
66
71
  let schema = z.number().describe(jsonSchema.description);
67
- return !required ? schema.optional() : schema;
72
+ return required ? schema : schema.optional();
68
73
  } else if (jsonSchema.type === "boolean") {
69
74
  let schema = z.boolean().describe(jsonSchema.description);
70
- return !required ? schema.optional() : schema;
75
+ return required ? schema : schema.optional();
71
76
  } else if (jsonSchema.type === "array") {
72
77
  let itemSchema = convertJsonSchemaToZodSchema(jsonSchema.items, true);
73
78
  let schema = z.array(itemSchema);
74
- return !required ? schema.optional() : schema;
79
+ return required ? schema : schema.optional();
75
80
  }
76
81
  }
77
82
 
@@ -196,6 +201,13 @@ export async function streamLangChainResponse({
196
201
 
197
202
  let mode: "function" | "message" | null = null;
198
203
 
204
+ const toolCallDetails = {
205
+ name: null,
206
+ id: null,
207
+ index: null,
208
+ prevIndex: null,
209
+ };
210
+
199
211
  while (true) {
200
212
  try {
201
213
  const { done, value } = await reader.read();
@@ -203,15 +215,30 @@ export async function streamLangChainResponse({
203
215
  let toolCallName: string | undefined = undefined;
204
216
  let toolCallId: string | undefined = undefined;
205
217
  let toolCallArgs: string | undefined = undefined;
218
+ let toolCallIndex: number | undefined = undefined;
219
+ let toolCallPrevIndex: number | undefined = undefined;
206
220
  let hasToolCall: boolean = false;
207
221
  let content = value?.content as string;
208
222
 
209
223
  if (isAIMessageChunk(value)) {
210
224
  let chunk = value.tool_call_chunks?.[0];
211
- toolCallName = chunk?.name;
212
- toolCallId = chunk?.id;
213
225
  toolCallArgs = chunk?.args;
214
226
  hasToolCall = chunk != undefined;
227
+ if (chunk?.name) toolCallDetails.name = chunk.name;
228
+ // track different index on the same tool cool
229
+ if (chunk?.index != null) {
230
+ toolCallDetails.index = chunk.index; // 1
231
+ if (toolCallDetails.prevIndex == null) toolCallDetails.prevIndex = chunk.index;
232
+ }
233
+ // Differentiate when calling the same tool but with different index
234
+ if (chunk?.id)
235
+ toolCallDetails.id = chunk.index != null ? `${chunk.id}-idx-${chunk.index}` : chunk.id;
236
+
237
+ // Assign to internal variables that the entire script here knows how to work with
238
+ toolCallName = toolCallDetails.name;
239
+ toolCallId = toolCallDetails.id;
240
+ toolCallIndex = toolCallDetails.index;
241
+ toolCallPrevIndex = toolCallDetails.prevIndex;
215
242
  } else if (isBaseMessageChunk(value)) {
216
243
  let chunk = value.additional_kwargs?.tool_calls?.[0];
217
244
  toolCallName = chunk?.function?.name;
@@ -237,7 +264,7 @@ export async function streamLangChainResponse({
237
264
 
238
265
  // If we send a new message type, send the appropriate start event.
239
266
  if (mode === null) {
240
- if (hasToolCall) {
267
+ if (hasToolCall && toolCallId && toolCallName) {
241
268
  mode = "function";
242
269
  eventStream$.sendActionExecutionStart(toolCallId, toolCallName);
243
270
  } else if (content) {
@@ -252,6 +279,12 @@ export async function streamLangChainResponse({
252
279
  Array.isArray(content) ? (content[0]?.text ?? "") : content,
253
280
  );
254
281
  } else if (mode === "function" && toolCallArgs) {
282
+ // For calls of the same tool with different index, we seal last tool call and register a new one
283
+ if (toolCallIndex !== toolCallPrevIndex) {
284
+ eventStream$.sendActionExecutionEnd();
285
+ eventStream$.sendActionExecutionStart(toolCallId, toolCallName);
286
+ toolCallDetails.prevIndex = toolCallDetails.index;
287
+ }
255
288
  eventStream$.sendActionExecutionArgs(toolCallArgs);
256
289
  }
257
290
  } catch (error) {
@@ -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 } from \"@copilotkit/shared\";\nimport { CopilotServiceAdapter, RemoteChain, RemoteChainParameters } 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 { Message } from \"../../graphql/types/converted\";\nimport { ForwardedParametersInput } from \"../../graphql/inputs/forwarded-parameters.input\";\nimport {\n isLangGraphAgentAction,\n LangGraphAgentAction,\n EndpointType,\n setupRemoteActions,\n EndpointDefinition,\n CopilotKitEndpoint,\n LangGraphCloudEndpoint,\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 * Deprecated: See `remoteEndpoints`.\n */\n remoteActions?: EndpointDefinition[];\n\n /*\n * A list of remote actions that can be executed.\n */\n remoteEndpoints?: EndpointDefinition[];\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 remoteEndpointDefinitions: EndpointDefinition[];\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.remoteEndpointDefinitions = params?.remoteEndpoints || [];\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, 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\n const remoteEndpointDefinitions = this.remoteEndpointDefinitions.map(\n (endpoint) =>\n ({\n ...endpoint,\n type: this.resolveEndpointType(endpoint),\n }) as EndpointDefinition,\n );\n\n const remoteActions = await setupRemoteActions({\n remoteEndpointDefinitions,\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 private resolveEndpointType(endpoint: EndpointDefinition) {\n if (\n !endpoint.type &&\n \"langsmithApiKey\" in endpoint &&\n \"deploymentUrl\" in endpoint &&\n \"agents\" in endpoint\n ) {\n return EndpointType.LangGraphCloud;\n }\n\n return endpoint.type;\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\n// The two functions below are \"factory functions\", meant to create the action objects that adhere to the expected interfaces\nexport function copilotKitEndpoint(config: Omit<CopilotKitEndpoint, \"type\">): CopilotKitEndpoint {\n return {\n ...config,\n type: EndpointType.CopilotKit,\n };\n}\n\nexport function langGraphCloudEndpoint(\n config: Omit<LangGraphCloudEndpoint, \"type\">,\n): LangGraphCloudEndpoint {\n return {\n ...config,\n type: EndpointType.LangGraphCloud,\n };\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,oCAA+C;;;ACNhE,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;;;ADuBhB,SAASiC,YAAY;AA6Gd,IAAMC,iBAAN,MAAMA;EACJC;EACCC;EACAC,YAAoC,CAAA;EACpCC;EACAC;EAERC,YAAYC,QAA6C;AArJ3D;AAsJI,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,6BAA4BK,iCAAQM,oBAAmB,CAAA;AAE5D,SAAKT,mBAAkBG,sCAAQO,eAARP,mBAAoBH;AAC3C,SAAKC,kBAAiBE,sCAAQO,eAARP,mBAAoBF;EAC5C;EAEA,MAAMU,sBAAsBC,SAAiE;AAnK/F;AAoKI,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;AA1Nf,YAAAC;AA2NU,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;AA5PrC;AA6PI,UAAM,EAAEE,UAAUC,aAAaI,uBAAuBC,gBAAgBE,aAAY,IAAKV;AACvF,UAAM,EAAEK,UAAU0C,WAAWC,SAAQ,IAAKtC;AAC1C,UAAMQ,oBAAoB,MAAM,KAAKC,qBAAqBnB,OAAAA;AAE1D,UAAME,WAAWe,0BAA0Bd,WAAAA;AAE3C,UAAM8C,QAAQ/B,kBAAkByB,KAC9B,CAACrB,WAAWA,OAAOC,SAASwB,aAAaG,uBAAuB5B,MAAAA,CAAAA;AAGlE,QAAI,CAAC2B,OAAO;AACV,YAAM,IAAIE,MAAM,SAASJ,qBAAqB;IAChD;AAEA,UAAM3B,yBAAwCF,kBAC3CL,OAAO,CAACS,WAAW,CAAC4B,uBAAuB5B,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,OAAO8C;MACPpC,eAAed;MACf8B,YAAYxB,eAAewB;IAC7B;AACA,QAAI;AACF,YAAMC,cAAc,IAAIC,mBAAAA;AACxB,YAAMmB,SAAS,MAAMJ,MAAMK,sBAAsB;QAC/C/B,MAAMwB;QACN1C;QACA2C;QACAN;MACF,CAAA;AAEAT,kBAAYoB,OAAO,OAAOE,iBAAAA;AACxBC,aAAKH,MAAAA,EAAQI,UAAU;UACrBC,MAAM,CAACC,UAAUJ,aAAaG,KAAKC,KAAAA;UACnCd,OAAO,CAACe,QAAQd,QAAQD,MAAM,mBAAmBe,GAAAA;UACjDC,UAAU,MAAMN,aAAaM,SAAQ;QACvC,CAAA;MACF,CAAA;AAEAtD,4BACG8B,KAAK,CAACC,mBAAAA;AAhTf,YAAAC;AAiTU,SAAAA,MAAA,KAAKlD,mBAAL,gBAAAkD,IAAA,WAAsB;UACpBlC;UACAC,OAAO8C;UACPpC,eAAed;UACfoC;UACAN,YAAYxB,eAAewB;QAC7B;MACF,CAAA,EACCQ,MAAM,CAACC,WAAAA;MAAY,CAAA;AAEtB,aAAO;QACLpC;QACAC,OAAO8C;QACPnB;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,gBAAgBsD,aAAanD,IAAG,IAAKX;AACpE,UAAMgB,gBAAgBC,0BAA0Bd,WAAAA;AAChD,UAAM4D,qBAAoC,CAAA;AAE1C,eAAWC,gBAAgB,KAAK7E,WAAW;AACzC,UAAI;AACF,cAAMK,QAAQ,MAAMwE;AACpBD,2BAAmBpE,KAAKH,KAAAA;MAC1B,SAASqD,OAAP;AACAC,gBAAQD,MAAM,kCAAkCA,KAAAA;MAClD;IACF;AAEA,UAAM3D,4BAA4B,KAAKA,0BAA0BmC,IAC/D,CAAC4C,cACE;MACC,GAAGA;MACHC,MAAM,KAAKC,oBAAoBF,QAAAA;IACjC,EAAA;AAGJ,UAAMG,gBAAgB,MAAMC,mBAAmB;MAC7CnF;MACAsB;MACAN,UAAUc;MACV8C;MACAQ,aAAa3D;IACf,CAAA;AAEA,UAAM4D,oBACJ,OAAO,KAAKtF,YAAY,aACpB,KAAKA,QAAQ;MAAE+C,YAAYxB,eAAewB;MAAYrB;IAAI,CAAA,IAC1D,KAAK1B;AAEX,WAAO;SAAIsF;SAAsBR;SAAuBK;;EAC1D;EAEQD,oBAAoBF,UAA8B;AACxD,QACE,CAACA,SAASC,QACV,qBAAqBD,YACrB,mBAAmBA,YACnB,YAAYA,UACZ;AACA,aAAOO,aAAaC;IACtB;AAEA,WAAOR,SAASC;EAClB;AACF;AA5OalF;AA8ON,SAAS+C,6BAA6B2C,iBAA8B;AACzE,MAAIC,WAA0B,CAAA;AAC9B,QAAMC,eAAyB,CAAA;AAC/B,aAAWC,QAAQH,iBAAiB;AAClC,QAAI,CAACE,aAAaE,SAASD,KAAKtD,IAAI,GAAG;AACrCoD,eAAShF,KAAKkF,IAAAA;AACdD,mBAAajF,KAAKkF,KAAKtD,IAAI;IAC7B;EACF;AACA,SAAOoD;AACT;AAVgB5C;AAaT,SAASgD,mBAAmBC,QAAwC;AACzE,SAAO;IACL,GAAGA;IACHd,MAAMM,aAAaS;EACrB;AACF;AALgBF;AAOT,SAASG,uBACdF,QAA4C;AAE5C,SAAO;IACL,GAAGA;IACHd,MAAMM,aAAaC;EACrB;AACF;AAPgBS;","names":["actionParametersToJsonSchema","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","remoteEndpointDefinitions","langserve","onBeforeRequest","onAfterRequest","constructor","params","chain","remoteChain","RemoteChain","push","toAction","remoteEndpoints","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","agentName","nodeName","agent","isLangGraphAgentAction","Error","undefined","stream","langGraphAgentHandler","eventStream$","from","subscribe","next","event","err","complete","agentStates","langserveFunctions","chainPromise","endpoint","type","resolveEndpointType","remoteActions","setupRemoteActions","frontendUrl","configuredActions","EndpointType","LangGraphCloud","toolsByPriority","allTools","allToolNames","tool","includes","copilotKitEndpoint","config","CopilotKit","langGraphCloudEndpoint"]}