Skip to main content

Phoson

phoson-engine-minimal

Minimal Python runtime for the Phoson autonomous-agent platform

Python uv ruff pytest License Stars Build

๐Ÿ”ฅ Open Source โ€” Built for developers who want full control over their AI agents.


๐Ÿ“‹ Table of Contents


๐Ÿค” What this project is

phoson-engine-minimal is the core runtime behind the Phoson autonomous-agent platform. It's a lightweight, framework-free Python implementation that gives you complete control over your AI agents without the bloat of heavy frameworks.

Unlike other agent frameworks (LangChain, LangGraph, etc.), Phoson is built from scratch using provider SDKs directly, with a custom ReAct loop designed for:

  • ๐Ÿ”„ Streaming behavior โ€” Token-by-token events for real-time UIs
  • ๐Ÿ”ง Tool-call orchestration โ€” Full control over tool execution
  • ๐Ÿ’ฐ Cost accounting โ€” Track spend per run with built-in pricing
  • ๐Ÿ‘๏ธ Observability โ€” RunStep events and typed event streams
  • ๐ŸŒณ Session trees โ€” Branchable conversation history (not linear!)
  • โŒจ๏ธ Interactive REPL โ€” Debug and iterate on agents interactively

๐ŸŽฏ Why Phoson?

Traditional Frameworks Phoson
Heavy dependencies Zero external agent frameworks
Linear conversations Branchable conversation trees
Black-box streaming Full event visibility
Fixed patterns Custom ReAct loop
Enterprise pricing MIT licensed

โœจ Features

Feature Description
Framework-free Pure Python + provider SDKs; no LangChain/LangGraph
Multi-provider OpenAI, Anthropic, OpenRouter, Ollama support
Typed events Normalized LLMEvent stream for all providers
Tool execution @tool decorator with JSON Schema definitions
Middleware hooks Pre/post processing for LLM calls and tool execution
Branching sessions ConversationTree for non-linear conversation history
Interactive REPL CLI with streaming, branching, and model switching
Cost tracking Built-in pricing module for USD usage calculation
Thinking support Native reasoning/thinking token handling (Anthropic & OpenAI o1)

๐Ÿ—๏ธ High-level architecture

flowchart LR
    U[App / CLI / API] --> AE[AgentEngine\nphoson_agent]
    AE --> MW[Middleware Hooks]
    AE --> T[Registered Tools]
    AE --> S[ConversationTree + Storage]
    AE --> C[BaseLLMChat Contract]
    C --> OA[OpenAIChat]
    C --> AN[AnthropicChat]
    OA --> P1[OpenAI / OpenRouter / Ollama]
    AN --> P2[Anthropic]
    OA --> E[Typed LLM Events]
    AN --> E
    E --> AE
    AE --> R[Agent Events + RunResult]

Runtime loop (tool call cycle)

sequenceDiagram
    participant Client
    participant Engine as AgentEngine
    participant LLM as LLM Adapter
    participant Tool as Tool Handler

    Client->>Engine: run(messages, config)
    Engine->>LLM: stream(history, config, tools)
    LLM-->>Engine: TokenEvent / ReasoningTokenEvent
    LLM-->>Engine: ToolCallEvent
    Engine->>Tool: execute(args)
    Tool-->>Engine: result/error
    Engine->>LLM: continue with ToolResultBlock
    LLM-->>Engine: UsageEvent + LLMDoneEvent
    Engine-->>Client: AgentRunResult

๐Ÿ—บ๏ธ Repository map

phoson-engine-minimal/
โ”œโ”€โ”€ phoson_llm/           # LLM normalization layer (adapters + schemas + pricing)
โ”œโ”€โ”€ phoson_agent/         # ReAct agent loop, tools, middleware, sessions
โ”œโ”€โ”€ phoson_cli/           # Interactive CLI (REPL) for agent sessions
โ”œโ”€โ”€ tests/                # Unit/integration tests for llm and agent layers
โ”œโ”€โ”€ .github/workflows/    # CI and security automation
โ”œโ”€โ”€ PROJECT.md            # Deep architecture notes and roadmap
โ””โ”€โ”€ pyproject.toml        # Project metadata, dependencies, tooling config

๐Ÿ“ฆ Core modules

phoson_llm โ€” LLM normalization layer

Provider adapters return a single typed event stream (LLMEvent subclasses):

