From 887a2317e1a08908abad7ba431a9e97d349311cf Mon Sep 17 00:00:00 2001 From: Daiwen2023 Date: Fri, 21 Aug 2026 07:32:13 +0800 Subject: [PATCH] feat: professionalize assistant responses --- apps/web/src/App.tsx | 2 +- apps/web/src/auth/AuthGate.tsx | 4 +- apps/web/src/chat/ChatPanel.tsx | 49 +++++++----- apps/web/src/orders/OrderPanel.tsx | 2 +- apps/web/src/timeline/TimelineRail.tsx | 4 +- apps/web/src/viewport/FlexGanttView.tsx | 2 +- apps/web/src/viewport/GanttView.tsx | 2 +- apps/web/src/viewport/PoolCapacityView.tsx | 2 +- docs/CHANGELOG.md | 11 +++ docs/README.md | 3 +- docs/development/response-style.md | 30 +++++++ server/agent_core/assistant.py | 92 ++++++++++------------ server/agent_core/context.py | 2 +- server/agent_core/dialog.py | 58 +++++++------- server/aps_domain/folder_pack.py | 18 ++--- server/aps_domain/guidance.py | 10 +-- server/aps_domain/readiness.py | 74 +++++++++-------- server/aps_domain/reports.py | 2 +- server/aps_domain/workflow.py | 20 ++--- server/gateway/app.py | 31 +++++--- tests/golden/test_assistant.py | 31 +++++++- tests/golden/test_guidance.py | 2 +- tests/golden/test_readiness.py | 6 +- tests/golden/test_schedule_wizard.py | 4 +- 24 files changed, 272 insertions(+), 189 deletions(-) create mode 100644 docs/development/response-style.md diff --git a/apps/web/src/App.tsx b/apps/web/src/App.tsx index e6b2cfe..d853ff0 100644 --- a/apps/web/src/App.tsx +++ b/apps/web/src/App.tsx @@ -438,7 +438,7 @@ export default function App() { // 命令面板条目:口令(发对话)/ 面板(布局开关)/ 视图(视口切换) const paletteItems: PaletteItem[] = [ ...[ - '多策略方案对比', '试排一版交期优先', '产能均衡重排', '建一个检查点', + '多策略方案对比', '生成一版交期优先试排方案', '产能均衡重排', '建一个检查点', '回滚到上一个检查点', '查看冲突', '标出超期订单', '查看当前KPI', '发布当前排产版本', ].map(q => ({ id: `cmd-${q}`, kind: '口令' as const, label: q, hint: '发送到对话', diff --git a/apps/web/src/auth/AuthGate.tsx b/apps/web/src/auth/AuthGate.tsx index 9a8a75d..5fab021 100644 --- a/apps/web/src/auth/AuthGate.tsx +++ b/apps/web/src/auth/AuthGate.tsx @@ -168,11 +168,11 @@ function GuestWorkspace() {
IB -

今天想先忙哪件事?

+

请选择要处理的任务

); @@ -94,13 +105,13 @@ export interface ChatHandle { } const QUICK = [ - '跑一版柔性排产', '瓶颈产能', 'PDU 500套什么时候能交', + '生成一版柔性排产方案', '瓶颈产能', 'PDU 500 套交期评估', '新建订单 客户 示例客户 产品 请替换为真实料号 数量 120 交期 8月20日', '新建物料 编码 SCR-NEW 名称 不锈钢螺丝 类型 原料 库存 800', '导入订单\n客户A,成品料号,200,2026-08-01,VIP\n客户 客户B 产品 成品料号 数量 100 交期 8月15日', '导入物料\nSCR-NEW,不锈钢螺丝,原料,包,800\nPCB-X,试验板,原料,块,200', '追溯订单依据', '分解全部订单', '主数据录入顺序有什么规定', - '多策略方案对比', '试排一版交期优先', '产能均衡重排', + '多策略方案对比', '生成一版交期优先试排方案', '产能均衡重排', '换线有什么规定', '生成排产方案报告', '生成日报', '生成版本对比报告', '建一个检查点', '回滚到上一个检查点', '只看VIP订单', '标出超期订单', '查看冲突', @@ -238,7 +249,7 @@ const ChatPanel = forwardRef ({ ...m, blocks: [...(m.blocks ?? []), ev.block] })); - else if (ev.type === 'error') patchLast(m => ({ ...m, text: m.text + '\n⚠ ' + ev.message })); + else if (ev.type === 'error') patchLast(m => ({ ...m, text: m.text + '\n\n**操作未完成**:' + ev.message })); else if (ev.type === 'done') { patchLast(m => ({ ...m, @@ -284,7 +295,7 @@ const ChatPanel = forwardRef patchLast(m => ({ ...m, text: m.text + '\n⚠ 连接失败,请确认后端已启动。', streaming: false }))); + }, hist).catch(() => patchLast(m => ({ ...m, text: m.text + '\n\n**连接未完成**:服务暂时不可用,请稍后重试。', streaming: false }))); setBusy(false); }, [busy, patchLast, props]); @@ -385,7 +396,7 @@ const ChatPanel = forwardRef setListening(false); recognitionRef.current = recognition; - setVoiceNotice('正在听,请说出排产要求或主数据说明。'); + setVoiceNotice('正在监听,请说明排产目标或主数据变更。'); setListening(true); recognition.start(); }, [autoGrow, listening]); @@ -394,7 +405,7 @@ const ChatPanel = forwardRef { const result = await postConfirm(sessionRef.current, confirmId, approve) - .catch(() => ({ message: '确认请求失败', refresh: false })); + .catch(() => ({ message: '确认操作未完成,数据未修改。', refresh: false })); setMsgs(ms => [...ms, { role: 'agent', text: result.message }]); if (result.refresh) props.onWorldRefresh(); return result; @@ -402,7 +413,7 @@ const ChatPanel = forwardRef { const result = await postScenarioApply(sessionRef.current, card.strategy, card.engine) - .catch(() => ({ message: '采用失败,请确认后端已启动', refresh: false })); + .catch(() => ({ message: '方案未采用,数据未修改。请稍后重试。', refresh: false })); setMsgs(ms => [...ms, { role: 'agent', text: result.message || `已采用【${card.label}】` }]); if (result.refresh) props.onWorldRefresh(); }, [props]); @@ -498,7 +509,7 @@ const ChatPanel = forwardRef : 正在处理…) : <>{m.text}{m.streaming ? '▍' : ''}} - {m.intent && !m.streaming && ( + {SHOW_INTENT_DEBUG && m.intent && !m.streaming && (
调试信息
{JSON.stringify(m.intent, null, 2)}
@@ -640,7 +651,7 @@ const ChatPanel = forwardRef