AgentField is an open-source control plane that lets you build AI agents callable by any service in your stack - frontends, backends, other agents, cron jobs - just like any other API. You write agent logic in Python, Go, or TypeScript. AgentField turns it into production infrastructure: routing, coordination, memory, async execution, and observability. Every function becomes a REST endpoint, and the same code scales from one agent on your laptop to ten thousand in a single workflow: the control plane handles the fan-out, the queues, and the retries.
Describe the system in one line. Get a production-ready multi-agent backend. Works in Claude Code, Codex, Gemini CLI, OpenCode, Aider, Windsurf, and Cursor.
curl -fsSL https://agentfield.ai/install.sh | bash
The installer also installs the codeaf coding harness in
$AGENTFIELD_HOME/bin (~/.agentfield/bin by default), so harness-backed agents
work out of the box; skip it with --no-codeaf (--no-aforge remains an alias). Staging uses
~/.agentfield-staging; an explicit AGENTFIELD_HOME selects the production
managed home. AGENTFIELD_INSTALL_DIR selects the af directory; CodeAF
always uses the managed home's bin. Repair it with af codeaf ensure.
The provider name aforge remains an alias; set AFORGE_BIN and select
provider="aforge" to pin the legacy adapter. CodeAF state stays isolated in
$AGENTFIELD_HOME/codeaf. See harness providers
for binary overrides, mirror/skip switches, and telemetry controls.
On macOS the installer also registers the control plane to start at login (under
launchd) and adds a menu-bar icon. Stop it with af service stop or the menu-bar
icon — a plain kill looks like a crash and it restarts. af service status
shows health and in-flight work; install with --no-tray to skip this entirely.
Then in your coding agent, paste any spec with /agentfield :
/agentfield Build a claims processor with risk scoring, pattern detection,
and human approval for low-confidence decisions.
You get a Docker Compose stack wired up end-to-end — the agent, the control plane, and a production ready REST API endpoint you can paste and curl into a terminal to try it. See it in action →
Plain Python (or Go / TypeScript) functions. No DSL, no YAML, no graph wiring.
import asyncio
from agentfield import Agent, AIConfig
from pydantic import BaseModel
app = Agent(
node_id="researcher",
version="1.0.0",# Canary deploys, A/B testing, blue-green rollouts
ai_config=AIConfig(model="anthropic/claude-sonnet-4-20250514"),
)
class SubQuestions(BaseModel):
questions: list[str]
@app.reasoner(tags=["research"])
async def research(question: str, depth: int = 0, model: str | None = None) -> dict:
if depth >= 3: # depth cap keeps fan-out bounded
answer = await app.ai(system="Answer directly and concisely.", user=question, model=model)
return {"question": question, "answer": answer}
# Break the question into sub-questions
plan = await app.ai(
system="Break this into 3-5 independent sub-questions.",
user=question, schema=SubQuestions, model=model,
)
# Fan out: each sub-question recurses on this same agent, through the control plane
branches = await asyncio.gather(*[
app.call(f"{app.node_id}.research", question=q, depth=depth + 1, model=model)
for q in plan.questions
])
# Synthesize the branches back into one answer
synthesis = await app.ai(system="Synthesize these findings.", user=str(branches), model=model)
return {"question": question, "answer": synthesis, "branches": branches}
app.run()
# This single line exposes: POST /api/v1/execute/researcher.research
# One request fans out to thousands of agents. The control plane queues, retries, and traces
# every branch. No broker, no queue setup, no timeout.
What you just saw:
app.ai()calls an LLM and returns structured output.app.call()routes to other agents (or back to itself) through the control plane, so recursion becomes distributed fan-out.asyncio.gather()runs every branch in parallel.app.run()auto-exposes everything as REST. Read the full docs →
from agentfield import Agent, AIConfig
from pydantic import BaseModel
app = Agent(
node_id="claims-processor",
version="2.1.0",# Canary deploys, A/B testing, blue-green rollouts
ai_config=AIConfig(model="anthropic/claude-sonnet-4-20250514"),
)
class Decision(BaseModel):
action: str# "approve", "deny", "escalate"
confidence: float
reasoning: str
@app.reasoner(tags=["insurance", "critical"])
async def evaluate_claim(claim: dict) -> dict:
# Structured AI judgment - returns typed Pydantic output
decision = await app.ai(
system="Insurance claims adjuster. Evaluate and decide.",
user=f"Claim #{claim['id']}: {claim['description']}",
schema=Decision,
)
if decision.confidence < 0.85:
# Human approval - suspends execution, notifies via webhook, resumes when approved
await app.pause(
approval_request_id=f"claim-{claim['id']}",
approval_request_url=f"https://internal.acme.com/approvals/claim-{claim['id']}",
expires_in_hours=48,
)
# Route to the next agent - traced through the control plane
await app.call("notifier.send_decision", input={
"claim_id": claim["id"],
"decision": decision.model_dump(),
})
return decision.model_dump()
app.run()
# This single line exposes: POST /api/v1/execute/claims-processor.evaluate_claim
# The agent auto-registers with the control plane, gets a cryptographic identity, and every
# execution produces a verifiable, tamper-proof audit trail.
> **What you just saw:** `app.ai()` calls an LLM and returns structured output. `app.pause()` suspends for [human approval](https://agentfield.ai/docs/build/execution/human-in-the-loop?utm_source=github-readme&utm_campaign=github-readme&utm_id=github-readme-human-in-the-loop). `app.call()` routes to other agents through the control plane. `app.run()` auto-exposes everything as REST. [Read the full docs →](https://agentfield.ai/docs/learn?utm_source=github-readme&utm_campaign=github-readme&utm_id=github-readme-read-full-docs)
af init my-agent --defaults # Scaffold agent
cd my-agent && pip install -r requirements.txt
af server # Terminal 1 → Dashboard at http://localhost:8080
python main.py # Terminal 2 → Agent auto-registers
# Call your agent
curl -X POST http://localhost:8080/api/v1/execute/my-agent.demo_echo \
-H "Content-Type: application/json" \
-d '{"input": {"message": "Hello!"}}'
```bash
# Go
af init my-agent --defaults --langu
| 日期 | 榜单 | 排名 | 周期新增 | 总 STAR |
|---|