Observed since 20 Oct, 17:40 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
abstractgateway
AbstractGateway: deployable Run Gateway host for AbstractRuntime (commands + ledger).
AbstractGateway is a deployable Run Gateway host for AbstractRuntime runs, and the control plane of an AbstractFramework installation:
/console), a terminal console, the CLI or a desktop tray icon.Clients (AbstractFlow, AbstractCode, AbstractObserver, AbstractContinuum, AbstractEntity, AbstractAssistant, scripts) talk to the gateway over HTTP, so none of them depends on the others.
Start here: docs/first-run.md on your own machine, or docs/getting-started.md for an explicit setup.
AbstractGateway is part of the AbstractFramework ecosystem:
pyproject.toml, src/abstractgateway/runner.py)src/abstractgateway/hosts/bundle_host.py)Related repos:
pip install abstractgateway
abstractgateway serve
On a first run with nothing configured, serve binds 127.0.0.1:8080, turns
on user auth, creates the admin user, and prints a one-time link
(http://127.0.0.1:8080/console#claim=...). Open it in a browser on the same
machine: you are signed in as the admin and a short first-run guide helps you
pick a local engine, a default model and the browser apps. A new link:
abstractgateway claim --open. Start the gateway at login:
abstractgateway service install. See docs/first-run.md.
The console's Providers page (its Local providers cards) and its Models page (and the matching commands) install a local engine, download a model that fits this machine and delete a download you no longer need, without a terminal. They are AbstractCore's model browser and engine installer, shown inside the gateway:
abstractgateway engines status --probe # Ollama, LM Studio, MLX, llama.cpp, ...
abstractgateway engines install ollama --dry-run # the exact command, nothing runs
abstractgateway models catalog --fits # models that fit this machine
abstractgateway models download ollama qwen3:8b
abstractgateway models list # installed models with sizes
The commands talk to the running gateway (admin rules and audit log apply);
add --local to run them in-process instead. Engine installs run on the
gateway host and are on by default for a loopback gateway, and for someone at
the gateway machine whatever it listens on
(allow_engine_install). See
docs/engines.md, docs/model-downloads.md
and docs/console.md.
Admins can turn on the OpenAI API on the console's OpenAI API page: any OpenAI SDK or app then uses this gateway's models at http://<gateway>/v1, with a named API key per app, made on that page (valid at /v1 only, revocable one at a time).
abstractgateway apps install observer --launch # Flow, Code, Observer, Continuum, Entity, Note, Assistant
abstractgateway apps open observer # a one-time signed-in link
abstractgateway network set lan # let your local network reach the gateway
abstractgateway network restart # apply it now
abstractgateway console # the terminal console, signed in
abstractgateway update --check # what the newest AbstractFramework release changes
abstractgateway update # ... and install it (installer installs)
The gateway installs Node.js when needed, installs the browser apps from npm,
runs them and opens them already signed in (docs/apps.md). The
network setting decides who can reach the gateway: localhost, lan or
internet
(docs/configuration.md).
With pip install "abstractgateway[tray]", serve also shows a menu bar /
system tray icon (docs/tray.md).
pip install abstractgateway
export ABSTRACTGATEWAY_DATA_DIR="$PWD/runtime/gateway"
# Optional: set only for a custom bundle registry. When unset, Gateway uses
# the packaged shipped bundle directory containing basic-agent.
# export ABSTRACTGATEWAY_FLOWS_DIR="/path/to/bundles"
# User accounts: the sign-in path for the console and the browser apps.
export ABSTRACTGATEWAY_USER_AUTH=1
abstractgateway serve --host 127.0.0.1 --port 8080
OpenAPI docs (Swagger UI): http://127.0.0.1:8080/docs
Smoke checks:
curl -sS "http://127.0.0.1:8080/api/health"
curl -sS -H "Authorization: Bearer $(cat "$ABSTRACTGATEWAY_DATA_DIR/auth/bootstrap-admin-token")" \
"http://127.0.0.1:8080/api/gateway/bundles"
That last call lists the workflows a fresh install already serves — including a
verify-gated coding agent (coding-agent), deep-research, and
co-scientist, alongside the default basic-agent. See
docs/shipped-workflows.md.
With user accounts on (the default of a plain serve, or
ABSTRACTGATEWAY_USER_AUTH=1), the gateway creates default/admin, writes its
first token to <data dir>/auth/bootstrap-admin-token, and routes each user to
their own runtime and data plane (1 user = 1 runtime). Admins manage users
from the console or /api/gateway/admin/users; user tokens are returned once
and stored only as hashes. Browser apps exchange a user token for an opaque
session (POST /api/gateway/session/login, HTTP-only cookie plus CSRF token)
instead of keeping the token. ABSTRACTGATEWAY_AUTH_TOKEN is a shared
server/operator token, not a browser sign-in token. See
docs/security.md.
The built-in console at /console groups its pages in the sidebar: Accounts
(users and entities in one table, with each account's email settings and
activity), Work (workflows, runtimes, apps), Models (providers, models,
engines, multimodal capability defaults) and System (host resources, a
sandbox, network access); Setup at the bottom reruns the setup guide. An
administrator sees every account; anyone else sees their own account and the
entities they created. The same
configuration surfaces exist in a terminal through the abstractgateway-console
Rust app (the installer builds it; by hand, cargo install abstractgateway-console);
abstractgateway console opens it signed in. See
docs/console.md.
Each user can connect their own mailbox (Accounts → Email on their own row in the web
console, @ on their own row in the terminal console, or /api/gateway/me/email): automations
can run when mail arrives, results and approvals can be emailed to the user,
and agents can use email tools when an administrator makes them available. See
docs/email.md.
Release images are published to GHCR. The default image is the light, portable server image:
docker pull ghcr.io/lpalbou/abstractgateway:0.13.1
NVIDIA hosts can try the experimental full GPU image when local vLLM/HuggingFace/Diffusers engines are wanted. This image is published best-effort until it has a real CUDA build and smoke gate:
docker pull ghcr.io/lpalbou/abstractgateway:0.13.1-gpu
The abstractgateway-server and abstractgateway-server-nvidia GHCR names are
published as aliases for existing deployments; use abstractgateway for new
ones.
The image installs the base abstractgateway package: HTTP server,
AbstractRuntime, Runtime-owned provider/tool and
multimodal facades, OpenAI-compatible text/media providers,
provider/session prompt-cache helpers, AbstractMemory/LanceDB KG support,
AbstractAgent, and AbstractFlow compatibility. Local sentence-transformer
embeddings and hardware-local inference engines are explicit extras so the
light server image does not pull PyTorch/CUDA runtime packages. Remote text
embeddings remain part of the light profile through the embedding.text
capability route: point it at OpenAI, OpenRouter, Portkey, LM Studio, vLLM,
any OpenAI-compatible embeddings endpoint, or a remote AbstractCore server.
AbstractFlow note:
abstractflow Python package to run .flow bundles. You only need it to author bundles; the gateway runs bundles only (store VisualFlows through /api/gateway/visualflows/* and publish them as bundles).docker run --rm --name abstractgateway \
-p 8080:8080 \
-e ABSTRACTGATEWAY_DATA_DIR=/data \
-e ABSTRACTGATEWAY_USER_AUTH=1 \
-e LMSTUDIO_BASE_URL="http://host.docker.internal:1234/v1" \
-v "$PWD/runtime:/data" \
ghcr.io/lpalbou/abstractgateway:latest
On first start, the container creates default/admin and writes the admin user
token to runtime/auth/bootstrap-admin-token. Use that token in /console,
then rotate it or create named users from the console.
Configure framework model defaults through execution-host capability routes:
docker exec abstractgateway abstractgateway-config set-default input.text \
--provider lmstudio \
--model your-model \
--base-url http://host.docker.internal:1234/v1
In user-auth mode this writes the Gateway baseline Core config at
/data/config/abstractcore.json. Per-user runtime overrides use the same Core
schema under /data/users/<tenant>/<runtime>/runtime/config/abstractcore.json;
use abstractgateway-config set-default --scope user --user alice ... for
operator-side scripting.
output.text is a compatibility alias for this same text route. Gateway reports
it as a read-only view of input.text, so LLM text input and output do not drift
to different default models.
On Apple Silicon, keep Metal/MLX inference native on macOS and run the
lightweight Gateway container as the transport/control plane. Point
OPENAI_BASE_URL at a generic host-native OpenAI-compatible endpoint such as
Docker Model Runner (http://model-runner.docker.internal/engines/v1) or
mlx_lm.server on a host port. For named providers, use
LMSTUDIO_BASE_URL=http://host.docker.internal:1234/v1 or
OLLAMA_BASE_URL=http://host.docker.internal:11434.
For native non-Docker installs with local engines, use
pip install "abstractgateway[apple]" on Apple Silicon, and
pip install "abstractgateway[gpu]" on GPU workstations or NVIDIA Docker builds.
For a minimal Apple-local Gateway + Flow setup, see
docs/apple-local-gateway-flow.md.
Compose and deployment details: docs/deployment.md.
Direct, run-scoped Gateway routes (each creates a durable child run and returns artifacts):
POST /api/gateway/runs/{run_id}/voice/tts,
POST /api/gateway/runs/{run_id}/audio/transcribePOST /api/gateway/runs/{run_id}/images/generate, /images/edit,
/images/upscalePOST /api/gateway/runs/{run_id}/videos/generate,
/videos/from_imagePOST /api/gateway/runs/{run_id}/music/generateGET /api/gateway/runs/{run_id}/input_data,
GET /api/gateway/runs/{run_id}/history_bundleDiscovery and catalogs for thin clients:
GET /api/gateway/discovery/capabilities: a versioned contract of packages,
plugins, endpoints and feature gates, with common.readiness/api/gateway/voice/voices, /audio/*/models, /audio/music/providers,
/vision/*), each with a gateway_catalog_v1 envelope and canonical items/api/gateway/artifacts/search: cross-run, session and run artifact search/api/gateway/kg/query: KG memory queries (LanceDB by default)/api/gateway/prompt_cache/* and /api/gateway/sessions/{session_id}/prompt_cache/*:
provider-dependent prompt-cache controlsMedia generation needs a configured backend for the route (the console's
Multimodal tab). Image and video routes stream abstract.progress records
on the child run's ledger; prompt-cache support depends on the provider and
model. Details: docs/api.md and docs/faq.md.
POST /api/gateway/runs/start
thinking sets the run-scoped _runtime.thinking default used by
Flow LLM/Agent nodes and AbstractAgent adapters when Core/provider support
reasoning controlsflow_id: "@default" with an agent interface runs the gateway's default
agent workflow for that interface; every start answers resolved_workflowinput_data._runtime.stream: true also sends the model's reply live
(llm.delta frames on the ledger stream)/api/gateway/automations* (docs/automations.md)POST /api/gateway/commands
pause|resume|cancel|conclude|emit_event|update_schedule|compact_memory|inject_guidance,
plus the automation.* commands for an automationGET /api/gateway/runs/{run_id}/ledger?after=...GET /api/gateway/runs/{run_id}/ledger/stream?after=...A run's owner can browse and preview the run's workspace folder
(GET /api/gateway/runs/{run_id}/workspace, /files, /content), and
GET /api/gateway/about reports the versions the gateway runs without
sign-in.
Model residency is available from a shell through
abstractgateway models loaded|load|unload (docs/console.md).
See docs/api.md for curl examples and the live OpenAPI spec (/openapi.json).
Requires Python >=3.10 (see pyproject.toml).
The base install is the remote-light HTTP/SSE server: Gateway, Runtime, Agent, Flow compatibility, Runtime-owned provider/tool and multimodal facades, and LanceDB-backed Memory. It intentionally excludes local sentence-transformer embeddings and hardware-local inference engines so Linux installs do not pull PyTorch/CUDA packages. Remote embeddings and remote multimodal input/output still work in this profile through hosted providers, OpenAI-compatible endpoints, or a remote AbstractCore server.
pip install abstractgateway
abstractgateway[apple]: full native macOS Python profile with Apple-local engines and all non-NVIDIA framework capabilitiesabstractgateway[gpu]: full local GPU profile with vLLM/HuggingFace, local Diffusers image generation, local voice engines, music, and KG memory; this is also the NVIDIA Docker install profileabstractgateway[embeddings]: local sentence-transformer embeddings for semantic KG queriesabstractgateway[tray]: a menu bar / system tray icon for abstractgateway serve (macOS, Windows, Linux) — open the console, pause/resume workflows, unload models, watch memory and GPU, restart or update; see docs/tray.mdabstractgateway[docs]: MkDocs site toolingabstractgateway[dev]: local test/dev depsKG memory nodes use Gateway's memory resolver. The default durable/vector
backend is LanceDB; memory is process-local dev/test storage, and sqlite is
structured-only when the installed AbstractMemory build exposes
SQLiteTripleStore.
Gateway has a first-class config helper:
abstractgateway-config status
abstractgateway config init --env-file .env
For details on capability route defaults, store backends, and workflow sources, see docs/configuration.md.
.flow bundle (authoring)Author the workflow in the AbstractFlow editor and publish it: the editor
stores the VisualFlow on the gateway (/api/gateway/visualflows/*) and
POST /api/gateway/visualflows/{flow_id}/publish packs it into a bundle. From
Python, AbstractRuntime packs a bundle from VisualFlow JSON files:
from abstractruntime.workflow_bundle import pack_workflow_bundle
pack_workflow_bundle(
root_flow_json="/path/to/root.json",
out_path="/path/to/bundles/my-bundle@0.1.0.flow",
bundle_id="my-bundle",
bundle_version="0.1.0",
flows_dir="/path/to/flows",
)
Upload it with POST /api/gateway/bundles/upload, or place it in
ABSTRACTGATEWAY_FLOWS_DIR.
See docs/getting-started.md for running, split API/runner, and file→SQLite migration.
Published docs site: https://www.lpalbou.info/AbstractGateway/
Project: CHANGELOG.md · CONTRIBUTING.md · CODE_OF_CONDUCT.md · SECURITY.md · ACKNOWLEDGMENTS.md · LICENSE (MIT)
Download counts and popularity will appear here as the collector receives them.
| Package / target | Requirement | Relationship |
|---|---|---|
abstractagentEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | abstractagent>=0.3.19 | runtime |
abstractcoreEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | abstractcore>=2.26.0 | runtime |
abstractmemoryEnvironment{
"extras": "lancedb",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | abstractmemory[lancedb]>=0.3.0 | runtime |
abstractruntimeEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | abstractruntime>=0.10.6 | runtime |
abstractskillEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | abstractskill>=0.3.0 | runtime |
abstractvoiceEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | abstractvoice>=0.15.1 | runtime |
fastapiEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | fastapi<1.0.0,>=0.136.0 | runtime |
httpxEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | httpx<1.0.0,>=0.28.1 | runtime |
python-multipartEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | python-multipart>=0.0.6 | runtime |
pyyamlEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | pyyaml>=5.1 | runtime |
requestsEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | requests<3.0.0,>=2.32.5 | runtime |
tomliEnvironment{
"extras": "",
"marker": "python_version < \"3.11\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | tomli>=1.1; python_version < "3.11" | runtime |
urllib3Environment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | urllib3<3.0.0,>=2.5.0 | runtime |
uvicornEnvironment{
"extras": "standard",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | uvicorn[standard]<1.0.0,>=0.38.0 | runtime |
websocketsEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | websockets>=13.1 | runtime |
abstractagentEnvironment{
"extras": "apple",
"marker": "extra == \"apple\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | abstractagent[apple]>=0.3.19; extra == "apple" | runtime |
abstractmemoryEnvironment{
"extras": "all-apple",
"marker": "extra == \"apple\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | abstractmemory[all-apple]>=0.3.0; extra == "apple" | runtime |
abstractruntimeEnvironment{
"extras": "apple",
"marker": "extra == \"apple\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | abstractruntime[apple]>=0.10.6; extra == "apple" | runtime |
aiosmtpdEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | aiosmtpd<2.0.0,>=1.4.4; extra == "dev" | runtime |
httpxEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | httpx>=0.27.0; extra == "dev" | runtime |
pytestEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | pytest>=7.0.0; extra == "dev" | runtime |
mkdocs-materialEnvironment{
"extras": "",
"marker": "extra == \"docs\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | mkdocs-material>=9.0.0; extra == "docs" | runtime |
mkdocsEnvironment{
"extras": "",
"marker": "extra == \"docs\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | mkdocs>=1.6.0; extra == "docs" | runtime |
abstractcoreEnvironment{
"extras": "embeddings",
"marker": "extra == \"embeddings\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | abstractcore[embeddings]>=2.26.0; extra == "embeddings" | runtime |
abstractagentEnvironment{
"extras": "gpu",
"marker": "extra == \"gpu\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | abstractagent[gpu]>=0.3.19; extra == "gpu" | runtime |
abstractmemoryEnvironment{
"extras": "all-gpu",
"marker": "extra == \"gpu\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | abstractmemory[all-gpu]>=0.3.0; extra == "gpu" | runtime |
abstractruntimeEnvironment{
"extras": "gpu",
"marker": "extra == \"gpu\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | abstractruntime[gpu]>=0.10.6; extra == "gpu" | runtime |
pillowEnvironment{
"extras": "",
"marker": "extra == \"tray\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | pillow>=10.0.0; extra == "tray" | runtime |
pystrayEnvironment{
"extras": "",
"marker": "extra == \"tray\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | pystray>=0.19.5; extra == "tray" | runtime |
bdist_wheel · 2,462.23 KB · Python py3
sdist · 4,265.74 KB · Python source
Observed since 20 Oct, 17:40 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package_version:68ee22a1d0e9056d475a4b060a6dc4c48879c2ae3f6e3d52bede2e52cb31bcbf