Skip to main content

acp-factory

A Python library for spawning and managing AI agents through the Agent Client Protocol (ACP).

Installation

pip install acp-factory

Prerequisites

  • Python 3.10+
  • Claude Code installed and authenticated (run claude once to set up)
  • Or set ANTHROPIC_API_KEY environment variable

Quick Start

import 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())

API Reference

AgentFactory

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)

AgentHandle

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

Session

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

Permission Modes

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",
))

Development

Setup

# 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]"

Commands

# Run tests
make test

# Run linter
make lint

# Format code
make format

# Type check
make typecheck

# Clean build artifacts
make clean

Publishing to PyPI

Prerequisites

  1. Create accounts on PyPI and TestPyPI
  2. Create API tokens for both
  3. Configure ~/.pypirc:
[distutils]
index-servers =
    pypi
    testpypi

[pypi]
username = __token__
password = pypi-YOUR_PYPI_TOKEN

[testpypi]
username = __token__
password = pypi-YOUR_TESTPYPI_TOKEN

Release Process

  1. Update version in both files:

    • pyproject.toml → version = "X.Y.Z"
    • src/acp_factory/__init__.py → __version__ = "X.Y.Z"
  2. Update CHANGELOG.md with release notes

  3. 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
    
  4. Publish to PyPI:

    make publish
    
  5. Create git tag:

    git tag v0.0.1
    git push --tags
    

Manual Publishing

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/*

License

MIT

Metadata

Release files for acp-factory 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for acp-factory 0.1.1
File Size Uploaded
acp_factory-0.1.1.tar.gz 22.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for acp-factory 0.1.1
File Interpreter ABI Platform
acp_factory-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 41.1 kB

Release files / acp_factory-0.1.1.tar.gz

Download URL acp_factory-0.1.1.tar.gz
Size 22.4 kB
Tags Source
SHA-256 checksum
How to use checksums
09863b34858ee32e93160c763864b96248d0af3edf35249716f39a907f2cb9b3
BLAKE2b-256 checksum
How to use checksums
d5314d810f5cf645c0af4acbdb1d939e3e6711418ee2fc4aa4f356c25fbf2d63
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.11.6

Release files / acp_factory-0.1.1-py3-none-any.whl

Download URL acp_factory-0.1.1-py3-none-any.whl
Size 18.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
5536fcaecae8679e820b3f04b43168d7ebe91439ff1c17009260b75c2863c2ad
BLAKE2b-256 checksum
How to use checksums
e43677ed86e31e014e85b1ae3d3f17dcd686f8c6f20b9db4b8e6b3fd53c541ae
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.11.6

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files

0.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page