@copilotkit/react-core 1.2.2-feat-runtime-remote-actions.1 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,14 +1,3 @@
1
- import { CopilotContextParams } from '../context/copilot-context.js';
2
- import '@copilotkit/shared';
3
- import '@copilotkit/runtime-client-gql';
4
- import '../types/frontend-action.js';
5
- import 'react';
6
- import './use-tree.js';
7
- import '../types/document-pointer.js';
8
- import '../types/chat-suggestion-configuration.js';
9
- import '../types/coagent-action.js';
10
- import '../types/coagent-state.js';
11
-
12
1
  interface WithInternalStateManagementAndInitial<T> {
13
2
  name: string;
14
3
  initialState: T;
@@ -30,8 +19,9 @@ interface UseCoagentReturnType<T> {
30
19
  running: boolean;
31
20
  state: T;
32
21
  setState: (newState: T | ((prevState: T | undefined) => T)) => void;
33
- start: (context: CopilotContextParams) => void;
34
- stop: (context: CopilotContextParams) => void;
22
+ start: () => void;
23
+ stop: () => void;
24
+ run: (hint?: string) => Promise<void>;
35
25
  }
36
26
  declare function useCoAgent<T = any>(options: UseCoagentOptions<T>): UseCoagentReturnType<T>;
37
27
 
@@ -22,6 +22,18 @@ var __spreadValues = (a, b) => {
22
22
  return a;
23
23
  };
24
24
  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
25
+ var __objRest = (source, exclude) => {
26
+ var target = {};
27
+ for (var prop in source)
28
+ if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
29
+ target[prop] = source[prop];
30
+ if (source != null && __getOwnPropSymbols)
31
+ for (var prop of __getOwnPropSymbols(source)) {
32
+ if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
33
+ target[prop] = source[prop];
34
+ }
35
+ return target;
36
+ };
25
37
  var __export = (target, all) => {
26
38
  for (var name in all)
27
39
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -70,7 +82,7 @@ __export(use_coagent_exports, {
70
82
  useCoAgent: () => useCoAgent
71
83
  });
72
84
  module.exports = __toCommonJS(use_coagent_exports);
73
- var import_react2 = require("react");
85
+ var import_react5 = require("react");
74
86
 
75
87
  // src/context/copilot-context.tsx
76
88
  var import_react = __toESM(require("react"));
@@ -139,7 +151,386 @@ function returnAndThrowInDebug(value) {
139
151
  return value;
140
152
  }
141
153
 
154
+ // src/hooks/use-copilot-chat.ts
155
+ var import_react4 = require("react");
156
+ var import_runtime_client_gql2 = require("@copilotkit/runtime-client-gql");
157
+
158
+ // src/hooks/use-chat.ts
159
+ var import_react2 = require("react");
160
+ var import_shared = require("@copilotkit/shared");
161
+ var import_runtime_client_gql = require("@copilotkit/runtime-client-gql");
162
+ function useChat(options) {
163
+ const {
164
+ messages,
165
+ setMessages,
166
+ makeSystemMessageCallback,
167
+ copilotConfig,
168
+ setIsLoading,
169
+ initialMessages,
170
+ isLoading,
171
+ actions,
172
+ onFunctionCall,
173
+ onCoagentAction,
174
+ setCoagentStates,
175
+ coagentStates,
176
+ agentSession,
177
+ setAgentSession
178
+ } = options;
179
+ const abortControllerRef = (0, import_react2.useRef)();
180
+ const threadIdRef = (0, import_react2.useRef)(null);
181
+ const runIdRef = (0, import_react2.useRef)(null);
182
+ const publicApiKey = copilotConfig.publicApiKey;
183
+ const headers = __spreadValues(__spreadValues({}, copilotConfig.headers || {}), publicApiKey ? { [import_shared.COPILOT_CLOUD_PUBLIC_API_KEY_HEADER]: publicApiKey } : {});
184
+ const runtimeClient = new import_runtime_client_gql.CopilotRuntimeClient({
185
+ url: copilotConfig.chatApiEndpoint,
186
+ publicApiKey: copilotConfig.publicApiKey,
187
+ headers,
188
+ credentials: copilotConfig.credentials
189
+ });
190
+ const runChatCompletion = (previousMessages) => __async(this, null, function* () {
191
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i;
192
+ setIsLoading(true);
193
+ let newMessages = [
194
+ new import_runtime_client_gql.TextMessage({
195
+ content: "",
196
+ role: import_runtime_client_gql.Role.Assistant
197
+ })
198
+ ];
199
+ const abortController = new AbortController();
200
+ abortControllerRef.current = abortController;
201
+ setMessages([...previousMessages, ...newMessages]);
202
+ const systemMessage = makeSystemMessageCallback();
203
+ const messagesWithContext = [systemMessage, ...initialMessages || [], ...previousMessages];
204
+ const stream = import_runtime_client_gql.CopilotRuntimeClient.asStream(
205
+ runtimeClient.generateCopilotResponse({
206
+ data: __spreadProps(__spreadValues(__spreadProps(__spreadValues({
207
+ frontend: {
208
+ actions: actions.map((action) => ({
209
+ name: action.name,
210
+ description: action.description || "",
211
+ jsonSchema: JSON.stringify((0, import_shared.actionParametersToJsonSchema)(action.parameters || []))
212
+ })),
213
+ url: window.location.href
214
+ },
215
+ threadId: threadIdRef.current,
216
+ runId: runIdRef.current,
217
+ messages: (0, import_runtime_client_gql.convertMessagesToGqlInput)((0, import_runtime_client_gql.filterAgentStateMessages)(messagesWithContext))
218
+ }, copilotConfig.cloud ? {
219
+ cloud: __spreadValues({}, ((_c = (_b = (_a = copilotConfig.cloud.guardrails) == null ? void 0 : _a.input) == null ? void 0 : _b.restrictToTopic) == null ? void 0 : _c.enabled) ? {
220
+ guardrails: {
221
+ inputValidationRules: {
222
+ allowList: copilotConfig.cloud.guardrails.input.restrictToTopic.validTopics,
223
+ denyList: copilotConfig.cloud.guardrails.input.restrictToTopic.invalidTopics
224
+ }
225
+ }
226
+ } : {})
227
+ } : {}), {
228
+ metadata: {
229
+ requestType: import_runtime_client_gql.CopilotRequestType.Chat
230
+ }
231
+ }), agentSession ? {
232
+ agentSession
233
+ } : {}), {
234
+ agentStates: Object.values(coagentStates).map((state) => ({
235
+ agentName: state.name,
236
+ state: JSON.stringify(state.state)
237
+ }))
238
+ }),
239
+ properties: copilotConfig.properties,
240
+ signal: (_d = abortControllerRef.current) == null ? void 0 : _d.signal
241
+ })
242
+ );
243
+ const guardrailsEnabled = ((_g = (_f = (_e = copilotConfig.cloud) == null ? void 0 : _e.guardrails) == null ? void 0 : _f.input) == null ? void 0 : _g.restrictToTopic.enabled) || false;
244
+ const reader = stream.getReader();
245
+ let actionResults = {};
246
+ let executedCoagentActions = [];
247
+ try {
248
+ while (true) {
249
+ const { done, value } = yield reader.read();
250
+ if (done) {
251
+ break;
252
+ }
253
+ if (!(value == null ? void 0 : value.generateCopilotResponse)) {
254
+ continue;
255
+ }
256
+ threadIdRef.current = value.generateCopilotResponse.threadId || null;
257
+ runIdRef.current = value.generateCopilotResponse.runId || null;
258
+ const messages2 = (0, import_runtime_client_gql.convertGqlOutputToMessages)(
259
+ (0, import_runtime_client_gql.filterAdjacentAgentStateMessages)(value.generateCopilotResponse.messages)
260
+ );
261
+ if (messages2.length === 0) {
262
+ continue;
263
+ }
264
+ newMessages = [];
265
+ if (((_h = value.generateCopilotResponse.status) == null ? void 0 : _h.__typename) === "FailedResponseStatus" && value.generateCopilotResponse.status.reason === "GUARDRAILS_VALIDATION_FAILED") {
266
+ newMessages = [
267
+ new import_runtime_client_gql.TextMessage({
268
+ role: import_runtime_client_gql.MessageRole.Assistant,
269
+ content: ((_i = value.generateCopilotResponse.status.details) == null ? void 0 : _i.guardrailsReason) || ""
270
+ })
271
+ ];
272
+ } else {
273
+ for (const message of messages2) {
274
+ newMessages.push(message);
275
+ if (message instanceof import_runtime_client_gql.ActionExecutionMessage && message.status.code !== import_runtime_client_gql.MessageStatusCode.Pending && message.scope === "client" && onFunctionCall) {
276
+ if (!(message.id in actionResults)) {
277
+ if (guardrailsEnabled && value.generateCopilotResponse.status === void 0) {
278
+ break;
279
+ }
280
+ const result = yield onFunctionCall({
281
+ messages: previousMessages,
282
+ name: message.name,
283
+ args: message.arguments
284
+ });
285
+ actionResults[message.id] = result;
286
+ }
287
+ newMessages.push(
288
+ new import_runtime_client_gql.ResultMessage({
289
+ result: import_runtime_client_gql.ResultMessage.encodeResult(actionResults[message.id]),
290
+ actionExecutionId: message.id,
291
+ actionName: message.name
292
+ })
293
+ );
294
+ }
295
+ if (message instanceof import_runtime_client_gql.AgentStateMessage && !message.active && !executedCoagentActions.includes(message.id) && onCoagentAction) {
296
+ if (guardrailsEnabled && value.generateCopilotResponse.status === void 0) {
297
+ break;
298
+ }
299
+ yield onCoagentAction({
300
+ name: message.agentName,
301
+ nodeName: message.nodeName,
302
+ state: message.state
303
+ });
304
+ executedCoagentActions.push(message.id);
305
+ }
306
+ }
307
+ const lastAgentStateMessage = [...messages2].reverse().find((message) => message instanceof import_runtime_client_gql.AgentStateMessage);
308
+ if (lastAgentStateMessage) {
309
+ if (lastAgentStateMessage.running) {
310
+ setCoagentStates((prevAgentStates) => __spreadProps(__spreadValues({}, prevAgentStates), {
311
+ [lastAgentStateMessage.agentName]: {
312
+ name: lastAgentStateMessage.agentName,
313
+ state: lastAgentStateMessage.state,
314
+ running: lastAgentStateMessage.running,
315
+ active: lastAgentStateMessage.active,
316
+ threadId: lastAgentStateMessage.threadId,
317
+ nodeName: lastAgentStateMessage.nodeName,
318
+ runId: lastAgentStateMessage.runId
319
+ }
320
+ }));
321
+ setAgentSession({
322
+ threadId: lastAgentStateMessage.threadId,
323
+ agentName: lastAgentStateMessage.agentName,
324
+ nodeName: lastAgentStateMessage.nodeName
325
+ });
326
+ } else {
327
+ setAgentSession(null);
328
+ }
329
+ }
330
+ }
331
+ if (newMessages.length > 0) {
332
+ setMessages([...previousMessages, ...newMessages]);
333
+ }
334
+ }
335
+ if (
336
+ // if we have client side results
337
+ Object.values(actionResults).length || // or the last message we received is a result
338
+ newMessages.length && newMessages[newMessages.length - 1] instanceof import_runtime_client_gql.ResultMessage
339
+ ) {
340
+ yield new Promise((resolve) => setTimeout(resolve, 10));
341
+ return yield runChatCompletion([...previousMessages, ...newMessages]);
342
+ } else {
343
+ return newMessages.slice();
344
+ }
345
+ } finally {
346
+ setIsLoading(false);
347
+ }
348
+ });
349
+ const runChatCompletionAndHandleFunctionCall = (messages2) => __async(this, null, function* () {
350
+ yield runChatCompletion(messages2);
351
+ });
352
+ const append = (message) => __async(this, null, function* () {
353
+ if (isLoading) {
354
+ return;
355
+ }
356
+ const newMessages = [...messages, message];
357
+ setMessages(newMessages);
358
+ return runChatCompletionAndHandleFunctionCall(newMessages);
359
+ });
360
+ const reload = () => __async(this, null, function* () {
361
+ if (isLoading || messages.length === 0) {
362
+ return;
363
+ }
364
+ let newMessages = [...messages];
365
+ const lastMessage = messages[messages.length - 1];
366
+ if (lastMessage instanceof import_runtime_client_gql.TextMessage && lastMessage.role === "assistant") {
367
+ newMessages = newMessages.slice(0, -1);
368
+ }
369
+ setMessages(newMessages);
370
+ return runChatCompletionAndHandleFunctionCall(newMessages);
371
+ });
372
+ const stop = () => {
373
+ var _a;
374
+ (_a = abortControllerRef.current) == null ? void 0 : _a.abort();
375
+ };
376
+ return {
377
+ append,
378
+ reload,
379
+ stop
380
+ };
381
+ }
382
+
383
+ // src/components/copilot-provider/copilotkit.tsx
384
+ var import_react3 = require("react");
385
+ var import_react_dom = require("react-dom");
386
+ var import_shared2 = require("@copilotkit/shared");
387
+ var import_jsx_runtime = require("react/jsx-runtime");
388
+ var defaultCopilotContextCategories = ["global"];
389
+
390
+ // src/hooks/use-copilot-chat.ts
391
+ function useCopilotChat(_a = {}) {
392
+ var _b = _a, {
393
+ makeSystemMessage
394
+ } = _b, options = __objRest(_b, [
395
+ "makeSystemMessage"
396
+ ]);
397
+ const {
398
+ getContextString,
399
+ getFunctionCallHandler,
400
+ copilotApiConfig,
401
+ messages,
402
+ setMessages,
403
+ isLoading,
404
+ setIsLoading,
405
+ chatInstructions,
406
+ actions,
407
+ coagentStates,
408
+ setCoagentStates,
409
+ coagentActions,
410
+ agentSession,
411
+ setAgentSession
412
+ } = useCopilotContext();
413
+ const latestGetContextString = useUpdatedRef(getContextString);
414
+ const deleteMessage = (0, import_react4.useCallback)(
415
+ (messageId) => {
416
+ setMessages((prev) => prev.filter((message) => message.id !== messageId));
417
+ },
418
+ [setMessages]
419
+ );
420
+ const makeSystemMessageCallback = (0, import_react4.useCallback)(() => {
421
+ const systemMessageMaker = makeSystemMessage || defaultSystemMessage;
422
+ const contextString = latestGetContextString.current([], defaultCopilotContextCategories);
423
+ return new import_runtime_client_gql2.TextMessage({
424
+ content: systemMessageMaker(contextString, chatInstructions),
425
+ role: import_runtime_client_gql2.Role.System
426
+ });
427
+ }, [getContextString, makeSystemMessage, chatInstructions]);
428
+ const onCoagentAction = (0, import_react4.useCallback)(
429
+ (args) => __async(this, null, function* () {
430
+ var _a2;
431
+ const { name, nodeName, state } = args;
432
+ let action = Object.values(coagentActions).find(
433
+ (action2) => action2.name === name && action2.nodeName === nodeName
434
+ );
435
+ if (!action) {
436
+ action = Object.values(coagentActions).find(
437
+ (action2) => action2.name === name && !action2.nodeName
438
+ );
439
+ }
440
+ if (action) {
441
+ yield (_a2 = action.handler) == null ? void 0 : _a2.call(action, { state, nodeName });
442
+ }
443
+ }),
444
+ [coagentActions]
445
+ );
446
+ const { append, reload, stop } = useChat(__spreadProps(__spreadValues({}, options), {
447
+ actions: Object.values(actions),
448
+ copilotConfig: copilotApiConfig,
449
+ initialMessages: options.initialMessages || [],
450
+ onFunctionCall: getFunctionCallHandler(),
451
+ onCoagentAction,
452
+ messages,
453
+ setMessages,
454
+ makeSystemMessageCallback,
455
+ isLoading,
456
+ setIsLoading,
457
+ coagentStates,
458
+ setCoagentStates,
459
+ agentSession,
460
+ setAgentSession
461
+ }));
462
+ const latestAppend = useUpdatedRef(append);
463
+ const latestAppendFunc = (0, import_react4.useCallback)(
464
+ (message) => {
465
+ return latestAppend.current(message);
466
+ },
467
+ [latestAppend]
468
+ );
469
+ const latestReload = useUpdatedRef(reload);
470
+ const latestReloadFunc = (0, import_react4.useCallback)(() => {
471
+ return latestReload.current();
472
+ }, [latestReload]);
473
+ const latestStop = useUpdatedRef(stop);
474
+ const latestStopFunc = (0, import_react4.useCallback)(() => {
475
+ return latestStop.current();
476
+ }, [latestStop]);
477
+ const latestDelete = useUpdatedRef(deleteMessage);
478
+ const latestDeleteFunc = (0, import_react4.useCallback)(
479
+ (messageId) => {
480
+ return latestDelete.current(messageId);
481
+ },
482
+ [latestDelete]
483
+ );
484
+ const latestSetMessages = useUpdatedRef(setMessages);
485
+ const latestSetMessagesFunc = (0, import_react4.useCallback)(
486
+ (messages2) => {
487
+ return latestSetMessages.current(messages2);
488
+ },
489
+ [latestSetMessages]
490
+ );
491
+ return {
492
+ visibleMessages: messages,
493
+ appendMessage: latestAppendFunc,
494
+ setMessages: latestSetMessagesFunc,
495
+ reloadMessages: latestReloadFunc,
496
+ stopGeneration: latestStopFunc,
497
+ deleteMessage: latestDeleteFunc,
498
+ isLoading
499
+ };
500
+ }
501
+ function useUpdatedRef(value) {
502
+ const ref = (0, import_react4.useRef)(value);
503
+ (0, import_react4.useEffect)(() => {
504
+ ref.current = value;
505
+ }, [value]);
506
+ return ref;
507
+ }
508
+ function defaultSystemMessage(contextString, additionalInstructions) {
509
+ return `
510
+ Please act as an efficient, competent, conscientious, and industrious professional assistant.
511
+
512
+ Help the user achieve their goals, and you do so in a way that is as efficient as possible, without unnecessary fluff, but also without sacrificing professionalism.
513
+ Always be polite and respectful, and prefer brevity over verbosity.
514
+
515
+ The user has provided you with the following context:
516
+ \`\`\`
517
+ ${contextString}
518
+ \`\`\`
519
+
520
+ They have also provided you with functions you can call to initiate actions on their behalf, or functions you can call to receive more information.
521
+
522
+ Please assist them as best you can.
523
+
524
+ You can ask them for clarifying questions if needed, but don't be annoying about it. If you can reasonably 'fill in the blanks' yourself, do so.
525
+
526
+ If you would like to call a function, call it without saying anything else.
527
+ ` + (additionalInstructions ? `
528
+
529
+ ${additionalInstructions}` : "");
530
+ }
531
+
142
532
  // src/hooks/use-coagent.ts
533
+ var import_runtime_client_gql3 = require("@copilotkit/runtime-client-gql");
143
534
  function useCoAgent(options) {
144
535
  const isExternalStateManagement = (options2) => {
145
536
  return "state" in options2 && "setState" in options2;
@@ -148,7 +539,9 @@ function useCoAgent(options) {
148
539
  const isInternalStateManagementWithInitial = (options2) => {
149
540
  return "initialState" in options2;
150
541
  };
151
- const { coagentStates, setCoagentStates } = useCopilotContext();
542
+ const context = useCopilotContext();
543
+ const { coagentStates, setCoagentStates } = context;
544
+ const { appendMessage } = useCopilotChat();
152
545
  const getCoagentState = (coagentStates2, name2) => {
153
546
  if (coagentStates2[name2]) {
154
547
  return coagentStates2[name2];
@@ -177,7 +570,7 @@ function useCoAgent(options) {
177
570
  };
178
571
  const coagentState = getCoagentState(coagentStates, name);
179
572
  const state = isExternalStateManagement(options) ? options.state : coagentState.state;
180
- (0, import_react2.useEffect)(() => {
573
+ (0, import_react5.useEffect)(() => {
181
574
  if (isExternalStateManagement(options)) {
182
575
  setState(options.state);
183
576
  } else if (coagentStates[name] === void 0) {
@@ -190,11 +583,14 @@ function useCoAgent(options) {
190
583
  state,
191
584
  setState,
192
585
  running: coagentState.running,
193
- start: (context) => {
586
+ start: () => {
194
587
  startAgent(name, context);
195
588
  },
196
- stop: (context) => {
589
+ stop: () => {
197
590
  stopAgent(name, context);
591
+ },
592
+ run: (hint) => {
593
+ return runAgent(name, context, appendMessage, hint);
198
594
  }
199
595
  };
200
596
  }
@@ -212,6 +608,45 @@ function stopAgent(name, context) {
212
608
  console.warn(`No agent session found for ${name}`);
213
609
  }
214
610
  }
611
+ function runAgent(name, context, appendMessage, hint) {
612
+ return __async(this, null, function* () {
613
+ var _a, _b;
614
+ const { agentSession, setAgentSession } = context;
615
+ if (!agentSession || agentSession.agentName !== name) {
616
+ setAgentSession({
617
+ agentName: name
618
+ });
619
+ }
620
+ let previousState = null;
621
+ for (let i = context.messages.length - 1; i >= 0; i--) {
622
+ const message = context.messages[i];
623
+ if (message instanceof import_runtime_client_gql3.AgentStateMessage && message.agentName === name) {
624
+ previousState = message.state;
625
+ }
626
+ }
627
+ let state = ((_b = (_a = context.coagentStates) == null ? void 0 : _a[name]) == null ? void 0 : _b.state) || {};
628
+ let content = "The state of the agent has been updated\n";
629
+ if (previousState !== null) {
630
+ content += `The previous state was:
631
+ ${JSON.stringify(previousState, null, 2)}
632
+
633
+ `;
634
+ }
635
+ content += `The current state is:
636
+ ${JSON.stringify(state, null, 2)}`;
637
+ if (hint) {
638
+ content += `
639
+
640
+ ${hint}`;
641
+ }
642
+ return yield appendMessage(
643
+ new import_runtime_client_gql3.TextMessage({
644
+ role: import_runtime_client_gql3.Role.System,
645
+ content
646
+ })
647
+ );
648
+ });
649
+ }
215
650
  // Annotate the CommonJS export names for ESM import in node:
216
651
  0 && (module.exports = {
217
652
  useCoAgent