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.3.1.tar.gz (64.6 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.3.1-py3-none-any.whl (67.8 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for pori-1.3.1.tar.gz
Algorithm Hash digest
SHA256 f7addb5c31915d67748cfe4ec9c8c8e0069bb7cffb63aa6edf67460c908bb3dd
MD5 f629dc6c58e7eb35dd2fe0e48ca5b580
BLAKE2b-256 f61c3a49658ff8be254dfbfc9affb129b674bebd04b31dcb0e9413069f886945

See more details on using hashes here.

Provenance

The following attestation bundles were made for pori-1.3.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.3.1-py3-none-any.whl.

File metadata

  • Download URL: pori-1.3.1-py3-none-any.whl
  • Upload date:
  • Size: 67.8 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.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 79936caa07516066743984747c4ef026fcfcf574f78aa811e305fa9ff540718e
MD5 d0d35540044d618e2eb1e7916992d44b
BLAKE2b-256 e65be77df189a54bc6b309c1bb52a29df8370d31ab6c22cea2ac7da6ecbca1ad

See more details on using hashes here.

Provenance

The following attestation bundles were made for pori-1.3.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