Junjie
2026-04-27 84dc5107cd8c40508a0b8fc85304a0e36b3f420e
src/main/java/com/zy/ai/utils/AiPromptUtils.java
@@ -24,6 +24,9 @@
        if (scene == AiPromptScene.SENSOR_CHAT) {
            return getWcsSensorPromptMcp();
        }
        if (scene == AiPromptScene.AUTO_TUNE_DISPATCH) {
            return getAutoTuneDispatchPromptMcp();
        }
        throw new IllegalArgumentException("不支持的 Prompt 场景: " + scene.getCode());
    }
@@ -115,6 +118,55 @@
                            "- 【可执行的排查 / 处理建议】");
            return blocks;
        }
        if (scene == AiPromptScene.AUTO_TUNE_DISPATCH) {
            blocks.put(AiPromptBlockType.BASE_POLICY,
                    "你是 WCS 自动调参 Agent,职责是在后台基于系统快照、历史调参记录和 MCP 工具事实,谨慎优化调度容量参数。\n\n" +
                            "你的目标是降低出库拥塞、减少无效堆积和过度并发,不追求一次性大幅调整。所有调参必须可审计、可回滚、可解释。");
            blocks.put(AiPromptBlockType.TOOL_POLICY,
                    "==================== 可用 MCP 工具 ====================\n\n" +
                            "你只能使用以下 MCP 工具进行自动调参工作:\n" +
                            "- dispatch_get_auto_tune_snapshot:获取当前调度、设备、站点、容量与可写参数快照\n" +
                            "- dispatch_get_recent_auto_tune_jobs:获取近期自动调参任务和变更结果\n" +
                            "- dispatch_apply_auto_tune_changes:提交调参变更,必须先 dry-run 再实际应用\n" +
                            "- dispatch_revert_last_auto_tune_job:仅在明确需要回滚最近一次调参时使用\n\n" +
                            "禁止调用上述列表之外的工具完成调参。禁止输出自由格式 JSON 让外层解析后调参;所有参数读取、试算、应用和回滚都必须通过 MCP 工具完成。\n\n" +
                            "实际应用前必须先调用 dispatch_apply_auto_tune_changes 执行 dry-run。只有 dry-run 返回允许应用且没有高风险拒绝原因时,才可以再次调用 dispatch_apply_auto_tune_changes 执行实际应用。");
            blocks.put(AiPromptBlockType.OUTPUT_CONTRACT,
                    "==================== 输出要求 ====================\n\n" +
                            "输出必须使用简体中文,并保持审计友好:\n" +
                            "1. 快照摘要:说明本轮依据的关键事实\n" +
                            "2. 调整计划:列出目标参数、原值、建议值和原因\n" +
                            "3. dry-run 结果:说明允许、拒绝或需要人工处理的原因\n" +
                            "4. 实际应用结果:只汇总 MCP 工具返回的应用状态\n" +
                            "5. 风险与观察点:说明下一轮应重点观察的指标\n\n" +
                            "如果没有足够事实支撑调参,输出“不调整”并说明缺少哪些 MCP 快照事实。");
            blocks.put(AiPromptBlockType.SCENE_PLAYBOOK,
                    "==================== 自动调参规则 ====================\n\n" +
                            "Step 1 获取事实\n" +
                            "- 先调用 dispatch_get_auto_tune_snapshot 获取后端快照/MCP facts。\n" +
                            "- 如需判断近期调参影响,再调用 dispatch_get_recent_auto_tune_jobs。\n" +
                            "- 方向与容量事实必须来自后端快照或 MCP facts,禁止从前端地图推断。\n\n" +
                            "Step 2 分析站点运行态\n" +
                            "- 运行时站点分析只能使用 autoing、loading、taskNo。\n" +
                            "- 禁止使用 taskWriteIdx 或 taskBufferItems 作为调参依据。\n\n" +
                            "Step 3 限制可写参数\n" +
                            "- sys_config.crnOutBatchRunningLimit\n" +
                            "- sys_config.conveyorStationTaskLimit\n" +
                            "- sys_config.aiAutoTuneIntervalMinutes\n" +
                            "- asr_bas_station.out_task_limit\n" +
                            "- asr_bas_crnp.maxOutTask\n" +
                            "- asr_bas_dual_crnp.maxOutTask\n" +
                            "- asr_bas_crnp.maxInTask\n" +
                            "- asr_bas_dual_crnp.maxInTask\n\n" +
                            "Step 4 提交变更\n" +
                            "- 先通过 dispatch_apply_auto_tune_changes 执行 dry-run。\n" +
                            "- dry-run 通过后才允许通过同一工具实际应用。\n" +
                            "- 如果工具返回拒绝、冷却中、存在活动任务风险或参数不在白名单内,必须停止实际应用。\n\n" +
                            "Step 5 回滚边界\n" +
                            "- 只有当最近一次自动调参被 MCP facts 明确证明造成异常,才允许调用 dispatch_revert_last_auto_tune_job。\n" +
                            "- 不得臆测回滚原因。");
            return blocks;
        }
        throw new IllegalArgumentException("不支持的 Prompt 场景: " + scene.getCode());
    }
@@ -124,7 +176,8 @@
            return getDefaultPromptBlocks(scene);
        }
        if ((scene == AiPromptScene.DIAGNOSE_STREAM && content.equals(getAiDiagnosePromptMcp()))
                || (scene == AiPromptScene.SENSOR_CHAT && content.equals(getWcsSensorPromptMcp()))) {
                || (scene == AiPromptScene.SENSOR_CHAT && content.equals(getWcsSensorPromptMcp()))
                || (scene == AiPromptScene.AUTO_TUNE_DISPATCH && content.equals(getAutoTuneDispatchPromptMcp()))) {
            return getDefaultPromptBlocks(scene);
        }
        LinkedHashMap<AiPromptBlockType, String> blocks = new LinkedHashMap<>();
@@ -236,6 +289,16 @@
        return prompt;
    }
    //WCS自动调参Prompt
    public String getAutoTuneDispatchPromptMcp() {
        LinkedHashMap<AiPromptBlockType, String> blocks = getDefaultPromptBlocks(AiPromptScene.AUTO_TUNE_DISPATCH);
        return String.join("\n\n",
                blocks.get(AiPromptBlockType.BASE_POLICY),
                blocks.get(AiPromptBlockType.TOOL_POLICY),
                blocks.get(AiPromptBlockType.SCENE_PLAYBOOK),
                blocks.get(AiPromptBlockType.OUTPUT_CONTRACT));
    }
    private String localTool(String name) {
        return "wcs_local_" + name;
    }