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

Uploaded Python 3

File details

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

File metadata

  • Download URL: pori-1.3.tar.gz
  • Upload date:
  • Size: 64.5 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.tar.gz
Algorithm Hash digest
SHA256 ab318bfc140b0a38258c6b56406ed044d9a0e1f42db3a0700c1039ae78e822e1
MD5 8ff8991e35f7c11ead4216386d2f8a11
BLAKE2b-256 f12c2f4de28f71da5b717a22823e0ab929278743611b7c9c32b3c362dfc47529

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: pori-1.3-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-py3-none-any.whl
Algorithm Hash digest
SHA256 b760af71fec4a5473d82df22a28a61e3d17fc74d1ef912279fbdd752c45d4e81
MD5 88438d59f7706506edd0669220488a8e
BLAKE2b-256 fc77006f8faf2b909ceb0519cfe48862bb560489f46c38b1b71504201df2d26e

See more details on using hashes here.

Provenance

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