Observed since 20 Oct, 21:24 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
A modular, extensible AI agent system
A modular, extensible AI agent system built around a core loop of perceive -> reason -> act.
# From PyPI
pip install agenai
# With web server support (for chat UI)
pip install agenai[server]
# For development (editable install)
pip install -e ".[dev]"
No API key required! Uses local LLMs.
# 1. Install Ollama from https://ollama.ai
# 2. Pull a model
ollama pull llama3.1
# 3. Start the web server
agenai-server
# 4. Open http://localhost:8000 in your browser
# Set your API key
export ANTHROPIC_API_KEY="your-key"
# Run CLI
agenai run "Explain Python for loops" -v
# Or interactive chat
agenai chat
Start the server with WebSocket support:
# Install server dependencies
pip install -e ".[server]"
# Start server
agenai-server --port 8000
# Or with auto-reload for development
agenai-server --reload
Open http://localhost:8000 for the chat UI.
| Endpoint | Method | Description |
|---|---|---|
/ | GET | Web chat interface |
/health | GET | Health check + Ollama status |
/chat | POST | REST chat endpoint |
/ws/{client_id} | WebSocket | Real-time chat |
from agenai.agent import SpecializedAgent, OllamaProvider
from agenai.agent.tools import Tool, ToolResult
class MyTool(Tool):
@property
def name(self) -> str:
return "my_tool"
@property
def description(self) -> str:
return "Does something useful"
@property
def parameters(self) -> dict:
return {"type": "object", "properties": {}}
def execute(self) -> ToolResult:
return ToolResult.ok("Done!")
class MyAgent(SpecializedAgent):
name = "my_agent"
description = "My custom agent"
def get_system_prompt(self) -> str:
return "You are a helpful assistant..."
def get_tools(self) -> list:
return [MyTool()]
# Use with Ollama (free, local)
agent = MyAgent(llm=OllamaProvider(model="llama3.1"))
result = agent.run("Hello!")
Teaching assistant for Python programming:
from agenai.agents.teaching_assistant import TeachingAssistantAgent
agent = TeachingAssistantAgent(difficulty_level="beginner")
result = agent.run("Explain what a for loop is")
Tools: run_code, review_code, create_exercise, create_quiz
┌─────────────┐ WebSocket ┌─────────────┐ ┌─────────────┐
│ Frontend │ <================> │ Backend │ <==========> │ Ollama │
│ (Web Chat) │ │ (FastAPI) │ │ (Local LLM) │
└─────────────┘ └──────┬──────┘ └─────────────┘
│
▼
┌─────────────┐
│ Agenai │
│ Agents │
└─────────────┘
See AI-AGENT-ARCHITECTURE.md for full details.
# Install dev dependencies
pip install -e ".[dev]"
# Run tests
pytest tests/ -v
# Format code
ruff check --fix .
# Build only
./scripts/publish.sh --build-only
# Publish to TestPyPI
TEST_PYPI_TOKEN=xxx ./scripts/publish.sh --test
# Publish to PyPI
PYPI_TOKEN=xxx ./scripts/publish.sh
The repo includes a GitHub Actions workflow that auto-publishes using Trusted Publisher (OIDC - no API tokens needed).
How it works:
Go to https://pypi.org/manage/project/agenai/settings/publishing/
Click "Add a new publisher"
Fill in:
| Field | Value |
|---|---|
| Owner | tautobot |
| Repository | agenai |
| Workflow name | publish.yml |
| Environment name | pypi |
testpypipypitestpypipyproject.tomlv0.x.xMIT
Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.1.3 | 26 Mar 2026 | 12 |
This describes our collected data; it is not a security assessment.
Observed since 20 Oct, 21:24 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:c7741285c92317b22148a1cc290ba97c6caa9329a27d09000250fb0d22c7eece