@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.
- package/.turbo/turbo-build.log +135 -121
- package/CHANGELOG.md +13 -2
- package/dist/{chunk-WH4L73VS.mjs → chunk-55K3I3XY.mjs} +7 -3
- package/dist/chunk-55K3I3XY.mjs.map +1 -0
- package/dist/{chunk-3WKJ25L3.mjs → chunk-BQ5SSV4Z.mjs} +12 -25
- package/dist/chunk-BQ5SSV4Z.mjs.map +1 -0
- package/dist/{chunk-JVCBCB2T.mjs → chunk-FDXBLJ6Y.mjs} +2 -2
- package/dist/chunk-HGMVI4JR.mjs +13 -0
- package/dist/chunk-HGMVI4JR.mjs.map +1 -0
- package/dist/{chunk-6WZFE6II.mjs → chunk-IA65HSBF.mjs} +3 -3
- package/dist/chunk-IOP6JX34.mjs +1 -0
- package/dist/{chunk-2YF2MC22.mjs → chunk-JFUS5YVO.mjs} +4 -21
- package/dist/chunk-JFUS5YVO.mjs.map +1 -0
- package/dist/{chunk-KLGA2MES.mjs → chunk-L2IFWQP4.mjs} +5 -5
- package/dist/chunk-L2IFWQP4.mjs.map +1 -0
- package/dist/{chunk-PHK2K7UB.mjs → chunk-L4WLQMO6.mjs} +16 -24
- package/dist/chunk-L4WLQMO6.mjs.map +1 -0
- package/dist/{chunk-S7ZVOTYK.mjs → chunk-M2RCEQTX.mjs} +1 -1
- package/dist/chunk-M2RCEQTX.mjs.map +1 -0
- package/dist/{chunk-UHTJLRI6.mjs → chunk-MI6PIZOT.mjs} +6 -6
- package/dist/{chunk-2EP7VLPI.mjs → chunk-OBWBSGOG.mjs} +2 -2
- package/dist/chunk-QAIUQFOK.mjs +85 -0
- package/dist/chunk-QAIUQFOK.mjs.map +1 -0
- package/dist/components/copilot-provider/copilotkit.js +10 -16
- package/dist/components/copilot-provider/copilotkit.js.map +1 -1
- package/dist/components/copilot-provider/copilotkit.mjs +3 -3
- package/dist/components/copilot-provider/index.js +10 -16
- package/dist/components/copilot-provider/index.js.map +1 -1
- package/dist/components/copilot-provider/index.mjs +3 -3
- package/dist/components/index.js +10 -16
- package/dist/components/index.js.map +1 -1
- package/dist/components/index.mjs +3 -3
- package/dist/context/copilot-context.d.ts +5 -5
- package/dist/context/copilot-context.js.map +1 -1
- package/dist/context/copilot-context.mjs +1 -1
- package/dist/context/index.js.map +1 -1
- package/dist/context/index.mjs +1 -1
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.js +105 -46
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/index.mjs +17 -12
- package/dist/hooks/use-chat.js +6 -33
- package/dist/hooks/use-chat.js.map +1 -1
- package/dist/hooks/use-chat.mjs +2 -2
- package/dist/hooks/use-copilot-action-implementation.d.ts +6 -0
- package/dist/hooks/use-copilot-action-implementation.js +179 -0
- package/dist/hooks/use-copilot-action-implementation.js.map +1 -0
- package/dist/hooks/use-copilot-action-implementation.mjs +12 -0
- package/dist/hooks/use-copilot-action-implementation.mjs.map +1 -0
- package/dist/hooks/use-copilot-action.d.ts +5 -0
- package/dist/hooks/use-copilot-action.js +137 -0
- package/dist/hooks/use-copilot-action.js.map +1 -0
- package/dist/hooks/use-copilot-action.mjs +11 -0
- package/dist/hooks/use-copilot-action.mjs.map +1 -0
- package/dist/hooks/use-copilot-chat.js +6 -33
- package/dist/hooks/use-copilot-chat.js.map +1 -1
- package/dist/hooks/use-copilot-chat.mjs +6 -6
- package/dist/hooks/use-make-copilot-actionable.d.ts +3 -0
- package/dist/hooks/use-make-copilot-actionable.js +60 -6
- package/dist/hooks/use-make-copilot-actionable.js.map +1 -1
- package/dist/hooks/use-make-copilot-actionable.mjs +3 -2
- package/dist/hooks/use-make-copilot-document-readable.js.map +1 -1
- package/dist/hooks/use-make-copilot-document-readable.mjs +2 -2
- package/dist/hooks/use-make-copilot-readable.js.map +1 -1
- package/dist/hooks/use-make-copilot-readable.mjs +2 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.js +130 -79
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +26 -21
- package/dist/lib/copilot-task.d.ts +3 -3
- package/dist/lib/copilot-task.js +10 -19
- package/dist/lib/copilot-task.js.map +1 -1
- package/dist/lib/copilot-task.mjs +5 -5
- package/dist/lib/index.js +10 -19
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/index.mjs +5 -5
- package/dist/openai-assistants/hooks/index.js.map +1 -1
- package/dist/openai-assistants/hooks/index.mjs +4 -4
- package/dist/openai-assistants/hooks/use-copilot-chat-v2.js.map +1 -1
- package/dist/openai-assistants/hooks/use-copilot-chat-v2.mjs +4 -4
- package/dist/openai-assistants/index.js.map +1 -1
- package/dist/openai-assistants/index.mjs +4 -4
- package/dist/utils/fetch-chat-completion.js +13 -24
- package/dist/utils/fetch-chat-completion.js.map +1 -1
- package/dist/utils/fetch-chat-completion.mjs +1 -1
- package/package.json +6 -6
- package/src/components/copilot-provider/copilotkit.tsx +16 -50
- package/src/context/copilot-context.tsx +5 -7
- package/src/hooks/index.ts +1 -0
- package/src/hooks/use-chat.ts +1 -20
- package/src/hooks/use-copilot-action-implementation.ts +100 -0
- package/src/hooks/use-copilot-action.ts +44 -0
- package/src/hooks/use-make-copilot-actionable.ts +6 -1
- package/src/lib/copilot-task.ts +5 -5
- package/src/utils/fetch-chat-completion.ts +11 -25
- package/dist/chunk-2YF2MC22.mjs.map +0 -1
- package/dist/chunk-3WKJ25L3.mjs.map +0 -1
- package/dist/chunk-5UGLWBZJ.mjs +0 -1
- package/dist/chunk-KLGA2MES.mjs.map +0 -1
- package/dist/chunk-PHK2K7UB.mjs.map +0 -1
- package/dist/chunk-S7ZVOTYK.mjs.map +0 -1
- package/dist/chunk-WH4L73VS.mjs.map +0 -1
- /package/dist/{chunk-JVCBCB2T.mjs.map → chunk-FDXBLJ6Y.mjs.map} +0 -0
- /package/dist/{chunk-6WZFE6II.mjs.map → chunk-IA65HSBF.mjs.map} +0 -0
- /package/dist/{chunk-5UGLWBZJ.mjs.map → chunk-IOP6JX34.mjs.map} +0 -0
- /package/dist/{chunk-UHTJLRI6.mjs.map → chunk-MI6PIZOT.mjs.map} +0 -0
- /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-
|
|
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-
|
|
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),
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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 ...
|
|
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":[]}
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
7
|
-
"version": "0.21.0-mme-
|
|
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": "^
|
|
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.
|
|
28
|
-
"eslint-config-custom": "0.6.0-mme-
|
|
29
|
-
"tsconfig": "0.10.0-mme-
|
|
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-
|
|
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,
|
|
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:
|
|
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,
|
|
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,
|
|
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
|
|
190
|
-
|
|
191
|
-
|
|
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
|
|
194
|
-
for (let
|
|
195
|
-
|
|
191
|
+
let actionsByFunctionName: Record<string, Action<any>> = {};
|
|
192
|
+
for (let action of actions) {
|
|
193
|
+
actionsByFunctionName[action.name] = action;
|
|
196
194
|
}
|
|
197
195
|
|
|
198
|
-
const
|
|
199
|
-
if (
|
|
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,
|
|
62
|
-
setEntryPoint: (id: string, entryPoint:
|
|
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,
|
|
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;
|
package/src/hooks/index.ts
CHANGED
|
@@ -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";
|
package/src/hooks/use-chat.ts
CHANGED
|
@@ -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:
|
|
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
|
-
|
|
30
|
+
const action = annotatedFunctionToAction(memoizedAnnotatedFunction as AnnotatedFunction<any[]>);
|
|
31
|
+
setEntryPoint(idRef.current, action);
|
|
27
32
|
|
|
28
33
|
return () => {
|
|
29
34
|
removeEntryPoint(idRef.current);
|