Skip to main content

Motia framework for III Engine

Project description

Motia Framework for Python

High-level framework for building workflows with the III Engine.

Installation

uv pip install motia

Usage

Defining a Step

from motia import FlowContext, queue

config = {
    "name": "process-data",
    "triggers": [queue("data.created")],
    "enqueues": ["data.processed"],
}

async def handler(data: dict, ctx: FlowContext) -> None:
    ctx.logger.info("Processing data", data)
    await ctx.enqueue({"topic": "data.processed", "data": data})

API Steps

from motia import ApiRequest, ApiResponse, FlowContext, http

config = {
    "name": "create-item",
    "triggers": [http("POST", "/items")],
    "emits": ["item.created"],
}

async def handler(req: ApiRequest, ctx: FlowContext) -> ApiResponse:
    ctx.logger.info("Creating item", req.body)
    await ctx.enqueue({"topic": "item.created", "data": req.body})
    return ApiResponse(status=201, body={"id": "123"})

Channel-based HTTP (Streaming)

import json
from typing import Any

from motia import FlowContext, MotiaHttpArgs, http

config = {
    "name": "HttpChannelEcho",
    "triggers": [http("POST", "/http-channel/echo")],
}

async def handler(args: MotiaHttpArgs[Any], ctx: FlowContext[Any]) -> None:
    request = args.request
    response = args.response

    chunks: list[bytes] = []
    async for chunk in request.request_body.stream:
        chunks.append(chunk if isinstance(chunk, bytes) else str(chunk).encode("utf-8"))

    await response.status(200)
    await response.headers({"content-type": "application/json"})
    response.writer.stream.write(json.dumps({"receivedBytes": len(b"".join(chunks))}).encode("utf-8"))
    response.close()

Streams

from motia import Stream

# Define a stream
todo_stream = Stream[dict]("todos")

# Use the stream
item = await todo_stream.get("group-1", "item-1")
await todo_stream.set("group-1", "item-1", {"title": "Buy milk"})
await todo_stream.delete("group-1", "item-1")
items = await todo_stream.get_group("group-1")

Build & Publish

python -m build
uv publish --index cloudsmith dist/*

Features

  • Event-driven step definitions
  • API route handlers
  • Cron job support
  • Stream-based state management
  • Type-safe context with logging

Testing

  1. Install dev dependencies:

    uv sync --extra dev
    
  2. Run the unit test suite:

    uv run pytest -m "not integration"
    
  3. Run the unit test suite with coverage:

    uv run pytest -m "not integration" --cov=src/motia --cov-report=term-missing
    

Running Integration Tests

Integration tests require a running III Engine instance on the test ports below.

uv run pytest -m integration

Test Configuration

Tests use non-default ports to avoid conflicts:

  • Engine WebSocket: ws://localhost:49199
  • HTTP API: http://localhost:3199

Set III_ENGINE_PATH environment variable to point to the III engine binary.

Test Coverage

The coverage command above measures the unit-testable Python package code under src/motia.

The integration test suite covers:

  • Bridge connection and function registration
  • API triggers (HTTP endpoints)
  • KV Server operations
  • PubSub messaging
  • Logging module
  • Motia framework integration
  • Stream operations (when available)
  • State management (when available)

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

motia-1.0.2rc1.tar.gz (127.4 kB view details)

Uploaded Source

Built Distribution

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

motia-1.0.2rc1-py3-none-any.whl (34.0 kB view details)

Uploaded Python 3

File details

Details for the file motia-1.0.2rc1.tar.gz.

File metadata

  • Download URL: motia-1.0.2rc1.tar.gz
  • Upload date:
  • Size: 127.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for motia-1.0.2rc1.tar.gz
Algorithm Hash digest
SHA256 0cb0199943d970e8fcfe40b839eb3d9993988c740a60382bb7ea1a16aba960c0
MD5 86400dc1185a3d95d0f077d07090f81e
BLAKE2b-256 b30e46fda46318d2b5f855a3c555fa8a18010610ae0af2908e3bed01a13beb5b

See more details on using hashes here.

File details

Details for the file motia-1.0.2rc1-py3-none-any.whl.

File metadata

  • Download URL: motia-1.0.2rc1-py3-none-any.whl
  • Upload date:
  • Size: 34.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for motia-1.0.2rc1-py3-none-any.whl
Algorithm Hash digest
SHA256 80ae293d031c7029a78d0ae5e468bceb01f74d7804b73218d5be11f384b7d87c
MD5 9d55c8d177f82bc56b555b1e8e7b029b
BLAKE2b-256 136a6c410f5fbd31f896de7f5384c2c2668c7c54a6cc911eb291811e7507afb1

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