Four things had drifted. It told you to run `fluksio login` two lines above saying `serve` signs you in — one of the two had to go, and it is the login. It ran `fluksio sync` before `fluksio run`, which `run` now does itself. The pipeline snippet passed `prepare` and `evaluate` to `Flow` without importing them, so copying it got a NameError on the one example that matters. And the site link was relative, which resolves to nothing on the page this file exists to be — pypi.org. Added one sentence, on installing into the environment you already work in, because it is the reason a reader's own imports keep working and there is nowhere else on this page they would learn it. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012ue1tkFWB1bcGy3aWhCKpU
87 lines
3.0 KiB
Markdown
87 lines
3.0 KiB
Markdown
# Fluksio
|
|
|
|
Fluksio is a node-based automation software that brings trust and reliability to your flow.
|
|
It just works and looks good.
|
|
Get started by running
|
|
|
|
```sh
|
|
pip install fluksio
|
|
fluksio serve
|
|
```
|
|
|
|
and you're ready to go — `serve` signs you in itself and says where it put the
|
|
token, so there is no login step. (`fluksio login` is for an engine somewhere
|
|
else.)
|
|
|
|
Install it into the environment you already work in and your nodes run on that
|
|
one, so everything you had imported is still importable. Fluksio keeps a SQLite
|
|
database, a git repository of your flows and an artifact store in a `.fluksio`
|
|
beside your code — one installation per project, found the way `.git` is.
|
|
|
|
## For data science
|
|
|
|
You can turn your existing data science project into a flow by decorating your functions with `@node` ...
|
|
|
|
```python
|
|
# myresearch/train.py
|
|
import fluksio
|
|
from fluksio import Port, node
|
|
|
|
@node(
|
|
requires=["dataset", Port("lr", "float")],
|
|
provides=[Port("loss", "float", stream=True), Port("weights", "artifact")],
|
|
device="gpu", device_policy="prefer",
|
|
)
|
|
def fit(dataset, lr, epochs=25):
|
|
for epoch in range(epochs):
|
|
loss = step(...)
|
|
yield {"loss": loss} # published as it happens, kept as a series
|
|
return {"weights": fluksio.save_artifact("weights.pt")}
|
|
```
|
|
|
|
... and passing them to a `Flow`:
|
|
|
|
```python
|
|
# myresearch/pipeline.py
|
|
from fluksio import Flow, Port
|
|
from myresearch.data import prepare
|
|
from myresearch.evaluate import evaluate
|
|
from myresearch.train import fit
|
|
|
|
train = Flow("train", nodes=[prepare, fit, evaluate],
|
|
inputs=[Port("lr", "float", initial=0.01)], outputs=["score"])
|
|
```
|
|
|
|
Fluksio will automatically infer the order of nodes based on the inputs and outputs you defined.
|
|
When everything is set, you can launch your first run as follows:
|
|
|
|
```sh
|
|
fluksio run train --lr 0.05 --wait
|
|
```
|
|
|
|
That syncs your code and then runs it, so after an edit the command is the same
|
|
one again.
|
|
|
|
Checkout our [documentation](https://docs.fluksio.com/getting-started/data-science/) for more infos.
|
|
|
|
## Some other features
|
|
|
|
- **Flows**: typed messages between nodes, wired by name, edited on a canvas
|
|
or declared in code. Every change is a commit in a git repository you own.
|
|
- **Runs**: an experiment and a CI-style job are the same entity. Parameters,
|
|
seed, result, per-node timings, artifacts and the commit it ran at.
|
|
- **Dashboards**: charts and controls bound to the same messages the flows
|
|
carry, with no separate metrics pipeline.
|
|
- **Remote workers**: `pip install fluksio-worker` on the GPU box; it dials
|
|
*out* over one websocket, so nothing there has to be reachable.
|
|
|
|
Fluksio can also be used for facility automation.
|
|
Visit us on [fluksio.com](https://fluksio.com) or go straight to our [documentation](https://docs.fluksio.com).
|
|
|
|
## License
|
|
|
|
Copyright (C) 2026 Melvin Strobl — [GNU Affero General Public License v3.0 or
|
|
later](https://www.gnu.org/licenses/agpl-3.0.en.html). Running a modified
|
|
version over a network obliges you to offer its users the corresponding source
|
|
(AGPL §13).
|