diff --git a/server/agent_core/intent.py b/server/agent_core/intent.py index 7658bb5..e88358e 100644 --- a/server/agent_core/intent.py +++ b/server/agent_core/intent.py @@ -707,6 +707,10 @@ def parse_fast(text: str, world: World) -> IntentResult | None: params["window"] = win elif re.search(r"滚动", t): params["window"] = "short" + # Explicit Optimize wording selects the integrated Optimize V2 adapter; + # ordinary flexible scheduling keeps the CLOSED_LOOP default. + if re.search(r"\boptimize\b|优化引擎|优化算法", t, re.I): + params["engine"] = "OPTIMIZE" return hit("flex.schedule", params) # 瓶颈产能评估(瓶颈产能法) if re.search(r"瓶颈产能|产能池|产能评估|各?工序产能|瓶颈在哪|产能瓶颈|能做多少|日产能", t): diff --git a/server/aps_domain/workflow.py b/server/aps_domain/workflow.py index c5827c9..0adf23b 100644 --- a/server/aps_domain/workflow.py +++ b/server/aps_domain/workflow.py @@ -1785,9 +1785,12 @@ def _run_flex(store: WorldStore, intent: IntentResult, actor: str) -> AgentReply store.save() else: result = run_flex_schedule(store, sort_mode=mode, order_ids=order_ids or None, - actor=actor, window=window) # P1 + actor=actor, window=window, + engine_type=engine or None) # P1 mode_key = str(result.get("sortMode") or result.get("engineType") or mode or "CLOSED_LOOP") mode_cn = _FLEX_MODE_CN.get(mode_key, mode_key) + if engine == "OPTIMIZE": + mode_cn = f"Optimize · {mode_cn}" solve_status = str(result.get("solveStatus") or "FEASIBLE").upper() if result.get("sortMode") == "EXTERNAL" or use_ext: mode_cn = f"外部算法({result.get('skillId') or 'skill'})" diff --git a/tests/golden/test_optimize_chat_trigger.py b/tests/golden/test_optimize_chat_trigger.py new file mode 100644 index 0000000..1aa9833 --- /dev/null +++ b/tests/golden/test_optimize_chat_trigger.py @@ -0,0 +1,30 @@ +from __future__ import annotations + +from pathlib import Path + +from server.agent_core.intent import parse_fast +from server.state.packs import load_pack + + +PACK_PATH = Path(__file__).resolve().parents[2] / "server" / "data" / "packs" / "optimize-simulation-v1.json" + + +def test_explicit_optimize_language_selects_optimize_flex_engine(): + world = load_pack(str(PACK_PATH)) + + result = parse_fast("用 Optimize 算法生成一版柔性排产", world) + + assert result is not None + assert result.intent == "flex.schedule" + assert result.params["engine"] == "OPTIMIZE" + assert result.params["sortMode"] == "BOTTLENECK" + + +def test_plain_flexible_schedule_keeps_closed_loop_default(): + world = load_pack(str(PACK_PATH)) + + result = parse_fast("生成一版柔性排产方案", world) + + assert result is not None + assert result.intent == "flex.schedule" + assert "engine" not in result.params