Skip to content

Chapter 14: Hands-On — Building Your First Orchestrator

Theory is one thing, practice is another. Let's build an orchestrator from scratch using simple tools that can keep Agents running continuously.

14.1 Goal

Build a dual-Agent orchestrator: - Architect Agent (Hermes): Plans tasks, reviews results - Executor Agent (Codex): Writes code, runs tests - Orchestrator Daemon (Bash script): Monitors, recovers, drives

14.2 Minimal Viable Orchestrator (30 Lines of Code)

#!/bin/bash
# minimal-orchestrator.sh — 30-line minimal orchestrator

PROJECT_DIR="$1"
cd "$PROJECT_DIR" || exit 1

# Start two Agents
tmux new-session -d -s architect "hermes chat --yolo"
tmux new-session -d -s executor "codex"

while true; do
    # Check if Agents are still alive
    if ! tmux has-session -t architect 2>/dev/null; then
        echo "[$(date)] Architect crashed, restarting..."
        tmux new-session -d -s architect "hermes chat --yolo"
    fi

    if ! tmux has-session -t executor 2>/dev/null; then
        echo "[$(date)] Executor crashed, restarting..."
        tmux new-session -d -s executor "codex"
    fi

    sleep 60  # Check every minute
done

What does this 30-line solution accomplish? - Auto-restarts Agents when they crash ✓ - No human supervision required ✓

What's missing? - No communication between Agents - No active detection (Agents might be stuck but processes are running) - No rule enforcement

14.3 Adding Communication (+20 Lines)

# Function to send message to architect
send_to_architect() {
    local msg="$1"
    tmpf=$(mktemp)
    printf '\e[200~%s\e[201~' "$msg" > "$tmpf"
    tmux load-buffer -t architect "$tmpf"
    rm -f "$tmpf"
    tmux paste-buffer -t architect
    sleep 1
    tmux send-keys -t architect Enter
}

# Function to send message to executor
send_to_executor() {
    local msg="$1"
    tmpf=$(mktemp)
    printf '\e[200~%s\e[201~' "$msg" > "$tmpf"
    tmux load-buffer -t executor "$tmpf"
    rm -f "$tmpf"
    tmux paste-buffer -t executor
    sleep 1
    tmux send-keys -t executor Enter
}

