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

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for pori-1.2.tar.gz
Algorithm Hash digest
SHA256 2a1f546f8090529d7330dc4702b8715a20426035a7c7b9f75cb873eb4d16de76
MD5 a44269c7b8a2963ff61f41e05a71ece8
BLAKE2b-256 00b757a435d4fc1ca06486a8ac858bd6d1f76f4ca5b94f31068e4a95e9170077

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: pori-1.2-py3-none-any.whl
  • Upload date:
  • Size: 67.5 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.2-py3-none-any.whl
Algorithm Hash digest
SHA256 6c1b84c17d67adafba88229326b6ad0f87a871228dbdd2f99bd3761cc740318a
MD5 9bbcbf30fdfd06d09c929030be6ea73b
BLAKE2b-256 debb9c0603193fc6a774fa7dd7c4a0ff24da348ea7d767427eb4849eb2ce7fdf

See more details on using hashes here.

Provenance

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