FastAPI HTTP interface exposing Algomancy scenario/data management to remote frontends.
Project description
algomancy-api
FastAPI HTTP interface that exposes the same scenario- and data-management
surface used by algomancy-gui, so a remote frontend (browser SPA, native
desktop app, another Python process) can drive an Algomancy backend over
the network instead of importing it in-process.
The HTTP layer is deliberately thin: every route maps to a single
ScenarioManager / SessionManager method and responses use the existing
to_dict() payloads. There is no parallel domain model — clients work with
the same Scenario, DataSource, and KPI concepts the Dash GUI does.
Quick start
from algomancy_api import ApiConfiguration, ApiLauncher
from algomancy_data import DataSource
cfg = ApiConfiguration(
etl_factory=MyETLFactory,
kpis=kpis,
algorithms=algorithms,
schemas=schemas,
data_object_type=DataSource,
has_persistent_state=True,
data_path="data",
autocreate=False,
autorun=False,
)
app = ApiLauncher.build(cfg) # returns a standard FastAPI app
ApiLauncher.run(app) # blocks; uses cfg.host / cfg.port
The server starts (default 127.0.0.1:8051) and serves the OpenAPI schema at
/openapi.json plus the interactive Swagger UI at /docs. All scenario/data
endpoints live under /api/v1/sessions/{session_id}/....
ApiLauncher.build returns a standard FastAPI instance — for production
deploys you can hand it to your own uvicorn / gunicorn process manager
instead of using ApiLauncher.run.
To try it against the bundled example wiring:
from algomancy_api import ApiLauncher
from algomancy_api.example import build_example_config
ApiLauncher.run(ApiLauncher.build(build_example_config()))
Endpoint inventory
All routes are prefixed with cfg.prefix (default /api/v1).
Sessions
GET /sessions— list[{id, display_name}, ...]and the default idPOST /sessions— create a new session — body{"display_name": "..."}POST /sessions/{sid}/copy— copy — body{"new_display_name": "..."}PATCH /sessions/{sid}— rename — body{"display_name": "..."}DELETE /sessions/{sid}— delete a session and all its data; the last remaining session is auto-replaced with a fresh"main"
{sid} accepts either the session's UUID (canonical) or its current
display_name (soft-compat alias).
Algorithm + KPI discovery
GET /sessions/{sid}/algorithms— list algorithm namesGET /sessions/{sid}/algorithms/{name}/parameters— per-parameter descriptorsGET /sessions/{sid}/kpis— list KPI template names
Scenarios
GET /sessions/{sid}/scenarios— list scenariosPOST /sessions/{sid}/scenarios— create a scenarioGET /sessions/{sid}/scenarios/{id}— full scenario incl. KPIs and resultDELETE /sessions/{sid}/scenarios/{id}— delete a scenarioPOST /sessions/{sid}/scenarios/{id}/run— enqueue for processingGET /sessions/{sid}/scenarios/{id}/status— lightweight status/progress (polling)GET /sessions/{sid}/processing— currently running scenario, ornull
Data
GET /sessions/{sid}/data— list dataset keysGET /sessions/{sid}/data/{key}— parsed JSON of a datasetDELETE /sessions/{sid}/data/{key}— delete a datasetPOST /sessions/{sid}/data/{key}/derive— derive a new datasetPOST /sessions/{sid}/data/from-json— add a dataset fromDataSource.to_json()payloadPOST /sessions/{sid}/etl— run ETL over a multipart upload
Meta
GET /health— liveness probeGET /openapi.json,GET /docs— OpenAPI schema and Swagger UI
Polling pattern
import time
import httpx
base = "http://127.0.0.1:8051/api/v1"
session = httpx.get(f"{base}/sessions").json()["default"]
scenario = httpx.post(
f"{base}/sessions/{session}/scenarios",
json={
"tag": "my-run",
"dataset_key": "Master data",
"algo_name": "Slow",
"algo_params": {"duration": 5},
},
).json()
httpx.post(f"{base}/sessions/{session}/scenarios/{scenario['id']}/run")
while True:
status = httpx.get(
f"{base}/sessions/{session}/scenarios/{scenario['id']}/status"
).json()
if status["status"] in ("complete", "failed"):
break
time.sleep(0.5)
print(httpx.get(f"{base}/sessions/{session}/scenarios/{scenario['id']}").json())
Error mapping
| Exception | HTTP | When |
|---|---|---|
ValueError |
400 |
Generic bad input |
ParameterError |
400 |
Algorithm parameter validation failure |
AssertionError |
409 |
Framework precondition (e.g. deleting data referenced by a scenario) |
Route-level HTTPException |
404 / 409 |
Unknown session/scenario/algorithm/dataset, duplicate tag, name conflict |
| Anything else | 500 |
Unexpected; logged with traceback |
Response shape is always {"detail": "<message>"} — branch on the status
code, not the message text.
For the full reference (including the parameter-descriptor schema and CORS configuration) see the HTTP API reference in the published documentation.
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 Distributions
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 algomancy_api-0.8.1-py3-none-any.whl.
File metadata
- Download URL: algomancy_api-0.8.1-py3-none-any.whl
- Upload date:
- Size: 18.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.19 {"installer":{"name":"uv","version":"0.11.19","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
74be048a07b7ef06b72dcf0a5065c3e9693f5fe6a129456350e398f853273045
|
|
| MD5 |
30f4355e8b4fe07624f3685267d760de
|
|
| BLAKE2b-256 |
7238e95817c3613a11cb7c31ee73fa64b4dea5615e8703f86fffcf7f6331c4f9
|