| import React, { useMemo } from 'react'; | |
| import { Variable } from 'lucide-react'; | |
| import ReactMarkdown from 'react-markdown'; | |
| import { Separator } from '@librechat/client'; | |
| import { specialVariables } from 'librechat-data-provider'; | |
| import { cn, extractUniqueVariables } from '~/utils'; | |
| import { CodeVariableGfm } from './Markdown'; | |
| import { useLocalize } from '~/hooks'; | |
| const specialVariableClasses = | |
| 'bg-amber-100 text-yellow-800 border-yellow-600 dark:border-yellow-500/50 dark:bg-transparent dark:text-yellow-500/90'; | |
| const components: { | |
| [nodeType: string]: React.ElementType; | |
| } = { code: CodeVariableGfm }; | |
| const PromptVariables = ({ | |
| promptText, | |
| showInfo = true, | |
| }: { | |
| promptText: string; | |
| showInfo?: boolean; | |
| }) => { | |
| const localize = useLocalize(); | |
| const variables = useMemo(() => { | |
| return extractUniqueVariables(promptText || ''); | |
| }, [promptText]); | |
| return ( | |
| <div className="rounded-xl border border-border-light bg-transparent p-4 shadow-md"> | |
| <h3 className="flex items-center gap-2 py-2 text-lg font-semibold text-text-primary"> | |
| <Variable className="icon-sm" aria-hidden="true" /> | |
| {localize('com_ui_variables')} | |
| </h3> | |
| <div className="flex flex-col space-y-4"> | |
| {variables.length ? ( | |
| <div className="flex flex-wrap gap-2"> | |
| {variables.map((variable, index) => ( | |
| <span | |
| className={cn( | |
| 'rounded-full border border-border-light px-3 py-1 text-text-primary', | |
| specialVariables[variable.toLowerCase()] != null ? specialVariableClasses : '', | |
| )} | |
| key={index} | |
| > | |
| {specialVariables[variable.toLowerCase()] != null | |
| ? variable.toLowerCase() | |
| : variable} | |
| </span> | |
| ))} | |
| </div> | |
| ) : ( | |
| <div className="text-sm text-text-secondary"> | |
| <ReactMarkdown components={components} className="markdown prose dark:prose-invert"> | |
| {localize('com_ui_variables_info')} | |
| </ReactMarkdown> | |
| </div> | |
| )} | |
| <Separator className="my-3 text-text-primary" /> | |
| {showInfo && ( | |
| <div className="space-y-4"> | |
| <div> | |
| <span className="text-sm font-medium text-text-primary"> | |
| {localize('com_ui_special_variables')} | |
| </span> | |
| <span className="text-sm text-text-secondary"> | |
| <ReactMarkdown components={components} className="markdown prose dark:prose-invert"> | |
| {localize('com_ui_special_variables_more_info')} | |
| </ReactMarkdown> | |
| </span> | |
| </div> | |
| <div> | |
| <span className="text-sm font-medium text-text-primary"> | |
| {localize('com_ui_dropdown_variables')} | |
| </span> | |
| <span className="text-sm text-text-secondary"> | |
| <ReactMarkdown components={components} className="markdown prose dark:prose-invert"> | |
| {localize('com_ui_dropdown_variables_info')} | |
| </ReactMarkdown> | |
| </span> | |
| </div> | |
| </div> | |
| )} | |
| </div> | |
| </div> | |
| ); | |
| }; | |
| export default PromptVariables; | |