From 3c1543a1049670c227755229a0305613442bcda8 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期三, 29 四月 2026 20:43:13 +0800
Subject: [PATCH] Merge branch 'codex/ai-provider-protocol-gateway'

---
 src/main/java/com/zy/ai/utils/AiPromptUtils.java |   72 +++++++++++++++++++++++++++++++----
 1 files changed, 63 insertions(+), 9 deletions(-)

diff --git a/src/main/java/com/zy/ai/utils/AiPromptUtils.java b/src/main/java/com/zy/ai/utils/AiPromptUtils.java
index 20901aa..6abe1ba 100644
--- a/src/main/java/com/zy/ai/utils/AiPromptUtils.java
+++ b/src/main/java/com/zy/ai/utils/AiPromptUtils.java
@@ -1,5 +1,6 @@
 package com.zy.ai.utils;
 
+import com.zy.ai.domain.autotune.AutoTuneControlModeSnapshot;
 import com.zy.ai.enums.AiPromptBlockType;
 import com.zy.ai.enums.AiPromptScene;
 import org.springframework.stereotype.Component;
@@ -9,11 +10,38 @@
 @Component
 public class AiPromptUtils {
 
+    private static final String AUTO_TUNE_TOOL_GET_SNAPSHOT = "wcs_local_dispatch_get_auto_tune_snapshot";
+    private static final String AUTO_TUNE_TOOL_GET_RECENT_JOBS = "wcs_local_dispatch_get_recent_auto_tune_jobs";
+    private static final String AUTO_TUNE_TOOL_APPLY_CHANGES = "wcs_local_dispatch_apply_auto_tune_changes";
+    private static final String AUTO_TUNE_TOOL_REVERT_LAST_JOB = "wcs_local_dispatch_revert_last_auto_tune_job";
+
     private static final String AUTO_TUNE_RULE_SNAPSHOT_INSTRUCTIONS =
             "Step 4 璇诲彇璋冨弬瑙勫垯\n" +
                     "- 蹇呴』璇诲彇 snapshot.ruleSnapshot 涓殑 minValue銆乵axValue銆乵axStep銆乧ooldownMinutes銆乨ynamicMaxValue 鍜� dynamicMaxSource銆俓n" +
-                    "- 鎻愪氦缁� wcs_local_dispatch_apply_auto_tune_changes 鐨勬瘡涓� change 閮藉繀椤诲尮閰嶅搴� targetType/targetKey 鐨勮鍒欍�俓n" +
+                    "- 鎵�鏈夋彁浜ょ粰 " + AUTO_TUNE_TOOL_APPLY_CHANGES + " 鐨� change 閮藉繀椤诲尮閰嶅搴� targetType/targetKey 鐨勮鍒欍�俓n" +
                     "- 姣忎釜鐩爣鍙傛暟鐨勬柊鍊煎繀椤绘弧瓒冲搴� minValue銆乵axValue 鎴� dynamicMaxValue銆乵axStep銆乧ooldownMinutes 鍜岃鍒� note锛涙壘涓嶅埌瑙勫垯鎴栨棤娉曡瘉鏄庡姩鎬佷笂闄愭椂绂佹鎻愪氦銆�";
+
+    public static String buildAutoTuneRuntimeGuard(String triggerType, AutoTuneControlModeSnapshot controlMode) {
+        return "璇锋墽琛屼竴娆″悗鍙� WCS 鑷姩璋冨弬銆倀riggerType=" + safeRuntimeValue(triggerType) + "銆俓n\n" +
+                "==================== 杩愯鏃跺己绾︽潫 ====================\n" +
+                "- 褰撳墠鎵ц妯″紡: modeCode=" + modeValue(controlMode == null ? null : controlMode.getModeCode())
+                + "锛宮odeLabel=" + modeValue(controlMode == null ? null : controlMode.getModeLabel())
+                + "锛宔nabled=" + modeValue(controlMode == null ? null : controlMode.getEnabled())
+                + "锛宎nalysisOnly=" + modeValue(controlMode == null ? null : controlMode.getAnalysisOnly())
+                + "锛宎llowApply=" + modeValue(controlMode == null ? null : controlMode.getAllowApply()) + "銆俓n" +
+                "- 蹇呴』鍏堣皟鐢� " + AUTO_TUNE_TOOL_GET_SNAPSHOT + " 鑾峰彇鍚庣蹇収锛屽苟璇诲彇 snapshot.controlModeSnapshot 鐨� enabled銆乤nalysisOnly銆乤llowApply銆乵odeCode銆乵odeLabel銆俓n" +
+                "- 褰� snapshot.controlModeSnapshot.analysisOnly=true 鎴� allowApply=false 鏃讹紝鍙厑璁稿垎鏋愩�佽皟鐢� " + AUTO_TUNE_TOOL_GET_RECENT_JOBS
+                + " 鍜岃皟鐢� " + AUTO_TUNE_TOOL_APPLY_CHANGES + " dryRun=true 璇曠畻锛涚姝� dryRun=false 姝e紡搴旂敤锛涚姝㈣皟鐢� "
+                + AUTO_TUNE_TOOL_REVERT_LAST_JOB + "銆俓n" +
+                "- 濡傞渶鎻愪氦 changes锛屽繀椤诲厛璋冪敤 " + AUTO_TUNE_TOOL_APPLY_CHANGES
+                + " dryRun=true锛沝ry-run 杩斿洖 success=false銆乺ejectCount>0銆乧hanges 涓虹┖鎴� changes[].resultStatus 鍏ㄩ儴涓� no_change 鏃讹紝涓嶅緱璋冪敤 dryRun=false銆俓n" +
+                "- 鍙湁 analysisOnly=false 涓� allowApply=true銆乨ry-run 閫氳繃銆佸瓨鍦ㄦ湁鏁堝彉鏇翠笖杩斿洖 dryRunToken 鏃讹紝鎵嶅厑璁搁�氳繃 "
+                + AUTO_TUNE_TOOL_APPLY_CHANGES + " dryRun=false 姝e紡搴旂敤锛涙寮忓簲鐢ㄥ繀椤绘惡甯﹁ dryRunToken銆俓n" +
+                "- 娌℃湁鏀跺埌 " + AUTO_TUNE_TOOL_APPLY_CHANGES + " 鎴� " + AUTO_TUNE_TOOL_REVERT_LAST_JOB
+                + " 鐨勫伐鍏疯繑鍥炵粨鏋滄椂锛屼笉寰楀0绉板凡璇曠畻銆佸凡搴旂敤鎴栧凡鍥炴粴锛涗笉瑕佽緭鍑鸿嚜鐢辨牸寮� JSON 渚涘灞傝В鏋愩�俓n" +
+                "- 蹇呴』妫�鏌� taskSnapshot.stationLimitBlockedTasks 鍜� taskSnapshot.outboundTaskSamples 涓殑 systemMsg銆亀rkSts銆乥atchSeq锛屽垽鏂槸鍚﹀瓨鍦ㄨ涓婇檺鎸′綇鐨勬棭搴忓嚭搴撲换鍔°�俓n\n" +
+                AUTO_TUNE_RULE_SNAPSHOT_INSTRUCTIONS;
+    }
 
     public String getDefaultPrompt(String sceneCode) {
         AiPromptScene scene = AiPromptScene.ofCode(sceneCode);
@@ -134,30 +162,43 @@
                             "- wcs_local_dispatch_get_auto_tune_snapshot锛氳幏鍙栧綋鍓嶈皟搴︺�佽澶囥�佺珯鐐广�佸閲忎笌鍙啓鍙傛暟蹇収\n" +
                             "- wcs_local_dispatch_get_recent_auto_tune_jobs锛氳幏鍙栬繎鏈熻嚜鍔ㄨ皟鍙備换鍔″拰鍙樻洿缁撴灉\n" +
                             "- wcs_local_dispatch_apply_auto_tune_changes锛氭彁浜よ皟鍙傚彉鏇达紝蹇呴』鍏� dry-run 鍐嶅疄闄呭簲鐢╘n" +
-                            "- wcs_local_dispatch_revert_last_auto_tune_job锛氫粎鍦ㄦ槑纭渶瑕佸洖婊氭渶杩戜竴娆¤皟鍙傛椂浣跨敤\n\n" +
+                            "- wcs_local_dispatch_revert_last_auto_tune_job锛氫粎鍦ㄨ繍琛屾ā寮忓厑璁镐笖鏄庣‘闇�瑕佸洖婊氭渶杩戜竴娆¤皟鍙傛椂浣跨敤\n\n" +
                             "绂佹璋冪敤涓婅堪鍒楄〃涔嬪鐨勫伐鍏峰畬鎴愯皟鍙傘�傜姝㈣緭鍑鸿嚜鐢辨牸寮� JSON 璁╁灞傝В鏋愬悗璋冨弬锛涙墍鏈夊弬鏁拌鍙栥�佽瘯绠椼�佸簲鐢ㄥ拰鍥炴粴閮藉繀椤婚�氳繃 MCP 宸ュ叿瀹屾垚銆俓n\n" +
-                            "瀹為檯搴旂敤鍓嶅繀椤诲厛璋冪敤 wcs_local_dispatch_apply_auto_tune_changes 鎵ц dry-run銆傚彧鏈� dry-run 杩斿洖鍏佽搴旂敤涓旀病鏈夐珮椋庨櫓鎷掔粷鍘熷洜鏃讹紝鎵嶅彲浠ュ啀娆¤皟鐢� wcs_local_dispatch_apply_auto_tune_changes 鎵ц瀹為檯搴旂敤銆�");
+                            "瀹為檯搴旂敤鍓嶅繀椤诲厛璋冪敤 wcs_local_dispatch_apply_auto_tune_changes 鎵ц dry-run銆傚彧鏈� snapshot.controlModeSnapshot 鏄剧ず analysisOnly=false 涓� allowApply=true锛宒ry-run 杩斿洖鍏佽搴旂敤涓斿瓨鍦ㄦ湁鏁堝彉鏇存椂锛屾墠鍙互鍐嶆璋冪敤 wcs_local_dispatch_apply_auto_tune_changes 鎵ц瀹為檯搴旂敤銆�");
             blocks.put(AiPromptBlockType.OUTPUT_CONTRACT,
                     "==================== 杈撳嚭瑕佹眰 ====================\n\n" +
                             "杈撳嚭蹇呴』浣跨敤绠�浣撲腑鏂囷紝骞朵繚鎸佸璁″弸濂斤細\n" +
                             "1. 蹇収鎽樿锛氳鏄庢湰杞緷鎹殑鍏抽敭浜嬪疄\n" +
                             "2. 璋冩暣璁″垝锛氬垪鍑虹洰鏍囧弬鏁般�佸師鍊笺�佸缓璁�煎拰鍘熷洜\n" +
                             "3. dry-run 缁撴灉锛氳鏄庡厑璁搞�佹嫆缁濇垨闇�瑕佷汉宸ュ鐞嗙殑鍘熷洜\n" +
-                            "4. 瀹為檯搴旂敤缁撴灉锛氬彧姹囨�� MCP 宸ュ叿杩斿洖鐨勫簲鐢ㄧ姸鎬乗n" +
+                            "4. 瀹為檯搴旂敤缁撴灉锛氬彧姹囨�� MCP 宸ュ叿杩斿洖鐨勫簲鐢ㄧ姸鎬侊紱浠呭垎鏋愭ā寮忓繀椤昏鏄庘�滀粎鍒嗘瀽/鏈寮忓簲鐢ㄥ弬鏁扳�漒n" +
                             "5. 椋庨櫓涓庤瀵熺偣锛氳鏄庝笅涓�杞簲閲嶇偣瑙傚療鐨勬寚鏍嘰n\n" +
                             "濡傛灉娌℃湁瓒冲浜嬪疄鏀拺璋冨弬锛岃緭鍑衡�滀笉璋冩暣鈥濆苟璇存槑缂哄皯鍝簺 MCP 蹇収浜嬪疄銆�");
             blocks.put(AiPromptBlockType.SCENE_PLAYBOOK,
                     "==================== 鑷姩璋冨弬瑙勫垯 ====================\n\n" +
+                            "娉ㄦ剰锛氬悗鍙� Agent 姣忚疆鐢ㄦ埛娑堟伅杩樹細闄勫姞褰撳墠鎵ц妯″紡銆乨ryRunToken銆乶o_change 鍜屽伐鍏疯繑鍥炶竟鐣岀殑杩愯鏃跺己绾︽潫锛涗笌鏈� playbook 瀛樺湪宸紓鏃朵互杩愯鏃跺己绾︽潫涓哄噯銆俓n\n" +
                             "Step 1 鑾峰彇浜嬪疄\n" +
-                            "- 鍏堣皟鐢� wcs_local_dispatch_get_auto_tune_snapshot 鑾峰彇鍚庣蹇収/MCP facts銆俓n" +
-                            "- 濡傞渶鍒ゆ柇杩戞湡璋冨弬褰卞搷锛屽啀璋冪敤 wcs_local_dispatch_get_recent_auto_tune_jobs銆俓n" +
+                            "- 鍏堣皟鐢� " + AUTO_TUNE_TOOL_GET_SNAPSHOT + " 鑾峰彇鍚庣蹇収/MCP facts銆俓n" +
+                            "- 蹇呴』璇诲彇 snapshot.controlModeSnapshot锛岀‘璁� enabled銆乤nalysisOnly銆乤llowApply銆乵odeCode銆乵odeLabel銆俓n" +
+                            "- 濡傞渶鍒ゆ柇杩戞湡璋冨弬褰卞搷锛屽啀璋冪敤 " + AUTO_TUNE_TOOL_GET_RECENT_JOBS + "銆俓n" +
                             "- 鏂瑰悜涓庡閲忎簨瀹炲繀椤绘潵鑷悗绔揩鐓ф垨 MCP facts锛岀姝粠鍓嶇鍦板浘鎺ㄦ柇銆俓n\n" +
+                            "Step 1.1 閬靛畧杩愯妯″紡\n" +
+                            "- 褰� controlModeSnapshot.analysisOnly=true 鎴� allowApply=false 鏃讹紝鍙厑璁稿垎鏋愩�佽幏鍙栧揩鐓с�佹煡璇㈡渶杩戜换鍔°�佽皟鐢� dryRun=true 璇曠畻锛涚姝� dryRun=false 瀹為檯搴旂敤锛涚姝� rollback锛涜緭鍑哄繀椤昏鏄庘�滀粎鍒嗘瀽/鏈寮忓簲鐢ㄥ弬鏁扳�濄�俓n" +
+                            "- 鍙湁褰� controlModeSnapshot.analysisOnly=false 涓� allowApply=true锛屽苟涓� dry-run 閫氳繃涓斿瓨鍦ㄦ湁鏁堝彉鏇存椂锛屾墠鍏佽姝e紡搴旂敤銆俓n\n" +
                             "Step 2 鍒嗘瀽绔欑偣杩愯鎬乗n" +
                             "- 杩愯鏃剁珯鐐瑰垎鏋愬彧鑳戒娇鐢� autoing銆乴oading銆乼askNo銆俓n" +
                             "- 绂佹浣跨敤 taskWriteIdx 鎴� taskBufferItems 浣滀负璋冨弬渚濇嵁銆俓n\n" +
                             "Step 2.1 鍒嗘瀽鍑哄簱浠诲姟闃诲\n" +
                             "- 蹇呴』妫�鏌� taskSnapshot.stationLimitBlockedTasks 鍜� taskSnapshot.outboundTaskSamples銆俓n" +
                             "- 濡傛灉鍚屼竴绔欑偣/鍚屼竴鎵规涓紝杈冨皬 batchSeq 鐨� NEW_OUTBOUND 浠诲姟鍥� systemMsg 鏄剧ず鈥滃嚭搴撲换鍔′笂闄愨�濊鎸′綇锛岃�岃緝澶� batchSeq 宸茶繘鍏� STATION_RUN锛岃鏄庡綋鍓嶄笂闄愬彲鑳介�犳垚鍑哄簱鎺掗槦鎴栭『搴忓紓甯革紝搴斾紭鍏堣瘎浼� outTaskLimit銆乵axOutTask銆乧rnOutBatchRunningLimit 绛夌浉鍏宠鍒欏厑璁哥殑涓婅皟绌洪棿銆俓n\n" +
+                            "Step 2.2 鍒嗘瀽璺緞灞�閮ㄥ帇鍔沑n" +
+                            "- 蹇呴』璇诲彇 routePressureSnapshot.routePressureRuleSnapshot锛岀悊瑙e綋鍓嶄粨搴撲娇鐢ㄧ殑鐧惧垎姣旈槇鍊煎拰璇勫垎鏉冮噸銆俓n" +
+                            "- 蹇呴』璇诲彇 routePressureSnapshot.targetStationRoutePressure銆乭otPathSegments銆乸ressureScore銆乸ressureFactors銆乧onfidence 鍜� evidenceText銆俓n" +
+                            "- heuristicDirection/recommendedDirection 鍙槸鍚庣鍚彂寮忔彁绀猴紝涓嶆槸鏈�缁堣皟鍙傜粨璁猴紱鏈�缁堟槸鍚﹁皟鍙傚繀椤荤敱浣犵粨鍚堜换鍔¢樆濉炪�佽矾寰勮瘎鍒嗐�佽鍒欐闀裤�佸姩鎬佷笂闄愬拰鍐峰嵈鐙珛鍒ゆ柇銆俓n" +
+                            "- 绂佹浠呭嚟鍏ㄥ眬鐜嚎绌洪棽銆佹�昏妭鐐圭┖闂叉垨閭绘帴鑺傜偣绌洪棽涓婅皟鍙傛暟锛涗笂璋冨繀椤绘湁鐩爣绔欏眬閮ㄨ矾寰勫帇鍔涗簨瀹炴敮鎾戙�俓n" +
+                            "- 褰� heuristicDirection=increase_candidate 鏃讹紝浠嶅繀椤绘鏌� ruleSnapshot銆乷utBufferCapacity銆乵axStep 鍜� cooldown锛屼笖涓嶅緱绐佺牬鍔ㄦ�佷笂闄愩�俓n" +
+                            "- 褰� heuristicDirection=decrease_candidate 鏃讹紝鍏佽鎶婂弬鏁颁笅璋冨埌浣庝簬褰撳墠宸叉墽琛�/宸插崰鐢ㄦ暟閲忥紱璇ュ姩浣滃彧闄愬埗鍚庣画鏂板浠诲姟锛屼笉鍙栨秷宸蹭笅鍙戜换鍔°�俓n" +
+                            "- 褰� pressureLevel=high銆乧onfidence=low 鎴� pathErrorCount>0 鏃讹紝绂佹婵�杩涗笂璋冿紱璺緞浜嬪疄涓嶈冻鏃跺繀椤昏鏄庣己灏戝摢浜涚洰鏍囩珯璺緞浜嬪疄銆俓n\n" +
                             "Step 3 闄愬埗鍙啓鍙傛暟\n" +
                             "鎻愪氦缁� MCP/apply-service 鐨� target_key 蹇呴』浣跨敤浠ヤ笅閿悕锛屼笉寰楁彁浜ゅ師濮嬫暟鎹簱鍒楀悕浣滀负 CRN/鍙屽伐浣嶅爢鍨涙満鍙傛暟閿細\n" +
                             "- crnOutBatchRunningLimit锛氬搴� sys_config.crnOutBatchRunningLimit\n" +
@@ -169,11 +210,13 @@
                             "娉ㄦ剰锛歛sr_bas_station.out_buffer_capacity 鏄汉宸ョ淮鎶ょ殑鍑哄簱缂撳瓨瀹归噺锛屽彧鐢ㄤ簬璇佹槑 outTaskLimit 鍙笂璋冧笂闄愶紝Agent 涓嶅厑璁镐慨鏀硅瀛楁锛涘澶� outTaskLimit 鏃跺缓璁�间笉寰楄秴杩囧搴旂珯鐐� outBufferCapacity銆俓n\n" +
                             AUTO_TUNE_RULE_SNAPSHOT_INSTRUCTIONS + "\n\n" +
                             "Step 5 鎻愪氦鍙樻洿\n" +
-                            "- 鍏堥�氳繃 wcs_local_dispatch_apply_auto_tune_changes 鎵ц dry-run銆俓n" +
-                            "- dry-run 閫氳繃鍚庢墠鍏佽閫氳繃鍚屼竴宸ュ叿瀹為檯搴旂敤銆俓n" +
+                            "- 鍏堥�氳繃 " + AUTO_TUNE_TOOL_APPLY_CHANGES + " 鎵ц dry-run銆俓n" +
+                            "- dry-run 杩斿洖 success=false銆乺ejectCount>0銆乧hanges 涓虹┖鎴栧叏閮� resultStatus=no_change 鏃讹紝蹇呴』鍋滄瀹為檯搴旂敤銆俓n" +
+                            "- 鍙湁 controlModeSnapshot.analysisOnly=false 涓� allowApply=true锛宒ry-run 閫氳繃銆佸瓨鍦ㄦ湁鏁堝彉鏇村苟杩斿洖 dryRunToken 鏃讹紝鎵嶅厑璁搁�氳繃鍚屼竴宸ュ叿鎼哄甫 dryRunToken 瀹為檯搴旂敤銆俓n" +
                             "- 濡傛灉宸ュ叿杩斿洖鎷掔粷銆佸喎鍗翠腑銆佸瓨鍦ㄦ椿鍔ㄤ换鍔¢闄╂垨鍙傛暟涓嶅湪鐧藉悕鍗曞唴锛屽繀椤诲仠姝㈠疄闄呭簲鐢ㄣ�俓n\n" +
                             "Step 6 鍥炴粴杈圭晫\n" +
-                            "- 鍙湁褰撴渶杩戜竴娆¤嚜鍔ㄨ皟鍙傝 MCP facts 鏄庣‘璇佹槑閫犳垚寮傚父锛屾墠鍏佽璋冪敤 wcs_local_dispatch_revert_last_auto_tune_job銆俓n" +
+                            "- analysisOnly=true 鎴� allowApply=false 鏃剁姝� rollback銆俓n" +
+                            "- 鍙湁褰撳厑璁告寮忓簲鐢紝涓旀渶杩戜竴娆¤嚜鍔ㄨ皟鍙傝 MCP facts 鏄庣‘璇佹槑閫犳垚寮傚父锛屾墠鍏佽璋冪敤 " + AUTO_TUNE_TOOL_REVERT_LAST_JOB + "銆俓n" +
                             "- 涓嶅緱鑷嗘祴鍥炴粴鍘熷洜銆�");
             return blocks;
         }
@@ -312,4 +355,15 @@
     private String localTool(String name) {
         return "wcs_local_" + name;
     }
+
+    private static String safeRuntimeValue(String value) {
+        if (value == null || value.trim().isEmpty()) {
+            return "unknown";
+        }
+        return value.trim();
+    }
+
+    private static String modeValue(Object value) {
+        return value == null ? "unknown" : String.valueOf(value);
+    }
 }

--
Gitblit v1.9.1