ESC

Type to search...

Plugin Standard

Standard for publishing EVOID plugins to PyPI. Anyone can build and publish plugins — you don’t need to be part of the core team.

Naming Convention

Plugins must follow this naming:

PatternExampleUse Case
evoid-*evoid-redisOfficial or community plugins
evoid-plugin-*evoid-plugin-discordCommunity plugins (alternative)

Both patterns are discoverable via evo plug search.

Manifest

Every plugin must have a MANIFEST dict in its __init__.py:

MANIFEST = {
    "name": "evoid-redis",
    "version": "0.1.0",
    "type": "engine",
    "description": "Redis cache engine for EVOID",
    "entry_point": "evoid_redis:register_plugin",
    "dependencies": ["redis>=4.0.0"],
    "evoid_version": ">=0.4.0",
    "tags": ["cache", "redis"],
}

Manifest Fields

FieldRequiredDescription
nameyesMust start with evoid
versionyesSemantic version
typeyesadapter, engine, language, or processor
descriptionnoWhat the plugin does
entry_pointnomodule:function format
dependenciesnoRequired packages
evoid_versionnoRequired EVOID version
tagsnoDiscovery tags

Creating a Plugin

Step 1: Package Structure

evoid-redis/
  evoid_redis/
    __init__.py
    cache.py
  pyproject.toml
  README.md

Step 2: Implement Entry Point

# evoid_plugin/__init__.py
from evoid.engines.plugin import register

def register_plugin():
    """Called by EVOID to register this plugin."""
    from .cache import RedisCache
    register("redis", "engine", RedisCache, version="1.0.0")

Step 3: pyproject.toml

[project]
name = "evoid-redis"
version = "1.0.0"
dependencies = ["redis>=4.0.0"]

[project.entry-points."evoid.plugins"]
redis = "evoid_plugin:register_plugin"

Discovery

Search PyPI

from evoid.engines.plugin import search_plugins

plugins = search_plugins("evoid")
# [{"name": "evoid-redis", "version": "1.0.0"}, ...]

Discover Installed

from evoid.engines.plugin import discover_installed

plugins = discover_installed()
# [PluginManifest(name="evoid-redis", ...), ...]

Installation

# From PyPI
evo plug install evoid-redis

# From git
evo plug install git+https://github.com/user/evoid-redis.git

# Search for plugins
evo plug search cache

# List installed
evo plug list

Via uv

uv add evoid-redis

Via evo CLI

evo install redis

Via EVOID Config

# evoid.toml
[plugins]
engines = ["redis"]

[plugins.redis]
module = "evoid_redis"
factory = "register_plugin"

Plugin Types

TypePurposeExample
adapterConvert external events to Intentstelegram, discord
engineReplace infrastructure componentsredis, sqlalchemy
languageAdd language runtimesrust, go
processorAdd custom pipeline processorsrate_limiter

Validation

from evoid.engines.plugin import PluginManifest, validate_manifest

manifest = PluginManifest(
    name="evoid-redis",
    version="1.0.0",
    type="engine",
)

errors = validate_manifest(manifest)
if errors:
    print(f"Invalid: {errors}")

Native IOP Style

In native IOP, plugins are just Intent-based:

from evoid.native import create_service, on
from evoid import Intent, Level
from evoid.engines.plugin import register

# Plugin registers itself
def register_plugin():
    register("redis", "engine", RedisCache, version="1.0.0")

# Service uses the plugin
app = create_service("api")
on(app, Intent(name="cache_get"), handle_cache_get)