diff --git a/web/app/components/workflow/nodes/llm/mock.ts b/web/app/components/workflow/nodes/llm/mock.ts new file mode 100644 index 0000000000..1a2df388da --- /dev/null +++ b/web/app/components/workflow/nodes/llm/mock.ts @@ -0,0 +1,37 @@ +import type { LLMNodeData } from '../../types' +import { MemoryRole } from '../../types' +import { Resolution } from '@/types/app' + +export const mockLLMNodeData: LLMNodeData = { + title: 'Test', + desc: 'Test', + type: 'Test', + model: { + provider: 'openai', + name: 'gpt-4', + mode: 'completion', + completion_params: { + temperature: 0.7, + }, + }, + variables: [], + prompt: [], + memory: { + role_prefix: MemoryRole.assistant, + window: { + enabled: false, + size: 0, + }, + }, + context: { + enabled: false, + size: 0, + }, + vision: { + enabled: false, + variable_selector: [], + configs: { + detail: Resolution.low, + }, + }, +} diff --git a/web/app/components/workflow/nodes/llm/panel.tsx b/web/app/components/workflow/nodes/llm/panel.tsx index 7d786fd0a2..12416bf299 100644 --- a/web/app/components/workflow/nodes/llm/panel.tsx +++ b/web/app/components/workflow/nodes/llm/panel.tsx @@ -1,13 +1,21 @@ import type { FC } from 'react' import { useTranslation } from 'react-i18next' import BasePanel from '../_base/panel' +import useInput from './use-input' +import { mockLLMNodeData } from './mock' import Field from '@/app/components/workflow/nodes/_base/components/field' import AddButton from '@/app/components/base/button/add-button' import Split from '@/app/components/workflow/nodes/_base/components/split' +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' const i18nPrefix = 'workflow.nodes.llm' const Panel: FC = () => { const { t } = useTranslation() + const { inputs, handleModelChanged } = useInput(mockLLMNodeData) + const { + textGenerationModelList, + } = useTextGenerationCurrentProviderAndModelAndModelList() const handleAddVariable = () => { console.log('add variable') } @@ -18,7 +26,16 @@ const Panel: FC = () => { - Model Selector + { + const [inputs, setInputs] = useState(initInputs) + + const handleModelChanged = useCallback((model: { provider: string; model: string }) => { + const newInputs = produce(inputs, (draft) => { + draft.model.provider = model.provider + draft.model.name = model.model + }) + setInputs(newInputs) + }, [inputs.model]) + return { + inputs, + setInputs: (key: string, payload: any) => { + setInputs({ + ...inputs, + [key]: payload, + } as LLMNodeData) + }, + handleModelChanged, + } +} + +export default useInput diff --git a/web/app/components/workflow/types.ts b/web/app/components/workflow/types.ts index 72d1012973..8a9332c870 100644 --- a/web/app/components/workflow/types.ts +++ b/web/app/components/workflow/types.ts @@ -1,5 +1,5 @@ import type { Node as ReactFlowNode } from 'reactflow' - +import type { Resolution } from '@/types/app' export type NodeData = { type: string name?: string @@ -7,3 +7,62 @@ export type NodeData = { description?: string } export type Node = ReactFlowNode + +export type ValueSelector = string[] // [nodeId, key | obj key path] + +export type Variable = { + variable: string + value_selector: ValueSelector +} + +export type ModelConfig = { + provider: string + name: string + mode: string + completion_params: Record +} + +export enum PromptRole { + system = 'system', + user = 'user', + assistant = 'assistant', +} + +export type PromptItem = { + role?: PromptRole + text: string +} + +export enum MemoryRole { + user = 'user', + assistant = 'assistant', +} + +export type Memory = { + role_prefix: MemoryRole + window: { + enabled: boolean + size: number + } +} + +export type LLMNodeData = { + title: string + desc: string + type: string + model: ModelConfig + variables: Variable[] + prompt: PromptItem[] | PromptItem + memory: Memory + context: { + enabled: boolean + size: number + } + vision: { + enabled: boolean + variable_selector: ValueSelector + configs: { + detail: Resolution + } + } +}