Skip to main content

ACE Context Engineering

PyPI version Python 3.11+ License: MIT

Self-improving AI agents through evolving playbooks. Wrap any LangChain agent with ACE to enable learning from experience without fine-tuning.

Based on research: Agentic Context Engineering (Stanford/SambaNova, 2025)


What is ACE?

ACE enables AI agents to learn and improve by accumulating strategies in a "playbook" - a knowledge base that grows smarter with each interaction.

Key Benefits

  • +17% task performance improvement
  • 82% faster adaptation to new domains
  • 75% lower computational cost vs fine-tuning
  • Zero model changes - works with any LLM

Installation

Using pip

# Default (FAISS vector store)
pip install ace-context-engineering

# With ChromaDB support
pip install ace-context-engineering[chromadb]

# With Qdrant support
pip install ace-context-engineering[qdrant]
# or: pip install qdrant-client
# Default (FAISS vector store)
uv add ace-context-engineering

# With ChromaDB support
uv add ace-context-engineering[chromadb]

# With Qdrant support
uv add ace-context-engineering[qdrant]
# or: uv add qdrant-client

Environment Setup:

# Copy example environment file
cp .env.example .env

# Add your API key
echo "OPENAI_API_KEY=your-key-here" >> .env

Quick Start

3-Step Integration

from ace import ACEConfig, ACEAgent, PlaybookManager
from langchain.chat_models import init_chat_model

# 1. Configure ACE
config = ACEConfig(
    playbook_name="my_app",
    vector_store="faiss",
    top_k=10
)

playbook = PlaybookManager(
    playbook_dir=config.get_storage_path(),
    vector_store=config.vector_store,
    embedding_model=config.embedding_model
)

# 2. Wrap your agent
base_agent = init_chat_model("openai:gpt-4o-mini")
agent = ACEAgent(
    base_agent,
    playbook,
    config,
    auto_inject=True  # Automatic context injection
)

# 3. Use normally - ACE handles context automatically!
response = agent.invoke([
    {"role": "user", "content": "Process payment for order #12345"}
])

# 4. Provide feedback for learning (optional but recommended)
chat_data = agent.get_last_interaction()  # Get interaction data
result = agent.submit_feedback(
    user_feedback="Payment processed successfully",
    rating=5,
    chat_data=chat_data  # Explicit for production/parallel users
)

Add Knowledge to Playbook

# Add strategies manually
playbook.add_bullet(
    content="Always validate order exists before processing payment",
    section="Payment Processing"
)

playbook.add_bullet(
    content="Log all failed transactions with error codes",
    section="Error Handling"
)

Learning from Feedback

Simple API (Recommended):

# After agent response, provide feedback
chat_data = agent.get_last_interaction()  # Get current interaction data

result = agent.submit_feedback(
    user_feedback="Payment processed successfully",
    rating=5,  # 1-5 scale
    feedback_type="positive",
    chat_data=chat_data  # Explicit for thread-safety in production
)

# ACE automatically:
# 1. Reflector analyzes feedback → extracts insights
# 2. Curator creates/updates playbook bullets
# 3. Playbook improves for future interactions!

For Async/Parallel Users:

# Use async API for better performance
chat_data = {
    "question": user_question,
    "model_response": response.content,
    "used_bullets": agent.get_used_bullets()
}

result = await agent.asubmit_feedback(
    user_feedback="Great response!",
    rating=5,
    chat_data=chat_data  # Required for thread-safety
)

Architecture

┌─────────────────┐
│   Your Agent    │ ← Any LangChain agent
│   (Generator)   │
└─────────┬───────┘
          │
          ▼
┌─────────────────┐
│   ACEAgent      │ ← Automatic context injection
│   Wrapper       │
└─────────┬───────┘
          │
          ▼
┌─────────────────┐
│   Playbook      │ ← Semantic knowledge retrieval
│   Manager       │
└─────────────────┘
          ▲
          │
┌─────────────────┐
│   Reflector     │ ← Analyzes feedback
│   + Curator     │ ← Updates playbook
└─────────────────┘

Components

Component Purpose Uses LLM? Key Features
ACEAgent Wraps your agent, injects context No Thread-safe with chat_data param, async support
PlaybookManager Stores & retrieves knowledge No Uses embeddings for semantic search
Reflector Analyzes feedback, extracts insights Yes Multi-iteration refinement, auto-critique
Curator Updates playbook deterministically No Uses embeddings for similarity matching (no LLM)

