Observed since 20 Oct, 18:23 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
A library for spawning and managing agents through the Agent Client Protocol (ACP)
A Python library for spawning and managing AI agents through the Agent Client Protocol (ACP).
pip install acp-factory
claude once to set up)ANTHROPIC_API_KEY environment variableimport asyncio
from acp_factory import AgentFactory
async def main():
# Spawn a Claude Code agent
agent = await AgentFactory.spawn("claude-code", {
"permission_mode": "auto-approve",
})
# Create a session
session = await agent.create_session(".")
# Send a prompt and stream responses
async for update in session.prompt("What files are in this directory?"):
if update.get("session_update") == "agent_message_chunk":
content = update.get("content", {})
if content.get("type") == "text":
print(content.get("text", ""), end="")
# Clean up
await agent.close()
asyncio.run(main())
Static class for managing agent types and spawning agents.
# List available agents
AgentFactory.list_agents() # ["claude-code", "codex", "gemini", "opencode"]
# Register a custom agent
AgentFactory.register("my-agent", AgentConfig(
command="my-agent",
args=["--acp"],
env={"MY_VAR": "value"},
))
# Spawn an agent
agent = await AgentFactory.spawn("claude-code", options)
Represents a running agent process.
# Agent capabilities
agent.capabilities # {"loadSession": True, ...}
# Create a new session
session = await agent.create_session("/path/to/cwd", SessionOptions(
mode="code",
mcp_servers=[],
))
# Load an existing session
session = await agent.load_session(session_id, "/path/to/cwd")
# Close the agent
await agent.close()
# Check if running
agent.is_running() # True/False
High-level interface for interacting with an agent session.
# Session properties
session.id # Session ID
session.modes # Available modes ["code", "ask", ...]
session.models # Available models ["claude-sonnet-4-...", ...]
# Send a prompt (returns async iterator)
async for update in session.prompt("Hello!"):
# Handle updates
pass
# Cancel the current prompt
await session.cancel()
# Set the session mode
await session.set_mode("ask")
# Interrupt and redirect with new context
async for update in session.interrupt_with("Focus on tests only"):
# Handle updates from new prompt
pass
Control how permission requests are handled:
from acp_factory import SpawnOptions
# Auto-approve all requests (default)
await AgentFactory.spawn("claude-code", SpawnOptions(
permission_mode="auto-approve",
))
# Auto-deny all requests
await AgentFactory.spawn("claude-code", SpawnOptions(
permission_mode="auto-deny",
))
# Use a callback handler
async def handle_permission(request):
return {"outcome": {"outcome": "selected", "option_id": "allow"}}
await AgentFactory.spawn("claude-code", SpawnOptions(
permission_mode="callback",
on_permission_request=handle_permission,
))
# Interactive mode - permissions emitted as session updates
await AgentFactory.spawn("claude-code", SpawnOptions(
permission_mode="interactive",
))
# Clone the repository
git clone https://github.com/sudocode-ai/acp-factory.git
cd acp-factory/python
# Install with dev dependencies
make dev
# or
pip install -e ".[dev]"
# Run tests
make test
# Run linter
make lint
# Format code
make format
# Type check
make typecheck
# Clean build artifacts
make clean
[distutils]
index-servers =
pypi
testpypi
[pypi]
username = __token__
password = pypi-YOUR_PYPI_TOKEN
[testpypi]
username = __token__
password = pypi-YOUR_TESTPYPI_TOKEN
Update version in both files:
pyproject.toml → version = "X.Y.Z"src/acp_factory/__init__.py → __version__ = "X.Y.Z"Update CHANGELOG.md with release notes
Test on TestPyPI first:
make publish-test
# Test installation from TestPyPI
pip install --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/ acp-factory
Publish to PyPI:
make publish
Create git tag:
git tag v0.0.1
git push --tags
If you prefer not to use Make:
# Install build tools
pip install build twine
# Build package
python -m build
# Upload to TestPyPI
python -m twine upload --repository testpypi dist/*
# Upload to PyPI
python -m twine upload dist/*
MIT
Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.1.1 | 7 Jan 2026 | 7 |
This describes our collected data; it is not a security assessment.
Observed since 20 Oct, 18:23 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:be82ea8d4515beee3d2ca2a225fee5ee6728c7f6b440630322de516a631513a4