Skip to main content

Build custom ACP-compatible agents using your existing AI subscriptions

Project description

ACP Agent Framework

Build custom AI agents using your existing subscriptions. No API keys. No vendor lock-in.

Python 3.10+ License: MIT CI PyPI ACP Protocol

The first open-source Python framework for building agents that speak the Agent Client Protocol (ACP).


How It Works

Architecture diagram

Why ACP?

Traditional Agent Frameworks ACP Agent Framework
Auth Manage API keys per provider Use your existing AI subscriptions
Protocol Proprietary APIs, custom integrations Open standard (ACP) — works with any ACP client
Lock-in Tied to one LLM provider Swap backends with one line: backend="gemini"

Features

Feature Description
Multi-Backend Claude, Gemini, Codex — swap with a single parameter
Agent Orchestration Sequential pipelines, keyword routing, agent-to-agent delegation
Tool Calling Wrap any Python function as an MCP tool the LLM can invoke
Streaming Real-time token-by-token output via async generators
Multi-Turn Conversation history maintained across prompts
Guardrails Input/output validation hooks — redact PII, block injections
Skills Load reusable agent capabilities per agentskills.io spec
Serving ACP stdio (editors), HTTP/SSE (web apps), CLI
Session Persistence Save and restore sessions as JSON

Install

pip install acp-agent-framework

For development:

git clone https://github.com/sanjay3290/agentic-framework-acp.git
cd agentic-framework-acp
pip install -e ".[dev]"

Quick Start

Simple Agent

from acp_agent_framework import Agent, serve

agent = Agent(
    name="assistant",
    backend="claude",  # or "gemini" or "codex"
    instruction="You are a helpful coding assistant.",
)

serve(agent)  # Serves over ACP stdio

Sequential Pipeline

Chain agents — each one's output feeds into the next:

Sequential pipeline

from acp_agent_framework import Agent, SequentialAgent, serve

researcher = Agent(
    name="researcher",
    backend="claude",
    instruction="Research the given topic thoroughly.",
    output_key="research",
)

summarizer = Agent(
    name="summarizer",
    backend="claude",
    instruction=lambda ctx: f"Summarize:\n\n{ctx.state.get('research', '')}",
)

pipeline = SequentialAgent(name="research-pipeline", agents=[researcher, summarizer])
serve(pipeline)

Router Agent

Route requests to specialists based on keywords:

Router agent pattern

from acp_agent_framework import Agent, Route, RouterAgent, serve

code_agent = Agent(name="coder", backend="claude", instruction="Help with code.")
writing_agent = Agent(name="writer", backend="gemini", instruction="Help with writing.")

router = RouterAgent(
    name="smart-router",
    routes=[
        Route(keywords=["code", "python", "bug"], agent=code_agent),
        Route(keywords=["write", "essay", "email"], agent=writing_agent),
    ],
    default_agent=code_agent,
)

serve(router)

Custom Tools

Wrap Python functions as tools the LLM can invoke via MCP:

from acp_agent_framework import Agent, FunctionTool, serve

def search_docs(query: str) -> str:
    """Search documentation for a query."""
    return f"Results for: {query}"

agent = Agent(
    name="tool-agent",
    backend="claude",
    instruction="Use tools to help the user.",
    tools=[FunctionTool(search_docs)],
)

serve(agent)

Tools are bridged to the backend via MCP — each FunctionTool is exposed as an MCP tool that the LLM can call during inference.

ToolAgent (No LLM Needed)

For deterministic workflows and data pipelines:

from acp_agent_framework import ToolAgent, FunctionTool, Context

async def build_report(ctx, tools):
    data = tools["fetch_data"].run({"source": "api"})
    return tools["format_report"].run({"data": data})

agent = ToolAgent(
    name="reporter",
    tools=[FunctionTool(fetch_data), FunctionTool(format_report)],
    execute=build_report,
    output_key="report",
)

Guardrails

Validate and transform inputs/outputs:

from acp_agent_framework import Agent, Guardrail, serve

agent = Agent(
    name="safe-agent",
    backend="claude",
    instruction="Be helpful.",
    input_guardrails=[
        Guardrail("pii-redact", lambda t: t.replace("SSN: 123-45-6789", "SSN: [REDACTED]")),
    ],
    output_guardrails=[
        Guardrail("length-limit", lambda t: t[:500] + "..." if len(t) > 500 else t),
    ],
)

Agent Skills

Load reusable capabilities per the agentskills.io spec:

