@copilotkit/react-core 0.21.0-mme-assistant-api.0 → 0.21.0-mme-experimental-actions.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 (107) hide show
  1. package/.turbo/turbo-build.log +135 -121
  2. package/CHANGELOG.md +13 -2
  3. package/dist/{chunk-WH4L73VS.mjs → chunk-55K3I3XY.mjs} +7 -3
  4. package/dist/chunk-55K3I3XY.mjs.map +1 -0
  5. package/dist/{chunk-3WKJ25L3.mjs → chunk-BQ5SSV4Z.mjs} +12 -25
  6. package/dist/chunk-BQ5SSV4Z.mjs.map +1 -0
  7. package/dist/{chunk-JVCBCB2T.mjs → chunk-FDXBLJ6Y.mjs} +2 -2
  8. package/dist/chunk-HGMVI4JR.mjs +13 -0
  9. package/dist/chunk-HGMVI4JR.mjs.map +1 -0
  10. package/dist/{chunk-6WZFE6II.mjs → chunk-IA65HSBF.mjs} +3 -3
  11. package/dist/chunk-IOP6JX34.mjs +1 -0
  12. package/dist/{chunk-2YF2MC22.mjs → chunk-JFUS5YVO.mjs} +4 -21
  13. package/dist/chunk-JFUS5YVO.mjs.map +1 -0
  14. package/dist/{chunk-KLGA2MES.mjs → chunk-L2IFWQP4.mjs} +5 -5
  15. package/dist/chunk-L2IFWQP4.mjs.map +1 -0
  16. package/dist/{chunk-PHK2K7UB.mjs → chunk-L4WLQMO6.mjs} +16 -24
  17. package/dist/chunk-L4WLQMO6.mjs.map +1 -0
  18. package/dist/{chunk-S7ZVOTYK.mjs → chunk-M2RCEQTX.mjs} +1 -1
  19. package/dist/chunk-M2RCEQTX.mjs.map +1 -0
  20. package/dist/{chunk-UHTJLRI6.mjs → chunk-MI6PIZOT.mjs} +6 -6
  21. package/dist/{chunk-2EP7VLPI.mjs → chunk-OBWBSGOG.mjs} +2 -2
  22. package/dist/chunk-QAIUQFOK.mjs +85 -0
  23. package/dist/chunk-QAIUQFOK.mjs.map +1 -0
  24. package/dist/components/copilot-provider/copilotkit.js +10 -16
  25. package/dist/components/copilot-provider/copilotkit.js.map +1 -1
  26. package/dist/components/copilot-provider/copilotkit.mjs +3 -3
  27. package/dist/components/copilot-provider/index.js +10 -16
  28. package/dist/components/copilot-provider/index.js.map +1 -1
  29. package/dist/components/copilot-provider/index.mjs +3 -3
  30. package/dist/components/index.js +10 -16
  31. package/dist/components/index.js.map +1 -1
  32. package/dist/components/index.mjs +3 -3
  33. package/dist/context/copilot-context.d.ts +5 -5
  34. package/dist/context/copilot-context.js.map +1 -1
  35. package/dist/context/copilot-context.mjs +1 -1
  36. package/dist/context/index.js.map +1 -1
  37. package/dist/context/index.mjs +1 -1
  38. package/dist/hooks/index.d.ts +1 -0
  39. package/dist/hooks/index.js +105 -46
  40. package/dist/hooks/index.js.map +1 -1
  41. package/dist/hooks/index.mjs +17 -12
  42. package/dist/hooks/use-chat.js +6 -33
  43. package/dist/hooks/use-chat.js.map +1 -1
  44. package/dist/hooks/use-chat.mjs +2 -2
  45. package/dist/hooks/use-copilot-action-implementation.d.ts +6 -0
  46. package/dist/hooks/use-copilot-action-implementation.js +179 -0
  47. package/dist/hooks/use-copilot-action-implementation.js.map +1 -0
  48. package/dist/hooks/use-copilot-action-implementation.mjs +12 -0
  49. package/dist/hooks/use-copilot-action-implementation.mjs.map +1 -0
  50. package/dist/hooks/use-copilot-action.d.ts +5 -0
  51. package/dist/hooks/use-copilot-action.js +137 -0
  52. package/dist/hooks/use-copilot-action.js.map +1 -0
  53. package/dist/hooks/use-copilot-action.mjs +11 -0
  54. package/dist/hooks/use-copilot-action.mjs.map +1 -0
  55. package/dist/hooks/use-copilot-chat.js +6 -33
  56. package/dist/hooks/use-copilot-chat.js.map +1 -1
  57. package/dist/hooks/use-copilot-chat.mjs +6 -6
  58. package/dist/hooks/use-make-copilot-actionable.d.ts +3 -0
  59. package/dist/hooks/use-make-copilot-actionable.js +60 -6
  60. package/dist/hooks/use-make-copilot-actionable.js.map +1 -1
  61. package/dist/hooks/use-make-copilot-actionable.mjs +3 -2
  62. package/dist/hooks/use-make-copilot-document-readable.js.map +1 -1
  63. package/dist/hooks/use-make-copilot-document-readable.mjs +2 -2
  64. package/dist/hooks/use-make-copilot-readable.js.map +1 -1
  65. package/dist/hooks/use-make-copilot-readable.mjs +2 -2
  66. package/dist/index.d.ts +1 -0
  67. package/dist/index.js +130 -79
  68. package/dist/index.js.map +1 -1
  69. package/dist/index.mjs +26 -21
  70. package/dist/lib/copilot-task.d.ts +3 -3
  71. package/dist/lib/copilot-task.js +10 -19
  72. package/dist/lib/copilot-task.js.map +1 -1
  73. package/dist/lib/copilot-task.mjs +5 -5
  74. package/dist/lib/index.js +10 -19
  75. package/dist/lib/index.js.map +1 -1
  76. package/dist/lib/index.mjs +5 -5
  77. package/dist/openai-assistants/hooks/index.js.map +1 -1
  78. package/dist/openai-assistants/hooks/index.mjs +4 -4
  79. package/dist/openai-assistants/hooks/use-copilot-chat-v2.js.map +1 -1
  80. package/dist/openai-assistants/hooks/use-copilot-chat-v2.mjs +4 -4
  81. package/dist/openai-assistants/index.js.map +1 -1
  82. package/dist/openai-assistants/index.mjs +4 -4
  83. package/dist/utils/fetch-chat-completion.js +13 -24
  84. package/dist/utils/fetch-chat-completion.js.map +1 -1
  85. package/dist/utils/fetch-chat-completion.mjs +1 -1
  86. package/package.json +6 -6
  87. package/src/components/copilot-provider/copilotkit.tsx +16 -50
  88. package/src/context/copilot-context.tsx +5 -7
  89. package/src/hooks/index.ts +1 -0
  90. package/src/hooks/use-chat.ts +1 -20
  91. package/src/hooks/use-copilot-action-implementation.ts +100 -0
  92. package/src/hooks/use-copilot-action.ts +44 -0
  93. package/src/hooks/use-make-copilot-actionable.ts +6 -1
  94. package/src/lib/copilot-task.ts +5 -5
  95. package/src/utils/fetch-chat-completion.ts +11 -25
  96. package/dist/chunk-2YF2MC22.mjs.map +0 -1
  97. package/dist/chunk-3WKJ25L3.mjs.map +0 -1
  98. package/dist/chunk-5UGLWBZJ.mjs +0 -1
  99. package/dist/chunk-KLGA2MES.mjs.map +0 -1
  100. package/dist/chunk-PHK2K7UB.mjs.map +0 -1
  101. package/dist/chunk-S7ZVOTYK.mjs.map +0 -1
  102. package/dist/chunk-WH4L73VS.mjs.map +0 -1
  103. /package/dist/{chunk-JVCBCB2T.mjs.map → chunk-FDXBLJ6Y.mjs.map} +0 -0
  104. /package/dist/{chunk-6WZFE6II.mjs.map → chunk-IA65HSBF.mjs.map} +0 -0
  105. /package/dist/{chunk-5UGLWBZJ.mjs.map → chunk-IOP6JX34.mjs.map} +0 -0
  106. /package/dist/{chunk-UHTJLRI6.mjs.map → chunk-MI6PIZOT.mjs.map} +0 -0
  107. /package/dist/{chunk-2EP7VLPI.mjs.map → chunk-OBWBSGOG.mjs.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/openai-assistants/index.ts","../../src/openai-assistants/hooks/use-copilot-chat-v2.ts","../../src/openai-assistants/utils/process-message-stream.ts","../../src/context/copilot-context.tsx","../../src/components/copilot-provider/copilotkit.tsx"],"sourcesContent":["export * from \"./hooks\";\nexport * from \"./utils\";\n","import { useContext, useMemo, useState } from \"react\";\nimport { processMessageStream } from \"../utils\";\nimport { Message, parseStreamPart } from \"@copilotkit/shared\";\nimport { CopilotContext } from \"../../context\";\nimport { defaultCopilotContextCategories } from \"../../components\";\n\nexport type AssistantStatus = \"in_progress\" | \"awaiting_message\";\n\nexport interface RequestForwardingOptions {\n /**\n * The credentials mode to be used for the fetch request.\n * Possible values are: 'omit', 'same-origin', 'include'.\n * Defaults to 'same-origin'.\n */\n credentials?: RequestCredentials;\n /**\n * HTTP headers to be sent with the API request.\n */\n headers?: Record<string, string> | Headers;\n /**\n * Extra body object to be sent with the API request.\n * @example\n * Send a `sessionId` to the API along with the messages.\n * ```js\n * useChat({\n * body: {\n * sessionId: '123',\n * }\n * })\n * ```\n */\n body?: object;\n}\nexport interface UseCopilotChatOptionsV2 extends RequestForwardingOptions {\n makeSystemMessage?: (contextString: string) => string;\n threadId?: string | undefined;\n}\n\nexport interface UseCopilotChatV2Result {\n messages: Message[];\n input: string;\n handleInputChange: (e: any) => void;\n submitMessage: (e: any) => Promise<void>;\n status: AssistantStatus;\n error: unknown;\n}\n\nexport function useCopilotChatV2(options: UseCopilotChatOptionsV2): UseCopilotChatV2Result {\n const {\n getContextString,\n getChatCompletionFunctionDescriptions,\n getFunctionCallHandler,\n copilotApiConfig,\n } = useContext(CopilotContext);\n\n const [messages, setMessages] = useState<Message[]>([]);\n const [input, setInput] = useState(\"\");\n const [threadId, setThreadId] = useState<string | undefined>(undefined);\n const [status, setStatus] = useState<AssistantStatus>(\"awaiting_message\");\n const [error, setError] = useState<unknown | undefined>(undefined);\n\n const systemMessage: Message = useMemo(() => {\n const systemMessageMaker = options.makeSystemMessage || defaultSystemMessage;\n const contextString = getContextString([], defaultCopilotContextCategories); // TODO: make the context categories configurable\n\n return {\n id: \"system\",\n content: systemMessageMaker(contextString),\n role: \"system\",\n };\n }, [getContextString, options.makeSystemMessage]);\n\n const handleInputChange = (e: any) => {\n setInput(e.target.value);\n };\n\n const submitMessage = async (e: any) => {\n e.preventDefault();\n\n if (input === \"\") {\n return;\n }\n\n setStatus(\"in_progress\");\n\n setMessages((messages) => [...messages, { id: \"\", role: \"user\", content: input }]);\n\n setInput(\"\");\n\n const apiUrl = copilotApiConfig.chatApiEndpointV2;\n\n const functions = getChatCompletionFunctionDescriptions();\n\n const result = await fetch(apiUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...copilotApiConfig.headers,\n ...options.headers,\n },\n body: JSON.stringify({\n // always use user-provided threadId when available:\n threadId: options.threadId ?? threadId ?? null,\n message: input,\n ...(functions.length > 0 && { functions: functions }),\n ...copilotApiConfig.body,\n ...options.body,\n }),\n });\n\n if (result.body == null) {\n throw new Error(\"The response body is empty.\");\n }\n\n await processMessageStream(result.body.getReader(), (message: string) => {\n try {\n const { type, value } = parseStreamPart(message);\n\n switch (type) {\n case \"assistant_message\": {\n // append message:\n setMessages((messages) => [\n ...messages,\n {\n id: value.id,\n role: value.role,\n content: value.content[0].text.value,\n },\n ]);\n break;\n }\n\n case \"assistant_control_data\": {\n setThreadId(value.threadId);\n\n // set id of last message:\n setMessages((messages) => {\n const lastMessage = messages[messages.length - 1];\n lastMessage.id = value.messageId;\n return [...messages.slice(0, messages.length - 1), lastMessage];\n });\n\n break;\n }\n\n case \"error\": {\n setError(value);\n break;\n }\n }\n } catch (error) {\n setError(error);\n }\n });\n\n setStatus(\"awaiting_message\");\n };\n\n return {\n messages,\n input,\n handleInputChange,\n submitMessage,\n status,\n error,\n };\n}\n\nexport function defaultSystemMessage(contextString: string): string {\n return `\nPlease act as an efficient, competent, conscientious, and industrious professional assistant.\n\nHelp 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.\nAlways be polite and respectful, and prefer brevity over verbosity.\n\nThe user has provided you with the following context:\n\\`\\`\\`\n${contextString}\n\\`\\`\\`\n\nThey have also provided you with functions you can call to initiate actions on their behalf, or functions you can call to receive more information.\n\nPlease assist them as best you can.\n\nYou 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.\n\nIf you would like to call a function, call it without saying anything else.\n`;\n}\n","export async function processMessageStream(\n reader: ReadableStreamDefaultReader<Uint8Array>,\n processMessage: (message: string) => void | Promise<void>,\n) {\n const decoder = new TextDecoder();\n let buffer = \"\";\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n if (buffer.length > 0) {\n processMessage(buffer);\n }\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n let endIndex: number;\n while ((endIndex = buffer.indexOf(\"\\n\")) !== -1) {\n processMessage(buffer.substring(0, endIndex).trim());\n buffer = buffer.substring(endIndex + 1); // Remove the processed instruction + delimiter\n }\n }\n}\n","\"use client\";\n\nimport { FunctionCallHandler, AnnotatedFunction, ToolDefinition } from \"@copilotkit/shared\";\nimport React from \"react\";\nimport { TreeNodeId } from \"../hooks/use-tree\";\nimport { DocumentPointer } from \"../types\";\n\n/**\n * Interface for the configuration of the Copilot API.\n */\nexport interface CopilotApiConfig {\n /**\n * The endpoint for the chat API.\n */\n chatApiEndpoint: string;\n\n /**\n * The endpoint for the chat API v2.\n */\n chatApiEndpointV2: string;\n\n /**\n * additional headers to be sent with the request\n * @default {}\n * @example\n * ```\n * {\n * 'Authorization': 'Bearer your_token_here'\n * }\n * ```\n */\n headers: Record<string, string>;\n\n /**\n * Additional body params to be sent with the request\n * @default {}\n * @example\n * ```\n * {\n * 'message': 'Hello, world!'\n * }\n * ```\n */\n body: Record<string, any>;\n\n /**\n * Backend only props that will be combined to body params to be sent with the request\n * @default {}\n * @example\n * ```\n * {\n * 'user_id': 'user_id'\n * }\n * ```\n */\n backendOnlyProps?: Record<string, any>;\n}\n\nexport interface CopilotContextParams {\n // function-calling\n entryPoints: Record<string, AnnotatedFunction<any[]>>;\n setEntryPoint: (id: string, entryPoint: AnnotatedFunction<any[]>) => void;\n removeEntryPoint: (id: string) => void;\n getChatCompletionFunctionDescriptions: (\n customEntryPoints?: Record<string, AnnotatedFunction<any[]>>,\n ) => ToolDefinition[];\n getFunctionCallHandler: (\n customEntryPoints?: Record<string, AnnotatedFunction<any[]>>,\n ) => FunctionCallHandler;\n\n // text context\n addContext: (context: string, parentId?: string, categories?: string[]) => TreeNodeId;\n removeContext: (id: TreeNodeId) => void;\n getContextString: (documents: DocumentPointer[], categories: string[]) => string;\n\n // document context\n addDocumentContext: (documentPointer: DocumentPointer, categories?: string[]) => TreeNodeId;\n removeDocumentContext: (documentId: string) => void;\n getDocumentsContext: (categories: string[]) => DocumentPointer[];\n\n // api endpoints\n copilotApiConfig: CopilotApiConfig;\n}\n\nconst emptyCopilotContext: CopilotContextParams = {\n entryPoints: {},\n setEntryPoint: () => {},\n removeEntryPoint: () => {},\n getChatCompletionFunctionDescriptions: () => returnAndThrowInDebug([]),\n getFunctionCallHandler: () => returnAndThrowInDebug(async () => {}),\n\n getContextString: (documents: DocumentPointer[], categories: string[]) =>\n returnAndThrowInDebug(\"\"),\n addContext: () => \"\",\n removeContext: () => {},\n\n getDocumentsContext: (categories: string[]) => returnAndThrowInDebug([]),\n addDocumentContext: () => returnAndThrowInDebug(\"\"),\n removeDocumentContext: () => {},\n\n copilotApiConfig: new (class implements CopilotApiConfig {\n get chatApiEndpoint(): string {\n throw new Error(\"Remember to wrap your app in a `<CopilotKit> {...} </CopilotKit>` !!!\");\n }\n get chatApiEndpointV2(): string {\n throw new Error(\"Remember to wrap your app in a `<CopilotKit> {...} </CopilotKit>` !!!\");\n }\n get headers(): Record<string, string> {\n return {};\n }\n get body(): Record<string, any> {\n return {};\n }\n })(),\n};\n\nexport const CopilotContext = React.createContext<CopilotContextParams>(emptyCopilotContext);\n\nexport function useCopilotContext(): CopilotContextParams {\n return React.useContext(CopilotContext);\n}\n\nfunction returnAndThrowInDebug<T>(value: T): T {\n throw new Error(\"Remember to wrap your app in a `<CopilotKit> {...} </CopilotKit>` !!!\");\n return value;\n}\n","\"use client\";\n\nimport { FunctionDefinition } from \"@copilotkit/shared\";\nimport { useCallback, useState } from \"react\";\nimport { CopilotContext, CopilotApiConfig } from \"../../context/copilot-context\";\nimport useTree from \"../../hooks/use-tree\";\nimport { DocumentPointer } from \"../../types\";\nimport {\n FunctionCallHandler,\n AnnotatedFunction,\n annotatedFunctionToChatCompletionFunction,\n} from \"@copilotkit/shared\";\nimport useFlatCategoryStore from \"../../hooks/use-flat-category-store\";\nimport { StandardCopilotApiConfig } from \"./standard-copilot-api-config\";\nimport { CopilotKitProps } from \"./copilotkit-props\";\nimport { ToolDefinition } from \"@copilotkit/shared\";\n\n/**\n * The CopilotKit component.\n * This component provides the Copilot context to its children.\n * It can be configured either with a chat API endpoint or a CopilotApiConfig.\n *\n * NOTE: The backend can use OpenAI, or you can bring your own LLM.\n * For examples of the backend api implementation, see `examples/next-openai` usage (under `src/api/copilotkit`),\n * or read the documentation at https://docs.copilotkit.ai\n * In particular, Getting-Started > Quickstart-Backend: https://docs.copilotkit.ai/getting-started/quickstart-backend\n *\n * Example usage:\n * ```\n * <CopilotKit url=\"https://your.copilotkit.api\">\n * <App />\n * </CopilotKit>\n * ```\n *\n * or\n *\n * ```\n * const copilotApiConfig = new StandardCopilotApiConfig(\n * \"https://your.copilotkit.api/v1\",\n * \"https://your.copilotkit.api/v2\",\n * {},\n * {}\n * );\n *\n * // ...\n *\n * <CopilotKit chatApiConfig={copilotApiConfig}>\n * <App />\n * </CopilotKit>\n * ```\n *\n * @param props - The props for the component.\n * @returns The CopilotKit component.\n */\nexport function CopilotKit({ children, ...props }: CopilotKitProps) {\n // Compute all the functions and properties that we need to pass\n // to the CopilotContext.\n\n const [entryPoints, setEntryPoints] = useState<Record<string, AnnotatedFunction<any[]>>>({});\n\n const { addElement, removeElement, printTree } = useTree();\n\n const {\n addElement: addDocument,\n removeElement: removeDocument,\n allElements: allDocuments,\n } = useFlatCategoryStore<DocumentPointer>();\n\n const setEntryPoint = useCallback((id: string, entryPoint: AnnotatedFunction<any[]>) => {\n setEntryPoints((prevPoints) => {\n return {\n ...prevPoints,\n [id]: entryPoint,\n };\n });\n }, []);\n\n const removeEntryPoint = useCallback((id: string) => {\n setEntryPoints((prevPoints) => {\n const newPoints = { ...prevPoints };\n delete newPoints[id];\n return newPoints;\n });\n }, []);\n\n const getContextString = useCallback(\n (documents: DocumentPointer[], categories: string[]) => {\n const documentsString = documents\n .map((document) => {\n return `${document.name} (${document.sourceApplication}):\\n${document.getContents()}`;\n })\n .join(\"\\n\\n\");\n\n const nonDocumentStrings = printTree(categories);\n\n return `${documentsString}\\n\\n${nonDocumentStrings}`;\n },\n [printTree],\n );\n\n const addContext = useCallback(\n (\n context: string,\n parentId?: string,\n categories: string[] = defaultCopilotContextCategories,\n ) => {\n return addElement(context, categories, parentId);\n },\n [addElement],\n );\n\n const removeContext = useCallback(\n (id: string) => {\n removeElement(id);\n },\n [removeElement],\n );\n\n const getChatCompletionFunctionDescriptions = useCallback(\n (customEntryPoints?: Record<string, AnnotatedFunction<any[]>>) => {\n return entryPointsToChatCompletionFunctions(Object.values(customEntryPoints || entryPoints));\n },\n [entryPoints],\n );\n\n const getFunctionCallHandler = useCallback(\n (customEntryPoints?: Record<string, AnnotatedFunction<any[]>>) => {\n return entryPointsToFunctionCallHandler(Object.values(customEntryPoints || entryPoints));\n },\n [entryPoints],\n );\n\n const getDocumentsContext = useCallback(\n (categories: string[]) => {\n return allDocuments(categories);\n },\n [allDocuments],\n );\n\n const addDocumentContext = useCallback(\n (documentPointer: DocumentPointer, categories: string[] = defaultCopilotContextCategories) => {\n return addDocument(documentPointer, categories);\n },\n [addDocument],\n );\n\n const removeDocumentContext = useCallback(\n (documentId: string) => {\n removeDocument(documentId);\n },\n [removeDocument],\n );\n\n // get the appropriate CopilotApiConfig from the props\n const copilotApiConfig: CopilotApiConfig = new StandardCopilotApiConfig(\n props.url,\n `${props.url}/v2`,\n props.headers || {},\n {\n ...props.body,\n ...props.backendOnlyProps,\n },\n );\n\n return (\n <CopilotContext.Provider\n value={{\n entryPoints,\n getChatCompletionFunctionDescriptions,\n getFunctionCallHandler,\n setEntryPoint,\n removeEntryPoint,\n getContextString,\n addContext,\n removeContext,\n getDocumentsContext,\n addDocumentContext,\n removeDocumentContext,\n copilotApiConfig: copilotApiConfig,\n }}\n >\n {children}\n </CopilotContext.Provider>\n );\n}\n\nexport const defaultCopilotContextCategories = [\"global\"];\n\nfunction entryPointsToFunctionCallHandler(\n entryPoints: AnnotatedFunction<any[]>[],\n): FunctionCallHandler {\n return async (chatMessages, functionCall) => {\n let entrypointsByFunctionName: Record<string, AnnotatedFunction<any[]>> = {};\n for (let entryPoint of entryPoints) {\n entrypointsByFunctionName[entryPoint.name] = entryPoint;\n }\n\n const entryPointFunction = entrypointsByFunctionName[functionCall.name || \"\"];\n if (entryPointFunction) {\n let functionCallArguments: Record<string, any>[] = [];\n if (functionCall.arguments) {\n functionCallArguments = JSON.parse(functionCall.arguments);\n }\n\n const paramsInCorrectOrder: any[] = [];\n for (let arg of entryPointFunction.argumentAnnotations) {\n paramsInCorrectOrder.push(\n functionCallArguments[arg.name as keyof typeof functionCallArguments],\n );\n }\n\n await entryPointFunction.implementation(...paramsInCorrectOrder);\n\n // commented out becasue for now we don't want to return anything\n // const result = await entryPointFunction.implementation(\n // ...parsedFunctionCallArguments\n // );\n // const functionResponse: ChatRequest = {\n // messages: [\n // ...chatMessages,\n // {\n // id: nanoid(),\n // name: functionCall.name,\n // role: 'function' as const,\n // content: JSON.stringify(result),\n // },\n // ],\n // };\n\n // return functionResponse;\n }\n };\n}\n\nfunction entryPointsToChatCompletionFunctions(\n entryPoints: AnnotatedFunction<any[]>[],\n): ToolDefinition[] {\n return entryPoints.map(annotatedFunctionToChatCompletionFunction);\n}\n"],"mappings":"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","names":["import_react","import_shared","React","import_react","messages","error"]}
