Skip to main content

Symvion AI Runtime

A multi-tenant AI orchestration framework powered by LangGraph.

Core Capabilities

Symvion provides a clean, modular Python package that supports:

  • Multi-tenant orchestration with isolated contexts
  • Dynamic agent registration via APIs (stating payloads and expected responses schemas)
  • Abstracted Tool/function calling
  • Observability hooks and state routing via LangGraph
  • HITL / controlled GenUI pauses via interrupt_before_tools + resume_stream (package protocol; no HTTP layer)

Installation

Create a project in one command (Python equivalent of npx create-next-app). uv and pipx download the CLI, scaffold the app, pin symvion in requirements.txt, create .venv, and install dependencies.

uv

uvx --from symvion create-symvion my-project

pipx

pipx run --spec symvion create-symvion my-project

Keep the CLI: pipx install symvion, then create-symvion my-project.

pip (Windows, macOS, Linux — no PATH setup required)

python -m pip install symvion
python -m symvion create my-project

conda — use --no-install so you do not nest a .venv inside the conda env:

conda create -n my-project python=3.12 -y
conda activate my-project
python -m pip install symvion
python -m symvion create my-project --no-install
cd my-project
python -m pip install -r requirements.txt

Poetry

python -m pip install symvion
python -m symvion create my-project --no-install
cd my-project
poetry init --no-interaction
poetry add symvion python-dotenv

symvion init is an alias for create. Pass --no-install to scaffold files only.

Example Usage

import asyncio
from symvion import Symvion, TenantConfig

async def main():
    config = TenantConfig(tenant_id="acme_corp")
    runtime = Symvion(config=config)
    
    runtime.register_agent({
        "name": "task_orchestrator",
        "description": "Orchestrates general tasks and queries",
        "system_prompt": "You are a helpful task orchestrator. Help the user with their request.",
        "input_schema": {
            "type": "object",
            "properties": {"task_description": {"type": "string"}}
        },
        "output_schema": {
            "type": "object",
            "properties": {"action_plan": {"type": "string"}, "is_complete": {"type": "boolean"}}
        },
        "tools": []
    })
    
    response = await runtime.chat(
        tenant="acme_corp",
        agent_name="task_orchestrator",
        payload_data={"task_description": "Organize my daily schedule and send notifications."}
    )
    print("Response:")
    print(response)

if __name__ == "__main__":
    asyncio.run(main())

HITL / controlled GenUI (package protocol)

Symvion can pause before selected tools so a portal or widget can render a form, approve, edit args, reject, or supply a client-side result — then resume the same session.

Allowlist only. Pass interrupt_before_tools=["render_signup_form"] (or set TenantConfig.interrupt_before_tools). Empty list = off. Backend/MCP tools not on the list keep auto-running. Tools marked with mark_client_tool(...) always interrupt.

from symvion.tools.hitl import mark_client_tool

async for event in runtime.chat_stream(
    tenant="acme_corp",
    message="Open the Signup form",
    session_id="thread-1",
    interrupt_before_tools=["render_signup_form"],
):
    if event["type"] == "tool_start":
        ...  # inspectors see this before interrupt
    if event["type"] == "interrupt":
        # event: tool, call_id, args, ui
        ...
    if event["type"] == "done" and event["status"] == "interrupted":
        break

async for event in runtime.resume_stream(
    tenant="acme_corp",
    session_id="thread-1",
    resume={"action": "provide_result", "result": {"symbol": "XYZ", "shares": 100}},
):
    print(event)

Resume actions: approve | edit (with args, client/UI tools only unless trust_hitl_edit) | reject | provide_result (with result).

Security (0.4.10+): provide_result and edit are only accepted for tools marked with mark_client_tool(...) unless you set TenantConfig.trust_hitl_edit (edit on server tools). approve uses the original interrupt args. Request metadata cannot override interrupt_before_tools / user_role / agent_id unless you set the matching trust_client_* flags after verifying the caller. allowed_outbound_hosts and file_sandbox_dir on TenantConfig are applied to claims and MCP clients. See CHANGELOG.md.

Stream events: token, agent_start, tool_start, interrupt, tool_end, metadata, done (success | interrupted), error.

Checkpointer note

Graphs compile with an injectable LangGraph checkpointer. The default is process-local MemorySaver — fine for package tests and single-process demos. Multi-replica or Coronation production should pass a durable checkpointer into Symvion(config, checkpointer=...).

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

symvion-0.4.12.tar.gz (249.8 kB view details)

Uploaded Source

Built Distribution

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

symvion-0.4.12-py3-none-any.whl (100.5 kB view details)

Uploaded Python 3

File details

Details for the file symvion-0.4.12.tar.gz.

File metadata

  • Download URL: symvion-0.4.12.tar.gz
  • Upload date:
  • Size: 249.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for symvion-0.4.12.tar.gz
Algorithm Hash digest
SHA256 d30fe7e1e98c3a22973c21b49bfa3cef683a59a8ab1165ef97fae893181f5b3c
MD5 0ab6f782dc09f25bbefcdc71a54238df
BLAKE2b-256 1114354daf0698877e23f8bcfe0d362ae6da40e6378e61b23cffbf1175684609

See more details on using hashes here.

File details

Details for the file symvion-0.4.12-py3-none-any.whl.

File metadata

  • Download URL: symvion-0.4.12-py3-none-any.whl
  • Upload date:
  • Size: 100.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for symvion-0.4.12-py3-none-any.whl
Algorithm Hash digest
SHA256 5db15ea89428d812a065e6b38c363b2a0fcd6c35251f468265962497837c67b0
MD5 bc72a71d71ab537e7ed0f83ad408d106
BLAKE2b-256 c1b6aa753085d405da52900d8427cfeccd119d09a89e98b6fdeb389f69e02d41

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.4.12 This release

2 files

0.4.11

2 files

0.4.10

2 files

Supported by

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