{"version":3,"sources":["../src/components/chat/Suggestion.tsx"],"sourcesContent":["import {\n  CopilotContextParams,\n  extract,\n  CopilotChatSuggestionConfiguration,\n  CopilotMessagesContextParams,\n} from \"@copilotkit/react-core\";\nimport { SuggestionsProps } from \"./props\";\nimport { SmallSpinnerIcon } from \"./Icons\";\nimport { CopilotChatSuggestion } from \"../../types/suggestions\";\nimport { actionParametersToJsonSchema } from \"@copilotkit/shared\";\nimport { CopilotRequestType } from \"@copilotkit/runtime-client-gql\";\n\nexport function Suggestion({ title, message, onClick, partial, className }: SuggestionsProps) {\n  return (\n    <button\n      disabled={partial}\n      onClick={(e) => {\n        e.preventDefault();\n        onClick(message);\n      }}\n      className={className || (partial ? \"suggestion loading\" : \"suggestion\")}\n      data-test-id=\"suggestion\"\n    >\n      {partial ? SmallSpinnerIcon : <span>{title}</span>}\n    </button>\n  );\n}\n\nexport const reloadSuggestions = async (\n  context: CopilotContextParams & CopilotMessagesContextParams,\n  chatSuggestionConfiguration: { [key: string]: CopilotChatSuggestionConfiguration },\n  setCurrentSuggestions: (suggestions: { title: string; message: string }[]) => void,\n  abortControllerRef: React.MutableRefObject<AbortController | null>,\n) => {\n  const abortController = abortControllerRef.current;\n\n  const tools = JSON.stringify(\n    Object.values(context.actions).map((action) => ({\n      name: action.name,\n      description: action.description,\n      jsonSchema: JSON.stringify(actionParametersToJsonSchema(action.parameters)),\n    })),\n  );\n\n  const allSuggestions: CopilotChatSuggestion[] = [];\n\n  for (const config of Object.values(chatSuggestionConfiguration)) {\n    try {\n      const numOfSuggestionsInstructions =\n        config.minSuggestions === 0\n          ? `Produce up to ${config.maxSuggestions} suggestions. ` +\n            `If there are no highly relevant suggestions you can think of, provide an empty array.`\n          : `Produce between ${config.minSuggestions} and ${config.maxSuggestions} suggestions.`;\n\n      const result = await extract({\n        context,\n        instructions:\n          \"Suggest what the user could say next. Provide clear, highly relevant suggestions. Do not literally suggest function calls. \",\n        data:\n          config.instructions +\n          \"\\n\\n\" +\n          numOfSuggestionsInstructions +\n          \"\\n\\n\" +\n          \"Available tools: \" +\n          tools +\n          \"\\n\\n\",\n        requestType: CopilotRequestType.Task,\n        parameters: [\n          {\n            name: \"suggestions\",\n            type: \"object[]\",\n            attributes: [\n              {\n                name: \"title\",\n                description:\n                  \"The title of the suggestion. This is shown as a button and should be short.\",\n                type: \"string\",\n              },\n              {\n                name: \"message\",\n                description:\n                  \"The message to send when the suggestion is clicked. This should be a clear, complete sentence and will be sent as an instruction to the AI.\",\n                type: \"string\",\n              },\n            ],\n          },\n        ],\n        include: {\n          messages: true,\n          readable: true,\n        },\n        abortSignal: abortController?.signal,\n        stream: ({ status, args }) => {\n          const suggestions = args.suggestions || [];\n          const newSuggestions: CopilotChatSuggestion[] = [];\n          for (let i = 0; i < suggestions.length; i++) {\n            // if GPT provides too many suggestions, limit the number of suggestions\n            if (config.maxSuggestions !== undefined && i >= config.maxSuggestions) {\n              break;\n            }\n            const { title, message } = suggestions[i];\n\n            // If this is the last suggestion and the status is not complete, mark it as partial\n            const partial = i == suggestions.length - 1 && status !== \"complete\";\n\n            newSuggestions.push({\n              title,\n              message,\n              partial,\n              className: config.className,\n            });\n          }\n          setCurrentSuggestions([...allSuggestions, ...newSuggestions]);\n        },\n      });\n      allSuggestions.push(...result.suggestions);\n    } catch (error) {\n      console.error(\"Error loading suggestions\", error);\n    }\n  }\n\n  if (abortControllerRef.current === abortController) {\n    abortControllerRef.current = null;\n  }\n};\n"],"mappings":";;;;;;;;AAAA;AAAA,EAEE;AAAA,OAGK;AAIP,SAAS,oCAAoC;AAC7C,SAAS,0BAA0B;AAaC;AAX7B,SAAS,WAAW,EAAE,OAAO,SAAS,SAAS,SAAS,UAAU,GAAqB;AAC5F,SACE;AAAA,IAAC;AAAA;AAAA,MACC,UAAU;AAAA,MACV,SAAS,CAAC,MAAM;AACd,UAAE,eAAe;AACjB,gBAAQ,OAAO;AAAA,MACjB;AAAA,MACA,WAAW,cAAc,UAAU,uBAAuB;AAAA,MAC1D,gBAAa;AAAA,MAEZ,oBAAU,mBAAmB,oBAAC,UAAM,iBAAM;AAAA;AAAA,EAC7C;AAEJ;AAEO,IAAM,oBAAoB,CAC/B,SACA,6BACA,uBACA,uBACG;AACH,QAAM,kBAAkB,mBAAmB;AAE3C,QAAM,QAAQ,KAAK;AAAA,IACjB,OAAO,OAAO,QAAQ,OAAO,EAAE,IAAI,CAAC,YAAY;AAAA,MAC9C,MAAM,OAAO;AAAA,MACb,aAAa,OAAO;AAAA,MACpB,YAAY,KAAK,UAAU,6BAA6B,OAAO,UAAU,CAAC;AAAA,IAC5E,EAAE;AAAA,EACJ;AAEA,QAAM,iBAA0C,CAAC;AAEjD,aAAW,UAAU,OAAO,OAAO,2BAA2B,GAAG;AAC/D,QAAI;AACF,YAAM,+BACJ,OAAO,mBAAmB,IACtB,iBAAiB,OAAO,sHAExB,mBAAmB,OAAO,sBAAsB,OAAO;AAE7D,YAAM,SAAS,MAAM,QAAQ;AAAA,QAC3B;AAAA,QACA,cACE;AAAA,QACF,MACE,OAAO,eACP,SACA,+BACA,0BAEA,QACA;AAAA,QACF,aAAa,mBAAmB;AAAA,QAChC,YAAY;AAAA,UACV;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,YAAY;AAAA,cACV;AAAA,gBACE,MAAM;AAAA,gBACN,aACE;AAAA,gBACF,MAAM;AAAA,cACR;AAAA,cACA;AAAA,gBACE,MAAM;AAAA,gBACN,aACE;AAAA,gBACF,MAAM;AAAA,cACR;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,SAAS;AAAA,UACP,UAAU;AAAA,UACV,UAAU;AAAA,QACZ;AAAA,QACA,aAAa,mDAAiB;AAAA,QAC9B,QAAQ,CAAC,EAAE,QAAQ,KAAK,MAAM;AAC5B,gBAAM,cAAc,KAAK,eAAe,CAAC;AACzC,gBAAM,iBAA0C,CAAC;AACjD,mBAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AAE3C,gBAAI,OAAO,mBAAmB,UAAa,KAAK,OAAO,gBAAgB;AACrE;AAAA,YACF;AACA,kBAAM,EAAE,OAAO,QAAQ,IAAI,YAAY,CAAC;AAGxC,kBAAM,UAAU,KAAK,YAAY,SAAS,KAAK,WAAW;AAE1D,2BAAe,KAAK;AAAA,cAClB;AAAA,cACA;AAAA,cACA;AAAA,cACA,WAAW,OAAO;AAAA,YACpB,CAAC;AAAA,UACH;AACA,gCAAsB,CAAC,GAAG,gBAAgB,GAAG,cAAc,CAAC;AAAA,QAC9D;AAAA,MACF,CAAC;AACD,qBAAe,KAAK,GAAG,OAAO,WAAW;AAAA,IAC3C,SAAS,OAAP;AACA,cAAQ,MAAM,6BAA6B,KAAK;AAAA,IAClD;AAAA,EACF;AAEA,MAAI,mBAAmB,YAAY,iBAAiB;AAClD,uBAAmB,UAAU;AAAA,EAC/B;AACF;","names":[]}