Skip to main content

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 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

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

elizaos-2.0.0a5.tar.gz (296.8 kB view details)

Uploaded Source

Built Distribution

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

elizaos-2.0.0a5-py3-none-any.whl (414.3 kB view details)

Uploaded Python 3

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

Hashes for elizaos-2.0.0a5.tar.gz
Algorithm Hash digest
SHA256 76cff9c69e376f3f6cbc3967a6d12643ce024da3bd9a5bf6a57ddfa3d4a422f8
MD5 42832513e3f6ddad5733a052676eed3e
BLAKE2b-256 6d29882b27863358dce81310ee3505411b22d7e0391230f23ff9c62827bbd989

See more details on using hashes here.

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

Hashes for elizaos-2.0.0a5-py3-none-any.whl
Algorithm Hash digest
SHA256 f33b341945d9195ca2163e9bc87e4926cdda20ef5c78e5091bf9f55547f2b2d5
MD5 7e3cf155498bc907fcff36b7864e5b17
BLAKE2b-256 567e8d8215c7337c05ce21952c66151f5528c58c3a34a4d07791c8b77ceb5bf1

See more details on using hashes here.

Supported by

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