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.

llm-params-panel.tsx 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import React, { useMemo } from 'react'
  2. import useSWR from 'swr'
  3. import { useTranslation } from 'react-i18next'
  4. import PresetsParameter from '@/app/components/header/account-setting/model-provider-page/model-parameter-modal/presets-parameter'
  5. import ParameterItem from '@/app/components/header/account-setting/model-provider-page/model-parameter-modal/parameter-item'
  6. import Loading from '@/app/components/base/loading'
  7. import type {
  8. FormValue,
  9. ModelParameterRule,
  10. } from '@/app/components/header/account-setting/model-provider-page/declarations'
  11. import type { ParameterValue } from '@/app/components/header/account-setting/model-provider-page/model-parameter-modal/parameter-item'
  12. import { fetchModelParameterRules } from '@/service/common'
  13. import { PROVIDER_WITH_PRESET_TONE, STOP_PARAMETER_RULE, TONE_LIST } from '@/config'
  14. import cn from '@/utils/classnames'
  15. type Props = {
  16. isAdvancedMode: boolean
  17. provider: string
  18. modelId: string
  19. completionParams: FormValue
  20. onCompletionParamsChange: (newParams: FormValue) => void
  21. }
  22. const LLMParamsPanel = ({
  23. isAdvancedMode,
  24. provider,
  25. modelId,
  26. completionParams,
  27. onCompletionParamsChange,
  28. }: Props) => {
  29. const { t } = useTranslation()
  30. const { data: parameterRulesData, isLoading } = useSWR(
  31. (provider && modelId)
  32. ? `/workspaces/current/model-providers/${provider}/models/parameter-rules?model=${modelId}`
  33. : null, fetchModelParameterRules,
  34. )
  35. const parameterRules: ModelParameterRule[] = useMemo(() => {
  36. return parameterRulesData?.data || []
  37. }, [parameterRulesData])
  38. const handleSelectPresetParameter = (toneId: number) => {
  39. const tone = TONE_LIST.find(tone => tone.id === toneId)
  40. if (tone) {
  41. onCompletionParamsChange({
  42. ...completionParams,
  43. ...tone.config,
  44. })
  45. }
  46. }
  47. const handleParamChange = (key: string, value: ParameterValue) => {
  48. onCompletionParamsChange({
  49. ...completionParams,
  50. [key]: value,
  51. })
  52. }
  53. const handleSwitch = (key: string, value: boolean, assignValue: ParameterValue) => {
  54. if (!value) {
  55. const newCompletionParams = { ...completionParams }
  56. delete newCompletionParams[key]
  57. onCompletionParamsChange(newCompletionParams)
  58. }
  59. if (value) {
  60. onCompletionParamsChange({
  61. ...completionParams,
  62. [key]: assignValue,
  63. })
  64. }
  65. }
  66. if (isLoading) {
  67. return (
  68. <div className='mt-5'><Loading /></div>
  69. )
  70. }
  71. return (
  72. <>
  73. <div className='mb-2 flex items-center justify-between'>
  74. <div className={cn('system-sm-semibold flex h-6 items-center text-text-secondary')}>{t('common.modelProvider.parameters')}</div>
  75. {
  76. PROVIDER_WITH_PRESET_TONE.includes(provider) && (
  77. <PresetsParameter onSelect={handleSelectPresetParameter} />
  78. )
  79. }
  80. </div>
  81. {!!parameterRules.length && (
  82. [
  83. ...parameterRules,
  84. ...(isAdvancedMode ? [STOP_PARAMETER_RULE] : []),
  85. ].map(parameter => (
  86. <ParameterItem
  87. key={`${modelId}-${parameter.name}`}
  88. parameterRule={parameter}
  89. value={completionParams?.[parameter.name]}
  90. onChange={v => handleParamChange(parameter.name, v)}
  91. onSwitch={(checked, assignValue) => handleSwitch(parameter.name, checked, assignValue)}
  92. isInWorkflow
  93. />
  94. )))}
  95. </>
  96. )
  97. }
  98. export default LLMParamsPanel