| import { useMemo, useCallback } from 'react'; |
| import { EModelEndpoint, Constants } from 'librechat-data-provider'; |
| import { useChatContext, useAgentsMapContext, useAssistantsMapContext } from '~/Providers'; |
| import { useGetAssistantDocsQuery, useGetEndpointsQuery } from '~/data-provider'; |
| import { getIconEndpoint, getEntity } from '~/utils'; |
| import { useSubmitMessage } from '~/hooks'; |
|
|
| const ConversationStarters = () => { |
| const { conversation } = useChatContext(); |
| const agentsMap = useAgentsMapContext(); |
| const assistantMap = useAssistantsMapContext(); |
| const { data: endpointsConfig } = useGetEndpointsQuery(); |
|
|
| const endpointType = useMemo(() => { |
| let ep = conversation?.endpoint ?? ''; |
| if ( |
| [ |
| EModelEndpoint.chatGPTBrowser, |
| EModelEndpoint.azureOpenAI, |
| EModelEndpoint.gptPlugins, |
| ].includes(ep as EModelEndpoint) |
| ) { |
| ep = EModelEndpoint.openAI; |
| } |
| return getIconEndpoint({ |
| endpointsConfig, |
| iconURL: conversation?.iconURL, |
| endpoint: ep, |
| }); |
| }, [conversation?.endpoint, conversation?.iconURL, endpointsConfig]); |
|
|
| const { data: documentsMap = new Map() } = useGetAssistantDocsQuery(endpointType, { |
| select: (data) => new Map(data.map((dbA) => [dbA.assistant_id, dbA])), |
| }); |
|
|
| const { entity, isAgent } = getEntity({ |
| endpoint: endpointType, |
| agentsMap, |
| assistantMap, |
| agent_id: conversation?.agent_id, |
| assistant_id: conversation?.assistant_id, |
| }); |
|
|
| const conversation_starters = useMemo(() => { |
| if (entity?.conversation_starters?.length) { |
| return entity.conversation_starters; |
| } |
|
|
| if (isAgent) { |
| return []; |
| } |
|
|
| return documentsMap.get(entity?.id ?? '')?.conversation_starters ?? []; |
| }, [documentsMap, isAgent, entity]); |
|
|
| const { submitMessage } = useSubmitMessage(); |
| const sendConversationStarter = useCallback( |
| (text: string) => submitMessage({ text }), |
| [submitMessage], |
| ); |
|
|
| if (!conversation_starters.length) { |
| return null; |
| } |
|
|
| return ( |
| <div className="mt-8 flex flex-wrap justify-center gap-3 px-4"> |
| {conversation_starters |
| .slice(0, Constants.MAX_CONVO_STARTERS) |
| .map((text: string, index: number) => ( |
| <button |
| key={index} |
| onClick={() => sendConversationStarter(text)} |
| className="relative flex w-40 cursor-pointer flex-col gap-2 rounded-2xl border border-border-medium px-3 pb-4 pt-3 text-start align-top text-[15px] shadow-[0_0_2px_0_rgba(0,0,0,0.05),0_4px_6px_0_rgba(0,0,0,0.02)] transition-colors duration-300 ease-in-out fade-in hover:bg-surface-tertiary" |
| > |
| <p className="break-word line-clamp-3 overflow-hidden text-balance break-all text-text-secondary"> |
| {text} |
| </p> |
| </button> |
| ))} |
| </div> |
| ); |
| }; |
|
|
| export default ConversationStarters; |
|
|