@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.
- package/CHANGELOG.md +12 -3
- package/dist/{chunk-6HXQC7IT.mjs → chunk-3LFBIWWK.mjs} +9 -36
- package/dist/chunk-3LFBIWWK.mjs.map +1 -0
- package/dist/{chunk-E6ZFCM3B.mjs → chunk-76K222WC.mjs} +133 -561
- package/dist/chunk-76K222WC.mjs.map +1 -0
- package/dist/{chunk-V7SK6QZN.mjs → chunk-CPAHDRLS.mjs} +36 -9
- package/dist/chunk-CPAHDRLS.mjs.map +1 -0
- package/dist/{chunk-TM7ZRU3M.mjs → chunk-DEZQR4EM.mjs} +2 -2
- package/dist/{chunk-XMDH5MKI.mjs → chunk-MCUYYSCJ.mjs} +2 -2
- package/dist/{chunk-6B3NPPSR.mjs → chunk-SPZSO3T3.mjs} +2 -2
- package/dist/{chunk-7MQDBRXJ.mjs → chunk-Y6RQG5HF.mjs} +2 -2
- package/dist/{copilot-runtime-aba7d4b4.d.ts → copilot-runtime-df3527ad.d.ts} +5 -27
- package/dist/index.d.ts +1 -1
- package/dist/index.js +213 -641
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +9 -13
- package/dist/index.mjs.map +1 -1
- package/dist/lib/index.d.ts +1 -1
- package/dist/lib/index.js +213 -641
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/index.mjs +9 -13
- package/dist/lib/integrations/index.d.ts +2 -2
- package/dist/lib/integrations/index.js +4 -5
- package/dist/lib/integrations/index.js.map +1 -1
- package/dist/lib/integrations/index.mjs +5 -5
- package/dist/lib/integrations/nest/index.d.ts +1 -1
- package/dist/lib/integrations/nest/index.js +4 -5
- package/dist/lib/integrations/nest/index.js.map +1 -1
- package/dist/lib/integrations/nest/index.mjs +3 -3
- package/dist/lib/integrations/node-express/index.d.ts +1 -1
- package/dist/lib/integrations/node-express/index.js +4 -5
- package/dist/lib/integrations/node-express/index.js.map +1 -1
- package/dist/lib/integrations/node-express/index.mjs +3 -3
- package/dist/lib/integrations/node-http/index.d.ts +1 -1
- package/dist/lib/integrations/node-http/index.js +4 -5
- package/dist/lib/integrations/node-http/index.js.map +1 -1
- package/dist/lib/integrations/node-http/index.mjs +2 -2
- package/dist/service-adapters/index.js +35 -8
- package/dist/service-adapters/index.js.map +1 -1
- package/dist/service-adapters/index.mjs +2 -2
- package/package.json +6 -7
- package/src/agents/langgraph/event-source.ts +67 -22
- package/src/lib/runtime/copilot-runtime.ts +11 -58
- package/src/lib/runtime/remote-actions.ts +159 -65
- package/src/service-adapters/events.ts +5 -1
- package/src/service-adapters/langchain/utils.test.ts +169 -0
- package/src/service-adapters/langchain/utils.ts +41 -8
- package/dist/chunk-6HXQC7IT.mjs.map +0 -1
- package/dist/chunk-E6ZFCM3B.mjs.map +0 -1
- package/dist/chunk-V7SK6QZN.mjs.map +0 -1
- package/src/lib/runtime/remote-action-constructors.ts +0 -283
- package/src/lib/runtime/remote-lg-cloud-action.ts +0 -441
- /package/dist/{chunk-TM7ZRU3M.mjs.map → chunk-DEZQR4EM.mjs.map} +0 -0
- /package/dist/{chunk-XMDH5MKI.mjs.map → chunk-MCUYYSCJ.mjs.map} +0 -0
- /package/dist/{chunk-6B3NPPSR.mjs.map → chunk-SPZSO3T3.mjs.map} +0 -0
- /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
|
|
66
|
+
return required ? schema : schema.optional();
|
|
62
67
|
} else if (jsonSchema.type === "string") {
|
|
63
68
|
let schema = z.string().describe(jsonSchema.description);
|
|
64
|
-
return
|
|
69
|
+
return required ? schema : schema.optional();
|
|
65
70
|
} else if (jsonSchema.type === "number") {
|
|
66
71
|
let schema = z.number().describe(jsonSchema.description);
|
|
67
|
-
return
|
|
72
|
+
return required ? schema : schema.optional();
|
|
68
73
|
} else if (jsonSchema.type === "boolean") {
|
|
69
74
|
let schema = z.boolean().describe(jsonSchema.description);
|
|
70
|
-
return
|
|
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
|
|
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":"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","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"]}
|