Skip to main content

Hush workflow engine core - A powerful async workflow orchestration framework

Project description

hush-icore

Core workflow engine for Hush — async DAG execution with built-in tracing and type-safe state management.

PyPI Python

Installation

pip install hush-icore

Quick Start

import asyncio
from hush.core import Hush, GraphOp, op, START, END, PARENT

@op
def double(x: int):
    return {"result": x * 2}

async def main():
    with GraphOp(name="workflow") as graph:
        step = double(x=PARENT["x"])
        START >> step >> END

    result = await Hush(graph).run(inputs={"x": 5})
    print(result["result"])  # 10

asyncio.run(main())

Key Concepts

Ops

  • @op — Turn any function into a workflow node
  • GraphOp — Container for nested workflows
  • BranchOp — Conditional routing (if_(...).else_(...))
  • @graph — Reusable workflow factory with auto-naming

@graph — Reusable Workflow Factory

from hush.core import graph, op, START, END, PARENT, GraphOp, Hush

#        fetch
#       /     \
# summarize  translate    (parallel)
#       \     /
#     merge_results

@op
def fetch(url: str):
    return {"data": f"content from {url}"}

@op
def summarize(text: str):
    return {"summary": text[:50] + "..."}

@op
def translate(text: str):
    return {"translated": f"[VI] {text}"}

@op
def merge_results(summary: str, translated: str):
    return {"report": f"{summary}\n{translated}"}

@graph
def process_url(url):
    f = fetch(url=url)
    s = summarize(text=f["data"])
    t = translate(text=f["data"])
    m = merge_results(summary=s["summary"], translated=t["translated"])
    START >> f >> [s, t] >> m >> END

@op
def publish(report: str):
    return {"status": f"published: {report[:30]}..."}

# Use in a parent graph — auto-named from variable
async def main():
    with GraphOp(name="pipeline") as pipeline:
        p = process_url(url=PARENT["url"])
        pub = publish(report=p["report"])
        START >> p >> pub >> END

    result = await Hush(pipeline).run(inputs={"url": "https://example.com"})
    print(result["status"])

Flow Control

# Sequential
START >> a >> b >> c >> END

# Parallel (fork + join)
START >> [a, b, c] >> merge >> END

# Generator (streaming iteration)
@op
def each_item(items: list):
    for item in items:
        yield {"value": item}

# Loop (feedback loop with condition)
with GraphOp.loop(until="count >= 5") as loop:
    inc = increment(counter=PARENT["count"])
    inc["counter"] >> PARENT["count"]
    START >> inc >> END

State References

# PARENT["key"] — external inputs from engine.run()
step = double(x=PARENT["input"])

# op["key"] — output from sibling op
upper = to_upper(text=greet["greeting"])

# Output mapping
step["result"] >> PARENT["answer"]

Tracing

from hush.core.tracing import LocalTracer

engine = Hush(graph, tracer=LocalTracer(tags=["dev"]))
result = await engine.run(inputs={...})
# Traces written to ~/.hush/traces/{request_id}.json

For external backends (Langfuse, OpenTelemetry), see hush-telemetry.

Rust Backend

hush-icore has a companion Rust crate for high-performance execution (~8x faster on pure-compute). Use via hush-serve:

engine = Hush(graph)
engine.serve(port=8000, backend="rust")

Related Packages

Package Description
hush-providers LLM, embedding, reranking integrations
hush-telemetry Langfuse, OpenTelemetry tracing
hush-serve HTTP API server (Python + Rust backends)

License

Apache 2.0

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

hush_icore-0.5.0.tar.gz (108.7 kB view details)

Uploaded Source

Built Distribution

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

hush_icore-0.5.0-py3-none-any.whl (137.8 kB view details)

Uploaded Python 3

File details

Details for the file hush_icore-0.5.0.tar.gz.

File metadata

  • Download URL: hush_icore-0.5.0.tar.gz
  • Upload date:
  • Size: 108.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for hush_icore-0.5.0.tar.gz
Algorithm Hash digest
SHA256 c2db4461de2dd82dba6329ab06c8bf0e233c9d1b4d78bc91078e740174a87203
MD5 c667855604a1ba25ed7c00560dbd8405
BLAKE2b-256 7c648e2c64cc692b302fab0fa8556efdc88c570f9859288917a104bc2a6e2617

See more details on using hashes here.

File details

Details for the file hush_icore-0.5.0-py3-none-any.whl.

File metadata

  • Download URL: hush_icore-0.5.0-py3-none-any.whl
  • Upload date:
  • Size: 137.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for hush_icore-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3f42b9241072ffb740eb890b89431aa7decbc6e3df07d1d69ff92a5cdf2a5760
MD5 72459cfaddb71c62634fe84b62fdd89a
BLAKE2b-256 bde4aca49e150c0182eded20aed49aef3d15c3d3d3266a6331a2ac952ee137cd

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