Skip to main content

fortel-agent

Runs Fortell's deep-learning jobs on your own hardware instead of ours. This is compute offload, not a privacy feature — the dataset is sent from Fortell to your machine to train on, and the trained model is sent back so it can be used for predictions later. It exists because a GPU costs more per month than the product does, not because anything is being kept from the server.

pip install "fortel-agent[torch]"           # omit [torch] for a connection test only
fortel-agent login --token fa_xxxxxxxx      # token from Fortell → Settings → Runners
fortel-agent start

Leave it running. Queue a job in Fortell and this picks it up.

What comes back

Metrics, and the model. When a run finishes, the network is exported to ONNX and uploaded, where it becomes a versioned entry in your Fortell model registry — so a forecaster can be rolled further forward later, and a detector can score rows that did not exist when it was trained.

ONNX rather than a pickle for a reason that matters on the receiving end: unpickling is executing, so a server that unpickled whatever a runner uploaded would be running code from a machine it does not control. ONNX is a graph description that a runtime parses.

The upload is never load-bearing. No torch, a graph that will not export, a model over the size ceiling, a dropped connection — each leaves your metrics untouched and reports model_saved: false with the reason, rather than failing the run.

Why it exists

Deep-learning models don't fit the economics of a hosted plan — a GPU dyno costs more per month than the whole product. Rather than not offering them, Fortell sends an instruction sheet to a runner you control: a recipe name and bounded parameters. Never code.

Commands

Command What it does
fortel-agent login --token … Saves and verifies a device token (~/.fortell/agent.json, mode 0600)
fortel-agent start Claims and runs jobs until you stop it
fortel-agent start --once Handles one job and exits — useful in CI or a notebook
fortel-agent doctor Checks every link in the chain and names the broken one

Configuration resolves command line → environment (FORTEL_API, FORTEL_TOKEN) → saved file.

Running on Colab or Kaggle

The runner needs no inbound connectivity, so it works anywhere Python does — including a free GPU notebook:

!pip install fortel-agent
from fortel_agent import run_in_notebook
run_in_notebook(api="https://your-fortel-api", token="fa_xxxxxxxx")

Check your notebook provider's terms before using it as a backend for a hosted service, and keep jobs short enough to finish inside one session — a runtime that disconnects mid-job simply returns the work to the queue.

Security

  • No inbound ports. The runner only calls out, so it works behind home routers, university firewalls and corporate proxies.
  • Names, not code. A job spec names a recipe from a fixed local registry. There is no eval and no import-by-name; an unrecognised name is refused even if the server sends it.
  • Bounded parameters. The server clamps every hyperparameter before queuing, because this runs on your machine.
  • The token never crosses plain HTTP except to loopback, for local development.
  • No standalone download links. The job spec never contains a URL: the runner builds the dataset address from the server it is already authenticated against, so there is nothing to redirect it elsewhere and no link that works on its own if it leaks.
  • Revocation is immediate. Revoking a device in Fortell stops it mid-job.

Installation size

The core has no third-party dependencies — the transport is standard library only, so the install cannot fail on a dependency resolution. Recipes needing a heavy stack are extras:

pip install "fortel-agent[torch]"

Adding a recipe

One file in fortel_agent/recipes/, one line in its REGISTRY. Transport, retries, heartbeating, progress reporting and failure handling are shared.

def run(params: dict, report, dataset=None, artifact=None) -> dict:
    frame = pd.read_csv(dataset)          # None when the recipe needs no data
    for step in range(1, params["epochs"] + 1):
        ...
        report(progress=step, total=params["epochs"], message=f"epoch {step}")
    return {"final_loss": loss}

dataset is a path inside a per-job directory the runner creates and deletes when the job ends, so the copy sent for training does not outlive the job here. artifact is the optional sink for handing the trained model back — see recipes/export.py; a recipe that trains nothing simply ignores it.

Give it an is_available() attribute if it needs an optional dependency — a recipe that can't run must not be advertised, or the server will hand it work that fails on someone else's schedule.

Metadata

Release files for fortel-agent 0.4.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for fortel-agent 0.4.0
File Size Uploaded Provenance Actions
fortel_agent-0.4.0.tar.gz 113.3 kB Without provenance Details for fortel_agent-0.4.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for fortel-agent 0.4.0
File Interpreter ABI Platform Actions
fortel_agent-0.4.0-py3-none-any.whl Python 3 none any Details for fortel_agent-0.4.0-py3-none-any.whl

Total release size: 195.1 kB

Release files / fortel_agent-0.4.0.tar.gz

Download URL fortel_agent-0.4.0.tar.gz
Size 113.3 kB
Tags Source
SHA-256 checksum
How to use checksums
06735770506a37e27133314aabc8bb75101fda2d047aa49c40e9ba76394d45da
BLAKE2b-256 checksum
How to use checksums
9ca20b843f080843b5781983e2896acdd8d9efbe237c496a9f6dde78427a92c8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.9

Release files / fortel_agent-0.4.0-py3-none-any.whl

Download URL fortel_agent-0.4.0-py3-none-any.whl
Size 81.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
5930c2e4082f45890b2b605041b41b589fcbf1abcf80c83c4027849c104c7446
BLAKE2b-256 checksum
How to use checksums
8762197088ff8f349246fa22e5d4cf57838cea2a171886728c2daaf1ff1ee5dd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.9

Security for fortel-agent 0.4.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

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