Event Description
LLMStartEvent Call start (model, message count)
TokenEvent Text fragment token-by-token
ReasoningStartEvent Model started reasoning (Anthropic thinking / OpenAI o1)
ReasoningTokenEvent Reasoning fragment
ReasoningDoneEvent Complete reasoning block
ToolCallDeltaEvent Partial tool args chunk (for real-time UI)
ToolCallEvent Complete tool call with parsed args
UsageEvent Tokens + cost in USD
LLMDoneEvent Full assembled text (always last)
ErrorEvent Error with code, message, retryable flag

Supported providers:

  • Anthropic โ€” AnthropicChat (thinking, tool use, prompt caching)
  • OpenAI โ€” OpenAIChat (tool use, reasoning_effort for o1/o3)
  • OpenRouter โ€” OpenAIChat(base_url=..., api_key=...)
  • Ollama โ€” OpenAIChat(base_url="http://localhost:11434/v1", api_key="ollama")

Pricing module (phoson_llm.pricing) provides calculate_cost() for provider-level USD usage.

phoson_agent โ€” Agent orchestration

Stateless-by-run orchestration over message history with tool execution:

  • AgentEngine โ€” Main entry point for running agents (async and sync)
  • @tool decorator โ€” Transform Python functions into AgentTool definitions with JSON Schema
  • AgentMiddleware โ€” Hooks for pre/post processing (LLM calls, tool execution)
  • AgentContext โ€” Shared state across middleware and tools

phoson_agent.sessions โ€” Conversation persistence

  • ConversationTree โ€” Branchable conversation structure (not linear)
  • ConversationNode โ€” Individual node with messages, children, label
  • JsonlStorage โ€” JSONL-backed session storage (local file)
  • SessionMeta โ€” Session metadata (id, message_count, created_at, updated_at)

phoson_cli โ€” Interactive REPL

Command-line interface for interactive agent sessions:

  • PhosonRepl โ€” Interactive read-eval-print loop
  • Commands: /exit, /quit, /clear, /new, /model, /tree, /sessions, /branch, /label, /help
  • Real-time streaming responses
  • Session branching and labeling
  • Multiple model switching

๐Ÿš€ Quick Start

from phoson_agent import AgentEngine
from phoson_llm.chats.openai import OpenAIChat
from phoson_llm.schemas import Message, ModelConfig

engine = AgentEngine(
    chat=OpenAIChat(),
    tools=[],
    phoson_weight=1.2,
)

result = engine.run_sync(
    messages=[Message(role="user", content="Summarize this project in one line")],
    config=ModelConfig(model="openai/gpt-4o-mini", max_tokens=128),
)

print(result.final_content)
print(result.total_cost_usd, result.total_credits)

Or run the interactive CLI:

uv run phoson-cli

Run the setup wizard to configure provider credentials and defaults:

uv run phoson-cli --setup

๐Ÿ“ฅ Installation

# Clone the repository
git clone https://github.com/phoson-lat/phoson-engine-minimal.git
cd phoson-engine-minimal

# Install dependencies
uv sync --dev --locked

# Install git hooks
uv run pre-commit install --install-hooks
uv run pre-commit install --hook-type commit-msg
uv run pre-commit install --hook-type pre-push

๐Ÿ› ๏ธ Development setup

Install dependencies

uv sync --dev --locked

Install git hooks

uv run pre-commit install --install-hooks
uv run pre-commit install --hook-type commit-msg
uv run pre-commit install --hook-type pre-push

โœ… Run checks locally

uv run ruff format --check .
uv run ruff check .
uv run python -m compileall phoson_llm phoson_agent phoson_cli
uv run pytest -q

๐Ÿ” Environment variables

ANTHROPIC_API_KEY=
OPENAI_API_KEY=
OPENROUTER_API_KEY=

Note: Use OPENROUTER_API_KEY when initializing OpenAIChat with an OpenRouter base_url.


๐Ÿ’ป Usage examples

Minimal agent usage

from phoson_agent import AgentEngine
from phoson_llm.chats.openai import OpenAIChat
from phoson_llm.schemas import Message, ModelConfig

engine = AgentEngine(
    chat=OpenAIChat(),
    tools=[],
    phoson_weight=1.2,
)

result = engine.run_sync(
    messages=[Message(role="user", content="Summarize this project in one line")],
    config=ModelConfig(model="openai/gpt-4o-mini", max_tokens=128),
)