agent = Agent(
    name="chat-agent",
    backend="claude",
    instruction="You are a helpful assistant.",
    skills=["google-chat"],  # loads from .agents/skills/google-chat/SKILL.md
)

Streaming

Real-time token-by-token output:

agent = Agent(name="storyteller", backend="gemini", instruction="Write stories.", stream=True)

async for event in agent.run(ctx):
    if event.type == "stream_chunk":
        print(event.content, end="", flush=True)

Agent-to-Agent Delegation

Wrap any agent as a tool for another agent:

Agent-to-agent delegation

from acp_agent_framework import Agent, AgentTool, serve

translator = Agent(name="translator", backend="gemini", instruction="Translate text.")
summarizer = Agent(name="summarizer", backend="claude", instruction="Summarize text.")

manager = Agent(
    name="content-manager",
    backend="claude",
    instruction="Use translator and summarizer tools to help the user.",
    tools=[AgentTool(translator, cwd="."), AgentTool(summarizer, cwd=".")],
)

serve(manager)

Serving Agents

Transport Use Case Command
ACP stdio ACP-compatible clients serve(agent)
HTTP/SSE Web apps, APIs serve(agent, transport="http", port=8000)
CLI Terminal acp-agent run module:agent

HTTP Endpoints

Method Endpoint Description
POST /api/sessions Create session
GET /api/sessions/{id} Get session info
DELETE /api/sessions/{id} Delete session
POST /api/sessions/{id}/prompt Prompt with SSE streaming

CLI

acp-agent init my-agent                            # Scaffold a new project
acp-agent run my_agent.agent:agent                 # Run over ACP stdio
acp-agent run my_agent.agent:agent -t http -p 8000 # Run as HTTP server

Supported Backends

Backend Command Install
Claude claude-agent-acp npm i -g @zed-industries/claude-agent-acp
Gemini gemini --experimental-acp npm i -g @google/gemini-cli
Codex codex-acp npm i -g @zed-industries/codex-acp

Register custom backends:

from acp_agent_framework import BackendConfig, BackendRegistry

registry = BackendRegistry()
registry.register("my-backend", BackendConfig(
    command="my-agent-binary",
    args=["--acp"],
))

Architecture

Framework internals

Testing

# Unit tests (158 tests)
pytest tests/ -v

# Integration tests (requires backends installed)
pytest tests/ -v -m integration

# Lint
ruff check src/ tests/

Examples

Check the examples/ directory for complete working agents:

Example Description
simple_agent Minimal agent with a single backend
function_tools Weather, calculator, and unit converter tools
tool_agent Hacker News digest without an LLM
guardrails PII redaction and injection blocking
streaming Real-time token streaming
multi_turn Conversational agent with history
router_agent Keyword-based routing
sequential_pipeline Multi-step agent chain
agent_to_agent Manager delegating to specialists

Contributing

See CONTRIBUTING.md for development setup and guidelines.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

acp_agent_framework-0.1.1.tar.gz (986.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

acp_agent_framework-0.1.1-py3-none-any.whl (37.2 kB view details)

Uploaded Python 3

File details

Details for the file acp_agent_framework-0.1.1.tar.gz.

File metadata

  • Download URL: acp_agent_framework-0.1.1.tar.gz
  • Upload date:
  • Size: 986.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for acp_agent_framework-0.1.1.tar.gz
Algorithm Hash digest
SHA256 563dd3b58b23193f7aa2b930d75e6355a014e5e76f97e5463c15e4cbfbb6cdfa
MD5 bb65c2f48a31c2d91be1f0f5db5d7f6b
BLAKE2b-256 3bb0d8461593d4b24166ac5d24a482a8e762bfbbc6a6cf1ee92de96badf470cc

See more details on using hashes here.

Provenance

The following attestation bundles were made for acp_agent_framework-0.1.1.tar.gz:

Publisher: publish.yml on sanjay3290/agentic-framework-acp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file acp_agent_framework-0.1.1-py3-none-any.whl.

File metadata

File hashes

Hashes for acp_agent_framework-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 3efb0008fd93020f2d61917db7ad458db05addd3839aaf200b575ebb5eec6d50
MD5 687f220283716ea1ed13157d2fe3c42c
BLAKE2b-256 b1f3a4439e9527275d01cf377ed7d6c00df50a7fc1af1a214d85f8d9c7e7aca3

See more details on using hashes here.

Provenance

The following attestation bundles were made for acp_agent_framework-0.1.1-py3-none-any.whl:

Publisher: publish.yml on sanjay3290/agentic-framework-acp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page