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.0.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.0-py3-none-any.whl (65.9 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: pori-1.0.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.0.tar.gz
Algorithm Hash digest
SHA256 186fb6839918f6ae749856e16cc98f43a367d9790ca90aed522fe8adc3e17195
MD5 f33991b9cde234a3b1216471eed6676b
BLAKE2b-256 7c2df2b445171c7d4d5c5eaed0bcd6da7092ab9c5acb7ac78a5839a7082badcd

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: pori-1.0-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.0-py3-none-any.whl
Algorithm Hash digest
SHA256 2f7716bf41f48f657bdf5fbafcfe9edaac5e9ed20239879c168b807089550dce
MD5 db671a2b9c97e6ce275693629acb2831
BLAKE2b-256 bfce4270e8b6d2ad3ef5a03f24246da8274e2f3ecd4ca8a439b5e71abad78daa

See more details on using hashes here.

Provenance

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