Executing Pipelines
Once your pipes are defined in .mthds files, you can execute them in multiple ways.
The Simplest Approach: Run a Bundle File
The easiest way to execute a pipeline is to point directly to your .mthds bundle file. No library configuration needed.
Using the CLI
# Run the bundle's main_pipe
pipelex run bundle path/to/my_bundle.mthds
# Run a specific pipe from the bundle
pipelex run bundle path/to/my_bundle.mthds --pipe my_specific_pipe
# Run with inputs
pipelex run bundle path/to/my_bundle.mthds --inputs inputs.json
Preparing Inputs
You can generate an input template with pipelex build inputs bundle path/to/my_bundle.mthds, which creates a results/inputs.json file with the required input structure.
Using Python
from pipelex.pipelex import Pipelex
from pipelex.pipeline.runner import PipelexRunner
Pipelex.make()
# Run the bundle's main_pipe
runner = PipelexRunner(
bundle_uri="path/to/my_bundle.mthds",
)
response = await runner.execute_pipeline(
inputs={
"my_input": {
"concept": "Text",
"content": "Hello world",
},
},
)
pipe_output = response.pipe_output
# Or run a specific pipe from the bundle
runner = PipelexRunner(
bundle_uri="path/to/my_bundle.mthds",
)
response = await runner.execute_pipeline(
pipe_code="my_specific_pipe",
inputs={...},
)
pipe_output = response.pipe_output
How main_pipe Works
When you run a bundle without specifying a pipe_code, Pipelex executes the bundle's main_pipe (declared at the top of the .mthds file). If no main_pipe is defined and no pipe_code is provided, an error is raised.
If you provide both bundle_uri and pipe_code, the explicit pipe_code takes priority over main_pipe.
See the Pipelex Bundle Specification for more about the main_pipe property.
Advanced: Using Library Directories
For larger projects with multiple bundles spread across directories, you can configure library directories to load all your pipes at once and reference them by code.
Understanding Libraries
When executing pipelines programmatically, Pipelex can load pipe libraries - collections of pipes loaded from one or more directories. This is useful when:
- You have multiple bundles across different directories
- You want to reference pipes by code without specifying the bundle path each time
- You're building an application that needs access to many pipes
Library Parameters
When using PipelexRunner, you can control library behavior with these parameters:
-
library_id: A unique identifier for the library instance. If not specified, it defaults to thepipeline_run_id(a unique ID generated for each pipeline execution). -
library_dirs: A list of directory paths to load pipe definitions from. These directories must contain both your.mthdsfiles AND any Python files definingStructuredContentclasses (e.g.,*_struct.pyfiles). If not specified, Pipelex falls back to thePIPELEXPATHenvironment variable, then to the current working directory. -
mthds_content: When provided toPipelexRunner.execute_pipeline(), Pipelex will load only this content into the library, bypassing directory scanning. This is useful for dynamic pipeline execution without file-based definitions.
Python Structure Classes
If your concepts use Python StructuredContent classes instead of inline structures, those Python files must be in the directories specified by library_dirs. Pipelex auto-discovers and registers these classes during library loading. Learn more about Python StructuredContent Classes.
Learn More About Libraries
For a comprehensive understanding of libraries, including their structure, uniqueness rules, lifecycle, and best practices, see Libraries.
Library Directory Configuration
For complete configuration options including the PIPELEXPATH environment variable, CLI options, and priority resolution, see Configuring Library Directories.
Running Pipes by Code
This approach loads pipe definitions from directories and executes a specific pipe by its code.
Basic usage (loads from current working directory):
from pipelex.pipelex import Pipelex
from pipelex.pipeline.runner import PipelexRunner
# First, initialize Pipelex (this loads all pipeline definitions)
Pipelex.make()
# Execute the pipeline and wait for the result
runner = PipelexRunner()
response = await runner.execute_pipeline(
pipe_code="description_to_tagline",
inputs={
"description": {
"concept": "ProductDescription",
"content": "EcoClean Pro is a revolutionary biodegradable cleaning solution that removes 99.9% of germs while being completely safe for children and pets. Made from plant-based ingredients.",
},
},
)
pipe_output = response.pipe_output
Loading from specific directories:
# Load pipes from specific directories
runner = PipelexRunner(
library_dirs=["./pipelines", "./shared_pipes"],
)
response = await runner.execute_pipeline(
pipe_code="description_to_tagline",
inputs={
"description": {
"concept": "ProductDescription",
"content": "...",
},
},
)
pipe_output = response.pipe_output
Using a custom library ID:
# Use a custom library ID for managing multiple library instances
runner = PipelexRunner(
library_id="my_marketing_library",
library_dirs=["./marketing_pipes"],
)
response = await runner.execute_pipeline(
pipe_code="description_to_tagline",
inputs={
"description": {
"concept": "ProductDescription",
"content": "...",
},
},
)
pipe_output = response.pipe_output
Listing available pipes
Use pipelex show pipe --all to list the pipes available in your project.
Using MTHDS Content Directly
You can directly pass MTHDS content as a string to PipelexRunner.execute_pipeline(), useful for dynamic pipeline execution without file-based definitions.
from pipelex.pipelex import Pipelex
from pipelex.pipeline.runner import PipelexRunner
my_pipe_content = """
domain = "marketing"
description = "Marketing content generation domain"
main_pipe = "generate_tagline"
[concept]
ProductDescription = "A description of a product's features and benefits"
Tagline = "A catchy marketing tagline"
[pipe.generate_tagline]
type = "PipeLLM"
description = "Generate a catchy tagline for a product"
inputs = { description = "ProductDescription" }
output = "Tagline"
prompt = "
Product Description: $description
Generate a catchy tagline based on the above description. The tagline should be memorable, concise, and highlight the key benefit.
"
"""
Pipelex.make()
runner = PipelexRunner()
response = await runner.execute_pipeline(
mthds_content=my_pipe_content,
inputs={
"description": {
"concept": "ProductDescription",
"content": "EcoClean Pro is a revolutionary biodegradable cleaning solution that removes 99.9% of germs while being completely safe for children and pets. Made from plant-based ingredients.",
},
},
)
pipe_output = response.pipe_output
Pipe Code Resolution
When using mthds_content:
- If the content has a
main_pipeproperty and you don't providepipe_code, themain_pipeis executed - If you provide
pipe_code, it overridesmain_pipe - If there's no
main_pipeand nopipe_code, an error is raised
Using the Pipelex API
Pipelex has a REST API for executing pipelines. See more about it here.
Background Execution
The public Python entry point is PipelexRunner.execute_pipeline(). The older standalone start_pipeline function is no longer a documented entry point.