elizaOS Core - The Python runtime and types for elizaOS AI agents
Project description
elizaOS Core (Python)
The Python implementation of elizaOS Core - the runtime and types for elizaOS AI agents.
Installation
From Repository (Development)
# From the repo root
cd eliza
# Create and activate virtual environment
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install the core package
pip install -e packages/python
# Install an LLM provider (required)
pip install -e plugins/plugin-openai/python
# Install a database adapter (required for message handling)
pip install -e plugins/plugin-inmemorydb/python
From PyPI
pip install elizaos elizaos-plugin-openai elizaos-plugin-inmemorydb
Quick Start
Run the Chat Example
# Set your OpenAI API key
export OPENAI_API_KEY="your-key"
# Run the example
python examples/chat/python/chat.py
Create Your Own Agent
from __future__ import annotations
import asyncio
import os
from pathlib import Path
from dotenv import load_dotenv
load_dotenv() # Load .env file
from uuid6 import uuid7
from elizaos import Character, ChannelType, Content, Memory
from elizaos.runtime import AgentRuntime
from elizaos_plugin_openai import get_openai_plugin
from elizaos_plugin_inmemorydb import plugin as inmemorydb_plugin
async def main() -> None:
# Define your agent's character
character = Character(
name="Eliza",
username="eliza",
bio="A helpful AI assistant.",
system="You are helpful and concise.",
)
# Create runtime with plugins
runtime = AgentRuntime(
character=character,
plugins=[
get_openai_plugin(), # LLM provider
inmemorydb_plugin, # Database adapter
],
)
user_id = uuid7()
room_id = uuid7()
try:
await runtime.initialize()
print(f"🤖 Chat with {character.name} (type 'quit' to exit)\n")
while True:
user_input = input("You: ")
if not user_input.strip() or user_input.lower() in ("quit", "exit"):
break
message = Memory(
entity_id=user_id,
room_id=room_id,
content=Content(
text=user_input,
source="cli",
channel_type=ChannelType.DM.value,
),
)
result = await runtime.message_service.handle_message(runtime, message)
print(f"\n{character.name}: {result.response_content.text}\n")
print("Goodbye! 👋")
finally:
await runtime.stop()
if __name__ == "__main__":
asyncio.run(main())
Features
- Strong typing with Pydantic models and full type hints
- Plugin architecture for extensibility
- Character configuration for defining agent personalities
- Memory system for conversation history and knowledge
- Event system for reactive programming
- Service abstraction for external integrations
Runtime Settings (cross-language parity)
These settings are read by the runtime/message loop to keep behavior aligned with the TypeScript and Rust implementations:
ALLOW_NO_DATABASE: when truthy, the runtime may run without a database adapter (benchmarks/tests).USE_MULTI_STEP: when truthy, enable the iterative multi-step workflow.MAX_MULTISTEP_ITERATIONS: maximum iterations for multi-step mode (default:6).
Benchmark & Trajectory Tracing
Benchmarks and harnesses can attach metadata to inbound messages:
message.metadata.trajectoryStepId: enables trajectory tracing for provider access + model calls.message.metadata.benchmarkContext: enables theCONTEXT_BENCHprovider and setsstate.values["benchmark_has_context"]=True, which forces action-based execution to exercise the full loop.
Model output contract (XML preferred, plain text tolerated)
The canonical message loop expects model outputs in the <response>...</response> XML format (with <actions>, <providers>, and <text> fields).
Some deterministic/offline backends may return plain text instead. In that case, the runtime will treat the raw output as a simple REPLY so the system remains usable even when strict XML formatting is unavailable.
Core Types
UUID- Universally unique identifierContent- Message content with text, actions, attachmentsMemory- Stored message or informationEntity- User or agent representationRoom- Conversation contextWorld- Collection of rooms and entities
Components
Action- Define agent capabilitiesProvider- Supply contextual informationEvaluator- Post-interaction analysisService- Long-running integrations
Plugin System
from elizaos import Plugin, Action, Provider
my_plugin = Plugin(
name="my-plugin",
description="A custom plugin",
actions=[...],
providers=[...],
)
Available Plugins
LLM Providers
| Plugin | Path | Description |
|---|---|---|
| OpenAI | plugins/plugin-openai/python |
GPT-4, embeddings, DALL-E |
| Anthropic | plugins/plugin-anthropic/python |
Claude models |
| Ollama | plugins/plugin-ollama/python |
Local LLMs |
| Groq | plugins/plugin-groq/python |
Fast inference |
Database Adapters
| Plugin | Path | Description |
|---|---|---|
| InMemoryDB | plugins/plugin-inmemorydb/python |
Ephemeral storage (dev/testing) |
| SQL | plugins/plugin-sql/python |
PostgreSQL/PGLite |
Platform Integrations
| Plugin | Path | Description |
|---|---|---|
| Telegram | plugins/plugin-telegram/python |
Telegram bots |
| Discord | plugins/plugin-discord/python |
Discord bots |
Environment Variables
# Required for OpenAI plugin
OPENAI_API_KEY=sk-...
# Optional
LOG_LEVEL=INFO
Development
# Install development dependencies
pip install -e ".[dev]"
# (Reproducible/pinned) Generate lockfiles used by CI
pip install pip-tools
pip-compile requirements.in -o requirements.lock
pip-compile requirements-dev.in -o requirements-dev.lock
# Run tests
pytest
# Type checking
mypy elizaos
# Linting
ruff check elizaos
Examples
See examples/ directory for complete working examples:
examples/chat/python/- CLI chat agentexamples/telegram/python/- Telegram botexamples/discord/python/- Discord botexamples/rest-api/fastapi/- REST API server
License
MIT
Project details
Release history Release notifications | RSS feed
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 elizaos-2.0.0a5.tar.gz.
File metadata
- Download URL: elizaos-2.0.0a5.tar.gz
- Upload date:
- Size: 296.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
76cff9c69e376f3f6cbc3967a6d12643ce024da3bd9a5bf6a57ddfa3d4a422f8
|
|
| MD5 |
42832513e3f6ddad5733a052676eed3e
|
|
| BLAKE2b-256 |
6d29882b27863358dce81310ee3505411b22d7e0391230f23ff9c62827bbd989
|
File details
Details for the file elizaos-2.0.0a5-py3-none-any.whl.
File metadata
- Download URL: elizaos-2.0.0a5-py3-none-any.whl
- Upload date:
- Size: 414.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f33b341945d9195ca2163e9bc87e4926cdda20ef5c78e5091bf9f55547f2b2d5
|
|
| MD5 |
7e3cf155498bc907fcff36b7864e5b17
|
|
| BLAKE2b-256 |
567e8d8215c7337c05ce21952c66151f5528c58c3a34a4d07791c8b77ceb5bf1
|