SkillAgentSearch skills...

Flowpipe

Very simple flow-based programming framework.

Install / Use

/learn @PaulSchweizer/Flowpipe
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

Version

<!-- Pytest Coverage Comment:Begin -->

<a href="https://github.com/PaulSchweizer/flowpipe/blob/main/README.md"><img alt="Coverage" src="https://img.shields.io/badge/Coverage-97%25-brightgreen.svg" /></a><details><summary>Coverage Report </summary><table><tr><th>File</th><th>Stmts</th><th>Miss</th><th>Cover</th><th>Missing</th></tr><tbody><tr><td colspan="5"><b>flowpipe</b></td></tr><tr><td>   <a href="https://github.com/PaulSchweizer/flowpipe/blob/main/flowpipe/__init__.py">init.py</a></td><td>4</td><td>0</td><td>100%</td><td> </td></tr><tr><td>   <a href="https://github.com/PaulSchweizer/flowpipe/blob/main/flowpipe/errors.py">errors.py</a></td><td>2</td><td>0</td><td>100%</td><td> </td></tr><tr><td>   <a href="https://github.com/PaulSchweizer/flowpipe/blob/main/flowpipe/evaluator.py">evaluator.py</a></td><td>144</td><td>30</td><td>79%</td><td><a href="https://github.com/PaulSchweizer/flowpipe/blob/main/flowpipe/evaluator.py#L196-L198">196–198</a>, <a href="https://github.com/PaulSchweizer/flowpipe/blob/main/flowpipe/evaluator.py#L241-L246">241–246</a>, <a href="https://github.com/PaulSchweizer/flowpipe/blob/main/flowpipe/evaluator.py#L249">249</a>, <a href="https://github.com/PaulSchweizer/flowpipe/blob/main/flowpipe/evaluator.py#L255-L256">255–256</a>, <a href="https://github.com/PaulSchweizer/flowpipe/blob/main/flowpipe/evaluator.py#L276">276</a>, <a href="https://github.com/PaulSchweizer/flowpipe/blob/main/flowpipe/evaluator.py#L294-L323">294–323</a></td></tr><tr><td>   <a href="https://github.com/PaulSchweizer/flowpipe/blob/main/flowpipe/event.py">event.py</a></td><td>23</td><td>0</td><td>100%</td><td> </td></tr><tr><td>   <a href="https://github.com/PaulSchweizer/flowpipe/blob/main/flowpipe/graph.py">graph.py</a></td><td>216</td><td>1</td><td>99%</td><td><a href="https://github.com/PaulSchweizer/flowpipe/blob/main/flowpipe/graph.py#L335">335</a></td></tr><tr><td>   <a href="https://github.com/PaulSchweizer/flowpipe/blob/main/flowpipe/node.py">node.py</a></td><td>377</td><td>2</td><td>99%</td><td><a href="https://github.com/PaulSchweizer/flowpipe/blob/main/flowpipe/node.py#L325-L330">325–330</a></td></tr><tr><td>   <a href="https://github.com/PaulSchweizer/flowpipe/blob/main/flowpipe/plug.py">plug.py</a></td><td>215</td><td>2</td><td>99%</td><td><a href="https://github.com/PaulSchweizer/flowpipe/blob/main/flowpipe/plug.py#L69-L74">69–74</a></td></tr><tr><td>   <a href="https://github.com/PaulSchweizer/flowpipe/blob/main/flowpipe/utilities.py">utilities.py</a></td><td>88</td><td>2</td><td>98%</td><td><a href="https://github.com/PaulSchweizer/flowpipe/blob/main/flowpipe/utilities.py#L37">37</a>, <a href="https://github.com/PaulSchweizer/flowpipe/blob/main/flowpipe/utilities.py#L45">45</a></td></tr><tr><td><b>TOTAL</b></td><td><b>1069</b></td><td><b>37</b></td><td><b>97%</b></td><td> </td></tr></tbody></table></details>

<!-- Pytest Coverage Comment:End -->

License: MIT PyPI - Python Version Documentation Status Black

Flowpipe Logo

Flow-based Programming

A lightweight framework for flow-based programming in python.

+-------------------+          +---------------------+
|   Invite People   |          |   Birthday Party    |
|-------------------|          |---------------------|
o amount<4>         |   +----->o attendees<>         |
|            people o---+ +--->o cake<>              |
+-------------------+     |    +---------------------+
                          |
+-------------------+     |
|    Bake a cake    |     |
+-------------------+     |
o type<"Chocolate"> |     |
|              cake o-----+
+-------------------+

Benefits:

  • Visualize code
  • Re-usability
  • Streamlined code design
  • Built-in concurrency
  • Represent workflows one to one in the code

Flowpipe - VFX Production Proven Flow-based Programming <br> Flowpipe Presentation Open Source Days 2025

Quick Example

Consider this simple example on how to represent the construction of a house with Flowpipe:

from flowpipe import Graph, INode, Node, InputPlug, OutputPlug