Configuration

from ace import ACEConfig

config = ACEConfig(
    playbook_name="my_app",           # Unique name for your app
    vector_store="faiss",             # "faiss", "chromadb", "qdrant", or "qdrant-cloud"
    storage_path="./.ace/playbooks",  # Optional: custom path
    chat_model="openai:gpt-4o-mini",  # For Reflector (feedback analysis)
    embedding_model="openai:text-embedding-3-small",  # For semantic search
    temperature=0.3,                  # LLM temperature
    top_k=10,                         # Number of bullets to retrieve
    deduplication_threshold=0.9,      # Similarity threshold for deduplication
    # Qdrant-specific (only needed for qdrant/qdrant-cloud)
    qdrant_url="http://localhost:6333",  # Qdrant server URL
    qdrant_api_key=None               # Required for qdrant-cloud, optional for qdrant
)

# Note: Curator does NOT use LLM - it's deterministic
# Curator uses embeddings via PlaybookManager for similarity matching

Storage Location

FAISS/ChromaDB (Local Storage): By default, ACE stores playbooks in ./.ace/playbooks/{playbook_name}/ (like .venv):

your-project/
 .venv/              ← Virtual environment
 .ace/               ← ACE storage
    playbooks/
        my_app/
            faiss_index.bin  (or chromadb/)
            metadata.json
            playbook.md
 your_code.py

Qdrant (External Vector Storage): With Qdrant, playbook metadata stays local, but vectors are stored externally:

your-project/
 .ace/
    playbooks/
        my_app/
            metadata.json      ← Local (bullet content, counters)
            playbook.md        ← Local
            # NO vector files   ← Vectors stored in Qdrant server

Qdrant Server (Docker/Cloud):
    Collection: my_app
        └── Vectors (embeddings) ← External

Qdrant Setup:

  • Local (Docker): docker run -p 6333:6333 -p 6334:6334 qdrant/qdrant
  • Cloud: Get URL and API key from Qdrant Cloud

Examples

Check the examples/ directory for complete examples:


Testing

# Run all tests
uv run pytest tests/ -v

# Run simple learning test (5 questions with feedback)
uv run pytest tests/test_simple_learning.py -v -s

# Or run directly (requires OPENAI_API_KEY in .env)
uv run python tests/test_simple_learning.py

# Run specific test suite
uv run pytest tests/test_e2e_learning.py -v -s

# Run with coverage
uv run pytest tests/ --cov=ace --cov-report=html

All tests passing ✓


Contributing

Contributions are welcome! Please:

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

Documentation


License

This project is licensed under the MIT License - see the LICENSE file for details.


Acknowledgments


Contact


Star this repo if you find it useful!

Metadata

Release files for ace-context-engineering 0.1.4

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

Source distribution (sdist)

Source distribution for ace-context-engineering 0.1.4
File Size Uploaded Provenance
ace_context_engineering-0.1.4.tar.gz 69.3 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for ace-context-engineering 0.1.4
File Interpreter ABI Platform
ace_context_engineering-0.1.4-py3-none-any.whl Python 3 none any Details

Total release size: 122.9 kB

Release files / ace_context_engineering-0.1.4.tar.gz

Download URL ace_context_engineering-0.1.4.tar.gz
Size 69.3 kB
Tags Source
SHA-256 checksum
How to use checksums
f7936555a492f5fd7dc945c637bbff93e4390d7392aa9cffb5b73c75a7d4ea1e
BLAKE2b-256 checksum
How to use checksums
1146b910834e8eb920d7756ff03d8e6b759ea12d5bd4f6c42f2af035c05e633a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.11.14

Release files / ace_context_engineering-0.1.4-py3-none-any.whl

Download URL ace_context_engineering-0.1.4-py3-none-any.whl
Size 53.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
fdaa1068597efe87353379ec75c944da9df81147c91fde427e002020583c8aa6
BLAKE2b-256 checksum
How to use checksums
a257c9aa3d5e9d9bea9d41ceed032fd5debd8ea986acf2291edc5750c78c8d6b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.11.14

Security for ace-context-engineering 0.1.4

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

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