You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

dynamic-prompt.tsx 2.7KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import { PromptEditor } from '@/components/prompt-editor';
  2. import { BlockButton, Button } from '@/components/ui/button';
  3. import {
  4. FormControl,
  5. FormField,
  6. FormItem,
  7. FormLabel,
  8. FormMessage,
  9. } from '@/components/ui/form';
  10. import { RAGFlowSelect } from '@/components/ui/select';
  11. import { X } from 'lucide-react';
  12. import { memo } from 'react';
  13. import { useFieldArray, useFormContext } from 'react-hook-form';
  14. import { useTranslation } from 'react-i18next';
  15. export enum PromptRole {
  16. User = 'user',
  17. Assistant = 'assistant',
  18. }
  19. const options = [
  20. { label: 'User', value: PromptRole.User },
  21. { label: 'Assistant', value: PromptRole.Assistant },
  22. ];
  23. const DynamicPrompt = () => {
  24. const { t } = useTranslation();
  25. const form = useFormContext();
  26. const name = 'prompts';
  27. const { fields, append, remove } = useFieldArray({
  28. name: name,
  29. control: form.control,
  30. });
  31. return (
  32. <FormItem>
  33. <FormLabel tooltip={t('flow.msgTip')}>{t('flow.msg')}</FormLabel>
  34. <div className="space-y-4">
  35. {fields.map((field, index) => (
  36. <div key={field.id} className="flex">
  37. <div className="space-y-2 flex-1">
  38. <FormField
  39. control={form.control}
  40. name={`${name}.${index}.role`}
  41. render={({ field }) => (
  42. <FormItem className="w-1/3">
  43. <FormLabel />
  44. <FormControl>
  45. <RAGFlowSelect
  46. {...field}
  47. options={options}
  48. ></RAGFlowSelect>
  49. </FormControl>
  50. <FormMessage />
  51. </FormItem>
  52. )}
  53. />
  54. <FormField
  55. control={form.control}
  56. name={`${name}.${index}.content`}
  57. render={({ field }) => (
  58. <FormItem className="flex-1">
  59. <FormControl>
  60. <section>
  61. <PromptEditor
  62. {...field}
  63. showToolbar={false}
  64. ></PromptEditor>
  65. </section>
  66. </FormControl>
  67. </FormItem>
  68. )}
  69. />
  70. </div>
  71. <Button
  72. type="button"
  73. variant={'ghost'}
  74. onClick={() => remove(index)}
  75. >
  76. <X />
  77. </Button>
  78. </div>
  79. ))}
  80. </div>
  81. <FormMessage />
  82. <BlockButton
  83. onClick={() => append({ content: '', role: PromptRole.User })}
  84. >
  85. Add
  86. </BlockButton>
  87. </FormItem>
  88. );
  89. };
  90. export default memo(DynamicPrompt);