Agent Builder
Mathews-Tom/armory
Build AI agents and automate Claude Code programmatically via the Claude Agent SDK and headless CLI mode.
Map of the agent-squad Python framework for async multi-agent orchestration: which agent, classifier, storage and tool provider to pick, and the pitfalls to avoid.
$ npx skills add 2FastLabs/agent-squad --skill agent-squad-python -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install 2FastLabs/agent-squad agent-squad-python --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/2FastLabs/agent-squad.git skills-src && mkdir -p .claude/skills && cp -r skills-src/python .claude/skills/agent-squad-python && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "agent-squad-python" agent skill from https://github.com/2FastLabs/agent-squad/tree/main/python into .claude/skills/agent-squad-python/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agent-squad-python", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/2FastLabs/agent-squad/tree/main/pythonType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add 2FastLabs/agent-squad --skill agent-squad-python -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install 2FastLabs/agent-squad agent-squad-python --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/2FastLabs/agent-squad.git skills-src && mkdir -p .agents/skills && cp -r skills-src/python .agents/skills/agent-squad-python && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "agent-squad-python" agent skill from https://github.com/2FastLabs/agent-squad/tree/main/python into .agents/skills/agent-squad-python/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agent-squad-python", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add 2FastLabs/agent-squad --skill agent-squad-python -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install 2FastLabs/agent-squad agent-squad-python --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/2FastLabs/agent-squad.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/python .cursor/skills/agent-squad-python && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "agent-squad-python" agent skill from https://github.com/2FastLabs/agent-squad/tree/main/python into .cursor/skills/agent-squad-python/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agent-squad-python", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/2FastLabs/agent-squad.git --path python--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add 2FastLabs/agent-squad --skill agent-squad-python -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install 2FastLabs/agent-squad agent-squad-python --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/2FastLabs/agent-squad.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/python .gemini/skills/agent-squad-python && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "agent-squad-python" agent skill from https://github.com/2FastLabs/agent-squad/tree/main/python into .gemini/skills/agent-squad-python/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agent-squad-python", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install 2FastLabs/agent-squad agent-squad-pythonInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add 2FastLabs/agent-squad --skill agent-squad-python -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/2FastLabs/agent-squad.git skills-src && mkdir -p .github/skills && cp -r skills-src/python .github/skills/agent-squad-python && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "agent-squad-python" agent skill from https://github.com/2FastLabs/agent-squad/tree/main/python into .github/skills/agent-squad-python/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agent-squad-python", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add 2FastLabs/agent-squad --skill agent-squad-python -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install 2FastLabs/agent-squad agent-squad-python --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/2FastLabs/agent-squad.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/python .opencode/skills/agent-squad-python && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "agent-squad-python" agent skill from https://github.com/2FastLabs/agent-squad/tree/main/python into .opencode/skills/agent-squad-python/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agent-squad-python", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
agent-squad-pythonMap of the agent-squad Python framework for async multi-agent orchestration: which agent, classifier, storage and tool provider to pick, and the pitfalls to avoid.
This guide supports building or changing Python apps with the agent-squad package, an async-first, dependency-optional multi-agent orchestration framework for Python 3.11 or later. It is a map rather than an API reference: the agent is told to read exact signatures from the source and docs and to use the guide for what to choose, when, and what to watch for. Third-party integrations are optional extras, installed for example with `agent-squad[aws]`, `agent-squad[anthropic]` or `agent-squad[mcp]`.
A when-to-use section matches needs to building blocks: a single `Agent` subclass for one assistant, several agents behind an `AgentSquad` orchestrator whose classifier routes each turn, `GroundedAgent` when answers must not drift from live data, `ChainAgent` for a fixed pipeline, `SupervisorAgent` for a lead agent delegating to a team, and `MCPToolProvider` to bring in tools from MCP servers. The guide stresses that `route_request` is a coroutine to await and that responses should be handled according to their `streaming` flag. The description also names storage, retriever and classifier options; the excerpt is truncated.
Read from SKILL.md and the folder at commit 729d5f5. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships script files (Python, from the files we listed), which the agent can run.
Shell commands in SKILL.md call:
pipnpmmakeFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use pip and npm, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
DAKERA_API_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Agent Squad Python Guide loads about 4.7k tokens when it runs. Until then it costs about 117 tokens; SKILL.md has 1,498 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from 2FastLabs/agent-squad at commit 729d5f5, republished under its Apache-2.0 licence (© 2FastLabs). 1,498 words, ~4,725 tokens.
.claude/skills/agent-squad-python/SKILL.md (or your agent's skills folder). This skill also uses 112 other files; get the full folder from GitHub.Async-first, dependency-optional multi-agent orchestration framework (Python 3.11+). This is a
guide and a map — not an API reference. Read exact signatures from the source
(python/src/agent_squad/) and the docs site (docs/src/content/docs/); this file tells you
what to use, when, and what to watch out for.
Agent subclass; no orchestrator needed, call process_request
directly.AgentSquad orchestrator; the classifier routes
each turn to the right agent automatically.GroundedAgent: a gatherer
LLM calls tools and sees raw results but never speaks to the user; an isolated presenter LLM
writes the reply grounded only on curated facts.ChainAgent: routes the output of one agent as the input to the next,
sequentially.SupervisorAgent: a lead BedrockLLMAgent or AnthropicAgent delegates
to a team of sub-agents via an internal tool loop, maintaining shared context. Can itself be
registered in an AgentSquad.MCPToolProvider (requires agent-squad[mcp]) connects any number
of MCP servers (stdio or SSE) and makes their tools available to any agent.All third-party integrations are optional extras — never forced on users who don't need them.
pip install agent-squad # core only (no LLM runtime)
pip install "agent-squad[aws]" # + boto3 — BedrockLLMAgent, BedrockClassifier, DynamoDbChatStorage, etc.
pip install "agent-squad[anthropic]" # + anthropic SDK — AnthropicAgent, AnthropicClassifier
pip install "agent-squad[openai]" # + openai SDK — OpenAIAgent, OpenAIClassifier
pip install "agent-squad[sql]" # + libsql-client — SqlChatStorage (Turso/libSQL)
pip install "agent-squad[strands-agents]"# + strands-agents — StrandsAgent
pip install "agent-squad[dakera]" # + dakera — DakeraRetriever
pip install "agent-squad[mcp]" # + mcp — MCPToolProvider
pip install "agent-squad[all]" # everything except strands-agentsAgentSquad.route_request is the one entry point worth memorising. It is a coroutine — you must
await it.
import asyncio
from agent_squad.orchestrator import AgentSquad
from agent_squad.agents import BedrockLLMAgent, BedrockLLMAgentOptions
from agent_squad.classifiers import BedrockClassifier, BedrockClassifierOptions
orchestrator = AgentSquad(
classifier=BedrockClassifier(BedrockClassifierOptions())
)
orchestrator.add_agent(BedrockLLMAgent(BedrockLLMAgentOptions(
name="General Assistant",
description="Handles general knowledge questions",
)))
async def main():
response = await orchestrator.route_request(
user_input="What is the capital of France?",
user_id="user-123",
session_id="session-abc",
)
if response.streaming:
# response.output is an async generator of AgentStreamResponse
async for chunk in response.output:
if chunk.text:
print(chunk.text, end="", flush=True)
if chunk.final_message:
pass # full ConversationMessage — already persisted
else:
# response.output is a ConversationMessage
print(response.output.content[0]["text"])
asyncio.run(main())AgentResponse has three fields: metadata (AgentProcessingResult), output, and streaming
(bool). Always branch on response.streaming — the type of output differs.
To stream back from route_request, pass stream_response=True:
response = await orchestrator.route_request(
user_input="...",
user_id="u1",
session_id="s1",
stream_response=True,
)If no agent is selected and no default agent is configured, route_request returns an
AgentResponse with the NO_SELECTED_AGENT_MESSAGE text rather than raising.
from agent_squad.orchestrator import AgentSquad
The top-level object. Holds an agent registry, a classifier, and a ChatStorage.
from agent_squad.types import AgentSquadConfig
orchestrator = AgentSquad(
options=AgentSquadConfig(
LOG_CLASSIFIER_OUTPUT=True,
MAX_MESSAGE_PAIRS_PER_AGENT=20,
USE_DEFAULT_AGENT_IF_NONE_IDENTIFIED=True,
),
storage=my_storage, # default: InMemoryChatStorage
classifier=my_classifier, # default: BedrockClassifier (if boto3 installed)
default_agent=fallback, # used when classifier returns no match
)
orchestrator.add_agent(agent)AgentSquadConfig fields: LOG_AGENT_CHAT, LOG_CLASSIFIER_CHAT, LOG_CLASSIFIER_RAW_OUTPUT,
LOG_CLASSIFIER_OUTPUT, LOG_EXECUTION_TIMES, MAX_RETRIES, USE_DEFAULT_AGENT_IF_NONE_IDENTIFIED,
NO_SELECTED_AGENT_MESSAGE, GENERAL_ROUTING_ERROR_MSG_MESSAGE, MAX_MESSAGE_PAIRS_PER_AGENT.
You can also call classify_request and agent_process_request separately if you need to inspect
the routing decision before dispatching.
All agents require agent-squad[aws], [anthropic], or [openai] depending on the underlying
SDK. The base Agent and AgentOptions plus SupervisorAgent and GroundedAgent are always
available with the core install.
| Agent | Extra needed | Notes |
|---|---|---|
BedrockLLMAgent | aws | Bedrock Converse API; supports streaming, tools, retriever |
AmazonBedrockAgent | aws | Bedrock Agents runtime (managed agents with KB/action groups) |
BedrockInlineAgent | aws | Bedrock inline agents — code interpretation, KB, and tools inline |
BedrockFlowsAgent | aws | Bedrock Flows — runs a preconfigured flow |
BedrockTranslatorAgent | aws | Bedrock translation agent |
LambdaAgent | aws | Invokes an AWS Lambda function |
LexBotAgent | aws | Routes to an Amazon Lex bot |
ComprehendFilterAgent | aws | Comprehend PII/toxicity filter before passing to another agent |
ChainAgent | aws | Sequential pipeline — each agent's output feeds the next |
AnthropicAgent | anthropic | Anthropic Messages API; supports streaming and tools |
OpenAIAgent | openai | OpenAI Chat Completions API; supports streaming and tools |
StrandsAgent | strands-agents | Strands Agents integration |
SupervisorAgent | aws or anthropic | Lead agent coordinates a team via tools; always available in __init__.py but requires a compatible lead_agent |
GroundedAgent | same as gatherer/presenter | Two-LLM anti-hallucination pattern; always importable |
All agents extend Agent (agent_squad.agents.agent). The AgentOptions dataclass is the
construction pattern — every concrete agent has a matching *Options dataclass that extends it:
from agent_squad.agents import BedrockLLMAgent, BedrockLLMAgentOptions
from agent_squad.utils import AgentTools, AgentTool
agent = BedrockLLMAgent(BedrockLLMAgentOptions(
name="My Agent",
description="Handles X", # shown to the classifier
model_id="anthropic.claude-3-5-sonnet-20240620-v1:0",
streaming=True,
save_chat=True, # default True — persists history
tool_config={"tool": my_tools}, # AgentTools instance
retriever=my_retriever,
LOG_AGENT_DEBUG_TRACE=False,
))GroundedAgent takes a gatherer, presenter, tools, optional curator
(ToolOutputCurator), and optional presenter_prompt (PresenterPrompt). The gatherer runs the
tool loop; the presenter receives only the curated data and never sees the chat history or the
gatherer's transcript.
SupervisorAgent takes a lead_agent (must be BedrockLLMAgent or AnthropicAgent), a
team list, optional storage, and optional extra_tools. The lead agent must not have its own
tool_config — tools are managed internally. Use extra_tools for additional tools beyond the
team-dispatch tools.
ChainAgent (requires aws) takes an agents list. Each agent's text output becomes the next
agent's input.
from agent_squad.classifiers import BedrockClassifier, AnthropicClassifier, OpenAIClassifier
| Classifier | Extra needed |
|---|---|
BedrockClassifier | aws |
AnthropicClassifier | anthropic |
OpenAIClassifier | openai |
The orchestrator defaults to BedrockClassifier if boto3 is installed and no classifier is
provided. If boto3 is not installed and no classifier is passed, the orchestrator raises
ValueError at construction time.
All classifiers extend Classifier (agent_squad.classifiers.classifier). You can override the
routing prompt via set_system_prompt(template, variables) where {{AGENT_DESCRIPTIONS}} and
{{HISTORY}} are the built-in template placeholders.
from agent_squad.storage import InMemoryChatStorage, DynamoDbChatStorage, SqlChatStorage
| Storage | Extra needed | Notes |
|---|---|---|
InMemoryChatStorage | none | Default; not persistent |
DynamoDbChatStorage | aws | DynamoDB-backed; production default for AWS deployments |
SqlChatStorage | sql | libSQL/Turso-backed |
SummarizingChatStorage | none | Wraps any storage; compresses history via a user-supplied async callable when history exceeds trigger_at pairs |
All storage classes extend ChatStorage (agent_squad.storage.chat_storage). Storage is keyed by
(user_id, session_id, agent_id). MAX_MESSAGE_PAIRS_PER_AGENT (default 100) trims history at
write time. save_chat=False on an agent disables history for that agent only.
from agent_squad.retrievers import AmazonKnowledgeBasesRetriever, DakeraRetriever
| Retriever | Extra needed | Notes |
|---|---|---|
AmazonKnowledgeBasesRetriever | aws | Amazon Bedrock Knowledge Bases |
DakeraRetriever | dakera | Self-hosted Dakera memory server |
All retrievers extend Retriever (agent_squad.retrievers.retriever). A retriever attached to an
agent augments its prompt with retrieved context before the LLM call.
DakeraRetriever reads DAKERA_API_KEY and DAKERA_URL from environment variables if not
provided in DakeraRetrieverOptions.
AgentTools / AgentTool — the native tool system, always available:
from agent_squad.utils import AgentTools, AgentTool
def get_weather(city: str) -> str:
"""Get the weather for a city.
:param city: The city name.
"""
return f"Sunny in {city}"
tools = AgentTools(tools=[
AgentTool(name="get_weather", func=get_weather)
])
# AgentTool auto-extracts properties from type hints and :param docstrings.AgentTool wraps both sync and async functions transparently. Properties, descriptions, and
required fields can be overridden explicitly. AgentTools.tool_handler processes tool call
responses for Bedrock and Anthropic wire formats.
MCPToolProvider — drop-in AgentTools subclass for MCP servers (requires agent-squad[mcp]):
from agent_squad.tools import MCPToolProvider, MCPServerConfig
provider = await MCPToolProvider.create([
MCPServerConfig(type="stdio", command="uvx", args=["my-mcp-server"]),
MCPServerConfig(type="sse", url="http://localhost:3000/sse"),
])
agent = BedrockLLMAgent(BedrockLLMAgentOptions(
name="MCP Agent",
description="...",
tool_config={"tool": provider},
))
# Clean up when done:
await provider.disconnect()MCPToolProvider.create is an async factory — it connects to all servers and fetches tool
definitions upfront so they are available synchronously when the agent builds its API request.
AgentCallbacks (on AgentOptions) hooks into the agent lifecycle:
on_agent_start — returns a dict (tracking info) available to other callbacks via kwargson_agent_endon_llm_starton_llm_new_tokenon_llm_endAgentToolCallbacks (on AgentTools) hooks into tool execution:
on_tool_starton_tool_endon_tool_errorClassifierCallbacks hooks into the classifier:
on_classifier_starton_classifier_stopSubclass the abstract base and pass your instance where the built-in goes. Source paths are
under python/src/agent_squad/.
| Seam | Base class | Source file |
|---|---|---|
| Agent | Agent | agents/agent.py |
| Classifier | Classifier | classifiers/classifier.py |
| Storage | ChatStorage | storage/chat_storage.py |
| Retriever | Retriever | retrievers/retriever.py |
| Tool curator | ToolOutputCurator | agents/grounded_agent.py |
| Presenter prompt | PresenterPrompt | agents/grounded_agent.py |
Minimal custom agent:
from typing import Optional, AsyncIterable, Union
from agent_squad.agents import Agent, AgentOptions
from agent_squad.types import ConversationMessage, ParticipantRole
class MyAgent(Agent):
def __init__(self, options: AgentOptions):
super().__init__(options)
async def process_request(
self,
input_text: str,
user_id: str,
session_id: str,
chat_history: list[ConversationMessage],
additional_params: Optional[dict] = None,
) -> Union[ConversationMessage, AsyncIterable]:
return ConversationMessage(
role=ParticipantRole.ASSISTANT.value,
content=[{"text": f"Echo: {input_text}"}],
)For a streaming custom agent, also override is_streaming_enabled to return True and yield
AgentStreamResponse objects (set final_message on the last one).
route_request, process_request, classify, storage methods,
and retriever methods are all coroutines. You must await them inside an async context. Use
asyncio.run(main()) at the top level.try/except ImportError at the top of each module. If you copy this pattern
for your own extensions, keep the guard at module level — never inside __init__ or a method.AgentSquad raises at
construction time if no classifier can be resolved (no boto3 installed and no classifier
passed). Always pass a classifier explicitly when boto3 is not available.response.streaming and response.output type are coupled. When streaming=True, output
is an async generator; when False, it is a ConversationMessage. Always branch on
response.streaming before consuming output.stream_response=False by default. Even if the agent itself streams internally, the
orchestrator will drain the stream and return a single ConversationMessage unless you pass
stream_response=True to route_request.id is derived from name via generate_key_from_name: lowercased, spaces replaced
with hyphens, special characters stripped. agent.id is the storage key — two agents with names
that normalise to the same string will collide. Pick distinct names.AgentOptions is a dataclass; new fields must have defaults. When subclassing (e.g.
BedrockLLMAgentOptions), add new fields with defaults so existing construction call-sites
keep working.SupervisorAgent name and description come from the lead agent. Whatever you set on
SupervisorAgentOptions.name / .description is overwritten by lead_agent.name /
lead_agent.description at construction time.SupervisorAgent forbids tool_config on the lead agent. The supervisor manages tools
internally. Use extra_tools for any additional tools beyond team dispatch.GroundedAgent presenter isolation is strict. The presenter never sees chat history or the
gatherer's transcript — only the curated data produced by the ToolOutputCurator. A chit-chat
turn that calls no tools is answered by the gatherer alone (presenter is skipped).MCPToolProvider.create is async. It must be awaited before building the agent. Call
await provider.disconnect() when done to close server connections.save_chat=True by default. Every agent persists both sides of each exchange unless
explicitly set to False. Storage is scoped per (user_id, session_id, agent_id). The
MAX_MESSAGE_PAIRS_PER_AGENT config trims at save time, not at fetch time.ConversationMessage.content is a list of dicts, not a plain string. Text is at
content[0]["text"] for most agents. Some agents may produce multi-block content (tool use,
images). Do not assume content has a single element.DakeraRetriever and AmazonKnowledgeBasesRetriever are not import-guarded — they are
always exported from agent_squad.retrievers. If the underlying SDK (dakera, boto3) is not
installed, the import will fail at runtime when you try to construct them.docs/src/content/docs/ (run with
npm run dev from docs/): get-started/, agents/, classifiers/, storage/, retrievers/,
tools/.python/src/agent_squad/:orchestrator.py — AgentSquad, route_request, classify_request, agent_process_requestagents/agent.py — Agent, AgentOptions, AgentCallbacks, AgentResponse, AgentStreamResponseagents/grounded_agent.py — GroundedAgent, GroundedAgentOptions, ToolOutputCurator, DataBlockCurator, PerToolCurator, PresenterPrompt, CapturedToolResultagents/supervisor_agent.py — SupervisorAgent, SupervisorAgentOptionsagents/chain_agent.py — ChainAgent, ChainAgentOptionsclassifiers/classifier.py — Classifier, ClassifierResult, ClassifierCallbacksstorage/chat_storage.py — ChatStorageretrievers/retriever.py — Retrieverutils/tool.py — AgentTools, AgentTool, AgentToolCallbacks, AgentToolResulttools/mcp_tool_provider.py — MCPToolProvider, MCPServerConfigtypes/types.py — ConversationMessage, ParticipantRole, AgentSquadConfig, TimestampedMessagepython/src/tests/ — pytest; run from python/ with make test.python/setup.cfg — [options.extras_require].© 2FastLabs, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 112 other files in python of 2FastLabs/agent-squad.
Open the folder on GitHubat commit 729d5f5
Agent Squad Python Guide next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Agent Squad Python Guide this skill2FastLabs/agent-squad | 7.8k | — | ~4.7k | Automated safety check: Pass | Apache-2.0 | |
| Agent BuilderMathews-Tom/armory | 327 | — | ~1.7k | Automated safety check: Pass | MIT | |
| Ydc Openai Agent SDK IntegrationLeoYeAI/openclaw-master-skills | 2.2k | — | ~4.4k | Automated safety check: Notes | MIT | |
| Using Ccproxy Inspectorstarbaser/ccproxy | 348 | — | ~2.7k | Automated safety check: Pass | Custom licence | |
| Bootstrapping Agentairbytehq/airbyte-agent-sdk | 135 | — | ~1.7k | Automated safety check: Notes | Custom licence | |
| Tool Designagentailor/fullstack-langgraph-nextjs-agent | 132 | — | ~3.2k | Automated safety check: Pass | MIT |
Mathews-Tom/armory
Build AI agents and automate Claude Code programmatically via the Claude Agent SDK and headless CLI mode.
LeoYeAI/openclaw-master-skills
Integrate OpenAI Agents SDK with You.com MCP server - Hosted and Streamable HTTP support for Python and TypeScript.
starbaser/ccproxy
Operates the ccproxy inspector MITM system for intercepting, inspecting, and transforming LLM API traffic.
airbytehq/airbyte-agent-sdk
Wires up an Airbyte connector for use in a PydanticAI, Claude SDK, or other agent.
agentailor/fullstack-langgraph-nextjs-agent
Design and verify tools that AI agents can actually use — for any framework or language (MCP servers, LangChain/LangGraph, function-calling, raw JSON schema; TypeScript, Python, or otherwise).
bitrouter/bitrouter
A skill your agent uses when a user wants to run, compare, resume, audit, share, or submit a Harbor benchmark through BitRouter, including choosing a Harbor dataset and agent, confirming routed…
2FastLabs/agent-squad
Guides building on-device multi-agent apps in Swift with the AgentSquad framework: which agent, orchestrator, classifier, storage or voice type fits each situation.
2FastLabs/agent-squad
Guide to building Node.js and TypeScript apps on the agent-squad package: orchestrator, agent types, classifier routing, storage, retrievers and MCP tools.
Categories
Map of the agent-squad Python framework for async multi-agent orchestration: which agent, classifier, storage and tool provider to pick, and the pitfalls to avoid. 11 or later. It is a map rather than an API reference: the agent is told to read exact signatures from the source and docs and to use the guide for what to choose, when, and what to watch for.
Agent Squad Python Guide fits situations like: building a multi-agent Python app with agent-squad; routing conversations between specialist agents with a classifier; adding a supervisor, chain or grounded agent to an existing squad; connecting MCP server tools to agent-squad agents.
Run `npx skills add 2FastLabs/agent-squad --skill agent-squad-python -a claude-code`. Or copy the skill folder (python in 2FastLabs/agent-squad) into .claude/skills/agent-squad-python in your project. Claude Code loads it when a task matches its description.
Run `npx skills add 2FastLabs/agent-squad --skill agent-squad-python -a codex`. Or copy the skill folder (python in 2FastLabs/agent-squad) into .agents/skills/agent-squad-python in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add 2FastLabs/agent-squad --skill agent-squad-python -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/agent-squad-python, .gemini/skills/agent-squad-python, .github/skills/agent-squad-python and .opencode/skills/agent-squad-python in your project.
Going by SKILL.md and its folder, Agent Squad Python Guide needs Python for the scripts in its folder, the command-line tools its instructions call (pip, npm and make) and credentials named DAKERA_API_KEY. Our summary lists: Python 3.11 or later; The agent-squad package, plus extras such as aws, anthropic or mcp for the integrations you use.
SKILL.md contains no URLs. Its commands use pip and npm, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Agent Squad Python Guide is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.7k tokens (SKILL.md is roughly 19k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Agent Squad Python Guide: Agent Builder (Mathews-Tom/armory, 327 stars), Ydc Openai Agent SDK Integration (LeoYeAI/openclaw-master-skills, 2.2k stars), Using Ccproxy Inspector (starbaser/ccproxy, 348 stars) and Bootstrapping Agent (airbytehq/airbyte-agent-sdk, 135 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
2FastLabs (a GitHub organization) maintains it in 2FastLabs/agent-squad, which has 7,787 GitHub stars. The repository holds 3 skills in this directory. The repository was last updated on October 7, 2026.
Source: 2FastLabs/agent-squad on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.