1
+ {"version":3,"sources":["../../src/openai-assistants/index.ts","../../src/openai-assistants/hooks/use-copilot-chat-v2.ts","../../src/openai-assistants/utils/process-message-stream.ts","../../src/context/copilot-context.tsx","../../src/components/copilot-provider/copilotkit.tsx"],"sourcesContent":["export * from \"./hooks\";\nexport * from \"./utils\";\n","import { useContext, useMemo, useState } from \"react\";\nimport { processMessageStream } from \"../utils\";\nimport { Message, parseStreamPart } from \"@copilotkit/shared\";\nimport { CopilotContext } from \"../../context\";\nimport { defaultCopilotContextCategories } from \"../../components\";\n\nexport type AssistantStatus = \"in_progress\" | \"awaiting_message\";\n\nexport interface RequestForwardingOptions {\n /**\n * The credentials mode to be used for the fetch request.\n * Possible values are: 'omit', 'same-origin', 'include'.\n * Defaults to 'same-origin'.\n */\n credentials?: RequestCredentials;\n /**\n * HTTP headers to be sent with the API request.\n */\n headers?: Record<string, string> | Headers;\n /**\n * Extra body object to be sent with the API request.\n * @example\n * Send a `sessionId` to the API along with the messages.\n * ```js\n * useChat({\n * body: {\n * sessionId: '123',\n * }\n * })\n * ```\n */\n body?: object;\n}\nexport interface UseCopilotChatOptionsV2 extends RequestForwardingOptions {\n makeSystemMessage?: (contextString: string) => string;\n threadId?: string | undefined;\n}\n\nexport interface UseCopilotChatV2Result {\n messages: Message[];\n input: string;\n handleInputChange: (e: any) => void;\n submitMessage: (e: any) => Promise<void>;\n status: AssistantStatus;\n error: unknown;\n}\n\nexport function useCopilotChatV2(options: UseCopilotChatOptionsV2): UseCopilotChatV2Result {\n const {\n getContextString,\n getChatCompletionFunctionDescriptions,\n getFunctionCallHandler,\n copilotApiConfig,\n } = useContext(CopilotContext);\n\n const [messages, setMessages] = useState<Message[]>([]);\n const [input, setInput] = useState(\"\");\n const [threadId, setThreadId] = useState<string | undefined>(undefined);\n const [status, setStatus] = useState<AssistantStatus>(\"awaiting_message\");\n const [error, setError] = useState<unknown | undefined>(undefined);\n\n const systemMessage: Message = useMemo(() => {\n const systemMessageMaker = options.makeSystemMessage || defaultSystemMessage;\n const contextString = getContextString([], defaultCopilotContextCategories); // TODO: make the context categories configurable\n\n return {\n id: \"system\",\n content: systemMessageMaker(contextString),\n role: \"system\",\n };\n }, [getContextString, options.makeSystemMessage]);\n\n const handleInputChange = (e: any) => {\n setInput(e.target.value);\n };\n\n const submitMessage = async (e: any) => {\n e.preventDefault();\n\n if (input === \"\") {\n return;\n }\n\n setStatus(\"in_progress\");\n\n setMessages((messages) => [...messages, { id: \"\", role: \"user\", content: input }]);\n\n setInput(\"\");\n\n const apiUrl = copilotApiConfig.chatApiEndpointV2;\n\n const functions = getChatCompletionFunctionDescriptions();\n\n const result = await fetch(apiUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...copilotApiConfig.headers,\n ...options.headers,\n },\n body: JSON.stringify({\n // always use user-provided threadId when available:\n threadId: options.threadId ?? threadId ?? null,\n message: input,\n ...(functions.length > 0 && { functions: functions }),\n ...copilotApiConfig.body,\n ...options.body,\n }),\n });\n\n if (result.body == null) {\n throw new Error(\"The response body is empty.\");\n }\n\n await processMessageStream(result.body.getReader(), (message: string) => {\n try {\n const { type, value } = parseStreamPart(message);\n\n switch (type) {\n case \"assistant_message\": {\n // append message:\n setMessages((messages) => [\n ...messages,\n {\n id: value.id,\n role: value.role,\n content: value.content[0].text.value,\n },\n ]);\n break;\n }\n\n case \"assistant_control_data\": {\n setThreadId(value.threadId);\n\n // set id of last message:\n setMessages((messages) => {\n const lastMessage = messages[messages.length - 1];\n lastMessage.id = value.messageId;\n return [...messages.slice(0, messages.length - 1), lastMessage];\n });\n\n break;\n }\n\n case \"error\": {\n setError(value);\n break;\n }\n }\n } catch (error) {\n setError(error);\n }\n });\n\n setStatus(\"awaiting_message\");\n };\n\n return {\n messages,\n input,\n handleInputChange,\n submitMessage,\n status,\n error,\n };\n}\n\nexport function defaultSystemMessage(contextString: string): string {\n return `\nPlease act as an efficient, competent, conscientious, and industrious professional assistant.\n\nHelp 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.\nAlways be polite and respectful, and prefer brevity over verbosity.\n\nThe user has provided you with the following context:\n\\`\\`\\`\n${contextString}\n\\`\\`\\`\n\nThey have also provided you with functions you can call to initiate actions on their behalf, or functions you can call to receive more information.\n\nPlease assist them as best you can.\n\nYou 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.\n\nIf you would like to call a function, call it without saying anything else.\n`;\n}\n","export async function processMessageStream(\n reader: ReadableStreamDefaultReader<Uint8Array>,\n processMessage: (message: string) => void | Promise<void>,\n) {\n const decoder = new TextDecoder();\n let buffer = \"\";\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n if (buffer.length > 0) {\n processMessage(buffer);\n }\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n let endIndex: number;\n while ((endIndex = buffer.indexOf(\"\\n\")) !== -1) {\n processMessage(buffer.substring(0, endIndex).trim());\n buffer = buffer.substring(endIndex + 1); // Remove the processed instruction + delimiter\n }\n }\n}\n","\"use client\";\n\nimport { FunctionCallHandler, AnnotatedFunction, ToolDefinition, Action } from \"@copilotkit/shared\";\nimport React from \"react\";\nimport { TreeNodeId } from \"../hooks/use-tree\";\nimport { DocumentPointer } from \"../types\";\n\n/**\n * Interface for the configuration of the Copilot API.\n */\nexport interface CopilotApiConfig {\n /**\n * The endpoint for the chat API.\n */\n chatApiEndpoint: string;\n\n /**\n * The endpoint for the chat API v2.\n */\n chatApiEndpointV2: string;\n\n /**\n * additional headers to be sent with the request\n * @default {}\n * @example\n * ```\n * {\n * 'Authorization': 'Bearer your_token_here'\n * }\n * ```\n */\n headers: Record<string, string>;\n\n /**\n * Additional body params to be sent with the request\n * @default {}\n * @example\n * ```\n * {\n * 'message': 'Hello, world!'\n * }\n * ```\n */\n body: Record<string, any>;\n\n /**\n * Backend only props that will be combined to body params to be sent with the request\n * @default {}\n * @example\n * ```\n * {\n * 'user_id': 'user_id'\n * }\n * ```\n */\n backendOnlyProps?: Record<string, any>;\n}\n\nexport interface CopilotContextParams {\n // function-calling\n entryPoints: Record<string, Action<any>>;\n setEntryPoint: (id: string, entryPoint: Action<any>) => void;\n removeEntryPoint: (id: string) => void;\n getChatCompletionFunctionDescriptions: (\n customEntryPoints?: Record<string, Action<any>>,\n ) => ToolDefinition[];\n getFunctionCallHandler: (customEntryPoints?: Record<string, Action<any>>) => FunctionCallHandler;\n\n // text context\n addContext: (context: string, parentId?: string, categories?: string[]) => TreeNodeId;\n removeContext: (id: TreeNodeId) => void;\n getContextString: (documents: DocumentPointer[], categories: string[]) => string;\n\n // document context\n addDocumentContext: (documentPointer: DocumentPointer, categories?: string[]) => TreeNodeId;\n removeDocumentContext: (documentId: string) => void;\n getDocumentsContext: (categories: string[]) => DocumentPointer[];\n\n // api endpoints\n copilotApiConfig: CopilotApiConfig;\n}\n\nconst emptyCopilotContext: CopilotContextParams = {\n entryPoints: {},\n setEntryPoint: () => {},\n removeEntryPoint: () => {},\n getChatCompletionFunctionDescriptions: () => returnAndThrowInDebug([]),\n getFunctionCallHandler: () => returnAndThrowInDebug(async () => {}),\n\n getContextString: (documents: DocumentPointer[], categories: string[]) =>\n returnAndThrowInDebug(\"\"),\n addContext: () => \"\",\n removeContext: () => {},\n\n getDocumentsContext: (categories: string[]) => returnAndThrowInDebug([]),\n addDocumentContext: () => returnAndThrowInDebug(\"\"),\n removeDocumentContext: () => {},\n\n copilotApiConfig: new (class implements CopilotApiConfig {\n get chatApiEndpoint(): string {\n throw new Error(\"Remember to wrap your app in a `<CopilotKit> {...} </CopilotKit>` !!!\");\n }\n get chatApiEndpointV2(): string {\n throw new Error(\"Remember to wrap your app in a `<CopilotKit> {...} </CopilotKit>` !!!\");\n }\n get headers(): Record<string, string> {\n return {};\n }\n get body(): Record<string, any> {\n return {};\n }\n })(),\n};\n\nexport const CopilotContext = React.createContext<CopilotContextParams>(emptyCopilotContext);\n\nexport function useCopilotContext(): CopilotContextParams {\n return React.useContext(CopilotContext);\n}\n\nfunction returnAndThrowInDebug<T>(value: T): T {\n throw new Error(\"Remember to wrap your app in a `<CopilotKit> {...} </CopilotKit>` !!!\");\n return value;\n}\n","\"use client\";\n\nimport { FunctionDefinition } from \"@copilotkit/shared\";\nimport { useCallback, useState } from \"react\";\nimport { CopilotContext, CopilotApiConfig } from \"../../context/copilot-context\";\nimport useTree from \"../../hooks/use-tree\";\nimport { DocumentPointer } from \"../../types\";\nimport { FunctionCallHandler, actionToChatCompletionFunction, Action } from \"@copilotkit/shared\";\nimport useFlatCategoryStore from \"../../hooks/use-flat-category-store\";\nimport { StandardCopilotApiConfig } from \"./standard-copilot-api-config\";\nimport { CopilotKitProps } from \"./copilotkit-props\";\nimport { ToolDefinition } from \"@copilotkit/shared\";\n\n/**\n * The CopilotKit component.\n * This component provides the Copilot context to its children.\n * It can be configured either with a chat API endpoint or a CopilotApiConfig.\n *\n * NOTE: The backend can use OpenAI, or you can bring your own LLM.\n * For examples of the backend api implementation, see `examples/next-openai` usage (under `src/api/copilotkit`),\n * or read the documentation at https://docs.copilotkit.ai\n * In particular, Getting-Started > Quickstart-Backend: https://docs.copilotkit.ai/getting-started/quickstart-backend\n *\n * Example usage:\n * ```\n * <CopilotKit url=\"https://your.copilotkit.api\">\n * <App />\n * </CopilotKit>\n * ```\n *\n * or\n *\n * ```\n * const copilotApiConfig = new StandardCopilotApiConfig(\n * \"https://your.copilotkit.api/v1\",\n * \"https://your.copilotkit.api/v2\",\n * {},\n * {}\n * );\n *\n * // ...\n *\n * <CopilotKit chatApiConfig={copilotApiConfig}>\n * <App />\n * </CopilotKit>\n * ```\n *\n * @param props - The props for the component.\n * @returns The CopilotKit component.\n */\nexport function CopilotKit({ children, ...props }: CopilotKitProps) {\n // Compute all the functions and properties that we need to pass\n // to the CopilotContext.\n\n const [entryPoints, setEntryPoints] = useState<Record<string, Action<any>>>({});\n\n const { addElement, removeElement, printTree } = useTree();\n\n const {\n addElement: addDocument,\n removeElement: removeDocument,\n allElements: allDocuments,\n } = useFlatCategoryStore<DocumentPointer>();\n\n const setEntryPoint = useCallback((id: string, entryPoint: Action<any>) => {\n setEntryPoints((prevPoints) => {\n return {\n ...prevPoints,\n [id]: entryPoint,\n };\n });\n }, []);\n\n const removeEntryPoint = useCallback((id: string) => {\n setEntryPoints((prevPoints) => {\n const newPoints = { ...prevPoints };\n delete newPoints[id];\n return newPoints;\n });\n }, []);\n\n const getContextString = useCallback(\n (documents: DocumentPointer[], categories: string[]) => {\n const documentsString = documents\n .map((document) => {\n return `${document.name} (${document.sourceApplication}):\\n${document.getContents()}`;\n })\n .join(\"\\n\\n\");\n\n const nonDocumentStrings = printTree(categories);\n\n return `${documentsString}\\n\\n${nonDocumentStrings}`;\n },\n [printTree],\n );\n\n const addContext = useCallback(\n (\n context: string,\n parentId?: string,\n categories: string[] = defaultCopilotContextCategories,\n ) => {\n return addElement(context, categories, parentId);\n },\n [addElement],\n );\n\n const removeContext = useCallback(\n (id: string) => {\n removeElement(id);\n },\n [removeElement],\n );\n\n const getChatCompletionFunctionDescriptions = useCallback(\n (customEntryPoints?: Record<string, Action<any>>) => {\n return entryPointsToChatCompletionFunctions(Object.values(customEntryPoints || entryPoints));\n },\n [entryPoints],\n );\n\n const getFunctionCallHandler = useCallback(\n (customEntryPoints?: Record<string, Action<any>>) => {\n return entryPointsToFunctionCallHandler(Object.values(customEntryPoints || entryPoints));\n },\n [entryPoints],\n );\n\n const getDocumentsContext = useCallback(\n (categories: string[]) => {\n return allDocuments(categories);\n },\n [allDocuments],\n );\n\n const addDocumentContext = useCallback(\n (documentPointer: DocumentPointer, categories: string[] = defaultCopilotContextCategories) => {\n return addDocument(documentPointer, categories);\n },\n [addDocument],\n );\n\n const removeDocumentContext = useCallback(\n (documentId: string) => {\n removeDocument(documentId);\n },\n [removeDocument],\n );\n\n // get the appropriate CopilotApiConfig from the props\n const copilotApiConfig: CopilotApiConfig = new StandardCopilotApiConfig(\n props.url,\n `${props.url}/v2`,\n props.headers || {},\n {\n ...props.body,\n ...props.backendOnlyProps,\n },\n );\n\n return (\n <CopilotContext.Provider\n value={{\n entryPoints,\n getChatCompletionFunctionDescriptions,\n getFunctionCallHandler,\n setEntryPoint,\n removeEntryPoint,\n getContextString,\n addContext,\n removeContext,\n getDocumentsContext,\n addDocumentContext,\n removeDocumentContext,\n copilotApiConfig: copilotApiConfig,\n }}\n >\n {children}\n </CopilotContext.Provider>\n );\n}\n\nexport const defaultCopilotContextCategories = [\"global\"];\n\nfunction entryPointsToChatCompletionFunctions(actions: Action<any>[]): ToolDefinition[] {\n return actions.map(actionToChatCompletionFunction);\n}\n\nfunction entryPointsToFunctionCallHandler(actions: Action<any>[]): FunctionCallHandler {\n return async (chatMessages, functionCall) => {\n let actionsByFunctionName: Record<string, Action<any>> = {};\n for (let action of actions) {\n actionsByFunctionName[action.name] = action;\n }\n\n const action = actionsByFunctionName[functionCall.name || \"\"];\n if (action) {\n let functionCallArguments: Record<string, any>[] = [];\n if (functionCall.arguments) {\n functionCallArguments = JSON.parse(functionCall.arguments);\n }\n return await action.handler(functionCallArguments);\n }\n };\n}\n"],"mappings":"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","names":["import_react","import_shared","React","import_react","messages","error"]}
@@ -2,7 +2,7 @@ import "../chunk-7GFKOIO7.mjs";
2
2
  import "../chunk-BABVSMJR.mjs";
