Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

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 the CONTEXT_BENCH provider and sets state.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 identifier
  • Content - Message content with text, actions, attachments
  • Memory - Stored message or information
  • Entity - User or agent representation
  • Room - Conversation context
  • World - Collection of rooms and entities

Components

  • Action - Define agent capabilities
  • Provider - Supply contextual information
  • Evaluator - Post-interaction analysis
  • Service - 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 agent
  • examples/telegram/python/ - Telegram bot
  • examples/discord/python/ - Discord bot
  • examples/rest-api/fastapi/ - REST API server

License

MIT

Metadata

Release files for elizaos 2.0.0a5

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for elizaos 2.0.0a5
File Size Uploaded
elizaos-2.0.0a5.tar.gz 296.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for elizaos 2.0.0a5
File Interpreter ABI Platform
elizaos-2.0.0a5-py3-none-any.whl Python 3 none any Details

Total release size: 711.1 kB

Release files / elizaos-2.0.0a5.tar.gz

Download URL elizaos-2.0.0a5.tar.gz
Size 296.8 kB
Tags Source
SHA-256 checksum
How to use checksums
76cff9c69e376f3f6cbc3967a6d12643ce024da3bd9a5bf6a57ddfa3d4a422f8
BLAKE2b-256 checksum
How to use checksums
6d29882b27863358dce81310ee3505411b22d7e0391230f23ff9c62827bbd989
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release files / elizaos-2.0.0a5-py3-none-any.whl

Download URL elizaos-2.0.0a5-py3-none-any.whl
Size 414.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f33b341945d9195ca2163e9bc87e4926cdda20ef5c78e5091bf9f55547f2b2d5
BLAKE2b-256 checksum
How to use checksums
567e8d8215c7337c05ce21952c66151f5528c58c3a34a4d07791c8b77ceb5bf1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.10

Release history Release notifications | RSS feed

This release

2.0.0a5 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page