A framework for rapidly building large-scale, deterministic, interactive workflows with a fault-tolerant, conversational UX
Project description
Build agents and assistants for complex workflows and large-scale Python applications, with deterministic or AI-powered business logic.
If you have tried AI enabling non-trivial applications, you have struggled with the following:
- AI assistants misunderstanding your intent and not adapting to your vocabulary and commands
- AI agents calling the wrong tools, or getting lost amid complex call chains and workflows
- Hallucinations in parameter extraction for tool calls
- Challenges supporting humans, agents, and client code at the same time
While DSPy (Why DSPy) is an amazing framework for optimizing LLM generation, we need an application framework that understands the concepts of DSPy (signatures, modules, optimization) and layers functionality on top to address the above challenges.
Why fastWorkflow?
- ✅ Cost-Effective Performance: fastWorkFlow with small, free models can match the quality of large expensive models
|
|
|
- ✅ Unlimited Tool Scaling: fastworkflow organizes tools into context hierarchies so use any number of tools without sacrificing performance or efficiency
- ✅ Reliable Tool Execution: fastworkflow validation pipeline virtually eliminates incorrect tool calling or parameter extraction, ensuring a reliable tool response
- ✅ Adaptive Learning: 1-shot learning from intent detection mistakes. It learns your conversational vocabulary as you interact with it
- ✅ Interface Flexibility: Support programmatic, assistant-driven and agent-driven interfaces with the same codebase
- ✅ Deep Code Understanding: fastworkflow understands classes, methods, inheritance and aggregation so you can quickly 'AI-enable' large-scale Python applications
Mistral Small agent tackling a complex command from Tau Bench Retail
Key Concepts
Adaptive Intent Understanding: Misunderstandings are a given in any conversation, no matter how intelligent the participants. Natural language applications should have intent clarification and parameter validation built-in. We have the ability to 1-shot adapt our semantic understanding of words and sentences based on the context of the conversation and clarifications of intent. Applications should also be able to do the same.
Contextual Hierarchies: Communication is always within a context. And not just one concept but layers of contexts. Interpretation starts with the narrowest context and expands to larger contexts if the narrow context does not 'fit' the interpretation. In programming languages, we express contexts as classes, tools as methods and context hierarchies using inheritance and aggregation. Natural language applications should understand classes, methods, inheritance and aggregation out-of-the-box.
Signatures: Signatures (ALA Pydantic and DSPy) are the most efficient way of mapping natural language commands to tool implementations, whether programmatic or GenAI. We use signatures as a backbone for implementing commands, enabling seamless integration with DSPy for producing LLM-content within a deterministic programming framework.
Code Generation: AI-enabling large-scale, complex applications is non-trivial. Build tools that can quickly map natural language commands to application classes and methods are critical if we are to build more than prototypes and demos.
Context Navigation at Runtime: Classes maintain state, not just methods. Method behaviors can change based on state. These capabilities are the building blocks for creating complex finite-state-machines on which non-trivial workflows are built. We need to support dynamically enabling/disabling methods along with the ability to navigate object instance hierarchies at run-time, if we want to build complex workflows.
Table of Contents
- Architecture Overview
- Installation
- Quick Start: Running an Example in 5 Minutes
- CLI Command Reference
- Understanding the Directory Structure
- Building Your First Workflow: The Manual Approach
- Refining Your Workflow
- Calling class methods and initializing the class instance to set the context
- Adding class inheritance with command_context_model.json
- Adding context hierarchies with context_inheritance_model.json
- Using DSPy for Response Generation
- Using Startup Commands and Actions
- Running FastWorkflow as a FastAPI Service
- Rapidly Building Workflows with the Build Tool
- Environment Variables Reference
- Troubleshooting / FAQ
- For Contributors
- License
Architecture Overview
fastWorkflow separates the build-time, train-time, and run-time concerns. The build tool creates a command interface from your code, the train tool builds NLP models to understand commands, and the run scripts execute the workflow.
graph LR
subgraph A[Build-Time]
A1(Your Python App Source) --> A2{fastworkflow.build};
A2 --> A3(Generated _commands);
A3 --> A4(context_inheritance_model.json);
A4 --> A5(Manual cleanup of generated code)
end
subgraph B[Train-Time]
B1(Generated _commands) --> B2{fastworkflow.train};
B2 --> B3(Trained Models in ___command_info);
end
subgraph C[Run-Time]
C1(User/Agent Input) --> C2{Intent Detection and validation};
C2 --> C3{Parameter Extraction and validation};
C3 --> C4(CommandExecutor);
C4 --> C5(Your Application Logic - DSPy or deterministic);
C5 --> C6(Response);
end
A --> B;
B --> C;
Installation
To get started, install fastWorkflow from PyPI using pip:
pip install fastworkflow
# Or with uv
uv pip install fastworkflow
Notes:
fastWorkflowcurrently works on Linux and MacOS only. On windows, use WSL.fastWorkflowinstalls PyTorch as a dependency. If you don't already have PyTorch installed, this could take a few minutes depending on your internet speed.fastWorkflowrequires Python 3.11+ or higher.- Training (
fastworkflow train) also expects the optional Hugging Facedatasetspackage. Install it by including the dev group when using Poetry.
Quick Start: Running an Example in 5 Minutes
This is the fastest way to see fastWorkflow in action.
Step 1: Fetch the hello_world Example
The fastworkflow command-line tool can fetch bundled examples:
fastworkflow examples fetch hello_world
This command will:
- Copy the
hello_worldexample into a new./examples/hello_world/directory. - Copy the environment files to
./examples/fastworkflow.envand./examples/fastworkflow.passwords.env.
Step 2: Add Your API Keys
The example workflows require API keys for the LLM models. Edit the ./examples/fastworkflow.passwords.env file:
# Edit the passwords file to add your API keys
nano ./examples/fastworkflow.passwords.env
You'll need to add at least:
LITELLM_API_KEY_SYNDATA_GEN=your-mistral-api-key
LITELLM_API_KEY_PARAM_EXTRACTION=your-mistral-api-key
LITELLM_API_KEY_RESPONSE_GEN=your-mistral-api-key
LITELLM_API_KEY_PLANNER=your-mistral-api-key
LITELLM_API_KEY_AGENT=your-mistral-api-key
You can get a free API key from Mistral AI for the mistral small model. Or a free API key from OpenRouter for the GPT-OSS-20B:free model. You can use different models for different LLM roles in the same workflow if you wish.
Step 3: Train the Example
[!note] The training CLI depends on the optional Hugging Face
datasetspackage.
Install it explicitly (pip install datasets) or, if you're working from this repo, runpoetry install --with devbefore training.
Train the intent-detection models for the workflow:
fastworkflow train ./examples/hello_world ./examples/fastworkflow.env ./examples/fastworkflow.passwords.env
This step builds the NLP models that help the workflow understand user commands.
Step 4: Run the Example
Once training is complete, run the interactive assistant:
fastworkflow run ./examples/hello_world ./examples/fastworkflow.env ./examples/fastworkflow.passwords.env
You will be greeted with a User > prompt. Try it out by asking "what can you do?" or "add 49 + 51"!
To see other available examples, run fastworkflow examples list.
CLI Command Reference
The fastworkflow CLI provides several commands to help you work with workflows:
Examples Management
# List available examples
fastworkflow examples list
# Fetch an example to your local directory
fastworkflow examples fetch <example_name>
Workflow Operations
# Build a workflow from your Python application
fastworkflow build --app-dir <app_dir> --workflow-folderpath <workflow_dir>
# Train a workflow's intent detection models
fastworkflow train <workflow_dir> <env_file> <passwords_file>
# Run a workflow
fastworkflow run <workflow_dir> <env_file> <passwords_file>
[!tip] Deterministic execution: Prefix a natural language command with
/to execute it deterministically (non‑agentic) during an interactive run.
Each command has additional options that can be viewed with the --help flag:
fastworkflow examples --help
fastworkflow build --help
fastworkflow train --help
fastworkflow run --help
Understanding the Directory Structure
A key concept in fastWorkflow is the separation of your application's logic from the workflow commands definition.
messaging_app_1/ # <-- The workflow_folderpath
├── application/ # <-- Your application directory (not generated)
│ └── send_message.py # <-- Your application code
│
├── _commands/ # <-- Commands folder
│ └── send_message.py
|
├── context_inheritance_model.json # <-- Inheritance model
|
├── ___command_info/ # <-- Metadata folder. Generated by the train tool
├── ___convo_info/ # <-- Converation log. Generated at run-time
├── ___workflow_contexts/ # <-- Session data. Generated at run-time
fastworkflow.env # <-- Env file (copy from hello_world example)
fastworkflow.passwords.env # <-- Passwords (copy from hello_world example)
- Your application code (
application/) remains untouched. - The
___command_info/folder contains all the generated files and trained models. - The build tool parameter
--app-dirpoints to your app code (application/) - The build tool parameter
--workflow-folderpathpoints to the workflow folderpath (messaging_app_1).
[!tip] Add to your
.gitignore:
Add the following folders to your.gitignoreto avoid committing generated files or sensitive data:___workflow_contexts ___command_info ___convo_info
Building Your First Workflow: The Manual Approach
Before we automate everything with the build tool, let’s hand-craft the smallest possible workflow. Walking through each file once will make the generated output much easier to understand.
[!tip] You can fetch messaging_app_1 code using
fastworkflow examples fetch messaging_app_1if you want to skip writing the code
Step 1: Create a new project directory
mkdir -p messaging_app_1
Step 2: Create a new application directory
mkdir -p messaging_app_1/application
Step 3: Design Your Application
Create a simple function in messaging_app_1/application/send_message.py.
def send_message(to: str, message: str) -> str:
print(f"Sending '{message}' to {to}")
Step 4: Write the Command File
Create a file named messaging_app_1/_commands/send_message.py. This file tells fastWorkflow how to handle the send_message command.
import fastworkflow
from fastworkflow.train.generate_synthetic import generate_diverse_utterances
from pydantic import BaseModel, Field
from ..application.send_message import send_message
# the signature class defines our intent
class Signature:
class Input(BaseModel):
to: str = Field(
description="Who are you sending the message to",
examples=['jsmith@abc.com', 'jane.doe@xyz.edu'],
pattern=r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
)
message: str = Field(
description="The message you want to send",
examples=['Hello, how are you?', 'Hi, reaching out to discuss fastWorkflow'],
min_length=3,
max_length=500
)
plain_utterances = [
"Tell john@fastworkflow.ai that the build tool needs improvement",
]
@staticmethod
def generate_utterances(workflow: fastworkflow.Workflow, command_name: str) -> list[str]:
"""This function will be called by the framework to generate utterances for training"""
return [
command_name.split('/')[-1].lower().replace('_', ' ')
] + generate_diverse_utterances(Signature.plain_utterances, command_name)
# the response generator class processes the command
class ResponseGenerator:
def _process_command(self, workflow: fastworkflow.Workflow, input: Signature.Input) -> None:
"""Helper function that actually executes the send_message function.
It is not required by fastworkflow. You can do everything in __call__().
"""
# Call the application function
send_message(to=input.to, message=input.message)
def __call__(self, workflow:
fastworkflow.Workflow,
command: str,
command_parameters: Signature.Input) -> fastworkflow.CommandOutput:
"""The framework will call this function to process the command"""
self._process_command(workflow, command_parameters)
response = (
f'Response: The message was printed to the screen'
)
return fastworkflow.CommandOutput(
workflow_id=workflow.id,
command_responses=[
fastworkflow.CommandResponse(response=response)
]
)
Step 5: Setup the env and password files
- Make sure you have the examples folder from fetching the 'hello_world' workflow
- Copy fastworkflow.env from examples folder to ./messaging_app_1
- Copy fastworkflow.passwords.env from examples folder to ./messaging_app_1
- Update the API keys for the LLM you are using in fastworkflow.passwords.env
Step 6: Train and Run
Your manual workflow is ready!
# Train the workflow
fastworkflow train ./messaging_app_1 ./messaging_app_1/fastworkflow.env ./messaging_app_1/fastworkflow.passwords.env
# Run the workflow
fastworkflow run ./messaging_app_1 ./messaging_app_1/fastworkflow.env ./messaging_app_1/fastworkflow.passwords.env
Refining Your Workflow
Calling class methods and initializing the class instance to set the context
This will allow you to move beyond a flat set of tools (global functions) and organize your tools into logical contexts that maintain state
Adding class inheritance with command_context_model.json
If you have a non-trivial application, your AI agent will have to understand the inheritance relationships between different types of objects in your application
Adding context hierarchies with context_inheritance_model.json
Contexts are layered! Command handling should start with the current context, but move up the context hierarchy when the current context cannot handle the command. Learn how to build sophisticated agentic applications that support context hierarchies and expose aggregation relationships in object models.
Using DSPy for Response Generation
fastWorkflow integrates seamlessly with DSPy to leverage LLM capabilities for response generation. The dspy_utils.py module provides a convenient bridge between Pydantic models and DSPy signatures:
# In your command file
from fastworkflow.utils.dspy_utils import dspySignature
import dspy
class ResponseGenerator:
def __call__(self, workflow, command_parameters: Signature.Input) -> fastworkflow.CommandOutput:
# 1. Define your signature and dspy function
dspy_signature_class = dspySignature(Signature.Input, Signature.Output)
dspy_predict_func = dspy.Predict(dspy_signature_class)
# 2. Get prediction from DSPy module
prediction = dspy_predict_func(command_parameters)
# 3. Create output directly using ** unpacking
output = Signature.Output(**prediction)
return fastworkflow.CommandOutput(
command_responses=[
fastworkflow.CommandResponse(response=output.model_dump_json())
]
)
The dspySignature function automatically:
- Maps your Pydantic model fields to DSPy input/output fields
- Preserves field types (or converts to strings if
preserve_types=False) - Transfers field descriptions to DSPy for better prompting
- Generates instructions based on field metadata (defaults, examples)
- Handles optional fields correctly
This approach maintains type safety while benefiting from DSPy's optimization capabilities, allowing you to easily switch between deterministic logic and AI-powered responses without changing your command interface.
Using Startup Commands and Actions
fastWorkflow supports initializing your workflow with a startup command or action when launching the application. This is useful for setting up the initial context, loading data, or performing any necessary initialization before user interaction begins.
Startup Commands
A startup command is a simple string that gets executed as if the user had typed it:
# Run with a startup command
fastworkflow run my_workflow/ .env passwords.env --startup_command "initialize project"
The startup command will be processed before any user input, and its output will be displayed to the user. This is ideal for simple initialization tasks like:
- Setting the initial context
- Loading default data
- Displaying welcome messages or available commands
Startup Actions
For more complex initialization needs, you can use a startup action defined in a JSON file:
# Run with a startup action defined in a JSON file
fastworkflow run my_workflow/ .env passwords.env --startup_action startup_action.json
The action JSON file should define a valid fastWorkflow Action object:
{
"command_context": "YourContextClass",
"command_name": "initialize",
"command_parameters": {
"param1": "value1",
"param2": "value2"
}
}
Startup actions provide more control than startup commands because:
- They bypass the intent detection phase
- They can specify exact parameter values
- They target a specific command context directly
Important Notes
- You cannot use both
--startup_commandand--startup_actionsimultaneously - Startup commands and actions are executed before the first user prompt appears
- If a startup command or action fails, an error will be displayed, but the application will continue running
- The
--keep_aliveflag (default: true) ensures the workflow continues running after the startup command completes
For workflows with complex initialization requirements, creating a dedicated startup or initialize command in your _commands directory is recommended.
[!tip] Running in Headless Mode:
To run a workflow non-interactively (headless mode), provide a startup command or action and set--keep_alivetoFalse:# Run a workflow that executes a command and exits fastworkflow run my_workflow/ .env passwords.env --startup_command "process data" --keep_alive False # Or with a startup action file fastworkflow run my_workflow/ .env passwords.env --startup_action process_action.json --keep_alive FalseThis is useful for scheduled tasks, CI/CD pipelines, or batch processing where you want the workflow to perform specific actions and terminate automatically when complete.
[!tip] Implementing a UI Chatbot using fastWorkflow:
Refer to the fastworkflow.run.main.py file in fastworkflow's repo for a reference implementation of a the command loop. You can use this as a starting point to build your own UI chatbot.
Running FastWorkflow as a FastAPI Service
For production deployments and integrations, fastWorkflow provides a FastAPI-based HTTP service via the run_fastapi_mcp module. This exposes your workflow as REST endpoints with JWT authentication, SSE streaming, and MCP (Model Context Protocol) support.
# Run the FastAPI service
python -m fastworkflow.run_fastapi_mcp \
--workflow_path ./my_workflow \
--env_file_path ./fastworkflow.env \
--passwords_file_path ./fastworkflow.passwords.env \
--port 8000
The service provides endpoints for:
/initialize- Create a new session and obtain JWT tokens/invoke_agent- Submit natural language queries to the agent/invoke_agent_stream- Stream responses via SSE or NDJSON/perform_action- Execute workflow actions directly/conversations- Manage conversation history
Kubernetes Liveness and Readiness Probes
When deploying fastWorkflow in Kubernetes, the service provides dedicated probe endpoints for health monitoring:
Liveness Probe (/probes/healthz)
Determines whether the container is still running. If this probe fails, Kubernetes will restart the container.
curl http://localhost:8000/probes/healthz
# Response: {"status": "alive"}
Readiness Probe (/probes/readyz)
Checks whether the container is ready to accept traffic. Kubernetes only routes traffic to containers that pass this check.
curl http://localhost:8000/probes/readyz
# Response (ready): {"status": "ready", "checks": {"ready": true, "fastworkflow_initialized": true, "workflow_path_valid": true}}
# Response (not ready): {"status": "not_ready", "checks": {"ready": false, ...}}
The readiness probe returns:
200 OKwhen the application is ready to serve traffic503 Service Unavailablewhen not ready (e.g., during startup)
Example Kubernetes Configuration
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: fastworkflow
livenessProbe:
httpGet:
path: /probes/healthz
port: 8000
initialDelaySeconds: 10
periodSeconds: 10
failureThreshold: 5
timeoutSeconds: 3
readinessProbe:
httpGet:
path: /probes/readyz
port: 8000
initialDelaySeconds: 5
periodSeconds: 5
failureThreshold: 3
timeoutSeconds: 3
[!note] Probe endpoints do not require authentication and are excluded from request logging when returning 200 status to avoid excessive log noise from frequent Kubernetes health checks.
Using LiteLLM Proxy
FastWorkflow supports routing LLM calls through a LiteLLM Proxy server. This is useful when you want to:
- Centralize API key management
- Use a unified endpoint for multiple LLM providers
- Route requests through a corporate proxy with custom configurations
To use LiteLLM Proxy, set your model strings to use the litellm_proxy/ prefix and configure the proxy URL:
# In fastworkflow.env - use the litellm_proxy/ prefix for model names
LLM_AGENT=litellm_proxy/bedrock_mistral_large_2407
LLM_PARAM_EXTRACTION=litellm_proxy/bedrock_mistral_large_2407
LITELLM_PROXY_API_BASE=http://127.0.0.1:4000
# In fastworkflow.passwords.env - shared key for proxy authentication
LITELLM_PROXY_API_KEY=your-proxy-api-key
The model name after litellm_proxy/ (e.g., bedrock_mistral_large_2407) is passed to your proxy server, which routes it to the actual provider based on its configuration.
[!note] When using
litellm_proxy/models, the per-role API keys (LITELLM_API_KEY_*) are ignored. All proxied calls use the sharedLITELLM_PROXY_API_KEYinstead. You can mix proxied and direct models - only models with thelitellm_proxy/prefix are routed through the proxy.
Rapidly Building Workflows with the Build Tool
After understanding the manual process, you can use the fastworkflow build command to automate everything. It introspects your code and generates all the necessary files.
Delete your manually created _commands directory and run:
fastworkflow build \
--app-dir my_app/ \
--workflow-folderpath my_workflow_ui/ \
--overwrite
This single command will generate the greet.py command, get_properties and set_properties for any properties, the context_inheritance_model.json, and more, accomplishing in seconds what we did manually.
[!tip] The build tool is a work in progress and is currently a one-shot tool. It also requires manually correcting the generated code. The plan is to morph it into a Copilot for building workflows. We can use fastWorkflow itself to implement this Copilot. Reach out if building this interests you.
Environment Variables Reference
Environment Variables
| Variable | Purpose | When Needed | Default |
|---|---|---|---|
SPEEDDICT_FOLDERNAME |
Directory name for workflow contexts | Always | ___workflow_contexts |
LLM_SYNDATA_GEN |
LiteLLM model string for synthetic utterance generation | train |
mistral/mistral-small-latest |
LLM_PARAM_EXTRACTION |
LiteLLM model string for parameter extraction | train, run |
mistral/mistral-small-latest |
LLM_RESPONSE_GEN |
LiteLLM model string for response generation | run |
mistral/mistral-small-latest |
LLM_PLANNER |
LiteLLM model string for the agent's task planner | run (agent mode) |
mistral/mistral-small-latest |
LLM_AGENT |
LiteLLM model string for the DSPy agent | run (agent mode) |
mistral/mistral-small-latest |
LLM_CONVERSATION_STORE |
LiteLLM model string for conversation topic/summary generation | FastAPI service | mistral/mistral-small-latest |
LITELLM_PROXY_API_BASE |
URL of your LiteLLM Proxy server | When using litellm_proxy/ models |
not set |
NOT_FOUND |
Placeholder value for missing parameters during extraction | Always | "NOT_FOUND" |
MISSING_INFORMATION_ERRMSG |
Error message prefix for missing parameters | Always | "Missing required..." |
INVALID_INFORMATION_ERRMSG |
Error message prefix for invalid parameters | Always | "Invalid information..." |
Password/API Key Variables
| Variable | Purpose | When Needed | Default |
|---|---|---|---|
LITELLM_API_KEY_SYNDATA_GEN |
API key for the LLM_SYNDATA_GEN model |
train |
required |
LITELLM_API_KEY_PARAM_EXTRACTION |
API key for the LLM_PARAM_EXTRACTION model |
train, run |
required |
LITELLM_API_KEY_RESPONSE_GEN |
API key for the LLM_RESPONSE_GEN model |
run |
required |
LITELLM_API_KEY_PLANNER |
API key for the LLM_PLANNER model |
run (agent mode) |
required |
LITELLM_API_KEY_AGENT |
API key for the LLM_AGENT model |
run (agent mode) |
required |
LITELLM_API_KEY_CONVERSATION_STORE |
API key for the LLM_CONVERSATION_STORE model |
FastAPI service | required |
LITELLM_PROXY_API_KEY |
Shared API key for authenticating with LiteLLM Proxy | When using litellm_proxy/ models |
optional |
[!tip] The example workflows are configured to use Mistral's models by default. You can get a free API key from Mistral AI that works with the
mistral-small-latestmodel.
Troubleshooting / FAQ
PARAMETER EXTRACTION ERRORThis means the LLM failed to extract the required parameters from your command. The error message will list the missing or invalid fields. Rephrase your command to be more specific.
CRASH RUNNING FASTWORKFLOWThis happens when the ___workflow_contexts folder gets corrupted. Delete it and run again.
Slow Training Training involves generating synthetic utterances, which requires multiple LLM calls, making it inherently time-consuming. The first run may also be slow due to model downloads from Hugging Face. Subsequent runs will be faster. Set
export HF_HOME=/path/to/cacheto control where models are stored. Training a small workflow takes ~5-8 minutes on a modern CPU.
Missing API Keys If you see errors about missing environment variables or API keys, make sure you've added your API keys to the
fastworkflow.passwords.envfile as described in the Quick Start guide.
Commands are not recognized Check the command implementation for import or syntax errors. If the command module cannot be loaded, it will not show up
[!tip] To debug command files and fastWorkflow code, set up vscode launch.json, set
justmycodeto False, add breakpoints, and run in debug mode
For Contributors
Interested in contributing to fastWorkflow itself? Great!
- Clone the repository:
git clone https://github.com/your-repo/fastworkflow.git - Set up the environment: Create a virtual environment using your preferred tool (venv, uv, conda, poetry, etc.) with Python 3.11+
- Install in editable mode with dev dependencies:
pip install -e .oruv pip install -e ".[dev]" - Join our Discord: Ask questions, discuss functionality, showcase your fastWorkflows
Our work
-
Optimizing intent classifiction with a sentence transformer pipeline architecture - 1/2
-
Optimizing intent classifiction with a sentence transformer pipeline architecture - 2/2
-
Structured understanding - A comparative study of parameter extraction across leading llms
References
-
DSPy - Compiling Declarative Language Model Calls into Self-Improving Pipelines
-
Position: LLMs Can’t Plan, But Can Help Planning in LLM-Modulo Frameworks
License
fastWorkflow is released under the Apache License 2.0
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fastworkflow-2.17.32.tar.gz.
File metadata
- Download URL: fastworkflow-2.17.32.tar.gz
- Upload date:
- Size: 482.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.3 CPython/3.12.2 Linux/6.6.87.2-microsoft-standard-WSL2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2a84c5f91e61764b6788a4d75d183bc194126bcbccc4c7bb325adc4fc8314565
|
|
| MD5 |
cc351c457f11d9c304c726e8be268a91
|
|
| BLAKE2b-256 |
5811d1261ce2964a32b7aa175c3eb327c2f008edcfd1087fe35dfbeeb1342d88
|
File details
Details for the file fastworkflow-2.17.32-py3-none-any.whl.
File metadata
- Download URL: fastworkflow-2.17.32-py3-none-any.whl
- Upload date:
- Size: 581.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.3 CPython/3.12.2 Linux/6.6.87.2-microsoft-standard-WSL2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dc220ea49538f7f6b3eeef8d935fdc0a130e112f8bb8bfb435478cf0cbe1b85e
|
|
| MD5 |
075d9de2c569e5b5221b99edd5aa7330
|
|
| BLAKE2b-256 |
1174c0d85ed4d3780bc9533d06ad61068e11f01dae61063bfb8e87ade80231ec
|