class HireWorkers(INode):
    """A node can be derived from the INode interface.

    The plugs are defined in the init method.
    The compute method received the inputs from any connected upstream nodes.
    """

    def __init__(self, amount=None, **kwargs):
        super(HireWorkers, self).__init__(**kwargs)
        InputPlug('amount', self, amount)
        OutputPlug('workers', self)

    def compute(self, amount):
        workers = ['John', 'Jane', 'Mike', 'Michelle']
        print('{0} workers are hired to build the house.'.format(amount))
        return {'workers.{0}'.format(i): workers[i] for i in range(amount)}


@Node(outputs=['workers'])
def Build(workers, section):
    """A node can also be created by the Node decorator.outputs

    The inputs to the function are turned into InputsPlugs, otuputs are defined
    in the decorator itself. The wrapped function is used as the compute method.
    """
    print('{0} are building the {1}'.format(', '.join(workers.values()), section))
    return {'workers.{0}'.format(i): worker for i, worker in workers.items()}


@Node()
def Party(attendees):
    print('{0} and {1} are having a great party!'.format(
        ', '.join(list(attendees.values())[:-1]), list(attendees.values())[-1]))


# Create a graph with the necessary nodes
graph = Graph(name='How to build a house')
workers = HireWorkers(graph=graph, amount=4)
build_walls = Build(graph=graph, name='Build Walls', section='walls')
build_roof = Build(graph=graph, name='Build Roof', section='roof')
party = Party(graph=graph, name='Housewarming Party')

# Wire up the connections between the nodes
workers.outputs['workers']['0'].connect(build_walls.inputs['workers']['0'])
workers.outputs['workers']['1'].connect(build_walls.inputs['workers']['1'])
workers.outputs['workers']['2'].connect(build_roof.inputs['workers']['0'])
workers.outputs['workers']['3'].connect(build_roof.inputs['workers']['1'])
build_walls.outputs['workers']['0'] >> party.inputs['attendees']['0']
build_walls.outputs['workers']['1'] >> party.inputs['attendees']['2']
build_roof.outputs['workers']['0'] >> party.inputs['attendees']['1']
build_roof.outputs['workers']['1'] >> party.inputs['attendees']['3']
party.inputs['attendees']['4'].value = 'Homeowner'

Visualize the code as a graph or as a listing:

print(graph.name)
print(graph)
print(graph.list_repr())

Output:

How to build a house
+------------------------+          +------------------------+          +---------------------------+
|      HireWorkers       |          |       Build Roof       |          |    Housewarming Party     |
|------------------------|          |------------------------|          |---------------------------|
o amount<4>              |          o section<"roof">        |          % attendees                 |
|                workers %          % workers                |     +--->o  attendees.0<>            |
|             workers.0  o-----+--->o  workers.0<>           |     |--->o  attendees.1<>            |
|             workers.1  o-----|--->o  workers.1<>           |     |--->o  attendees.2<>            |
|             workers.2  o-----|    |                workers %     |--->o  attendees.3<>            |
|             workers.3  o-----|    |             workers.0  o-----|    o  attendees.4<"Homeowner>  |
+------------------------+     |    |             workers.1  o-----|    +---------------------------+
                               |    +------------------------+     |
                               |    +------------------------+     |
                               |    |      Build Walls       |     |
                               |    |------------------------|     |
                               |    o section<"walls">       |     |
                               |    % workers                |     |
                               +--->o  workers.0<>           |     |
                               +--->o  workers.1<>           |     |
                                    |                workers %     |
                                    |             workers.0  o-----+
                                    |             workers.1  o-----+
                                    +------------------------+

Build a House
 HireWorkers
  [i] amount: 4
  [o] workers
   [o] workers.0 >> Build Walls.workers.0
   [o] workers.1 >> Build Walls.workers.1
   [o] workers.2 >> Build Roof.workers.0
   [o] workers.3 >> Build Roof.workers.1
 Build Roof
  [i] section: "roof"
  [i] workers
   [i] workers.0 << HireWorkers.workers.2
   [i] workers.1 << HireWorkers.workers.3
  [o] workers
   [o] workers.0 >> Housewarming Party.attendees.1
   [o] workers.1 >> Housewarming Party.attendees.3
 Build Walls
  [i] section: "walls"
  [i] workers
   [i] workers.0 << HireWorkers.workers.0
   [i] workers.1 << HireWorkers.workers.1
  [o] workers
   [o] workers.0 >> Housewarming Party.attendees.0
   [o] workers.1 >> Housewarming Party.attendees.2
 Housewarming Party
  [i] attendees
   [i] attendees.0 << Build Walls.workers.0
   [i] attendees.1 << Build Roof.workers.0
   [i] attendees.2 << Build Walls.workers.1
   [i] attendees.3 << Build Roof
View on GitHub
GitHub Stars271
CategoryDevelopment
Updated8d ago
Forks38

Languages

Python

Security Score

100/100

Audited on Mar 20, 2026

No findings