diff --git a/frontend-web/src/open-canvas/components/ai-writing/AIWritingForm.tsx b/frontend-web/src/open-canvas/components/ai-writing/AIWritingForm.tsx index dafe4a4b..7f9db889 100644 --- a/frontend-web/src/open-canvas/components/ai-writing/AIWritingForm.tsx +++ b/frontend-web/src/open-canvas/components/ai-writing/AIWritingForm.tsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from 'react'; +import { useEffect, useMemo, useState } from 'react'; import { PenLine } from 'lucide-react'; import { Button } from '@/components/ui/button'; @@ -10,8 +10,7 @@ import { SelectTrigger, SelectValue, } from '@/components/ui/select'; -import { getBackendBaseURL } from '@/core/config'; -import { apiFetch } from '@/core/api'; +import { useModels } from '@/core/models/hooks'; import type { AIWritingRequest } from '../../types/ai-writing'; import { useArticleTypes } from '../../hooks/useArticleTypes'; @@ -23,11 +22,6 @@ interface AIWritingFormProps { hideAdvancedFields?: boolean; } -interface ModelOption { - name: string; - displayName: string; -} - const INPUT_CLASS = 'flex h-12 w-full rounded-xl border border-[#e8dedd] bg-white px-4 py-2 text-sm shadow-sm ' + 'placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 ' + @@ -52,10 +46,24 @@ export function AIWritingForm({ const [wordCountInput, setWordCountInput] = useState('800'); const [strictMode, setStrictMode] = useState(false); const [modelName, setModelName] = useState(''); - const [models, setModels] = useState([]); + const { models, isLoading: modelsLoading } = useModels(); const { articleTypes, loading: typesLoading, refresh: refreshTypes } = useArticleTypes(); + // 首次 /api/models 返回后默认选第一项;配置变更导致当前值不在列表时也回退到首项。 + useEffect(() => { + if (models.length === 0) return; + const stillExists = models.some((m) => m.name === modelName); + if (!modelName || !stillExists) { + setModelName(models[0].name); + } + }, [models, modelName]); + + const selectedModel = useMemo( + () => models.find((m) => m.name === modelName) ?? models[0], + [models, modelName], + ); + // 初始化时加载文章类型 useEffect(() => { refreshTypes(); @@ -81,25 +89,6 @@ export function AIWritingForm({ } } - useEffect(() => { - apiFetch(`${getBackendBaseURL()}/api/models`) - .then((r) => r.json()) - .then((data) => { - const list: ModelOption[] = (data.models ?? []).map( - (m: { name: string; display_name?: string }) => ({ - name: m.name, - displayName: m.display_name || m.name, - }), - ); - setModels(list); - if (list.length > 0 && !modelName) { - setModelName(list[0].name); - } - }) - .catch(() => {}); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - function handleWordCountBlur() { const num = parseInt(wordCountInput, 10); if (isNaN(num) || num < 100) { @@ -122,7 +111,7 @@ export function AIWritingForm({ wordCountTarget: wordCount, keywordCount: DEFAULT_KEYWORD_COUNT, writingMode: hideAdvancedFields ? 'loose' : strictMode ? 'strict' : 'loose', - modelName: modelName || undefined, + modelName: selectedModel?.name || modelName || undefined, }); } @@ -192,17 +181,25 @@ export function AIWritingForm({
- {isRoundTableRunning ? ( + {showPausedUi ? ( + ) : ( + - ) : ( - )}
@@ -324,14 +345,16 @@ export function Step2Panel(props: Step2PanelProps) { value={customAgentInput} onChange={(e) => setCustomAgentInput(e.target.value)} onKeyDown={(e) => { - if (e.key === "Enter") onInjectToRoundtable(); + if (e.key === "Enter") handleInject(); }} placeholder="作为指挥官,您可以随时插话输入指令,对智能体博弈朝向实施人工干预..." className="flex-1 bg-white border border-slate-200 rounded-xl px-3.5 py-2.5 text-xs focus:outline-none focus:border-primary focus:ring-1 focus:ring-[var(--brand-200)]/50 font-medium" />