From 7ef8e904f0eb5d05bd6e8e87e16f5adc24569efc Mon Sep 17 00:00:00 2001 From: Kalo Chin Date: Fri, 20 Jun 2025 22:26:05 +0900 Subject: [PATCH] Refactor parameter merging to async utility function Replaces direct parameter rule fetching and merging logic with a new async utility function `fetchAndMergeValidCompletionParams` in both configuration and LLM panel components. This centralizes the logic for fetching model parameter rules and merging valid completion parameters, improving code reuse and maintainability. --- web/app/components/app/configuration/index.tsx | 11 ++++++----- web/app/components/workflow/nodes/llm/panel.tsx | 15 ++++++++++----- web/utils/completion-params.ts | 16 +++++++++++++--- 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/web/app/components/app/configuration/index.tsx b/web/app/components/app/configuration/index.tsx index 2d9e7b2851..db71c0f761 100644 --- a/web/app/components/app/configuration/index.tsx +++ b/web/app/components/app/configuration/index.tsx @@ -80,8 +80,7 @@ import { import PluginDependency from '@/app/components/workflow/plugin-dependency' import { supportFunctionCall } from '@/utils/tool-call' import { MittProvider } from '@/context/mitt-context' -import { mergeValidCompletionParams } from '@/utils/completion-params' -import { fetchModelParameterRules } from '@/service/common' +import { fetchAndMergeValidCompletionParams } from '@/utils/completion-params' import Toast from '@/app/components/base/toast' type PublishConfig = { @@ -459,9 +458,11 @@ const Configuration: FC = () => { // merge and keep only valid completion params for the new model try { - const url = `/workspaces/current/model-providers/${provider}/models/parameter-rules?model=${modelId}` - const { data: parameterRules } = await fetchModelParameterRules(url) - const { params: filtered, removedDetails } = mergeValidCompletionParams(completionParams, parameterRules ?? []) + const { params: filtered, removedDetails } = await fetchAndMergeValidCompletionParams( + provider, + modelId, + completionParams, + ) if (Object.keys(removedDetails).length) Toast.notify({ type: 'warning', message: `${t('common.modelProvider.parametersInvalidRemoved')}: ${Object.entries(removedDetails).map(([k, reason]) => `${k} (${reason})`).join(', ')}` }) setCompletionParams(filtered) diff --git a/web/app/components/workflow/nodes/llm/panel.tsx b/web/app/components/workflow/nodes/llm/panel.tsx index 17e7e5427b..8debcaec0e 100644 --- a/web/app/components/workflow/nodes/llm/panel.tsx +++ b/web/app/components/workflow/nodes/llm/panel.tsx @@ -23,8 +23,7 @@ import Editor from '@/app/components/workflow/nodes/_base/components/prompt/edit import StructureOutput from './components/structure-output' import Switch from '@/app/components/base/switch' import { RiAlertFill, RiQuestionLine } from '@remixicon/react' -import { mergeValidCompletionParams } from '@/utils/completion-params' -import { fetchModelParameterRules } from '@/service/common' +import { fetchAndMergeValidCompletionParams } from '@/utils/completion-params' import Toast from '@/app/components/base/toast' const i18nPrefix = 'workflow.nodes.llm' @@ -142,14 +141,20 @@ const Panel: FC> = ({ }) => { (async () => { try { - const url = `/workspaces/current/model-providers/${model.provider}/models/parameter-rules?model=${model.modelId}` - const { data: parameterRules } = await fetchModelParameterRules(url) - const { params: filtered, removedDetails } = mergeValidCompletionParams(inputs.model.completion_params, parameterRules ?? []) + const { params: filtered, removedDetails } = await fetchAndMergeValidCompletionParams( + model.provider, + model.modelId, + inputs.model.completion_params, + ) const keys = Object.keys(removedDetails) if (keys.length) Toast.notify({ type: 'warning', message: `${t('common.modelProvider.parametersInvalidRemoved')}: ${keys.map(k => `${k} (${removedDetails[k]})`).join(', ')}` }) handleCompletionParamsChange(filtered) } + catch (e) { + Toast.notify({ type: 'error', message: t('common.error') }) + handleCompletionParamsChange({}) + } finally { handleModelChanged(model) } diff --git a/web/utils/completion-params.ts b/web/utils/completion-params.ts index d6ccaa2bf2..ce7115b5fe 100644 --- a/web/utils/completion-params.ts +++ b/web/utils/completion-params.ts @@ -1,7 +1,5 @@ import type { FormValue, ModelParameterRule } from '@/app/components/header/account-setting/model-provider-page/declarations' -// Returns a new object that contains only the keys accepted by `rules` and whose -// values conform to the rule's basic validation (range/options). export const mergeValidCompletionParams = ( oldParams: FormValue | undefined, rules: ModelParameterRule[], @@ -70,10 +68,22 @@ export const mergeValidCompletionParams = ( return } default: { - nextParams[key] = value + removedDetails[key] = `unsupported rule type: ${(rule as any)?.type ?? 'unknown'}` + return } } }) return { params: nextParams, removedDetails } } + +export const fetchAndMergeValidCompletionParams = async ( + provider: string, + modelId: string, + oldParams: FormValue | undefined, +): Promise<{ params: FormValue; removedDetails: Record }> => { + const { fetchModelParameterRules } = await import('@/service/common') + const url = `/workspaces/current/model-providers/${provider}/models/parameter-rules?model=${modelId}` + const { data: parameterRules } = await fetchModelParameterRules(url) + return mergeValidCompletionParams(oldParams, parameterRules ?? []) +}