Skip to main content

Building blocks for AI Agents

Project description

AgentPress: Building Blocks for AI Agents

AgentPress is a collection of simple, but powerful utilities that serve as building blocks for creating AI agents. Plug, play, and customize.

AgentPress Flow

See How It Works for an explanation of this flow.

Core Components

  • Threads: Manage Messages[] as threads.
  • Tools: Register code as callable tools with definitions in both OpenAPI and XML
  • Response Processing: Support for native-LLM OpenAPI and XML-based tool calling
  • State Management: Thread-safe JSON key-value state management
  • LLM: +100 LLMs using the OpenAI I/O Format powered by LiteLLM

Installation & Setup

  1. Install the package:
pip install agentpress
  1. Initialize AgentPress in your project:
agentpress init

Creates a agentpress directory with all the core utilities. Check out File Overview for explanations of the generated files.

  1. If you selected the example agent during initialization:
    • Creates an agent.py file with a web development agent example
    • Creates a tools directory with example tools:
      • files_tool.py: File operations (create/update files, read directory and load into state)
      • terminal_tool.py: Terminal command execution
    • Creates a workspace directory for the agent to work in

Quick Start

  1. Set up your environment variables in a .env file:
OPENAI_API_KEY=your_key_here
ANTHROPIC_API_KEY=your_key_here
GROQ_API_KEY=your_key_here
  1. Create a calculator tool with OpenAPI schema:
from agentpress.tool import Tool, ToolResult, openapi_schema

class CalculatorTool(Tool):
    @openapi_schema({
        "type": "function",
        "function": {
            "name": "add",
            "description": "Add two numbers",
            "parameters": {
                "type": "object",
                "properties": {
                    "a": {"type": "number"},
                    "b": {"type": "number"}
                },
                "required": ["a", "b"]
            }
        }
    })
    async def add(self, a: float, b: float) -> ToolResult:
        try:
            result = a + b
            return self.success_response(f"The sum is {result}")
        except Exception as e:
            return self.fail_response(f"Failed to add numbers: {str(e)}")
  1. Or create a tool with XML schema:
from agentpress.tool import Tool, ToolResult, xml_schema

class FilesTool(Tool):
    @xml_schema(
        tag_name="create-file",
        mappings=[
            {"param_name": "file_path", "node_type": "attribute", "path": "."},
            {"param_name": "file_contents", "node_type": "content", "path": "."}
        ],
        example='''
        <create-file file_path="path/to/file">
        File contents go here
        </create-file>
        '''
    )
    async def create_file(self, file_path: str, file_contents: str) -> ToolResult:
        # Implementation here
        pass
  1. Use the Thread Manager with streaming and tool execution:
import asyncio
from agentpress.thread_manager import ThreadManager
from calculator_tool import CalculatorTool

async def main():
    # Initialize thread manager and add tools
    manager = ThreadManager()
    manager.add_tool(CalculatorTool)

    # Create a new thread
    thread_id = await manager.create_thread()
    
    # Add your message
    await manager.add_message(thread_id, {
        "role": "user", 
        "content": "What's 2 + 2?"
    })
    
    # Run with streaming and tool execution
    response = await manager.run_thread(
        thread_id=thread_id,
        system_message={
            "role": "system", 
            "content": "You are a helpful assistant with calculation abilities."
        },
        model_name="anthropic/claude-3-5-sonnet-latest",
        stream=True,
        native_tool_calling=True,
        execute_tools=True,
        execute_tools_on_stream=True
    )

    # Handle streaming response
    if isinstance(response, AsyncGenerator):
        async for chunk in response:
            if hasattr(chunk.choices[0], 'delta'):
                delta = chunk.choices[0].delta
                if hasattr(delta, 'content') and delta.content:
                    print(delta.content, end='', flush=True)

asyncio.run(main())
  1. View conversation threads in a web UI:
streamlit run agentpress/thread_viewer_ui.py

How It Works

Each AI agent iteration follows a clear, modular flow:

  1. Message & LLM Handling

    • Messages are managed in threads via ThreadManager
    • LLM API calls are made through a unified interface (llm.py)
    • Supports streaming responses for real-time interaction
  2. Response Processing

    • LLM returns both content and tool calls
    • Content is streamed in real-time
    • Tool calls are parsed using either:
      • Standard OpenAPI function calling
      • XML-based tool definitions
      • Custom parsers (extend ToolParserBase)
  3. Tool Execution

    • Tools are executed either:
      • In real-time during streaming (execute_tools_on_stream)
      • After complete response
      • In parallel or sequential order
    • Supports both standard and XML tool formats
    • Extensible through ToolExecutorBase
  4. Results Management

    • Results from both content and tool executions are handled
    • Supports different result formats (standard/XML)
    • Customizable through ResultsAdderBase

