Scaling Managed Agents: Decoupling the brain from the hands

Bài tóm tắt Anthropic 2026 3. Quy mô lớn Độ khó: Trung bình

Anthropic · 2026 · 3. Quy mô lớn · Độ khó: Trung bình — bài gốc

Bài về hạ tầng chạy agent dài hạn (Claude Managed Agents). Phần context engineering cho model chỉ tóm tắt ngắn; trọng tâm ở đây là việc tách một container chứa tất cả thành ba thành phần có trạng thái riêng.

Bối cảnh

  • Harness (vòng lặp gọi model và chuyển tool call tới hạ tầng) chứa giả định về những gì model chưa tự làm được, và giả định đó cũ đi khi model tốt lên. Anthropic muốn một dịch vụ có interface bền hơn mọi cách cài đặt cụ thể, giống OS ảo hoá phần cứng thành process, file.
  • Ba thành phần được ảo hoá: session (log chỉ-ghi-thêm mọi chuyện đã xảy ra), harness ("bộ não": model + vòng lặp), sandbox ("đôi tay": môi trường chạy code, sửa file).

Thiết kế ban đầu: một container chứa tất cả

  • Session, harness, sandbox chung một container: sửa file là syscall trực tiếp, không có ranh giới service phải thiết kế.
  • Nhưng container thành pet: container chết là mất session; container treo thì phải "chăm" cho sống lại. Cửa sổ duy nhất để nhìn vào là luồng sự kiện WebSocket, không cho biết lỗi ở đâu (bug harness, mất gói, container offline trông như nhau). Muốn gỡ thì phải mở shell vào container, mà container chứa dữ liệu user, nên thực tế là không gỡ lỗi được.
  • Harness giả định mọi thứ model làm việc nằm cùng container; khách muốn nối vào VPC của họ thì phải peer mạng hoặc tự chạy harness.

Thay đổi chính

  • Harness ra khỏi container. Nó gọi sandbox như mọi tool: execute(name, input) → string. Container thành cattle: chết thì harness nhận lỗi tool call, model quyết định thử lại thì dựng container mới bằng công thức chuẩn provision({resources}).
  • Harness cũng thành cattle. Session log nằm ngoài harness; harness crash thì chạy bản mới bằng wake(sessionId), đọc lại log bằng getSession(id) và tiếp từ sự kiện cuối; trong lúc chạy ghi bền bằng emitEvent(id, event).
  • Ranh giới bảo mật: trong thiết kế cũ, code do model sinh chạy chung chỗ với credential, nên một prompt injection chỉ cần thuyết phục model đọc môi trường của chính nó. Sửa về cấu trúc: token không bao giờ với tới được từ sandbox. Git: token dùng để clone lúc khởi tạo và gắn vào remote, push/pull chạy được mà agent không cầm token. Tool tuỳ chỉnh qua MCP: OAuth token nằm trong vault, model gọi qua một proxy nhận token của session rồi tự lấy credential.
  • Session là kho context ngoài cửa sổ của model: getEvents() cho phép lấy lát cắt theo vị trí (đọc tiếp, tua lại vài sự kiện, đọc lại trước một hành động); biến đổi context (cho prompt cache, compaction) là việc của harness. Lưu trữ bền và quản lý context được tách ra vì không đoán được model tương lai cần gì.

Kết quả

  • Container chỉ được cấp khi model cần qua tool call, nên phiên không cần sandbox không phải chờ clone repo, khởi động tiến trình. TTFT p50 giảm khoảng 60%, p95 giảm hơn 90% (theo Anthropic).
  • "Nhiều bộ não" là chạy nhiều harness stateless; "nhiều đôi tay" là mỗi sandbox, MCP server, tool là một execute. Không tay nào gắn với não nào, nên não có thể chuyển tay cho nhau.

Bài học cho SWE

  • Đưa trạng thái bền (log sự kiện) ra khỏi máy xử lý thì cả hai phía máy xử lý đều thành cattle: chết thì dựng lại và đọc log (Tách compute khỏi storage).
  • Gói mọi thứ vào một đơn vị triển khai thì nhanh lúc đầu, nhưng gộp luôn miền lỗi, quyền truy cập và khả năng gỡ lỗi; tách theo interface hẹp (execute, emitEvent) để thay từng phần (Monolith và microservices — đi và quay lại).
  • Cấp tài nguyên đắt theo nhu cầu (lazy) thay vì trả trước cho mọi phiên cắt thẳng vào latency người dùng thấy.
  • Credential phải ở ngoài nơi chạy code không tin cậy; giới hạn phạm vi token là chưa đủ.

Liên quan