import { BookOpen, Bot, Brain, ChevronLeft, ChevronRight, Sparkles, User2Icon } from 'lucide-react'; import type { AnswerStyle, CompareLayout, KnowledgeScope, QAMode, qaModeItem, ViewMode } from './GeneralQA.types'; /** * 左侧配置栏 Props。 * * 组件内不保存业务状态,所有选中值和 setter 都来自父组件。 * 这样父组件可以统一处理“生成中切换需要确认停止”的逻辑,配置栏只负责触发用户意图。 */ type Props = { isDark: boolean; // 当前是否为暗黑主题,用于样式适配 viewMode: ViewMode; // 当前视图模式:'single' 单一模式 或 'compare' 对比模式 qaMode: QAMode; // 单一模式下的问答模式:'single-round' 单轮RAG / 'multi-round' 多轮RAG / 'deep-search' 深度检索 compareLeftMode: QAMode; // 对比模式下左侧的问答模式 compareRightMode: QAMode; // 对比模式下右侧的问答模式 compareLayout: CompareLayout; // 对比模式的布局方式:'horizontal' 水平 或 'vertical' 垂直 knowledgeScope: KnowledgeScope; // 知识范围设置:'all' 全部 / 'specific-kb' 指定知识库 / 'specific-domain' 指定领域 answerStyle: AnswerStyle; // 回答风格偏好:'concise' 简洁 或 'detailed' 详细 showSources: boolean; // 是否在回答中展示引用来源 showProcess: boolean; // 是否展示模型的思考过程 autoSummarizeDiff: boolean; // 对比模式下是否自动总结左右差异 recommendBetter: boolean; // 对比模式下是否推荐更好的回答方案 isCollapsed: boolean; // 左侧配置面板是否折叠 qaModeOptions?: qaModeItem[]; setQaMode: (mode: QAMode) => void; // 设置单一模式的问答模式 setCompareLeftMode: (mode: QAMode) => void; // 设置对比模式左侧的模式 setCompareRightMode: (mode: QAMode) => void; // 设置对比模式右侧的模式 setCompareLayout: (layout: CompareLayout) => void; // 设置对比布局方式 setKnowledgeScope: (scope: KnowledgeScope) => void; // 设置知识范围 setAnswerStyle: (style: AnswerStyle) => void; // 设置回答风格 setShowSources: (show: boolean) => void; // 设置是否展示引用来源 setShowProcess: (show: boolean) => void; // 设置是否展示思考过程 setAutoSummarizeDiff: (enabled: boolean) => void; // 设置是否自动总结差异 setRecommendBetter: (enabled: boolean) => void; // 设置是否推荐更好的方案 setIsCollapsed: (collapsed: boolean) => void; // 设置配置面板折叠状态 }; /** * 单一模式下可选的问答模式。 * * 每个选项同时提供展示文案、图标和简短说明,便于配置栏用统一结构渲染卡片。 */ const qaModeList: qaModeItem[] = [ { value: 'single-chat' as const, label: '快速', icon: Bot, desc: '快速直接' }, { value: 'single-round' as const, label: '单轮RAG', icon: Sparkles, desc: '快速直接' }, { value: 'multi-round' as const, label: '多轮RAG', icon: Brain, desc: '深入理解' }, { value: 'deep-search' as const, label: '任务检索', icon: BookOpen, desc: '检索相关任务' }, { value: 'hx-search' as const, label: '画像检索', icon: User2Icon, desc: '检索相关账号' }, { value: 'news-report' as const, label: '新闻报告生成', icon: User2Icon, desc: '检索相关新闻' }, ]; /** * 知识范围选项。 * * 当前只影响 UI 配置状态,后续接入真实知识库筛选时可以直接把该值映射到请求参数。 */ const knowledgeScopeOptions = [ { value: 'all' as const, label: '全部知识源' }, { value: 'specific-kb' as const, label: '指定知识库' }, { value: 'specific-domain' as const, label: '指定资源域' }, ]; /** * 左侧问答配置栏。 * * 该组件集中承载页面的“模式选择、知识范围、回答偏好、对比设置”等表单控件。 * 父组件仍是唯一状态源,配置栏通过 setter 把用户选择同步回父组件;这样不会改变原有请求逻辑, * 同时把 300 多行配置 JSX 从 `GeneralQA.tsx` 中移出,便于后续维护表单项和样式。 */ export default function GeneralQAConfigSidebar({ isDark, viewMode, qaMode, compareLeftMode, compareRightMode, compareLayout, knowledgeScope, answerStyle, showSources, showProcess, autoSummarizeDiff, recommendBetter, isCollapsed, qaModeOptions = qaModeList, setQaMode, setCompareLeftMode, setCompareRightMode, setCompareLayout, setKnowledgeScope, setAnswerStyle, setShowSources, setShowProcess, setAutoSummarizeDiff, setRecommendBetter, setIsCollapsed, }: Props): JSX.Element { /** * 自定义勾选图标。 * * 原生 checkbox 被隐藏后,所有勾选项都通过这个 SVG 保持一致的视觉风格。 */ const renderCheckIcon = () => ( ); return (