3
3
  import {
4
4
  useCopilotChatV2
5
- } from "../chunk-6WZFE6II.mjs";
5
+ } from "../chunk-IA65HSBF.mjs";
6
6
  import "../chunk-FRAKUJWH.mjs";
7
7
  import {
8
8
  processMessageStream
@@ -10,11 +10,11 @@ import {
10
10
  import "../chunk-VNRDQJXW.mjs";
11
11
  import "../chunk-JD7BAH7U.mjs";
12
12
  import "../chunk-SPCZTZCY.mjs";
13
- import "../chunk-PHK2K7UB.mjs";
13
+ import "../chunk-L4WLQMO6.mjs";
14
14
  import "../chunk-F2JIAPZQ.mjs";
15
- import "../chunk-VUY2K2DI.mjs";
16
- import "../chunk-S7ZVOTYK.mjs";
17
15
  import "../chunk-YULKJPY3.mjs";
16
+ import "../chunk-VUY2K2DI.mjs";
17
+ import "../chunk-M2RCEQTX.mjs";
18
18
  import "../chunk-MRXNTQOX.mjs";
19
19
  export {
20
20
  processMessageStream,
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  var __defProp = Object.defineProperty;
3
+ var __defProps = Object.defineProperties;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
6
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
7
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
6
8
  var __hasOwnProp = Object.prototype.hasOwnProperty;
@@ -17,6 +19,7 @@ var __spreadValues = (a, b) => {
17
19
  }
18
20
  return a;
19
21
  };
22
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
23
  var __export = (target, all) => {
21
24
  for (var name in all)
22
25
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -71,6 +74,7 @@ function fetchChatCompletion(_0) {
71
74
  body,
72
75
  signal
73
76
  }) {
77
+ var _a, _b;
74
78
  temperature || (temperature = 0.5);
75
79
  tools || (tools = []);
76
80
  const cleanedMessages = messages.map((message) => {
@@ -86,47 +90,32 @@ function fetchChatCompletion(_0) {
86
90
  model,
87
91
  messages: cleanedMessages,
88
92
  stream: true
89
- }, tools.length ? { tools } : {}), temperature ? { temperature } : {}), tools.length != 0 ? { tool_choice: "auto" } : {}), copilotConfig.body), copilotConfig.backendOnlyProps), excludeBackendOnlyProps(copilotConfig)), body ? __spreadValues({}, body) : {})),
93
+ }, tools.length ? { tools } : {}), temperature ? { temperature } : {}), tools.length != 0 ? { tool_choice: "auto" } : {}), copilotConfig.body), copilotConfig.backendOnlyProps), Object.keys((_a = copilotConfig["body"]) != null ? _a : {}).length > 0 ? { [import_shared.EXCLUDE_FROM_FORWARD_PROPS_KEYS]: Object.keys((_b = copilotConfig["body"]) != null ? _b : {}) } : {}), body ? __spreadValues({}, body) : {})),
90
94
  signal
