prompts.js 4.23 KB
/**
 * Prompts - 编排器提示词模板
 * 
 * 所有发给 Master Agent 的提示词集中管理,禁止字符串拼接。
 */

const Prompts = {
  /**
   * 首轮提示词:将用户需求发给 Master
   */
  initial(requirement, agentList) {
    return `\
## 任务需求

${requirement}

## 可用子 Agent

${agentList}

## 调度指令

请分析上述需求,然后调用合适的子 Agent 执行任务。

**推荐格式(JSON):**
\`\`\`json
{ "agent": "agent_name", "task": "具体任务描述" }
\`\`\`

**备选格式(文本标记):**
[CALL: agent_name]
具体任务描述
[/CALL]

⚠️ 你是调度者,禁止直接编写代码或使用任何工具。你的输出只能是需求分析和调度指令。`;
  },

  /**
   * 本轮执行结果反馈 → 强制 Master 做 Reflection + Summary
   */
  followup({ currentResults, passedValidators, unpassedValidators }) {
    const resultBlocks = currentResults
      .map(r => {
        // 优先使用完整输出(含诗歌/小说等内容),降级到 message
        const content = r.output || r.message || '(无)';
        return `--- ${r.agent} ---\n状态: ${r.status}\n完整输出:\n${content}`;
      })
      .join('\n\n');

    // 产出文件展示
    const allArtifacts = currentResults
      .filter(r => r.artifacts?.length > 0)
      .map(r => `### ${r.agent} 产出文件\n${r.artifacts.map(f => `- ${f}`).join('\n')}`)
      .join('\n\n');

    const artifactsBlock = allArtifacts
      ? `\n## 已产出文件\n\n${allArtifacts}\n`
      : '';

    return `\
## Sub Agent 执行结果

${resultBlocks.trim()}
${artifactsBlock}

---

## ⚠️ 你现在必须按顺序做以下两件事(不可跳过):

### 第一步:Reflection(反思评估)

对每个 Sub Agent 的返回结果逐一评估:
- 产出内容是否满足用户的原始需求?
- 内容质量如何?(格式正确性、内容准确度、创作水平)
- 决策:
  - ✅ PASS → 接受结果,进入总结
  - 🔄 RETRY → 不满意,重新调用该 Agent(用 [CALL: agent_name]改进指令[/CALL])

### 第二步:Summary(总结 — 仅当所有结果 PASS 时执行)

你**必须**输出面向用户的中文总结,**核心要求:直接展示用户要的内容**:
- 用户要写诗 → 把诗的**全文**贴出来
- 用户要写小说 → 列出每个章节的文件名和内容摘要
- 用户要做研究 → 列出研究的核心发现

格式:
\`\`\`
📝 Reflection:
[对 Sub Agent 输出的评估]

✅ 任务完成

[诗歌/小说/研究结果的完整内容]

**后续建议**:
- ...

[RESULT: DONE]
完成
[/RESULT]
\`\`\`

---

⚠️ 格式提醒:
- 重新调用 Agent: [CALL: agent_name]改进指令[/CALL]
- 完成: 先写 Reflection + Summary,再写 [RESULT: DONE]完成[/RESULT]`;
  },

  /**
   * Master 越权后强制验证
   */
  forceValidation(files, validators) {
    return `\
⚠️ 系统提醒:检测到工作目录中已有文件(${files.join(', ')}),现在需要验证这些文件的质量。

请调用以下 validator 进行验证:${validators.join(', ')}

记住:使用 [CALL: validator_name]...[/CALL] 格式调用。`;
  },

  /**
   * 任务未完成,强制 Master 继续调度
   */
  forceResume(unpassedValidators) {
    return `\
⚠️ 系统警告:任务尚未完成。以下 validator 尚未通过:${unpassedValidators.join(', ')}。

请使用 [CALL: agent_name]...[/CALL] 调用这些 validator 进行验证,或调用 executor 修复问题。

提醒:你是调度者,禁止直接执行任务。`;
  },

  /**
   * Agent 输出格式不对时的自动纠正提示
   */
  formatCorrection({ agentType, retryCount, maxRetries, originalTask }) {
    const expectedFormats = agentType === 'validator'
      ? '[RESULT: PASS]...[/RESULT] 或 [RESULT: FAIL]...[/RESULT]'
      : '[RESULT: DONE]...[/RESULT] 或 [RESULT: ERROR]...[/RESULT]';

    return `\
⚠️ 系统格式纠正(自动重试 ${retryCount}/${maxRetries}):

你上一次的输出缺少必需的 [RESULT] 标记,系统无法解析你的判定结果。

**你的输出最后必须包含以下格式的标记:**
${expectedFormats}

请重新执行以下任务,并确保输出最后包含正确的 [RESULT] 标记:

---

${originalTask}`;
  },
};

module.exports = { Prompts };