# ════════════════════════════════════════════════════════════
# Assembler — 配置组装师
# ════════════════════════════════════════════════════════════
#
# 将 Analyst + Retriever + Prompter 的输出合并为完整 YAML

agentId: builder-assembler
name: 配置组装师
description: >
  将需求分析、参考配置、systemPrompt 三份输入合并组装为
  一个完整的、符合 schema 的 agent YAML 配置文件。

type: chain

model:
  provider: dashscope
  name: qwen3-max-2026-01-23
  temperature: 0.1
  maxTokens: 4096

systemPrompt: |
  你是 agent 配置组装专家。你将三份专家分析材料合并为一份完整的 YAML 配置。
  严格遵循 lambdagent 的 YAML schema 规范。

chain:
  steps:
    - name: merge_inputs
      prompt: |
        将以下三份专家材料合并为一份 agent 配置草案。

        【需求分析 (Analyst)】
        {analyst_output}

        【参考配置 (Retriever)】
        {retriever_output}

        【SystemPrompt (Prompter)】
        {prompter_output}

        ## 字段映射规则

        agentId: 根据核心能力生成 kebab-case 标识（如 stock-analyzer, csv-processor）
        name: 中文名称，简洁（如 "股票分析助手"）
        description: 一句话描述
        type: 取 Analyst 的 agent_type

        model:
          provider: 根据 Analyst 的 tier 映射
            - high → anthropic (claude-sonnet-4-20250514) 或 dashscope (qwen3-max-2026-01-23)
            - medium → dashscope (qwen-plus)
            - low → dashscope (qwen-plus) 或 moonshot (moonshot-v1-128k)
          temperature: 推理任务 0.1-0.3, 创作任务 0.5-0.8
          maxTokens: 一般 2048, 长文 4096

        systemPrompt: 直接使用 Prompter 的 PROMPT_V1

        react/chain/router/parallel: 根据 type 生成对应配置块
          - react: maxSteps 根据任务复杂度 5-15, toolTimeout 30
          - chain: 根据 Analyst 分析的步骤构建 steps

        memory:
          enabled: Analyst 的 memory_required
          strategy: local
          size: 20
          ttl: 3600

        mcp:
          localTools: 从 Analyst 的 tools_needed 映射
            - shell → shell
            - file → file
            - browser → browser
            - search → 添加到 onlineTool (example-mcp-server)
            - 始终包含 terminate
          onlineTool: 如果需要 search，添加 example-mcp-server
          policy: { mode: auto }

        guard:
          - safety=high → dangerousCommandBlock: true, highRiskConfirmation: true
          - safety=medium → highRiskConfirmation: true
          - 始终设 maxOutputLength: 5000

        rag: 如果 Analyst 的 rag_required=true，添加 rag 配置

        app.mcp.custom: 如果有 onlineTool，添加 example-mcp-server 节点配置

        如果 Retriever 有相关参考配置，优先复用其验证过的参数值。

        输出完整 YAML，不省略任何字段。
      outputParser: text

    - name: fill_defaults
      prompt: |
        检查以下 YAML 配置，补全缺失的默认值并修正格式问题。

        {merge_inputs}

        ## 默认值检查清单

        1. agentId — 必须存在，kebab-case
        2. name — 必须存在
        3. description — 必须存在
        4. type — 必须是 react/chain/router/parallel 之一
        5. model.provider — 必须在支持列表: anthropic, openai, dashscope, deepseek, zhipu, moonshot, ollama
        6. model.name — 必须与 provider 匹配
        7. model.temperature — [0.0, 2.0], 默认 0.3
        8. model.maxTokens — 默认 2048
        9. react.maxSteps — 默认 10 (仅 type=react)
        10. react.observationEnabled — 默认 true
        11. react.toolTimeout — 默认 30
        12. memory.enabled — 默认 true
        13. memory.strategy — 默认 local
        14. memory.size — 默认 20
        15. memory.ttl — 默认 3600
        16. mcp.localTools — 必须包含 terminate
        17. mcp.policy.mode — 默认 auto
        18. guard.maxOutputLength — 默认 5000

        ## provider → model name 映射表

        anthropic: claude-sonnet-4-20250514, claude-opus-4-20250514
        openai: gpt-4o, gpt-4o-mini
        dashscope: qwen3-max-2026-01-23, qwen-max, qwen-plus
        deepseek: deepseek-chat, deepseek-reasoner
        zhipu: glm-4-plus, glm-4-flash
        moonshot: moonshot-v1-128k
        ollama: llama3, qwen2

        输出补全后的完整 YAML。
      outputParser: text

    - name: validate_output
      prompt: |
        最终验证以下 YAML 配置，确保可以直接部署运行。

        {fill_defaults}

        ## 验证项

        1. YAML 语法合法性（缩进、引号、特殊字符转义）
        2. 必填字段完整: agentId, name, type, systemPrompt, model
        3. type 与子配置匹配: type=react 必须有 react 块, type=chain 必须有 chain 块
        4. model.provider + model.name 组合合法
        5. mcp.localTools 中的工具名合法
        6. systemPrompt 不为空且长度 > 50 字符
        7. 如果有 onlineTool，必须有对应的 app.mcp.custom.nodes 配置
        8. guard 配置合理（不冲突）

        如果发现问题，直接修复后输出。
        如果没有问题，原样输出完整 YAML。

        最终输出必须是纯 YAML（不要包裹在 markdown 代码块中）。
      outputParser: text
      guard:
        validator: "'agentId' in x and 'systemPrompt' in x and 'model' in x"
        retry: 2

memory:
  enabled: false
