debug-item.tsx 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. import type { CSSProperties, FC } from 'react'
  2. import { useTranslation } from 'react-i18next'
  3. import { memo } from 'react'
  4. import type { ModelAndParameter } from '../types'
  5. import ModelParameterTrigger from './model-parameter-trigger'
  6. import ChatItem from './chat-item'
  7. import TextGenerationItem from './text-generation-item'
  8. import { useDebugWithMultipleModelContext } from './context'
  9. import { useDebugConfigurationContext } from '@/context/debug-configuration'
  10. import Dropdown from '@/app/components/base/dropdown'
  11. import type { Item } from '@/app/components/base/dropdown'
  12. import { useProviderContext } from '@/context/provider-context'
  13. import { ModelStatusEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
  14. type DebugItemProps = {
  15. modelAndParameter: ModelAndParameter
  16. className?: string
  17. style?: CSSProperties
  18. }
  19. const DebugItem: FC<DebugItemProps> = ({
  20. modelAndParameter,
  21. className,
  22. style,
  23. }) => {
  24. const { t } = useTranslation()
  25. const { mode } = useDebugConfigurationContext()
  26. const {
  27. multipleModelConfigs,
  28. onMultipleModelConfigsChange,
  29. onDebugWithMultipleModelChange,
  30. } = useDebugWithMultipleModelContext()
  31. const { textGenerationModelList } = useProviderContext()
  32. const index = multipleModelConfigs.findIndex(v => v.id === modelAndParameter.id)
  33. const currentProvider = textGenerationModelList.find(item => item.provider === modelAndParameter.provider)
  34. const currentModel = currentProvider?.models.find(item => item.model === modelAndParameter.model)
  35. const handleSelect = (item: Item) => {
  36. if (item.value === 'duplicate') {
  37. if (multipleModelConfigs.length >= 4)
  38. return
  39. onMultipleModelConfigsChange(
  40. true,
  41. [
  42. ...multipleModelConfigs.slice(0, index + 1),
  43. {
  44. ...modelAndParameter,
  45. id: `${Date.now()}`,
  46. },
  47. ...multipleModelConfigs.slice(index + 1),
  48. ],
  49. )
  50. }
  51. if (item.value === 'debug-as-single-model')
  52. onDebugWithMultipleModelChange(modelAndParameter)
  53. if (item.value === 'remove') {
  54. onMultipleModelConfigsChange(
  55. true,
  56. multipleModelConfigs.filter(item => item.id !== modelAndParameter.id),
  57. )
  58. }
  59. }
  60. return (
  61. <div
  62. className={`flex flex-col min-w-[320px] rounded-xl bg-white border-[0.5px] border-black/5 ${className}`}
  63. style={style}
  64. >
  65. <div className='shrink-0 flex items-center justify-between h-10 px-3 border-b-[0.5px] border-b-black/5'>
  66. <div className='flex items-center justify-center w-6 h-5 font-medium italic text-gray-500'>
  67. #{index + 1}
  68. </div>
  69. <ModelParameterTrigger
  70. modelAndParameter={modelAndParameter}
  71. />
  72. <Dropdown
  73. onSelect={handleSelect}
  74. items={[
  75. ...(
  76. multipleModelConfigs.length <= 3
  77. ? [
  78. {
  79. value: 'duplicate',
  80. text: t('appDebug.duplicateModel'),
  81. },
  82. ]
  83. : []
  84. ),
  85. ...(
  86. (modelAndParameter.provider && modelAndParameter.model)
  87. ? [
  88. {
  89. value: 'debug-as-single-model',
  90. text: t('appDebug.debugAsSingleModel'),
  91. },
  92. ]
  93. : []
  94. ),
  95. ]}
  96. secondItems={
  97. multipleModelConfigs.length > 2
  98. ? [
  99. {
  100. value: 'remove',
  101. text: t('common.operation.remove') as string,
  102. },
  103. ]
  104. : undefined
  105. }
  106. />
  107. </div>
  108. <div style={{ height: 'calc(100% - 40px)' }}>
  109. {
  110. (mode === 'chat' || mode === 'agent-chat') && currentProvider && currentModel && currentModel.status === ModelStatusEnum.active && (
  111. <ChatItem modelAndParameter={modelAndParameter} />
  112. )
  113. }
  114. {
  115. mode === 'completion' && currentProvider && currentModel && currentModel.status === ModelStatusEnum.active && (
  116. <TextGenerationItem modelAndParameter={modelAndParameter}/>
  117. )
  118. }
  119. </div>
  120. </div>
  121. )
  122. }
  123. export default memo(DebugItem)