Start here · Developer

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 vLLM
from 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_key

Point 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 abstractagent
from 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 survives

Process 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 code

Then make it yours

TRY 1

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.

Providers and extras

TRY 2

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.

Durable waits

TRY 3

Schedule your workflow

Publish a workflow with automation defaults from Flow, then create an automation for it with one POST /api/gateway/automations.

Automations API

Worth knowing

Pinned together. 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.
CodeAct runs Python locally. Its execute_python tool runs in a local subprocess, not a hardened sandbox. Use tool approvals, or run it where that is acceptable.
Every package documents itself for agents. Each repository ships llms.txt and llms-full.txt; point your coding assistant at them. Site index (llms.txt)