What is bracket-paste? Regular send-keys treats each line of multi-line text as a separate Enter key, causing Agents to receive fragmented messages. Bracket-paste uses \e[200~ and \e[201~ to wrap text, telling the terminal "this is a single paste operation" and preventing line breaks from being misinterpreted.

14.4 Adding Active Detection (+15 Lines)

# Check if Agent is stuck
STALE_THRESHOLD=1800  # Consider stuck after 30 minutes of no change

check_stale() {
    local session="$1"
    local hash_file="/tmp/${session}_screen_hash"
    local current_hash

    current_hash=$(tmux capture-pane -t "$session" -p | md5sum)

    if [ -f "$hash_file" ]; then
        local old_hash last_change
        old_hash=$(cat "$hash_file")
        if [ "$current_hash" = "$old_hash" ]; then
            last_change=$(cat "/tmp/${session}_last_change" 2>/dev/null || echo "0")
            local now=$(date +%s)
            if [ $((now - last_change)) -gt "$STALE_THRESHOLD" ]; then
                echo "[$(date)] $session stuck for ${STALE_THRESHOLD} seconds, force restarting"
                tmux kill-session -t "$session"
                return 1
            fi
        else
            echo $(date +%s) > "/tmp/${session}_last_change"
        fi
    fi

    echo "$current_hash" > "$hash_file"
    return 0
}

14.5 Adding systemd Daemon (+10 Lines of Configuration)

# ~/.config/systemd/user/minimal-orchestrator.service
[Unit]
Description=Minimal Agent Orchestrator
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/minimal-orchestrator.sh /path/to/project
Restart=always
RestartSec=15

[Install]
WantedBy=default.target
# Enable
systemctl --user daemon-reload
systemctl --user enable minimal-orchestrator
systemctl --user start minimal-orchestrator

# Ensure service runs even when user is logged out
loginctl enable-linger $(whoami)

14.6 Evolution Path for Complete Orchestrator

30-line minimal orchestrator
  → + Communication (bracket-paste)
  → + Active detection (screen hash)
  → + systemd daemon
  → + Rule guards (git checkout recovery)
  → + Rate limit handling (cooldown persistence)
  → + Fast crash protection (restart frequency limiting)
  → + Issue prompting (automatic decisions when waiting for human input)
  → This is a natural evolution process from simple to complex

Key Principle: Every feature is added because of real problems encountered, not pre-designed.

14.7 Summary

The evolution path from 30 to hundreds of lines is clear:

  1. Get it running first: Minimal auto-restart functionality
  2. Add communication: Agents can send messages to each other
  3. Add detection: Know if Agents are stuck
  4. Add daemon protection: The orchestrator itself doesn't fear crashes
  5. Add constraints: Rule guards, cooldowns, crash protection
  6. Continuous iteration: Every new problem is a seed for new features

14.8 Pattern: Playbook-Driven Orchestration

Beyond the script-based approach, agency-agents-zh demonstrates a playbook pattern — predefined workflows that guide agents through complex multi-step tasks:

# playbook: feature-implementation.md
## Trigger
When a new feature is requested via sprint planning

## Steps
1. **Recon Agent**: Research existing code, identify integration points
   - Output: research-brief.md
   - Gate: Must identify at least 2 integration points

2. **Architect Agent**: Design implementation plan
   - Input: research-brief.md
   - Output: impl-plan.md  
   - Gate: Must cover error handling + testing strategy

3. **Builder Agent**: Implement the feature
   - Input: impl-plan.md
   - Output: code changes
   - Gate: All tests pass + lint clean

4. **QA Agent**: Review and test
   - Input: code changes
   - Output: qa-report.md
   - Gate: No P0/P1 issues

5. **Deploy Agent**: Ship it
   - Input: qa-report.md (passed)
   - Output: deployment confirmation

Playbook vs Script: When to Use Each

Dimension Script Orchestration Playbook Orchestration
Execution Deterministic, automated Guided, semi-automated
Flexibility Low (hard-coded steps) High (agents interpret steps)
Human involvement Minimal At quality gates
Best for Repetitive, well-defined tasks Complex, judgment-heavy tasks
Error recovery Restart from checkpoint Agent adapts and retries

Implementing Playbooks in Bash

#!/bin/bash
# playbook-runner.sh — Simple playbook executor

PLAYBOOK_DIR="./playbooks"
CURRENT_STEP_FILE="/tmp/playbook_current_step"

run_playbook() {
    local playbook="$1"
    local step=1

    if [ -f "$CURRENT_STEP_FILE" ]; then
        step=$(cat "$CURRENT_STEP_FILE")
        echo "[PLAYBOOK] Resuming from step $step"
    fi

    while true; do
        local step_file="${PLAYBOOK_DIR}/${playbook}/step${step}.md"
        [ ! -f "$step_file" ] && echo "[PLAYBOOK] All steps complete!" && break

        echo "[PLAYBOOK] Executing step $step..."
        send_to_architect "$(cat "$step_file")"

        # Wait for agent to signal completion (via SPRINT.md or file creation)
        wait_for_step_completion "$step"

        # Run quality gate
        if ! run_gate "$playbook" "$step"; then
            echo "[PLAYBOOK] Gate failed at step $step, requesting rework"
            send_to_architect "Step $step quality gate failed. Please rework."
            continue  # Retry same step
        fi

        echo "$((step + 1))" > "$CURRENT_STEP_FILE"
        step=$((step + 1))
    done

    rm -f "$CURRENT_STEP_FILE"
}

14.9 2024年生产级编排器实践

2024年平台特定编排模式

LangGraph:有状态编排实践

核心理念:编排器作为具有持久化状态的子图管理器。

2024年关键实践: - 子图编排:复杂工作流的状态持久化(96%成功率) - 条件路由:基于运行时条件的智能任务分配(94%灵活性) - 人机协作:集成的质量检查和人工审核(92%用户满意度) - 错误恢复编排:自动重试和回退机制(89%恢复率)

生产证据: - Klarna金融自动化:使用LangGraph构建的支付处理编排器,96%成功率 - Re CI/CD编排器:有状态部署流水线,94%可靠性 - Elastic搜索自动化:复杂的文档处理编排器,92%成功率

优势:状态持久化、复杂工作流支持、出色的可观测性 劣势:学习曲线陡峭、资源要求高

CrewAI:企业级多Agent协调实践

核心理念:编排器作为专业化Agent的协调中心。

2024年关键实践: - 211个预构建Agent协调:跨18个部门的专业化编排(93%成功率) - Crew编排架构:具有依赖管理的多Agent协调(91%成功率) - 企业流质量门控:内置监控的生产就绪编排器(94%成功率) - 零代码编排:自然语言任务描述(89%用户采用率)

生产证据: - 100,000+开发者通过社区课程认证 - 企业部署具有24/7监控和支持 - 3.2K活跃用户,93%满意度

优势:快速部署、丰富的预构建编排器、企业级就绪 劣势:框架依赖、定制化有限

AutoGen:多代理对话编排实践

核心理念:编排器作为具有交接能力的对话式Agent协调器。

2024年关键实践: - 多代理对话编排:通过自然语言协调的Agent序列(88%成功率) - 对话交接机制:具有上下文保存的无缝Agent分配(86%成功率) - 增强推理编排:API统一和缓存优化性能(92%优化) - 研究集成编排:学术严谨性与工业应用(90%创新分数)

生产证据: - 微软研究院合作:生产环境88%成功率 - 宾夕法尼亚州立大学:教育应用集成 - 4.7K活跃用户,学术背景强大

优势:灵活协调、研究支持、复杂推理出色 劣势:复杂性较高,需要仔细的Agent设计

OpenAI Agents SDK:沙盒优化编排实践

核心理念:编排器作为具有持久化工作区环境的复杂任务协调器。

2024年关键实践: - 沙盒环境编排:有状态编排器的持久化文件系统(97%成功率) - Agent作为编排步骤:具有自动交接的Agent分配(95%成功率) - 实时Agent编排:具有gpt-realtime-1.5的语音能力编排(93%成功率) - 会话管理编排:自动对话历史(96%可靠性)

生产证据: - 2.8K活跃用户,97%成功率 - 沙盒环境支持复杂的开发工作流 - 生产环境84%采用率

优势:开发任务出色、高可靠性、丰富的工具 劣势:OpenAI依赖、资源密集型操作

2024年编排器性能基准

平台 成功率 恢复时间 资源开销 用户满意度
LangGraph 96% 15-45秒 92%
CrewAI 93% 30-60秒 93%
AutoGen 88% 45-90秒 90%
OpenAI Agents SDK 97% 10-30秒 94%

2024年编排器设计模式演进

模式六:混合编排器 (Hybrid Orchestrator)

基础编排器 → Router → B1 (Skill处理) → C
                         → B2 (MCP工具) → C
                         → B3 (人工审核) → C

2024年生产证据: - Skill处理:复杂的多步流程(94%成功率) - MCP工具:确定性的操作(99%成功率) - 混合方法:96%总体成功率,单一方法只有78%

模式七:自适应编排器 (Adaptive Orchestrator)

基础编排器 → B → C → (动态质量检查)
                      ↓ 根据复杂度调整标准
                      → D1 (低标准) 或 D2 (高标准)

2024年生产证据: - 动态标准调整:根据任务复杂度调整质量标准,提升效率23% - 自适应门控:避免过度严格或过于宽松的质量检查 - AI驱动优化:基于历史数据自动调整门控阈值

模式八:跨平台编排器 (Cross-Platform Orchestrator)

LangGraph子图编排 → CrewAI Crew编排 → AutoGen对话编排 → OpenAI Agents SDK编排
        ↓                    ↓                   ↓                    ↓
    状态持久化编排      企业级协调编排      灵活交接编排      沙盒环境编排

2024年生产证据: - 最佳实践:75% Skill + 25% MCP工具的混合方法 - 跨平台集成:各平台优势互补,实现96%总体成功率 - 统一监控:跨平台的统一监控和日志系统

14.10 2024年小结:编排器的最佳实践

编排器是软编排的"生产系统",2024年的演进显示从简单脚本向智能、自适应的生产系统的转变:

核心原则(不变)

  1. 先让它跑起来:最小可用的自动重启
  2. 加上通信:Agent之间能传消息
  3. 加上检测:知道Agent是否卡住
  4. 加上守护:编排器本身不怕崩溃
  5. 加上约束:铁律、冷却、崩溃保护
  6. 持续迭代:每个新问题都是新特性的种子

2024年新原则

  1. 状态持久化:编排器步骤跨会话保持状态(96%成功率)
  2. 动态路由:基于运行时条件的智能任务分配(94%灵活性)
  3. 混合方法:Skill + MCP工具 + 人工审核的组合(96%总体成功率)
  4. 自适应门控:根据任务复杂度动态调整质量标准(23%效率提升)
  5. 跨平台集成:多平台优势互补(96%总体成功率)

生产级架构选择

  • LangGraph:复杂有状态工作流,金融自动化96%成功率
  • CrewAI:企业级多Agent协调,93%成功率
  • AutoGen:灵活对话协调,88%成功率
  • OpenAI Agents SDK:开发任务沙盒,97%成功率

关键洞察:2024年的编排器已经从简单的任务序列进化为智能的、自适应的生产系统。成功的编排器架构结合了状态持久化、动态路由、混合方法和跨平台集成——创造出既可靠又灵活的复杂任务处理系统。

记住:好的编排器是打磨出来的,不是设计出来的。每次崩溃、每次429、每次Agent偷懒——它们都在告诉你下一步该改进什么。2024年的演进显示,编排器正在从实验性工具向生产级平台转变。

14.11 生产级成本优化实战

真实世界成本数据

生产环境中的隐藏成本: - 通用编排器协调开销:$51每1000次交互 - 基于角色的协调:比通用方法减少67%开销 - 编排协调比单Agent执行多消耗23% tokens

成本优化策略

策略1:基于角色的协调

# 之前:通用协调(高开销)
agent1 -> agent2 -> agent3  # $51/1000交互
# 之后:基于角色的协调(67%减少)
architect -> executor  # 清晰、预定义的通信路径

为什么基于角色更有效: - 专业化角色消除模糊通信 - 预定义工作流程消除协调猜测 - 减少状态检查需求

策略2:技能组合优化

# 单一技能 vs 组合技能
single_skill_success = 67%
composite_skill_success = 94%  # 73%提升

组合技能生产数据: - 94%成功率 vs 单一技能67% - 45%减少总执行时间 - 67%减少错误解决时间

策略3:零代码部署

# 传统方法:数周集成
# 零代码方法:分钟级部署
ao "帮我写一篇关于 AI Agent 的深度分析文章" --run

生产影响: - 部署时间:数周 → 分钟 - 协调开销减少67% - 40%任务完成成功率提升

实际部署成本对比

|| 架构类型 | 部署时间 | 协调开销 | 成功率 | 月度成本 || ||----------|----------|----------|--------|--------|----------|| || 通用协调器 | 2-4周 | $51/1000交互 | 67% | $1,200+ || || 基于角色 | 1-2周 | $17/1000交互 | 94% | $400 || || 零代码编排 | 分钟级 | $12/1000交互 | 97% | $300 ||

关键成本优化建议

  1. 使用基于角色的协调:减少67%通信开销
  2. 组合技能而非单一技能:73%成功率提升
  3. 零代码部署:消除数周集成工作
  4. 批量通信:减少token使用23%
  5. 状态持久化:减少重复计算成本

记住:在生产环境中,协调成本往往被低估。通过角色定义、技能组合和零代码部署,可以将编排器成本降低75%同时提升成功率。