Skip to main content

PenguiFlow

PenguiFlow logo

CI Status PyPI version Docs Benchmarks License

Async-first orchestration library for typed, reliable, concurrent workflows — from deterministic data pipelines to LLM agents.

Why PenguiFlow

  • Graph runtime: run async node graphs with bounded queues (backpressure).
  • Reliability controls: per-node timeouts + retries, plus per-trace cancellation and deadlines (envelope mode).
  • Streaming: emit partial output (StreamChunk) and a final answer with deterministic correlation.
  • Planner (ReactPlanner): JSON-first tool orchestration with pause/resume (HITL), parallel fan-out + joins, and trajectory logging.
  • Tool integrations: native + ToolNode (MCP / UTCP / HTTP) with auth and resilience patterns.

Concepts at a glance

  • Flow: a directed graph (runtime) you run(), emit() into, and fetch() results from.
  • Node: an async function + NodePolicy (validation, retries, timeout).
  • Message (recommended for production): Message(payload=..., headers=Headers(tenant=...), trace_id=...) enabling trace correlation, cancellation, deadlines, and streaming.
  • StateStore (optional): durability/audit/event persistence for distributed and “ops-ready” deployments.

Install

Requirements: Python 3.11+

pip install penguiflow

Common extras:

pip install "penguiflow[planner]"      # ReactPlanner + ToolNode integrations
pip install "penguiflow[a2a-server]"   # A2A HTTP+JSON server bindings
pip install "penguiflow[a2a-client]"   # A2A client bindings

If you use uv:

uv pip install penguiflow

Quickstart

1) Minimal typed flow (runtime)

from __future__ import annotations

import asyncio

from pydantic import BaseModel

from penguiflow import ModelRegistry, Node, NodePolicy, create


class In(BaseModel):
    text: str


class Out(BaseModel):
    upper: str


async def to_upper(msg: In, _ctx) -> Out:
    return Out(upper=msg.text.upper())


async def main() -> None:
    node = Node(to_upper, name="to_upper", policy=NodePolicy(validate="both"))

    registry = ModelRegistry()
    registry.register("to_upper", In, Out)

    flow = create(node.to())
    flow.run(registry=registry)

    await flow.emit(In(text="hello"))
    result: Out = await flow.fetch()
    await flow.stop()

    print(result.upper)


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

2) ReactPlanner via CLI (fastest path)

uv run penguiflow new my-agent --template react
cd my-agent
uv sync
uv run penguiflow dev --project-root .

Documentation (canonical)

Suggested starting points (in-repo sources):

Stability, versioning, and public API

PenguiFlow follows a 2.x line and aims to follow SemVer with a clear public surface.

Contributing, security, and support

License

MIT — see LICENSE.

Download files

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

Source Distribution

penguiflow-3.11.0.tar.gz (4.6 MB view details)

Uploaded Source

Built Distribution

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

penguiflow-3.11.0-py3-none-any.whl (4.6 MB view details)

Uploaded Python 3

File details

Details for the file penguiflow-3.11.0.tar.gz.

File metadata

  • Download URL: penguiflow-3.11.0.tar.gz
  • Upload date:
  • Size: 4.6 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for penguiflow-3.11.0.tar.gz
Algorithm Hash digest
SHA256 ed1de256648c586baa9cf9b9f08d7ceb265ef5fbd92a6535a7e94061db8450c0
MD5 882561db98b9ae46f35a2978f28683bd
BLAKE2b-256 428933cb1b9e5a075fead895e6401b3f7fcf31d536dffca5801e4862eea4e0a6

See more details on using hashes here.

Provenance

The following attestation bundles were made for penguiflow-3.11.0.tar.gz:

Publisher: ci.yml on hurtener/penguiflow

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file penguiflow-3.11.0-py3-none-any.whl.

File metadata

  • Download URL: penguiflow-3.11.0-py3-none-any.whl
  • Upload date:
  • Size: 4.6 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for penguiflow-3.11.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1305cfbb3fb044418c069fecb8d0cb35dea1ae226647b17a2e6473495bd8d0f7
MD5 0966bf6d3ac064bd3a2468a0e982d791
BLAKE2b-256 0ad6d49040225d393b388fdba08259d0063203c981f72ef6614c814e03b93b12

See more details on using hashes here.

Provenance

The following attestation bundles were made for penguiflow-3.11.0-py3-none-any.whl:

Publisher: ci.yml on hurtener/penguiflow

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

3.11.2

2 files

3.11.1

2 files

This release

3.11.0 This release

2 files

3.10.1

2 files

3.10.0

2 files

3.9.0

2 files

3.8.1

2 files

3.8.0

2 files

3.7.0

2 files

3.6.4

2 files

3.6.3

2 files

3.6.2

2 files

3.6.1

2 files

3.6.0

2 files

3.5.0

2 files

3.4.0

2 files

3.3.0

2 files

3.2.1

2 files

3.1.1

2 files

3.1.0

2 files

3.0.1

2 files

3.0.0

2 files

2.12.5

2 files

2.12.4

2 files

2.12.3

2 files

2.12.2

2 files

2.12.1

2 files

2.12.0

2 files

2.11.7

2 files

2.11.6

2 files

2.11.5

2 files

2.11.4

2 files

2.11.3

2 files

2.11.2

2 files

2.11.1

2 files

2.11.0

2 files

2.10.2

2 files

2.10.1

2 files

2.9.0

2 files

2.8.1

2 files

2.8.0

2 files

2.7.3

2 files

2.7.1

2 files

2.7.0

2 files

2.6.0

2 files

2.5.0

2 files

2.3.0

2 files

2.2.6

2 files

2.2.5

2 files

2.2.4

2 files

2.2.3

2 files

2.2.2

2 files

2.2.1

2 files

2.2.0

2 files

2.1.0

2 files

2.0.0

2 files

1.0.3

2 files

1.0.2

2 files

1.0.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page