Skip to main content

A simple, extensible AI agent framework with tool integration and memory

Project description

Pori Logo

Pori

Python 3.8+ License: MIT PRs Welcome

Pori is a lightweight, extensible AI agent framework for building intelligent agents with tiered memory, tool-calling, and clean orchestration.

⚡ Quick Start

Installation

Currently, Pori must be installed from source (PyPI publishing is planned — see ROADMAP.md):

git clone https://github.com/aloysathekge/pori.git
cd pori

# Using uv (recommended)
uv venv
.venv\Scripts\activate  # On Windows: .venv\Scripts\activate
                        # On Unix/macOS: source .venv/bin/activate
uv pip install -r requirements.txt

# Or using pip
pip install -r requirements.txt

Configuration

Create config.yaml from config.example.yaml and add your API keys to .env:

cp config.example.yaml config.yaml
# Edit .env with your ANTHROPIC_API_KEY or OPENAI_API_KEY

Basic Usage

Interactive CLI:

python -m pori

Programmatic:

import asyncio
from pori import Orchestrator, AgentSettings, register_all_tools
from pori.llm import ChatAnthropic
from pori.tools.registry import tool_registry
import os
from dotenv import load_dotenv

load_dotenv()

async def main():
    registry = tool_registry()
    register_all_tools(registry)
    
    llm = ChatAnthropic(
        model="claude-sonnet-4-20250514",
        api_key=os.getenv("ANTHROPIC_API_KEY")
    )
    orchestrator = Orchestrator(llm=llm, tools_registry=registry)
    
    result = await orchestrator.execute_task(
        "Calculate the sum of the first 10 Fibonacci numbers",
        agent_settings=AgentSettings(max_steps=10)
    )
    
    if result['success']:
        agent = result.get('agent')
        final_answer = agent.memory.get_final_answer()
        print(f"Answer: {final_answer['final_answer']}")

asyncio.run(main())

Docker

Build and run with Docker:

# Build
docker build -t pori .

# Run (use --env-file to load API keys from .env)
docker run -p 8000:8000 --env-file .env pori

Or with Docker Compose:

# Ensure .env exists with ANTHROPIC_API_KEY
docker compose up --build

Health check: curl http://localhost:8000/v1/health

🧠 Core Features

  • Core Memory: Letta-style editable blocks (persona, human, notes) — always in-context
  • Custom LLM Wrappers: Direct SDK integration (Anthropic, OpenAI) — no LangChain dependency
  • Planning & Reflection: Agent plans tasks and adapts based on results
  • Extensible Tools: Simple decorator-based tool registration with Pydantic validation
  • Parallel Execution: Orchestrate multiple tasks concurrently
  • Comprehensive Logging: Full observability of agent decisions and tool calls

🏗️ Architecture

Pori follows a modular design:

  • Orchestrator: Manages task lifecycle, concurrency, and shared memory
  • Agent: Core reasoning loop (Plan → Act → Reflect → Evaluate)
  • Memory: Conversation history, tool tracking, and Letta-style core memory blocks
  • Tool Registry: Validated tool management via Pydantic models
  • LLM Wrappers: Lightweight providers (pori/llm/) replacing LangChain

📚 Documentation

📄 License

MIT License.

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

pori-1.1.tar.gz (62.7 kB view details)

Uploaded Source

Built Distribution

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

pori-1.1-py3-none-any.whl (65.9 kB view details)

Uploaded Python 3

File details

Details for the file pori-1.1.tar.gz.

File metadata

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

File hashes

Hashes for pori-1.1.tar.gz
Algorithm Hash digest
SHA256 0a1706dedc20182ab6abbf81b2f0838c82e2026707ff0010f2e3d5ea1b3f4275
MD5 f55d91e13ec32d5f3b1de7c69afa005c
BLAKE2b-256 1dabe0cfda1f8e8bdcbb7943cb45d8a9f208f58ec84d5dc91edf2451f7741908

See more details on using hashes here.

Provenance

The following attestation bundles were made for pori-1.1.tar.gz:

Publisher: publish.yml on aloysathekge/Pori

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

File details

Details for the file pori-1.1-py3-none-any.whl.

File metadata

  • Download URL: pori-1.1-py3-none-any.whl
  • Upload date:
  • Size: 65.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for pori-1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 d5558c1a5493cfcf5c19a30fd3f69dc3f51e7ceb72e2af16182a08293b7e4770
MD5 e862f6082ec092291dd0d0d676e32e2f
BLAKE2b-256 4da6e58e892500a4a8c0aea0945183bb0c1f1b86b5fa8ce57fc8ee4de040c3e1

See more details on using hashes here.

Provenance

The following attestation bundles were made for pori-1.1-py3-none-any.whl:

Publisher: publish.yml on aloysathekge/Pori

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