91
95
  });
92
96
  return response;
93
97
  });
94
98
  }
95
- function excludeBackendOnlyProps(copilotConfig) {
96
- var _a;
97
- const backendOnlyProps = (_a = copilotConfig.backendOnlyProps) != null ? _a : {};
98
- if (Object.keys(backendOnlyProps).length > 0) {
99
- return {
100
- [import_shared.EXCLUDE_FROM_FORWARD_PROPS_KEYS]: Object.keys(backendOnlyProps)
101
- };
102
- } else {
103
- return {};
104
- }
105
- }
106
99
  function fetchAndDecodeChatCompletion(params) {
107
100
  return __async(this, null, function* () {
108
101
  const response = yield fetchChatCompletion(params);
109
102
  if (!response.ok || !response.body) {
110
- response.events = null;
111
- } else {
112
- const events = yield (0, import_shared.decodeChatCompletion)((0, import_shared.parseChatCompletion)(response.body));
113
- response.events = events;
103
+ return __spreadProps(__spreadValues({}, response), { events: null });
114
104
  }
115
- return response;
105
+ const events = yield (0, import_shared.decodeChatCompletion)((0, import_shared.parseChatCompletion)(response.body));
106
+ return __spreadProps(__spreadValues({}, response), { events });
116
107
  });
117
108
  }