print(result.final_content)
print(result.total_cost_usd, result.total_credits)

Define a tool

from phoson_agent import tool

@tool
def calculate(expression: str) -> str:
    """Evaluate a mathematical expression."""
    return str(eval(expression))

Interactive CLI

uv run phoson-cli

Available commands:

  • /new โ€” Start a new session
  • /model <name> โ€” Switch model
  • /tree โ€” Show conversation tree
  • /sessions โ€” List saved sessions
  • /branch โ€” Branch from current node
  • /label <text> โ€” Label current node
  • /help โ€” Show all commands

๐Ÿ”’ CI and security workflows

  • .github/workflows/ci.yml: Format check, lint, smoke compile, and tests on PRs and pushes to main.
  • .github/workflows/security.yml: Dependency audit and secret scan on PRs, pushes to main, and weekly schedule.

๐Ÿ“ Commit message format

Conventional Commits are enforced through a commit-msg hook.

Examples:

feat: add streaming chat abstraction
fix: handle unknown model pricing fallback
chore: update pre-commit hook versions

Common types: feat, fix, docs, refactor, test, chore, ci


๐Ÿ—“๏ธ Roadmap

For detailed architecture notes and future plans, see PROJECT.md.


๐Ÿค Contributing

Contributions are welcome! Here's how you can help:

  1. Fork the repository
  2. Create a feature branch: git checkout -b feature/amazing-feature
  3. Commit your changes: git commit -m 'feat: add amazing feature'
  4. Push to the branch: git push origin feature/amazing-feature
  5. Open a Pull Request

Please read CONTRIBUTING.md for details on our code of conduct and development process.

Ideas for contributions

  • ๐Ÿ†• Add new LLM providers (Google Gemini, Azure OpenAI, etc.)
  • ๐Ÿ”ง Improve tool execution (batching, retries, caching)
  • ๐Ÿ“Š Add observability integrations (OpenTelemetry, Langfuse)
  • ๐Ÿ–ฅ๏ธ Build a web-based REPL or playground
  • ๐Ÿ“š Improve documentation and examples

๐Ÿ“„ License

This project is licensed under the MIT License โ€” see the LICENSE file for details.

MIT License

Copyright (c) 2024 Phoson

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

๐Ÿ’ฌ Support


โญ Show your support

Give us a โญ๏ธ if this project helped you build better AI agents!


Built with ๐Ÿ”ฅ by phoson.lat

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

phoson_engine_minimal-0.3.0.tar.gz (360.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

phoson_engine_minimal-0.3.0-py3-none-any.whl (175.8 kB view details)

Uploaded Python 3

File details

Details for the file phoson_engine_minimal-0.3.0.tar.gz.

File metadata

  • Download URL: phoson_engine_minimal-0.3.0.tar.gz
  • Upload date:
  • Size: 360.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for phoson_engine_minimal-0.3.0.tar.gz
Algorithm Hash digest
SHA256 63961105a538c34eae13b2174e25dce2c2fc5a9d8932f979e96d6da7de5ee9cd
MD5 fb93c3ad24ceadd10643cba7ad11bd4a
BLAKE2b-256 ee06c3e03d4a69d21677ef05eaed5e550ba9f31b9db956146ae6ba4c298d6d1c

See more details on using hashes here.

Provenance

The following attestation bundles were made for phoson_engine_minimal-0.3.0.tar.gz:

Publisher: publish.yml on phoson-lat/phoson-engine-minimal

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file phoson_engine_minimal-0.3.0-py3-none-any.whl.

File metadata

File hashes

Hashes for phoson_engine_minimal-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d02c0e9a67496be2bd80f32ac39e62e8230bf99b6f52724d402ff08b8c322c25
MD5 9618a4a06990d54ad2cd3850e14b295d
BLAKE2b-256 6c8e0b5347165dba8d7f88b6274263c8593c922598765329acf954b60a5cb8f2

See more details on using hashes here.

Provenance

The following attestation bundles were made for phoson_engine_minimal-0.3.0-py3-none-any.whl:

Publisher: publish.yml on phoson-lat/phoson-engine-minimal

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.8.0

2 files

0.7.3

2 files

0.7.2

2 files

0.7.1

2 files

0.7.0

2 files

0.6.0

2 files

0.5.0

2 files

0.4.0

2 files

This release

0.3.0 This release

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page