use-config-vision.ts 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import produce from 'immer'
  2. import { useCallback } from 'react'
  3. import { useIsChatMode } from './use-workflow'
  4. import type { ModelConfig, VisionSetting } from '@/app/components/workflow/types'
  5. import { useTextGenerationCurrentProviderAndModelAndModelList } from '@/app/components/header/account-setting/model-provider-page/hooks'
  6. import {
  7. ModelFeatureEnum,
  8. } from '@/app/components/header/account-setting/model-provider-page/declarations'
  9. import { Resolution } from '@/types/app'
  10. type Payload = {
  11. enabled: boolean
  12. configs?: VisionSetting
  13. }
  14. type Params = {
  15. payload: Payload
  16. onChange: (payload: Payload) => void
  17. }
  18. const useConfigVision = (model: ModelConfig, {
  19. payload = {
  20. enabled: false,
  21. },
  22. onChange,
  23. }: Params) => {
  24. const {
  25. currentModel: currModel,
  26. } = useTextGenerationCurrentProviderAndModelAndModelList(
  27. {
  28. provider: model.provider,
  29. model: model.name,
  30. },
  31. )
  32. const isChatMode = useIsChatMode()
  33. const getIsVisionModel = useCallback(() => {
  34. return !!currModel?.features?.includes(ModelFeatureEnum.vision)
  35. }, [currModel])
  36. const isVisionModel = getIsVisionModel()
  37. const handleVisionResolutionEnabledChange = useCallback((enabled: boolean) => {
  38. const newPayload = produce(payload, (draft) => {
  39. draft.enabled = enabled
  40. if (enabled && isChatMode) {
  41. draft.configs = {
  42. detail: Resolution.high,
  43. variable_selector: ['sys', 'files'],
  44. }
  45. }
  46. })
  47. onChange(newPayload)
  48. }, [isChatMode, onChange, payload])
  49. const handleVisionResolutionChange = useCallback((config: VisionSetting) => {
  50. const newPayload = produce(payload, (draft) => {
  51. draft.configs = config
  52. })
  53. onChange(newPayload)
  54. }, [onChange, payload])
  55. const handleModelChanged = useCallback(() => {
  56. const isVisionModel = getIsVisionModel()
  57. if (!isVisionModel) {
  58. handleVisionResolutionEnabledChange(false)
  59. return
  60. }
  61. if (payload.enabled) {
  62. onChange({
  63. enabled: true,
  64. configs: {
  65. detail: Resolution.high,
  66. variable_selector: [],
  67. },
  68. })
  69. }
  70. }, [getIsVisionModel, handleVisionResolutionEnabledChange, onChange, payload.enabled])
  71. return {
  72. isVisionModel,
  73. handleVisionResolutionEnabledChange,
  74. handleVisionResolutionChange,
  75. handleModelChanged,
  76. }
  77. }
  78. export default useConfigVision