118
109
  function fetchAndDecodeChatCompletionAsText(params) {
119
110
  return __async(this, null, function* () {
120
111
  const response = yield fetchChatCompletion(params);
121
112
  if (!response.ok || !response.body) {
122
- response.events = null;
123
- } else {
124
- const events = yield (0, import_shared.decodeChatCompletionAsText)(
125
- (0, import_shared.decodeChatCompletion)((0, import_shared.parseChatCompletion)(response.body))
126
- );
127
- response.events = events;
113
+ return __spreadProps(__spreadValues({}, response), { events: null });
128
114
  }
129
- return response;
115
+ const events = yield (0, import_shared.decodeChatCompletionAsText)(
116
+ (0, import_shared.decodeChatCompletion)((0, import_shared.parseChatCompletion)(response.body))
117
+ );
118
+ return __spreadProps(__spreadValues({}, response), { events });
130
119
  });
131
120
  }
132
121
  // Annotate the CommonJS export names for ESM import in node:
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/fetch-chat-completion.ts"],"sourcesContent":["import {\n Message,\n ToolDefinition,\n ChatCompletionEvent,\n decodeChatCompletion,\n parseChatCompletion,\n decodeChatCompletionAsText,\n EXCLUDE_FROM_FORWARD_PROPS_KEYS,\n} from \"@copilotkit/shared\";\nimport { CopilotApiConfig } from \"../context\";\n\nexport interface FetchChatCompletionParams {\n copilotConfig: CopilotApiConfig;\n model?: string;\n messages: Message[];\n tools?: ToolDefinition[];\n temperature?: number;\n maxTokens?: number;\n headers?: Record<string, string> | Headers;\n body?: object;\n signal?: AbortSignal;\n}\n\nexport async function fetchChatCompletion({\n copilotConfig,\n model,\n messages,\n tools,\n temperature,\n headers,\n body,\n signal,\n}: FetchChatCompletionParams): Promise<Response> {\n temperature ||= 0.5;\n tools ||= [];\n\n // clean up any extra properties from messages\n const cleanedMessages = messages.map((message) => {\n const { content, role, name, function_call } = message;\n return { content, role, name, function_call };\n });\n\n const response = await fetch(copilotConfig.chatApiEndpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...copilotConfig.headers,\n ...(headers ? { ...headers } : {}),\n },\n body: JSON.stringify({\n model,\n messages: cleanedMessages,\n stream: true,\n ...(tools.length ? { tools } : {}),\n ...(temperature ? { temperature } : {}),\n ...(tools.length != 0 ? { tool_choice: \"auto\" } : {}),\n ...copilotConfig.body,\n ...copilotConfig.backendOnlyProps,\n ...excludeBackendOnlyProps(copilotConfig),\n ...(body ? { ...body } : {}),\n }),\n signal,\n });\n\n return response;\n}\n\nfunction excludeBackendOnlyProps(copilotConfig: any) {\n const backendOnlyProps = copilotConfig.backendOnlyProps ?? {};\n if (Object.keys(backendOnlyProps).length > 0) {\n return {\n [EXCLUDE_FROM_FORWARD_PROPS_KEYS]: Object.keys(backendOnlyProps),\n };\n } else {\n return {};\n }\n}\n\nexport interface DecodedChatCompletionResponse extends Response {\n events: ReadableStream<ChatCompletionEvent> | null;\n}\n\nexport async function fetchAndDecodeChatCompletion(\n params: FetchChatCompletionParams,\n): Promise<DecodedChatCompletionResponse> {\n const response = await fetchChatCompletion(params);\n if (!response.ok || !response.body) {\n (response as any).events = null;\n } else {\n const events = await decodeChatCompletion(parseChatCompletion(response.body));\n (response as any).events = events;\n }\n return response as any;\n}\n\nexport interface DecodedChatCompletionResponseAsText extends Response {\n events: ReadableStream<string> | null;\n}\n\nexport async function fetchAndDecodeChatCompletionAsText(\n params: FetchChatCompletionParams,\n): Promise<DecodedChatCompletionResponseAsText> {\n const response = await fetchChatCompletion(params);\n if (!response.ok || !response.body) {\n (response as any).events = null;\n } else {\n const events = await decodeChatCompletionAsText(\n decodeChatCompletion(parseChatCompletion(response.body)),\n );\n (response as any).events = events;\n }\n\n return response as any;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAQO;AAeP,SAAsB,oBAAoB,IASO;AAAA,6CATP;AAAA,IACxC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAiD;AAC/C,kCAAgB;AAChB,sBAAU,CAAC;AAGX,UAAM,kBAAkB,SAAS,IAAI,CAAC,YAAY;AAChD,YAAM,EAAE,SAAS,MAAM,MAAM,cAAc,IAAI;AAC/C,aAAO,EAAE,SAAS,MAAM,MAAM,cAAc;AAAA,IAC9C,CAAC;AAED,UAAM,WAAW,MAAM,MAAM,cAAc,iBAAiB;AAAA,MAC1D,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,SACb,cAAc,UACb,UAAU,mBAAK,WAAY,CAAC;AAAA,MAElC,MAAM,KAAK,UAAU;AAAA,QACnB;AAAA,QACA,UAAU;AAAA,QACV,QAAQ;AAAA,SACJ,MAAM,SAAS,EAAE,MAAM,IAAI,CAAC,IAC5B,cAAc,EAAE,YAAY,IAAI,CAAC,IACjC,MAAM,UAAU,IAAI,EAAE,aAAa,OAAO,IAAI,CAAC,IAChD,cAAc,OACd,cAAc,mBACd,wBAAwB,aAAa,IACpC,OAAO,mBAAK,QAAS,CAAC,EAC3B;AAAA,MACD;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAAA;AAEA,SAAS,wBAAwB,eAAoB;AAnErD;AAoEE,QAAM,oBAAmB,mBAAc,qBAAd,YAAkC,CAAC;AAC5D,MAAI,OAAO,KAAK,gBAAgB,EAAE,SAAS,GAAG;AAC5C,WAAO;AAAA,MACL,CAAC,6CAA+B,GAAG,OAAO,KAAK,gBAAgB;AAAA,IACjE;AAAA,EACF,OAAO;AACL,WAAO,CAAC;AAAA,EACV;AACF;AAMA,SAAsB,6BACpB,QACwC;AAAA;AACxC,UAAM,WAAW,MAAM,oBAAoB,MAAM;AACjD,QAAI,CAAC,SAAS,MAAM,CAAC,SAAS,MAAM;AAClC,MAAC,SAAiB,SAAS;AAAA,IAC7B,OAAO;AACL,YAAM,SAAS,UAAM,wCAAqB,mCAAoB,SAAS,IAAI,CAAC;AAC5E,MAAC,SAAiB,SAAS;AAAA,IAC7B;AACA,WAAO;AAAA,EACT;AAAA;AAMA,SAAsB,mCACpB,QAC8C;AAAA;AAC9C,UAAM,WAAW,MAAM,oBAAoB,MAAM;AACjD,QAAI,CAAC,SAAS,MAAM,CAAC,SAAS,MAAM;AAClC,MAAC,SAAiB,SAAS;AAAA,IAC7B,OAAO;AACL,YAAM,SAAS,UAAM;AAAA,YACnB,wCAAqB,mCAAoB,SAAS,IAAI,CAAC;AAAA,MACzD;AACA,MAAC,SAAiB,SAAS;AAAA,IAC7B;AAEA,WAAO;AAAA,EACT;AAAA;","names":[]}
1
+ {"version":3,"sources":["../../src/utils/fetch-chat-completion.ts"],"sourcesContent":["import {\n Message,\n ToolDefinition,\n ChatCompletionEvent,\n decodeChatCompletion,\n parseChatCompletion,\n decodeChatCompletionAsText,\n EXCLUDE_FROM_FORWARD_PROPS_KEYS,\n} from \"@copilotkit/shared\";\nimport { CopilotApiConfig } from \"../context\";\n\nexport interface FetchChatCompletionParams {\n copilotConfig: CopilotApiConfig;\n model?: string;\n messages: Message[];\n tools?: ToolDefinition[];\n temperature?: number;\n maxTokens?: number;\n headers?: Record<string, string> | Headers;\n body?: object;\n signal?: AbortSignal;\n}\n\nexport async function fetchChatCompletion({\n copilotConfig,\n model,\n messages,\n tools,\n temperature,\n headers,\n body,\n signal,\n}: FetchChatCompletionParams): Promise<Response> {\n temperature ||= 0.5;\n tools ||= [];\n\n // clean up any extra properties from messages\n const cleanedMessages = messages.map((message) => {\n const { content, role, name, function_call } = message;\n return { content, role, name, function_call };\n });\n\n const response = await fetch(copilotConfig.chatApiEndpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...copilotConfig.headers,\n ...(headers ? { ...headers } : {}),\n },\n body: JSON.stringify({\n model,\n messages: cleanedMessages,\n stream: true,\n ...(tools.length ? { tools } : {}),\n ...(temperature ? { temperature } : {}),\n ...(tools.length != 0 ? { tool_choice: \"auto\" } : {}),\n ...copilotConfig.body,\n ...copilotConfig.backendOnlyProps,\n ...(Object.keys(copilotConfig[\"body\"] ?? {}).length > 0\n ? { [EXCLUDE_FROM_FORWARD_PROPS_KEYS]: Object.keys(copilotConfig[\"body\"] ?? {}) }\n : {}),\n ...(body ? { ...body } : {}),\n }),\n signal,\n });\n\n return response;\n}\n\nexport interface DecodedChatCompletionResponse extends Response {\n events: ReadableStream<ChatCompletionEvent> | null;\n}\n\nexport async function fetchAndDecodeChatCompletion(\n params: FetchChatCompletionParams,\n): Promise<DecodedChatCompletionResponse> {\n const response = await fetchChatCompletion(params);\n if (!response.ok || !response.body) {\n return { ...response, events: null };\n }\n const events = await decodeChatCompletion(parseChatCompletion(response.body));\n return { ...response, events };\n}\n\nexport interface DecodedChatCompletionResponseAsText extends Response {\n events: ReadableStream<string> | null;\n}\n\nexport async function fetchAndDecodeChatCompletionAsText(\n params: FetchChatCompletionParams,\n): Promise<DecodedChatCompletionResponseAsText> {\n const response = await fetchChatCompletion(params);\n if (!response.ok || !response.body) {\n return { ...response, events: null };\n }\n const events = await decodeChatCompletionAsText(\n decodeChatCompletion(parseChatCompletion(response.body)),\n );\n return { ...response, events };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAQO;AAeP,SAAsB,oBAAoB,IASO;AAAA,6CATP;AAAA,IACxC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAiD;AAhCjD;AAiCE,kCAAgB;AAChB,sBAAU,CAAC;AAGX,UAAM,kBAAkB,SAAS,IAAI,CAAC,YAAY;AAChD,YAAM,EAAE,SAAS,MAAM,MAAM,cAAc,IAAI;AAC/C,aAAO,EAAE,SAAS,MAAM,MAAM,cAAc;AAAA,IAC9C,CAAC;AAED,UAAM,WAAW,MAAM,MAAM,cAAc,iBAAiB;AAAA,MAC1D,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,SACb,cAAc,UACb,UAAU,mBAAK,WAAY,CAAC;AAAA,MAElC,MAAM,KAAK,UAAU;AAAA,QACnB;AAAA,QACA,UAAU;AAAA,QACV,QAAQ;AAAA,SACJ,MAAM,SAAS,EAAE,MAAM,IAAI,CAAC,IAC5B,cAAc,EAAE,YAAY,IAAI,CAAC,IACjC,MAAM,UAAU,IAAI,EAAE,aAAa,OAAO,IAAI,CAAC,IAChD,cAAc,OACd,cAAc,mBACb,OAAO,MAAK,mBAAc,MAAM,MAApB,YAAyB,CAAC,CAAC,EAAE,SAAS,IAClD,EAAE,CAAC,6CAA+B,GAAG,OAAO,MAAK,mBAAc,MAAM,MAApB,YAAyB,CAAC,CAAC,EAAE,IAC9E,CAAC,IACD,OAAO,mBAAK,QAAS,CAAC,EAC3B;AAAA,MACD;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAAA;AAMA,SAAsB,6BACpB,QACwC;AAAA;AACxC,UAAM,WAAW,MAAM,oBAAoB,MAAM;AACjD,QAAI,CAAC,SAAS,MAAM,CAAC,SAAS,MAAM;AAClC,aAAO,iCAAK,WAAL,EAAe,QAAQ,KAAK;AAAA,IACrC;AACA,UAAM,SAAS,UAAM,wCAAqB,mCAAoB,SAAS,IAAI,CAAC;AAC5E,WAAO,iCAAK,WAAL,EAAe,OAAO;AAAA,EAC/B;AAAA;AAMA,SAAsB,mCACpB,QAC8C;AAAA;AAC9C,UAAM,WAAW,MAAM,oBAAoB,MAAM;AACjD,QAAI,CAAC,SAAS,MAAM,CAAC,SAAS,MAAM;AAClC,aAAO,iCAAK,WAAL,EAAe,QAAQ,KAAK;AAAA,IACrC;AACA,UAAM,SAAS,UAAM;AAAA,UACnB,wCAAqB,mCAAoB,SAAS,IAAI,CAAC;AAAA,IACzD;AACA,WAAO,iCAAK,WAAL,EAAe,OAAO;AAAA,EAC/B;AAAA;","names":[]}
@@ -2,7 +2,7 @@ import {
2
2
  fetchAndDecodeChatCompletion,
3
3
  fetchAndDecodeChatCompletionAsText,
4
4
  fetchChatCompletion
5
- } from "../chunk-3WKJ25L3.mjs";
5
+ } from "../chunk-BQ5SSV4Z.mjs";
6
6
  import "../chunk-MRXNTQOX.mjs";