This modular architecture allows you to:

  • Use standard OpenAPI function calling
  • Switch to XML-based tool definitions
  • Create custom processors by extending base classes
  • Mix and match different approaches

File Overview

Core Components

agentpress/llm.py

LLM API interface using LiteLLM. Supports 100+ LLMs with OpenAI-compatible format. Includes streaming, retry logic, and error handling.

agentpress/thread_manager.py

Manages conversation threads with support for:

  • Message history management
  • Tool registration and execution
  • Streaming responses
  • Both OpenAPI and XML tool calling patterns

agentpress/tool.py

Base infrastructure for tools with:

  • OpenAPI schema decorator for standard function calling
  • XML schema decorator for XML-based tool calls
  • Standardized ToolResult responses

agentpress/tool_registry.py

Central registry for tool management:

  • Registers both OpenAPI and XML tools
  • Maintains tool schemas and implementations
  • Provides tool lookup and validation

agentpress/state_manager.py

Thread-safe state persistence:

  • JSON-based key-value storage
  • Atomic operations with locking
  • Automatic file handling

Response Processing

agentpress/llm_response_processor.py

Handles LLM response processing with support for:

  • Streaming and complete responses
  • Tool call extraction and execution
  • Result formatting and message management

Standard Processing

  • standard_tool_parser.py: Parses OpenAPI function calls
  • standard_tool_executor.py: Executes standard tool calls
  • standard_results_adder.py: Manages standard results

XML Processing

  • xml_tool_parser.py: Parses XML-formatted tool calls
  • xml_tool_executor.py: Executes XML tool calls
  • xml_results_adder.py: Manages XML results

Philosophy

  • Plug & Play: Start with our defaults, then customize to your needs.
  • Agnostic: Built on LiteLLM, supporting any LLM provider. Minimal opinions, maximum flexibility.
  • Simplicity: Clean, readable code that's easy to understand and modify.
  • No Lock-in: Take full ownership of the code. Copy what you need directly into your codebase.

Contributing

We welcome contributions! Feel free to:

  • Submit issues for bugs or suggestions
  • Fork the repository and send pull requests
  • Share how you've used AgentPress in your projects

Development

  1. Clone:
git clone https://github.com/kortix-ai/agentpress
cd agentpress
  1. Install dependencies:
pip install poetry
poetry install
  1. For quick testing:
pip install -e .

License

MIT License

Built with ❤️ by Kortix AI Corp

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

agentpress-0.1.8.tar.gz (38.9 kB view details)

Uploaded Source

Built Distribution

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

agentpress-0.1.8-py3-none-any.whl (46.6 kB view details)

Uploaded Python 3

File details

Details for the file agentpress-0.1.8.tar.gz.

File metadata

  • Download URL: agentpress-0.1.8.tar.gz
  • Upload date:
  • Size: 38.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.4 CPython/3.12.7 Linux/6.5.0-1025-azure

File hashes

Hashes for agentpress-0.1.8.tar.gz
Algorithm Hash digest
SHA256 64c187e56b4aa26ed4f9294311b83aa95645de8c924246c8276dff9a3349eab6
MD5 196430959da54d8286b40b9f47555c90
BLAKE2b-256 76bb3a996e2e6ed0e2f4f38fd548315e313e80388ccda1aeca446ff07eec5494

See more details on using hashes here.

File details

Details for the file agentpress-0.1.8-py3-none-any.whl.

File metadata

  • Download URL: agentpress-0.1.8-py3-none-any.whl
  • Upload date:
  • Size: 46.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.4 CPython/3.12.7 Linux/6.5.0-1025-azure

File hashes

Hashes for agentpress-0.1.8-py3-none-any.whl
Algorithm Hash digest
SHA256 02113678a1074ce0aa36912e75a1d44a5ce18aef4d9bbb6caa298c696f55e139
MD5 fd310023796bb9748e646b5910dd4344
BLAKE2b-256 35d417d560ab84653d32c91c55666af7798a57ff5b6c8c0918d712c21ef580bc

See more details on using hashes here.

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