|
@@ -1,423 +0,0 @@
|
|
|
-'use client'
|
|
|
-import type { FC } from 'react'
|
|
|
-import React, { useEffect, useState } from 'react'
|
|
|
-import cn from 'classnames'
|
|
|
-import { useTranslation } from 'react-i18next'
|
|
|
-import { useBoolean, useClickAway, useGetState } from 'ahooks'
|
|
|
-import { InformationCircleIcon } from '@heroicons/react/24/outline'
|
|
|
-import produce from 'immer'
|
|
|
-import ParamItem from './param-item'
|
|
|
-import { SlidersH } from '@/app/components/base/icons/src/vender/line/mediaAndDevices'
|
|
|
-import Radio from '@/app/components/base/radio'
|
|
|
-import Panel from '@/app/components/base/panel'
|
|
|
-import type { CompletionParams } from '@/models/debug'
|
|
|
-import { TONE_LIST } from '@/config'
|
|
|
-import Toast from '@/app/components/base/toast'
|
|
|
-import { AlertTriangle } from '@/app/components/base/icons/src/vender/solid/alertsAndFeedback'
|
|
|
-import { formatNumber } from '@/utils/format'
|
|
|
-import { Brush01 } from '@/app/components/base/icons/src/vender/solid/editor'
|
|
|
-import { Scales02 } from '@/app/components/base/icons/src/vender/solid/FinanceAndECommerce'
|
|
|
-import { Target04 } from '@/app/components/base/icons/src/vender/solid/general'
|
|
|
-import { Sliders02 } from '@/app/components/base/icons/src/vender/solid/mediaAndDevices'
|
|
|
-import { fetchModelParams } from '@/service/debug'
|
|
|
-import Loading from '@/app/components/base/loading'
|
|
|
-import useBreakpoints, { MediaType } from '@/hooks/use-breakpoints'
|
|
|
-import type { ModelModeType } from '@/types/app'
|
|
|
-import ModelIcon from '@/app/components/header/account-setting/model-provider-page/model-icon'
|
|
|
-import ModelName from '@/app/components/header/account-setting/model-provider-page/model-name'
|
|
|
-import ModelSelector from '@/app/components/header/account-setting/model-provider-page/model-selector'
|
|
|
-import { useTextGenerationCurrentProviderAndModelAndModelList } from '@/app/components/header/account-setting/model-provider-page/hooks'
|
|
|
-
|
|
|
-export type IConfigModelProps = {
|
|
|
- isAdvancedMode: boolean
|
|
|
- mode: string
|
|
|
- modelId: string
|
|
|
- provider: string
|
|
|
- setModel: (model: { id: string; provider: string; mode: ModelModeType; features: string[] }) => void
|
|
|
- completionParams: CompletionParams
|
|
|
- onCompletionParamsChange: (newParams: CompletionParams) => void
|
|
|
- disabled: boolean
|
|
|
-}
|
|
|
-
|
|
|
-const ConfigModel: FC<IConfigModelProps> = ({
|
|
|
- isAdvancedMode,
|
|
|
- modelId,
|
|
|
- provider,
|
|
|
- setModel,
|
|
|
- completionParams,
|
|
|
- onCompletionParamsChange,
|
|
|
- disabled,
|
|
|
-}) => {
|
|
|
- const { t } = useTranslation()
|
|
|
- const [isShowConfig, { setFalse: hideConfig, toggle: toogleShowConfig }] = useBoolean(false)
|
|
|
- const [maxTokenSettingTipVisible, setMaxTokenSettingTipVisible] = useState(false)
|
|
|
- const configContentRef = React.useRef(null)
|
|
|
- const {
|
|
|
- currentProvider,
|
|
|
- currentModel: currModel,
|
|
|
- textGenerationModelList,
|
|
|
- } = useTextGenerationCurrentProviderAndModelAndModelList(
|
|
|
- { provider, model: modelId },
|
|
|
- )
|
|
|
-
|
|
|
- const media = useBreakpoints()
|
|
|
- const isMobile = media === MediaType.mobile
|
|
|
-
|
|
|
- // Cache loaded model param
|
|
|
- const [allParams, setAllParams, getAllParams] = useGetState<Record<string, Record<string, any>>>({})
|
|
|
- const currParams = allParams[provider]?.[modelId]
|
|
|
- const hasEnableParams = currParams && Object.keys(currParams).some(key => currParams[key].enabled)
|
|
|
- const allSupportParams = ['temperature', 'top_p', 'presence_penalty', 'frequency_penalty', 'max_tokens']
|
|
|
- const currSupportParams = currParams ? allSupportParams.filter(key => currParams[key].enabled) : allSupportParams
|
|
|
- if (isAdvancedMode)
|
|
|
- currSupportParams.push('stop')
|
|
|
-
|
|
|
- useEffect(() => {
|
|
|
- (async () => {
|
|
|
- if (!allParams[provider]?.[modelId]) {
|
|
|
- const res = await fetchModelParams(provider, modelId)
|
|
|
- const newAllParams = produce(allParams, (draft) => {
|
|
|
- if (!draft[provider])
|
|
|
- draft[provider] = {}
|
|
|
-
|
|
|
- draft[provider][modelId] = res
|
|
|
- })
|
|
|
- setAllParams(newAllParams)
|
|
|
- }
|
|
|
- })()
|
|
|
- }, [provider, modelId, allParams, setAllParams])
|
|
|
-
|
|
|
- useClickAway(() => {
|
|
|
- hideConfig()
|
|
|
- }, configContentRef)
|
|
|
-
|
|
|
- const selectedModel = { name: modelId } // options.find(option => option.id === modelId)
|
|
|
-
|
|
|
- const ensureModelParamLoaded = (provider: string, modelId: string) => {
|
|
|
- return new Promise<void>((resolve) => {
|
|
|
- if (getAllParams()[provider]?.[modelId]) {
|
|
|
- resolve()
|
|
|
- return
|
|
|
- }
|
|
|
- const runId = setInterval(() => {
|
|
|
- if (getAllParams()[provider]?.[modelId]) {
|
|
|
- resolve()
|
|
|
- clearInterval(runId)
|
|
|
- }
|
|
|
- }, 500)
|
|
|
- })
|
|
|
- }
|
|
|
-
|
|
|
- const transformValue = (value: number, fromRange: [number, number], toRange: [number, number]): number => {
|
|
|
- const [fromStart = 0, fromEnd] = fromRange
|
|
|
- const [toStart = 0, toEnd] = toRange
|
|
|
-
|
|
|
- // The following three if is to avoid precision loss
|
|
|
- if (fromStart === toStart && fromEnd === toEnd)
|
|
|
- return value
|
|
|
-
|
|
|
- if (value <= fromStart)
|
|
|
- return toStart
|
|
|
-
|
|
|
- if (value >= fromEnd)
|
|
|
- return toEnd
|
|
|
-
|
|
|
- const fromLength = fromEnd - fromStart
|
|
|
- const toLength = toEnd - toStart
|
|
|
-
|
|
|
- let adjustedValue = (value - fromStart) * (toLength / fromLength) + toStart
|
|
|
- adjustedValue = parseFloat(adjustedValue.toFixed(2))
|
|
|
- return adjustedValue
|
|
|
- }
|
|
|
-
|
|
|
- const handleSelectModel = ({ id, provider: nextProvider, mode, features }: { id: string; provider: string; mode: ModelModeType; features: string[] }) => {
|
|
|
- return async () => {
|
|
|
- const prevParamsRule = getAllParams()[provider]?.[modelId]
|
|
|
-
|
|
|
- setModel({
|
|
|
- id,
|
|
|
- provider: nextProvider || 'openai',
|
|
|
- mode,
|
|
|
- features,
|
|
|
- })
|
|
|
-
|
|
|
- await ensureModelParamLoaded(nextProvider, id)
|
|
|
-
|
|
|
- const nextParamsRule = getAllParams()[nextProvider]?.[id]
|
|
|
- // debugger
|
|
|
- const nextSelectModelMaxToken = nextParamsRule.max_tokens.max
|
|
|
- const newConCompletionParams = produce(completionParams, (draft: any) => {
|
|
|
- if (nextParamsRule.max_tokens.enabled) {
|
|
|
- if (completionParams.max_tokens > nextSelectModelMaxToken) {
|
|
|
- Toast.notify({
|
|
|
- type: 'warning',
|
|
|
- message: t('common.model.params.setToCurrentModelMaxTokenTip', { maxToken: formatNumber(nextSelectModelMaxToken) }),
|
|
|
- })
|
|
|
- draft.max_tokens = parseFloat((nextSelectModelMaxToken * 0.8).toFixed(2))
|
|
|
- }
|
|
|
- // prev don't have max token
|
|
|
- if (!completionParams.max_tokens)
|
|
|
- draft.max_tokens = nextParamsRule.max_tokens.default
|
|
|
- }
|
|
|
- else {
|
|
|
- delete draft.max_tokens
|
|
|
- }
|
|
|
-
|
|
|
- allSupportParams.forEach((key) => {
|
|
|
- if (key === 'max_tokens')
|
|
|
- return
|
|
|
-
|
|
|
- if (!nextParamsRule[key].enabled) {
|
|
|
- delete draft[key]
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- if (draft[key] === undefined) {
|
|
|
- draft[key] = nextParamsRule[key].default || 0
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- if (!prevParamsRule[key].enabled) {
|
|
|
- draft[key] = nextParamsRule[key].default || 0
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- draft[key] = transformValue(
|
|
|
- draft[key],
|
|
|
- [prevParamsRule[key].min, prevParamsRule[key].max],
|
|
|
- [nextParamsRule[key].min, nextParamsRule[key].max],
|
|
|
- )
|
|
|
- })
|
|
|
- })
|
|
|
- onCompletionParamsChange(newConCompletionParams)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // only openai support this
|
|
|
- function matchToneId(completionParams: CompletionParams): number {
|
|
|
- const remvoedCustomeTone = TONE_LIST.slice(0, -1)
|
|
|
- const CUSTOM_TONE_ID = 4
|
|
|
- const tone = remvoedCustomeTone.find((tone) => {
|
|
|
- return tone.config?.temperature === completionParams.temperature
|
|
|
- && tone.config?.top_p === completionParams.top_p
|
|
|
- && tone.config?.presence_penalty === completionParams.presence_penalty
|
|
|
- && tone.config?.frequency_penalty === completionParams.frequency_penalty
|
|
|
- })
|
|
|
- return tone ? tone.id : CUSTOM_TONE_ID
|
|
|
- }
|
|
|
-
|
|
|
- // tone is a preset of completionParams.
|
|
|
- const [toneId, setToneId] = React.useState(matchToneId(completionParams)) // default is Balanced
|
|
|
- const toneTabBgClassName = ({
|
|
|
- 1: 'bg-[#F5F8FF]',
|
|
|
- 2: 'bg-[#F4F3FF]',
|
|
|
- 3: 'bg-[#F6FEFC]',
|
|
|
- })[toneId] || ''
|
|
|
- // set completionParams by toneId
|
|
|
- const handleToneChange = (id: number) => {
|
|
|
- if (id === 4)
|
|
|
- return // custom tone
|
|
|
- const tone = TONE_LIST.find(tone => tone.id === id)
|
|
|
- if (tone) {
|
|
|
- setToneId(id)
|
|
|
- onCompletionParamsChange({
|
|
|
- ...tone.config,
|
|
|
- max_tokens: completionParams.max_tokens,
|
|
|
- } as CompletionParams)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- useEffect(() => {
|
|
|
- setToneId(matchToneId(completionParams))
|
|
|
- }, [completionParams])
|
|
|
-
|
|
|
- const handleParamChange = (key: string, value: number | string[]) => {
|
|
|
- if (value === undefined)
|
|
|
- return
|
|
|
- if ((completionParams as any)[key] === value)
|
|
|
- return
|
|
|
-
|
|
|
- if (key === 'stop') {
|
|
|
- onCompletionParamsChange({
|
|
|
- ...completionParams,
|
|
|
- [key]: value as string[],
|
|
|
- })
|
|
|
- }
|
|
|
- else {
|
|
|
- const currParamsRule = getAllParams()[provider]?.[modelId]
|
|
|
- let notOutRangeValue = parseFloat((value as number).toFixed(2))
|
|
|
- notOutRangeValue = Math.max(currParamsRule[key].min, notOutRangeValue)
|
|
|
- notOutRangeValue = Math.min(currParamsRule[key].max, notOutRangeValue)
|
|
|
- onCompletionParamsChange({
|
|
|
- ...completionParams,
|
|
|
- [key]: notOutRangeValue,
|
|
|
- })
|
|
|
- }
|
|
|
- }
|
|
|
- const ableStyle = 'bg-indigo-25 border-[#2A87F5] cursor-pointer'
|
|
|
- const diabledStyle = 'bg-[#FFFCF5] border-[#F79009]'
|
|
|
-
|
|
|
- const getToneIcon = (toneId: number) => {
|
|
|
- const className = 'w-[14px] h-[14px]'
|
|
|
- const res = ({
|
|
|
- 1: <Brush01 className={className} />,
|
|
|
- 2: <Scales02 className={className} />,
|
|
|
- 3: <Target04 className={className} />,
|
|
|
- 4: <Sliders02 className={className} />,
|
|
|
- })[toneId]
|
|
|
- return res
|
|
|
- }
|
|
|
- useEffect(() => {
|
|
|
- if (!currParams)
|
|
|
- return
|
|
|
-
|
|
|
- const max = currParams.max_tokens.max
|
|
|
- const isSupportMaxToken = currParams.max_tokens.enabled
|
|
|
- if (isSupportMaxToken && currentProvider?.provider !== 'anthropic' && completionParams.max_tokens > max * 2 / 3)
|
|
|
- setMaxTokenSettingTipVisible(true)
|
|
|
- else
|
|
|
- setMaxTokenSettingTipVisible(false)
|
|
|
- }, [currParams, completionParams.max_tokens, setMaxTokenSettingTipVisible, currentProvider])
|
|
|
- return (
|
|
|
- <div className='relative' ref={configContentRef}>
|
|
|
- <div
|
|
|
- className={cn('flex items-center border h-8 px-2 space-x-2 rounded-lg', disabled ? diabledStyle : ableStyle)}
|
|
|
- onClick={() => !disabled && toogleShowConfig()}
|
|
|
- >
|
|
|
- {
|
|
|
- currentProvider && (
|
|
|
- <ModelIcon
|
|
|
- className='!w-5 !h-5'
|
|
|
- provider={currentProvider}
|
|
|
- />
|
|
|
- )
|
|
|
- }
|
|
|
- {
|
|
|
- currModel && (
|
|
|
- <ModelName
|
|
|
- className='text-gray-900'
|
|
|
- modelItem={currModel}
|
|
|
- showMode={isAdvancedMode}
|
|
|
- />
|
|
|
- )
|
|
|
- }
|
|
|
- {disabled ? <InformationCircleIcon className='w-4 h-4 text-[#F79009]' /> : <SlidersH className='w-4 h-4 text-indigo-600' />}
|
|
|
- </div>
|
|
|
- {isShowConfig && (
|
|
|
- <Panel
|
|
|
- className='absolute z-20 top-8 left-0 sm:left-[unset] sm:right-0 !w-fit sm:!w-[496px] bg-white !overflow-visible shadow-md'
|
|
|
- keepUnFold
|
|
|
- headerIcon={
|
|
|
- <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
|
- <path d="M8.26865 0.790031C8.09143 0.753584 7.90866 0.753584 7.73144 0.790031C7.52659 0.832162 7.3435 0.934713 7.19794 1.01624L7.15826 1.03841L6.17628 1.58395C5.85443 1.76276 5.73846 2.16863 5.91727 2.49049C6.09608 2.81234 6.50195 2.9283 6.82381 2.74949L7.80579 2.20395C7.90681 2.14782 7.95839 2.11946 7.99686 2.10091L8.00004 2.09938L8.00323 2.10091C8.0417 2.11946 8.09327 2.14782 8.1943 2.20395L9.17628 2.74949C9.49814 2.9283 9.90401 2.81234 10.0828 2.49048C10.2616 2.16863 10.1457 1.76276 9.82381 1.58395L8.84183 1.03841L8.80215 1.01624C8.65659 0.934713 8.4735 0.832162 8.26865 0.790031Z" fill="#1C64F2" />
|
|
|
- <path d="M12.8238 3.25062C12.5019 3.07181 12.0961 3.18777 11.9173 3.50963C11.7385 3.83148 11.8544 4.23735 12.1763 4.41616L12.6272 4.66668L12.1763 4.91719C11.8545 5.096 11.7385 5.50186 11.9173 5.82372C12.0961 6.14558 12.502 6.26154 12.8238 6.08273L13.3334 5.79966V6.33339C13.3334 6.70158 13.6319 7.00006 14 7.00006C14.3682 7.00006 14.6667 6.70158 14.6667 6.33339V5.29435L14.6668 5.24627C14.6673 5.12441 14.6678 4.98084 14.6452 4.83482C14.6869 4.67472 14.6696 4.49892 14.5829 4.34286C14.4904 4.1764 14.3371 4.06501 14.1662 4.02099C14.0496 3.93038 13.9239 3.86116 13.8173 3.8024L13.7752 3.77915L12.8238 3.25062Z" fill="#1C64F2" />
|
|
|
- <path d="M3.8238 4.41616C4.14566 4.23735 4.26162 3.83148 4.08281 3.50963C3.90401 3.18777 3.49814 3.07181 3.17628 3.25062L2.22493 3.77915L2.18284 3.8024C2.07615 3.86116 1.95045 3.9304 1.83382 4.02102C1.66295 4.06506 1.50977 4.17643 1.41731 4.34286C1.33065 4.49886 1.31323 4.67459 1.35493 4.83464C1.33229 4.98072 1.33281 5.12436 1.33326 5.24627L1.33338 5.29435V6.33339C1.33338 6.70158 1.63185 7.00006 2.00004 7.00006C2.36823 7.00006 2.66671 6.70158 2.66671 6.33339V5.79961L3.17632 6.08273C3.49817 6.26154 3.90404 6.14558 4.08285 5.82372C4.26166 5.50186 4.1457 5.096 3.82384 4.91719L3.3729 4.66666L3.8238 4.41616Z" fill="#1C64F2" />
|
|
|
- <path d="M2.66671 9.66672C2.66671 9.29853 2.36823 9.00006 2.00004 9.00006C1.63185 9.00006 1.33338 9.29853 1.33338 9.66672V10.7058L1.33326 10.7538C1.33262 10.9298 1.33181 11.1509 1.40069 11.3594C1.46024 11.5397 1.55759 11.7051 1.68622 11.8447C1.835 12.0061 2.02873 12.1128 2.18281 12.1977L2.22493 12.221L3.17628 12.7495C3.49814 12.9283 3.90401 12.8123 4.08281 12.4905C4.26162 12.1686 4.14566 11.7628 3.8238 11.584L2.87245 11.0554C2.76582 10.9962 2.71137 10.9656 2.67318 10.9413L2.66995 10.9392L2.66971 10.9354C2.66699 10.8902 2.66671 10.8277 2.66671 10.7058V9.66672Z" fill="#1C64F2" />
|
|
|
- <path d="M14.6667 9.66672C14.6667 9.29853 14.3682 9.00006 14 9.00006C13.6319 9.00006 13.3334 9.29853 13.3334 9.66672V10.7058C13.3334 10.8277 13.3331 10.8902 13.3304 10.9354L13.3301 10.9392L13.3269 10.9413C13.2887 10.9656 13.2343 10.9962 13.1276 11.0554L12.1763 11.584C11.8544 11.7628 11.7385 12.1686 11.9173 12.4905C12.0961 12.8123 12.5019 12.9283 12.8238 12.7495L13.7752 12.221L13.8172 12.1977C13.9713 12.1128 14.1651 12.0061 14.3139 11.8447C14.4425 11.7051 14.5398 11.5397 14.5994 11.3594C14.6683 11.1509 14.6675 10.9298 14.6668 10.7538L14.6667 10.7058V9.66672Z" fill="#1C64F2" />
|
|
|
- <path d="M6.82381 13.2506C6.50195 13.0718 6.09608 13.1878 5.91727 13.5096C5.73846 13.8315 5.85443 14.2374 6.17628 14.4162L7.15826 14.9617L7.19793 14.9839C7.29819 15.04 7.41625 15.1061 7.54696 15.1556C7.66589 15.2659 7.82512 15.3333 8.00008 15.3333C8.17507 15.3333 8.33431 15.2659 8.45324 15.1556C8.58391 15.1061 8.70193 15.04 8.80215 14.9839L8.84183 14.9617L9.82381 14.4162C10.1457 14.2374 10.2616 13.8315 10.0828 13.5096C9.90401 13.1878 9.49814 13.0718 9.17628 13.2506L8.66675 13.5337V13C8.66675 12.6318 8.36827 12.3333 8.00008 12.3333C7.63189 12.3333 7.33341 12.6318 7.33341 13V13.5337L6.82381 13.2506Z" fill="#1C64F2" />
|
|
|
- <path d="M6.82384 6.58385C6.50199 6.40505 6.09612 6.52101 5.91731 6.84286C5.7385 7.16472 5.85446 7.57059 6.17632 7.7494L7.33341 8.39223V9.66663C7.33341 10.0348 7.63189 10.3333 8.00008 10.3333C8.36827 10.3333 8.66675 10.0348 8.66675 9.66663V8.39223L9.82384 7.7494C10.1457 7.57059 10.2617 7.16472 10.0829 6.84286C9.90404 6.52101 9.49817 6.40505 9.17632 6.58385L8.00008 7.23732L6.82384 6.58385Z" fill="#1C64F2" />
|
|
|
- </svg>
|
|
|
- }
|
|
|
- title={t('appDebug.modelConfig.title')}
|
|
|
- >
|
|
|
- <div className='py-3 pl-10 pr-6 text-sm'>
|
|
|
- <div className="flex items-center justify-between my-5 h-9">
|
|
|
- <div>{t('appDebug.modelConfig.model')}</div>
|
|
|
- <ModelSelector
|
|
|
- defaultModel={{ model: modelId, provider }}
|
|
|
- modelList={textGenerationModelList}
|
|
|
- onSelect={({ provider, model }) => {
|
|
|
- const targetProvider = textGenerationModelList.find(modelItem => modelItem.provider === provider)
|
|
|
- const targetModelItem = targetProvider?.models.find(modelItem => modelItem.model === model)
|
|
|
- handleSelectModel({
|
|
|
- id: model,
|
|
|
- provider,
|
|
|
- mode: targetModelItem?.model_properties.mode as ModelModeType,
|
|
|
- features: targetModelItem?.features || [],
|
|
|
- })()
|
|
|
- }}
|
|
|
- />
|
|
|
- </div>
|
|
|
- {hasEnableParams && (
|
|
|
- <div className="border-b border-gray-100"></div>
|
|
|
- )}
|
|
|
-
|
|
|
- {/* Tone type */}
|
|
|
- {['openai', 'azure_openai'].includes(provider) && (
|
|
|
- <div className="mt-5 mb-4">
|
|
|
- <div className="mb-3 text-sm text-gray-900">{t('appDebug.modelConfig.setTone')}</div>
|
|
|
- <Radio.Group className={cn('!rounded-lg', toneTabBgClassName)} value={toneId} onChange={handleToneChange}>
|
|
|
- <>
|
|
|
- {TONE_LIST.slice(0, 3).map(tone => (
|
|
|
- <div className='grow flex items-center' key={tone.id}>
|
|
|
- <Radio
|
|
|
- value={tone.id}
|
|
|
- className={cn(tone.id === toneId && 'rounded-md border border-gray-200 shadow-md', '!mr-0 grow !px-1 sm:!px-2 !justify-center text-[13px] font-medium')}
|
|
|
- labelClassName={cn(tone.id === toneId
|
|
|
- ? ({
|
|
|
- 1: 'text-[#6938EF]',
|
|
|
- 2: 'text-[#444CE7]',
|
|
|
- 3: 'text-[#107569]',
|
|
|
- })[toneId]
|
|
|
- : 'text-[#667085]', 'flex items-center space-x-2')}
|
|
|
- >
|
|
|
- <>
|
|
|
- {getToneIcon(tone.id)}
|
|
|
- {!isMobile && <div>{t(`common.model.tone.${tone.name}`) as string}</div>}
|
|
|
- <div className=""></div>
|
|
|
- </>
|
|
|
- </Radio>
|
|
|
- {tone.id !== toneId && tone.id + 1 !== toneId && (<div className='h-5 border-r border-gray-200'></div>)}
|
|
|
- </div>
|
|
|
- ))}
|
|
|
- </>
|
|
|
- <Radio
|
|
|
- value={TONE_LIST[3].id}
|
|
|
- className={cn(toneId === 4 && 'rounded-md border border-gray-200 shadow-md', '!mr-0 grow !px-1 sm:!px-2 !justify-center text-[13px] font-medium')}
|
|
|
- labelClassName={cn('flex items-center space-x-2 ', toneId === 4 ? 'text-[#155EEF]' : 'text-[#667085]')}
|
|
|
- >
|
|
|
- <>
|
|
|
- {getToneIcon(TONE_LIST[3].id)}
|
|
|
- {!isMobile && <div>{t(`common.model.tone.${TONE_LIST[3].name}`) as string}</div>}
|
|
|
- </>
|
|
|
- </Radio>
|
|
|
- </Radio.Group>
|
|
|
- </div>
|
|
|
- )}
|
|
|
-
|
|
|
- {/* Params */}
|
|
|
- <div className={cn(hasEnableParams && 'mt-4', 'space-y-4', !allParams[provider]?.[modelId] && 'flex items-center min-h-[200px]')}>
|
|
|
- {(allParams[provider]?.[modelId])
|
|
|
- ? (
|
|
|
- currSupportParams.map(key => (<ParamItem
|
|
|
- key={key}
|
|
|
- id={key}
|
|
|
- name={t(`common.model.params.${key === 'stop' ? 'stop_sequences' : key}`)}
|
|
|
- tip={t(`common.model.params.${key === 'stop' ? 'stop_sequences' : key}Tip`)}
|
|
|
- {...currParams[key] as any}
|
|
|
- value={(completionParams as any)[key] as any}
|
|
|
- onChange={handleParamChange}
|
|
|
- inputType={key === 'stop' ? 'inputTag' : 'slider'}
|
|
|
- />))
|
|
|
- )
|
|
|
- : (
|
|
|
- <Loading type='area' />
|
|
|
- )}
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- {
|
|
|
- maxTokenSettingTipVisible && (
|
|
|
- <div className='flex py-2 pr-4 pl-5 rounded-bl-xl rounded-br-xl bg-[#FFFAEB] border-t border-[#FEF0C7]'>
|
|
|
- <AlertTriangle className='shrink-0 mr-2 mt-[3px] w-3 h-3 text-[#F79009]' />
|
|
|
- <div className='mr-2 text-xs font-medium text-gray-700'>{t('common.model.params.maxTokenSettingTip')}</div>
|
|
|
- </div>
|
|
|
- )
|
|
|
- }
|
|
|
- </Panel>
|
|
|
- )}
|
|
|
- </div>
|
|
|
-
|
|
|
- )
|
|
|
-}
|
|
|
-
|
|
|
-export default React.memo(ConfigModel)
|