llm-params-panel.tsx 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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 { TONE_LIST } from '@/config'
  14. import cn from '@/utils/classnames'
  15. const PROVIDER_WITH_PRESET_TONE = ['langgenius/openai/openai', 'langgenius/azure_openai/azure_openai']
  16. const stopParameterRule: ModelParameterRule = {
  17. default: [],
  18. help: {
  19. en_US: 'Up to four sequences where the API will stop generating further tokens. The returned text will not contain the stop sequence.',
  20. zh_Hans: '最多四个序列,API 将停止生成更多的 token。返回的文本将不包含停止序列。',
  21. },
  22. label: {
  23. en_US: 'Stop sequences',
  24. zh_Hans: '停止序列',
  25. },
  26. name: 'stop',
  27. required: false,
  28. type: 'tag',
  29. tagPlaceholder: {
  30. en_US: 'Enter sequence and press Tab',
  31. zh_Hans: '输入序列并按 Tab 键',
  32. },
  33. }
  34. type Props = {
  35. isAdvancedMode: boolean
  36. provider: string
  37. modelId: string
  38. completionParams: FormValue
  39. onCompletionParamsChange: (newParams: FormValue) => void
  40. }
  41. const LLMParamsPanel = ({
  42. isAdvancedMode,
  43. provider,
  44. modelId,
  45. completionParams,
  46. onCompletionParamsChange,
  47. }: Props) => {
  48. const { t } = useTranslation()
  49. const { data: parameterRulesData, isLoading } = useSWR(
  50. (provider && modelId)
  51. ? `/workspaces/current/model-providers/${provider}/models/parameter-rules?model=${modelId}`
  52. : null, fetchModelParameterRules,
  53. )
  54. const parameterRules: ModelParameterRule[] = useMemo(() => {
  55. return parameterRulesData?.data || []
  56. }, [parameterRulesData])
  57. const handleSelectPresetParameter = (toneId: number) => {
  58. const tone = TONE_LIST.find(tone => tone.id === toneId)
  59. if (tone) {
  60. onCompletionParamsChange({
  61. ...completionParams,
  62. ...tone.config,
  63. })
  64. }
  65. }
  66. const handleParamChange = (key: string, value: ParameterValue) => {
  67. onCompletionParamsChange({
  68. ...completionParams,
  69. [key]: value,
  70. })
  71. }
  72. const handleSwitch = (key: string, value: boolean, assignValue: ParameterValue) => {
  73. if (!value) {
  74. const newCompletionParams = { ...completionParams }
  75. delete newCompletionParams[key]
  76. onCompletionParamsChange(newCompletionParams)
  77. }
  78. if (value) {
  79. onCompletionParamsChange({
  80. ...completionParams,
  81. [key]: assignValue,
  82. })
  83. }
  84. }
  85. if (isLoading) {
  86. return (
  87. <div className='mt-5'><Loading /></div>
  88. )
  89. }
  90. return (
  91. <>
  92. <div className='flex items-center justify-between mb-2'>
  93. <div className={cn('h-6 flex items-center text-text-secondary system-sm-semibold')}>{t('common.modelProvider.parameters')}</div>
  94. {
  95. PROVIDER_WITH_PRESET_TONE.includes(provider) && (
  96. <PresetsParameter onSelect={handleSelectPresetParameter} />
  97. )
  98. }
  99. </div>
  100. {!!parameterRules.length && (
  101. [
  102. ...parameterRules,
  103. ...(isAdvancedMode ? [stopParameterRule] : []),
  104. ].map(parameter => (
  105. <ParameterItem
  106. key={`${modelId}-${parameter.name}`}
  107. parameterRule={parameter}
  108. value={completionParams?.[parameter.name]}
  109. onChange={v => handleParamChange(parameter.name, v)}
  110. onSwitch={(checked, assignValue) => handleSwitch(parameter.name, checked, assignValue)}
  111. isInWorkflow
  112. />
  113. )))}
  114. </>
  115. )
  116. }
  117. export default LLMParamsPanel