A simple, extensible AI agent framework with tool integration and memory
Project description
Pori
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
- Roadmap — Planned features and contribution areas
- Contributing — How to contribute
📄 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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ab318bfc140b0a38258c6b56406ed044d9a0e1f42db3a0700c1039ae78e822e1
|
|
| MD5 |
8ff8991e35f7c11ead4216386d2f8a11
|
|
| BLAKE2b-256 |
f12c2f4de28f71da5b717a22823e0ab929278743611b7c9c32b3c362dfc47529
|
Provenance
The following attestation bundles were made for pori-1.3.tar.gz:
Publisher:
publish.yml on aloysathekge/Pori
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pori-1.3.tar.gz -
Subject digest:
ab318bfc140b0a38258c6b56406ed044d9a0e1f42db3a0700c1039ae78e822e1 - Sigstore transparency entry: 1074765688
- Sigstore integration time:
-
Permalink:
aloysathekge/Pori@cd2c644dc11a4ae7bf7569d7882d8943c2a2edfd -
Branch / Tag:
refs/tags/v1.3.0 - Owner: https://github.com/aloysathekge
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@cd2c644dc11a4ae7bf7569d7882d8943c2a2edfd -
Trigger Event:
release
-
Statement type:
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b760af71fec4a5473d82df22a28a61e3d17fc74d1ef912279fbdd752c45d4e81
|
|
| MD5 |
88438d59f7706506edd0669220488a8e
|
|
| BLAKE2b-256 |
fc77006f8faf2b909ceb0519cfe48862bb560489f46c38b1b71504201df2d26e
|
Provenance
The following attestation bundles were made for pori-1.3-py3-none-any.whl:
Publisher:
publish.yml on aloysathekge/Pori
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pori-1.3-py3-none-any.whl -
Subject digest:
b760af71fec4a5473d82df22a28a61e3d17fc74d1ef912279fbdd752c45d4e81 - Sigstore transparency entry: 1074765751
- Sigstore integration time:
-
Permalink:
aloysathekge/Pori@cd2c644dc11a4ae7bf7569d7882d8943c2a2edfd -
Branch / Tag:
refs/tags/v1.3.0 - Owner: https://github.com/aloysathekge
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@cd2c644dc11a4ae7bf7569d7882d8943c2a2edfd -
Trigger Event:
release
-
Statement type: