Start as a developer
Two entry points lead to the same ecosystem: AbstractCore, a Python library with one API over local and cloud providers, and AbstractGateway, a control plane with durable runs over HTTP. Start with either.
Install, try it, make it yours
Call any model from Python 10 min
pip install "abstractcore[apple]" # Apple Silicon; plain abstractcore for Ollama, LM Studio and OpenAI-compatible endpoints; [gpu] for vLLMfrom abstractcore import create_llm
# Local model on Apple silicon (MLX). Any provider works the same way, e.g.
# create_llm("openai", model="gpt-5-mini") or create_llm("ollama", model="qwen3:4b").
llm = create_llm("mlx", model="mlx-community/Qwen3.5-4B-4bit")
response = llm.generate("In two sentences, what is a durable workflow runtime?")
print(response.content)Tools, structured output with Pydantic, streaming, media input, embeddings and MCP tool sources use the same object, and the same generate() returns voice, music, images, video and 3D once a capability route is configured (input and output). Models are never downloaded silently: abstractcore models download fetches them, and abstractcore models catalog --fits lists what fits your machine. After the one-line install, abstractcore, its apps (summarizer, extractor, judge, intent, deepsearch), abstractvoice, abstractmusic and abstractvision are already on your PATH, matching the gateway’s versions.
Serve it to any OpenAI client 5 min
pip install abstractcore # the server and its web console
abstractcore serve # 127.0.0.1:8000; prints a one-time console link
abstractcore serve --print-token # prints the token; paste it as Bearer <token> or api_keyPoint any OpenAI SDK at http://localhost:8000/v1 and route with model="provider/model". The same server exposes audio, image and video routes when the plugins are installed.
Make it agentic, then durable 15 min
AbstractAgent runs ReAct, CodeAct and MemAct loops on AbstractRuntime. The plain factory call keeps the run in memory: it works, and it ends with your process.
pip install abstractagentfrom abstractagent import create_react_agent
agent = create_react_agent(provider="mlx", model="mlx-community/Qwen3.5-4B-4bit")
agent.start("List the files in the current directory")
state = agent.run_to_completion()
print(state.output["answer"])To resume after a restart, give the agent persistent stores and save its state: the run’s checkpoint goes to the run store and every step to the append-only ledger, both in .runs/. A second process loads the state and continues the same run.
from abstractagent import create_react_agent
from abstractruntime.storage.json_files import JsonFileRunStore, JsonlLedgerStore
run_store = JsonFileRunStore(".runs") # run state as JSON files
ledger_store = JsonlLedgerStore(".runs") # append-only ledger, one JSONL file per run
agent = create_react_agent(provider="mlx", model="mlx-community/Qwen3.5-4B-4bit",
run_store=run_store, ledger_store=ledger_store)
agent.start("List the files in the current directory, then say which one is a CSV file")
agent.save_state("agent_state.json") # the run id; the state itself is in .runs/
# ... the process stops here (crash, restart, deploy): nothing in memory survivesProcess 2, after the first one stopped:
from abstractagent import create_react_agent
from abstractruntime.storage.json_files import JsonFileRunStore, JsonlLedgerStore
run_store = JsonFileRunStore(".runs")
ledger_store = JsonlLedgerStore(".runs")
agent = create_react_agent(provider="mlx", model="mlx-community/Qwen3.5-4B-4bit",
run_store=run_store, ledger_store=ledger_store)
agent.load_state("agent_state.json") # re-attach to the same run
state = agent.run_to_completion()
print(state.output["answer"])Or run the agent on the gateway (next step): every run there is durable, with its ledger kept on disk.
Drive the gateway over HTTP 15 min
Install the framework (one line, or pip install abstractgateway then abstractgateway serve). Paste the admin token from <data dir>/auth/bootstrap-admin-token where the requests say <token>. Start a run of a shipped workflow, stream its ledger, and read it back after a restart:
# <token>: <data dir>/auth/bootstrap-admin-token, or the console's one-time link (abstractgateway docs/configuration.md:120, v0.7.2)
# Start a run of a shipped workflow (flow_id omitted: the bundle's default entrypoint)
RUN_ID=$(curl -sS -H "Authorization: Bearer <token>" -H "Content-Type: application/json" \
-d '{"bundle_id":"basic-agent","input_data":{"prompt":"How long should I steep green tea?"}}' \
"http://127.0.0.1:8080/api/gateway/runs/start" | python3 -c 'import json,sys; print(json.load(sys.stdin)["run_id"])')
# Replay the ledger, then follow new records live (SSE; --max-time ends the sample)
curl -sS -H "Authorization: Bearer <token>" "http://127.0.0.1:8080/api/gateway/runs/$RUN_ID/ledger?after=0"
curl -sS -N --max-time 5 -H "Authorization: Bearer <token>" "http://127.0.0.1:8080/api/gateway/runs/$RUN_ID/ledger/stream"
# The run and its ledger survive a gateway restart
curl -sS -H "Authorization: Bearer <token>" "http://127.0.0.1:8080/api/gateway/runs/$RUN_ID"The OpenAPI spec is at /openapi.json and Swagger UI at /docs on your gateway.
Author and code 15 min
Open Flow at /apps/flow/, draw a workflow and publish it. Launch it from the Observer or with one POST /api/gateway/runs/start; once it declares abstractcode.agent.v1, AbstractCode’s /workflow command picks it as the agent of a session, and the Assistant lists it when it declares abstractassistant.agent.v1 and is promoted to the shared catalog. For coding, the one-line installer already put the AbstractCode terminal client on your PATH (otherwise cargo install abstractcode). Sign it in once:
abstractcode login --token <admin token> # the installer's summary prints this line
abstractcode
# or, on the gateway's computer:
abstractgateway apps tui-command codeThen make it yours
Swap providers
Run the same script against a local model and a cloud model by changing only the first argument of create_llm. Tools and structured output behave the same.
Pause for a human
Build a workflow that asks the user a question mid-run, stop the process while it waits, restart it and answer: the run resumes from its checkpoint.
Schedule your workflow
Publish a workflow with automation defaults from Flow, then create an automation for it with one POST /api/gateway/automations.
Worth knowing
pip install abstractframework installs every framework package at versions released and tested together (AbstractCamera installs separately); the framework CHANGELOG lists each release’s pins; each package’s changes are in its own CHANGELOG: AbstractGateway, AbstractCore, AbstractRuntime, AbstractAgent, AbstractVoice, AbstractMusic, AbstractVision, Abstract3D. Install packages one by one when you only need a few.execute_python tool runs in a local subprocess, not a hardened sandbox. Use tool approvals, or run it where that is acceptable.llms.txt and llms-full.txt; point your coding assistant at them. Site index (llms.txt)