7
7
  export {
8
8
  fetchAndDecodeChatCompletion,
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
7
- "version": "0.21.0-mme-assistant-api.0",
7
+ "version": "0.21.0-mme-experimental-actions.1",
8
8
  "sideEffects": false,
9
9
  "main": "./dist/index.js",
10
10
  "module": "./dist/index.mjs",
@@ -19,18 +19,18 @@
19
19
  "devDependencies": {
20
20
  "@types/jest": "^29.5.4",
21
21
  "@types/react": "^18.2.5",
22
- "eslint": "^7.32.0",
22
+ "eslint": "^8.56.0",
23
23
  "jest": "^29.6.4",
24
24
  "react": "^18.2.0",
25
25
  "ts-jest": "^29.1.1",
26
26
  "tsup": "^6.7.0",
27
- "typescript": "^5.1.3",
28
- "eslint-config-custom": "0.6.0-mme-assistant-api.0",
29
- "tsconfig": "0.10.0-mme-assistant-api.0"
27
+ "typescript": "^5.2.3",
28
+ "eslint-config-custom": "0.6.0-mme-experimental-actions.1",
29
+ "tsconfig": "0.10.0-mme-experimental-actions.1"
30
30
  },
31
31
  "dependencies": {
32
32
  "nanoid": "^4.0.2",
33
- "@copilotkit/shared": "0.5.0-mme-assistant-api.0"
33
+ "@copilotkit/shared": "0.5.0-mme-experimental-actions.1"
34
34
  },
35
35
  "scripts": {
36
36
  "build": "tsup --clean",
@@ -5,11 +5,7 @@ import { useCallback, useState } from "react";
5
5
  import { CopilotContext, CopilotApiConfig } from "../../context/copilot-context";
6
6
  import useTree from "../../hooks/use-tree";
7
7
  import { DocumentPointer } from "../../types";
8
- import {
9
- FunctionCallHandler,
10
- AnnotatedFunction,
11
- annotatedFunctionToChatCompletionFunction,
12
- } from "@copilotkit/shared";
8
+ import { FunctionCallHandler, actionToChatCompletionFunction, Action } from "@copilotkit/shared";
13
9
  import useFlatCategoryStore from "../../hooks/use-flat-category-store";
14
10
  import { StandardCopilotApiConfig } from "./standard-copilot-api-config";
15
11
  import { CopilotKitProps } from "./copilotkit-props";
@@ -56,7 +52,7 @@ export function CopilotKit({ children, ...props }: CopilotKitProps) {
56
52
  // Compute all the functions and properties that we need to pass
57
53
  // to the CopilotContext.
58
54
 
59
- const [entryPoints, setEntryPoints] = useState<Record<string, AnnotatedFunction<any[]>>>({});
55
+ const [entryPoints, setEntryPoints] = useState<Record<string, Action<any>>>({});
60
56
 
61
57
  const { addElement, removeElement, printTree } = useTree();
62
58
 
@@ -66,7 +62,7 @@ export function CopilotKit({ children, ...props }: CopilotKitProps) {
66
62
  allElements: allDocuments,
67
63
  } = useFlatCategoryStore<DocumentPointer>();
68
64
 
69
- const setEntryPoint = useCallback((id: string, entryPoint: AnnotatedFunction<any[]>) => {
65
+ const setEntryPoint = useCallback((id: string, entryPoint: Action<any>) => {
70
66
  setEntryPoints((prevPoints) => {
71
67
  return {
72
68
  ...prevPoints,
@@ -117,14 +113,14 @@ export function CopilotKit({ children, ...props }: CopilotKitProps) {
117
113
  );
118
114
 
119
115
  const getChatCompletionFunctionDescriptions = useCallback(
120
- (customEntryPoints?: Record<string, AnnotatedFunction<any[]>>) => {
116
+ (customEntryPoints?: Record<string, Action<any>>) => {
121
117
  return entryPointsToChatCompletionFunctions(Object.values(customEntryPoints || entryPoints));
122
118
  },
123
119
  [entryPoints],
124
120
  );
125
121
 
126
122
  const getFunctionCallHandler = useCallback(
127
- (customEntryPoints?: Record<string, AnnotatedFunction<any[]>>) => {
123
+ (customEntryPoints?: Record<string, Action<any>>) => {
128
124
  return entryPointsToFunctionCallHandler(Object.values(customEntryPoints || entryPoints));
129
125
  },
130
126
  [entryPoints],
@@ -186,54 +182,24 @@ export function CopilotKit({ children, ...props }: CopilotKitProps) {
186
182
 
187
183
  export const defaultCopilotContextCategories = ["global"];
188
184
 
189
- function entryPointsToFunctionCallHandler(
190
- entryPoints: AnnotatedFunction<any[]>[],
191
- ): FunctionCallHandler {
185
+ function entryPointsToChatCompletionFunctions(actions: Action<any>[]): ToolDefinition[] {
186
+ return actions.map(actionToChatCompletionFunction);
187
+ }
188
+
189
+ function entryPointsToFunctionCallHandler(actions: Action<any>[]): FunctionCallHandler {
192
190
  return async (chatMessages, functionCall) => {
193
- let entrypointsByFunctionName: Record<string, AnnotatedFunction<any[]>> = {};
194
- for (let entryPoint of entryPoints) {
195
- entrypointsByFunctionName[entryPoint.name] = entryPoint;
191
+ let actionsByFunctionName: Record<string, Action<any>> = {};
192
+ for (let action of actions) {
193
+ actionsByFunctionName[action.name] = action;
196
194
  }
197
195
 
198
- const entryPointFunction = entrypointsByFunctionName[functionCall.name || ""];
199
- if (entryPointFunction) {
196
+ const action = actionsByFunctionName[functionCall.name || ""];
197
+ if (action) {
200
198
  let functionCallArguments: Record<string, any>[] = [];
201
199
  if (functionCall.arguments) {
202
200
  functionCallArguments = JSON.parse(functionCall.arguments);
203
201
  }
204
-
205
- const paramsInCorrectOrder: any[] = [];
206
- for (let arg of entryPointFunction.argumentAnnotations) {
207
- paramsInCorrectOrder.push(
208
- functionCallArguments[arg.name as keyof typeof functionCallArguments],
209
- );
210
- }
211
-
212
- await entryPointFunction.implementation(...paramsInCorrectOrder);
213
-
214
- // commented out becasue for now we don't want to return anything
215
- // const result = await entryPointFunction.implementation(
216
- // ...parsedFunctionCallArguments
217
- // );
218
- // const functionResponse: ChatRequest = {
219
- // messages: [
220
- // ...chatMessages,
221
- // {
222
- // id: nanoid(),
223
- // name: functionCall.name,
224
- // role: 'function' as const,
225
- // content: JSON.stringify(result),
226
- // },
227
- // ],
228
- // };
229
-
230
- // return functionResponse;
202
+ return await action.handler(functionCallArguments);
231
203
  }
232
204
  };
233
205
  }
234
-
235
- function entryPointsToChatCompletionFunctions(
236
- entryPoints: AnnotatedFunction<any[]>[],
237
- ): ToolDefinition[] {
238
- return entryPoints.map(annotatedFunctionToChatCompletionFunction);
239
- }
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { FunctionCallHandler, AnnotatedFunction, ToolDefinition } from "@copilotkit/shared";
3
+ import { FunctionCallHandler, AnnotatedFunction, ToolDefinition, Action } from "@copilotkit/shared";
4
4
  import React from "react";
5
5
  import { TreeNodeId } from "../hooks/use-tree";
6
6
  import { DocumentPointer } from "../types";
@@ -58,15 +58,13 @@ export interface CopilotApiConfig {
58
58
 
59
59
  export interface CopilotContextParams {
60
60
  // function-calling
61
- entryPoints: Record<string, AnnotatedFunction<any[]>>;
62
- setEntryPoint: (id: string, entryPoint: AnnotatedFunction<any[]>) => void;
61
+ entryPoints: Record<string, Action<any>>;
62
+ setEntryPoint: (id: string, entryPoint: Action<any>) => void;
63
63
  removeEntryPoint: (id: string) => void;
64
64
  getChatCompletionFunctionDescriptions: (
65
- customEntryPoints?: Record<string, AnnotatedFunction<any[]>>,
65
+ customEntryPoints?: Record<string, Action<any>>,
66
66
  ) => ToolDefinition[];
67
- getFunctionCallHandler: (
68
- customEntryPoints?: Record<string, AnnotatedFunction<any[]>>,
69
- ) => FunctionCallHandler;
67
+ getFunctionCallHandler: (customEntryPoints?: Record<string, Action<any>>) => FunctionCallHandler;
70
68
 
71
69
  // text context
72
70
  addContext: (context: string, parentId?: string, categories?: string[]) => TreeNodeId;
@@ -3,6 +3,7 @@ export type { UseCopilotChatOptions } from "./use-copilot-chat";
3
3
  export type { UseCopilotChatReturn } from "./use-copilot-chat";
4
4
 
5
5
  export { useMakeCopilotActionable } from "./use-make-copilot-actionable";
6
+ export { useCopilotAction } from "./use-copilot-action";
6
7
  export { useMakeCopilotReadable } from "./use-make-copilot-readable";
7
8
  export { useMakeCopilotDocumentReadable } from "./use-make-copilot-document-readable";
8
9
  export { type UseChatHelpers } from "./use-chat";
@@ -85,8 +85,6 @@ export function useChat(options: UseChatOptionsWithCopilotConfig): UseChatHelper
85
85
  const [input, setInput] = useState("");
86
86
  const [isLoading, setIsLoading] = useState(false);
87
87
  const abortControllerRef = useRef<AbortController>();
88
- const threadIdRef = useRef<string | null>(null);
89
- const runIdRef = useRef<string | null>(null);
90
88
 
91
89
  const runChatCompletion = async (messages: Message[]): Promise<Message[]> => {
92
90
  setIsLoading(true);
@@ -104,32 +102,15 @@ export function useChat(options: UseChatOptionsWithCopilotConfig): UseChatHelper
104
102
 
105
103
  setMessages([...messages, ...newMessages]);
106
104
 
107
- // add threadId and runId to the body if it exists
108
- const copilotConfigBody = options.copilotConfig.body || {};
109
- if (threadIdRef.current) {
110
- copilotConfigBody.threadId = threadIdRef.current;
111
- }
112
- if (runIdRef.current) {
113
- copilotConfigBody.runId = runIdRef.current;
114
- }
115
-
116
105
  const messagesWithContext = [...(options.initialMessages || []), ...messages];
117
106
  const response = await fetchAndDecodeChatCompletion({
118
- copilotConfig: { ...options.copilotConfig, body: copilotConfigBody },
107
+ copilotConfig: options.copilotConfig,
119
108
  messages: messagesWithContext,
120
109
  tools: options.tools,
121
110
  headers: options.headers,
122
111
  signal: abortController.signal,
123
112
  });
124
113
 
125
- if (response.headers.get("threadid")) {
126
- threadIdRef.current = response.headers.get("threadid");
127
- }
128
-
129
- if (response.headers.get("runid")) {
130
- runIdRef.current = response.headers.get("runid");
131
- }
132
-
133
114
  if (!response.events) {
134
115
  throw new Error("Failed to fetch chat completion");
135
116
  }
@@ -0,0 +1,100 @@
1
+ "use client";
2
+
3
+ import { Action, AnnotatedFunction, Parameter } from "@copilotkit/shared";
4
+ import { useRef, useContext, useEffect, useMemo } from "react";
5
+ import { CopilotContext } from "../context/copilot-context";
6
+ import { nanoid } from "nanoid";
7
+
8
+ // We implement useCopilotActionImplementation dependency handling so that
9
+ // the developer has the option to not provide any dependencies.
10
+ // In this case, we assume they want to update the handler on each rerender.
11
+ // To avoid getting stuck in an infinite loop, we update the handler directly,
12
+ // skipping React state updates.
13
+ // This is ok in this case, because the handler is not part of any UI that
14
+ // needs to be updated.
15
+ // useCallback, useMemo or other memoization techniques are not suitable here,
16
+ // because they will cause a infinite rerender loop.
17
+ export function useCopilotActionImplementation<T extends Array<any> = []>(
18
+ action: Action<T>,
19
+ dependencies?: any[],
20
+ ): void {
21
+ const { setEntryPoint, removeEntryPoint, entryPoints } = useContext(CopilotContext);
22
+ const idRef = useRef<string>(nanoid());
23
+
24
+ // If the developer doesn't provide dependencies, we assume they want to
25
+ // update the handler when the action object changes.
26
+ // This ensures that any captured variables in the handler are up to date.
27
+ if (dependencies === undefined) {
28
+ if (entryPoints[idRef.current]) {
29
+ entryPoints[idRef.current].handler = action.handler;
30
+ }
31
+ }
32
+
33
+ useEffect(() => {
34
+ setEntryPoint(idRef.current, action);
35
+ return () => {
36
+ removeEntryPoint(idRef.current);
37
+ };
38
+ }, [
39
+ setEntryPoint,
40
+ removeEntryPoint,
41
+ action.description,
42
+ action.name,
43
+ // This should be faster than deep equality checking
44
+ // In addition, all major JS engines guarantee the order of object keys
45
+ JSON.stringify(action.parameters),
46
+ // dependencies set by the developer
47
+ ...(dependencies || []),
48
+ ]);
49
+ }
50
+
51
+ export function annotatedFunctionToAction(
52
+ annotatedFunction: AnnotatedFunction<any[]>,
53
+ ): Action<any> {
54
+ const parameters: Parameter[] = annotatedFunction.argumentAnnotations.map((annotation) => {
55
+ switch (annotation.type) {
56
+ case "string":
57
+ case "number":
58
+ case "boolean":
59
+ case "object":
60
+ return {
61
+ name: annotation.name,
62
+ description: annotation.description,
63
+ type: annotation.type,
64
+ required: annotation.required,
65
+ };
66
+ case "array":
67
+ let type;
68
+ if (annotation.items.type === "string") {
69
+ type = "string[]";
70
+ } else if (annotation.items.type === "number") {
71
+ type = "number[]";
72
+ } else if (annotation.items.type === "boolean") {
73
+ type = "boolean[]";
74
+ } else if (annotation.items.type === "object") {
75
+ type = "object[]";
76
+ } else {
77
+ type = "string[]";
78
+ }
79
+ return {
80
+ name: annotation.name,
81
+ description: annotation.description,
82
+ type: type as any,
83
+ required: annotation.required,
84
+ };
85
+ }
86
+ });
87
+
88
+ return {
89
+ name: annotatedFunction.name,
90
+ description: annotatedFunction.description,
91
+ parameters: parameters,
92
+ handler: (args) => {
93
+ const paramsInCorrectOrder: any[] = [];
94
+ for (let arg of annotatedFunction.argumentAnnotations) {
95
+ paramsInCorrectOrder.push(args[arg.name]);
96
+ }
97
+ return annotatedFunction.implementation(...paramsInCorrectOrder);
98
+ },
99
+ };
100
+ }
@@ -0,0 +1,44 @@
1
+ "use client";
2
+
3
+ import { Action, Parameter } from "@copilotkit/shared";
4
+ import { useCopilotActionImplementation } from "./use-copilot-action-implementation";
5
+
6
+ // Prettier chokes on the `const` in the function signature
7
+ // To have the main implementation checked by prettier, we split
8
+ // this into a separate file
9
+ // prettier-ignore
10
+ export function useCopilotAction<const T extends Parameter[] | [] = []>(action: Action<T>, dependencies?: any[]): void {
11
+ return useCopilotActionImplementation(action, dependencies);
12
+ }
13
+
14
+ // Usage Example:
15
+ // useCopilotAction({
16
+ // name: "myAction",
17
+ // parameters: [
18
+ // { name: "arg1", type: "string", enum: ["option1", "option2", "option3"], required: false },
19
+ // { name: "arg2", type: "number" },
20
+ // {
21
+ // name: "arg3",
22
+ // type: "object",
23
+ // attributes: [
24
+ // { name: "nestedArg1", type: "boolean" },
25
+ // { name: "xyz", required: false },
26
+ // ],
27
+ // },
28
+ // { name: "arg4", type: "number[]" },
29
+ // ],
30
+ // handler: ({ arg1, arg2, arg3, arg4 }) => {
31
+ // const x = arg3.nestedArg1;
32
+ // const z = arg3.xyz;
33
+ // console.log(arg1, arg2, arg3);
34
+ // },
35
+ // });
36
+
37
+ // useCopilotAction({
38
+ // name: "myAction",
39
+ // handler: () => {
40
+ // console.log("No parameters provided.");
41
+ // },
42
+ // });
43
+
44
+ // https://community.openai.com/t/function-call-complex-arrays-as-parameters/295648/3
@@ -4,7 +4,11 @@ import { useRef, useContext, useEffect, useMemo } from "react";
4
4
  import { CopilotContext } from "../context/copilot-context";
5
5
  import { AnnotatedFunction } from "@copilotkit/shared";
6
6
  import { nanoid } from "nanoid";
7
+ import { annotatedFunctionToAction } from "./use-copilot-action-implementation";
7
8
 
9
+ /**
10
+ * @deprecated Use the useCopilotAction function instead.
11
+ */
8
12
  export function useMakeCopilotActionable<ActionInput extends any[]>(
9
13
  annotatedFunction: AnnotatedFunction<ActionInput>,
10
14
  dependencies: any[],
@@ -23,7 +27,8 @@ export function useMakeCopilotActionable<ActionInput extends any[]>(
23
27
  );
24
28
 
25
29
  useEffect(() => {
26
- setEntryPoint(idRef.current, memoizedAnnotatedFunction as AnnotatedFunction<any[]>);
30
+ const action = annotatedFunctionToAction(memoizedAnnotatedFunction as AnnotatedFunction<any[]>);
31
+ setEntryPoint(idRef.current, action);
27
32
 
28
33
  return () => {
29
34
  removeEntryPoint(idRef.current);