model-bar.tsx 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import Tooltip from '@/app/components/base/tooltip'
  2. import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
  3. import { useModelList } from '@/app/components/header/account-setting/model-provider-page/hooks'
  4. import ModelSelector from '@/app/components/header/account-setting/model-provider-page/model-selector'
  5. import Indicator from '@/app/components/header/indicator'
  6. import { type FC, useMemo } from 'react'
  7. import { useTranslation } from 'react-i18next'
  8. export type ModelBarProps = {
  9. provider: string
  10. model: string
  11. } | {}
  12. const useAllModel = () => {
  13. const { data: textGeneration } = useModelList(ModelTypeEnum.textGeneration)
  14. const { data: moderation } = useModelList(ModelTypeEnum.moderation)
  15. const { data: rerank } = useModelList(ModelTypeEnum.rerank)
  16. const { data: speech2text } = useModelList(ModelTypeEnum.speech2text)
  17. const { data: textEmbedding } = useModelList(ModelTypeEnum.textEmbedding)
  18. const { data: tts } = useModelList(ModelTypeEnum.tts)
  19. const models = useMemo(() => {
  20. return textGeneration
  21. .concat(moderation)
  22. .concat(rerank)
  23. .concat(speech2text)
  24. .concat(textEmbedding)
  25. .concat(tts)
  26. }, [textGeneration, moderation, rerank, speech2text, textEmbedding, tts])
  27. if (!textGeneration || !moderation || !rerank || !speech2text || !textEmbedding || !tts)
  28. return undefined
  29. return models
  30. }
  31. export const ModelBar: FC<ModelBarProps> = (props) => {
  32. const { t } = useTranslation()
  33. const modelList = useAllModel()
  34. if (!('provider' in props)) {
  35. return <Tooltip
  36. popupContent={t('workflow.nodes.agent.modelNotSelected')}
  37. triggerMethod='hover'
  38. >
  39. <div className='relative'>
  40. <ModelSelector
  41. modelList={[]}
  42. triggerClassName='bg-workflow-block-parma-bg !h-6 !rounded-md'
  43. defaultModel={undefined}
  44. showDeprecatedWarnIcon={false}
  45. readonly
  46. deprecatedClassName='opacity-50'
  47. />
  48. <Indicator color={'red'} className='absolute -right-0.5 -top-0.5' />
  49. </div>
  50. </Tooltip>
  51. }
  52. const modelInstalled = modelList?.some(
  53. provider => provider.provider === props.provider && provider.models.some(model => model.model === props.model))
  54. const showWarn = modelList && !modelInstalled
  55. return modelList && <Tooltip
  56. popupContent={t('workflow.nodes.agent.modelNotInstallTooltip')}
  57. triggerMethod='hover'
  58. disabled={!modelList || modelInstalled}
  59. >
  60. <div className='relative'>
  61. <ModelSelector
  62. modelList={modelList}
  63. triggerClassName='bg-workflow-block-parma-bg !h-6 !rounded-md'
  64. defaultModel={props}
  65. showDeprecatedWarnIcon={false}
  66. readonly
  67. deprecatedClassName='opacity-50'
  68. />
  69. {showWarn && <Indicator color={'red'} className='absolute -right-0.5 -top-0.5' />}
  70. </div>
  71. </Tooltip>
  72. }