模型文件有数 GB,需先 grid pull 下载后才能 join --serve;安装后若提示 command not found 需新开终端;codex 席位需从住宅网络出口提供服务,且 grid chat 不支持 codex 模型。
autonomous-grid
autonomous-aiMIT活跃维护把家里已有的多台电脑组网成 AI 内网,统一跑大模型推理和微调训练,兼容 OpenAI 接口,适合本地部署和 homelab 场景。
Your AI intranet: network the computers you already own for inference and training.
curl -fsSL https://grid.autonomous.ai/install.sh | bash
grid start托管网格的机器只做路由,不需要显卡;运行模型的机器按模型要求,catalog 中标注如 Apple Silicon 最低 32 GB、NVIDIA 最低 24 GB;无 GPU 可用 --api openai 或 codex 接入云端模型。
把家里已有的电脑组成一个内网 AI 集群,对外提供统一的 OpenAI 兼容接口
把家里已有的多台电脑组网成 AI 内网,统一跑大模型推理和微调训练,兼容 OpenAI 接口,适合本地部署和 homelab 场景。
核心能力
- 用 OpenAI 兼容端点统一路由到持有对应模型的机器
- 复用已有 Ollama、vLLM、LM Studio,不替换它们
- grid pull 从 Hugging Face 拉取 GGUF 模型并自动补多模态文件
- grid join 让任意机器以指定模型加入网格
- 支持 comfyui 媒体引擎做图像生成、编辑与视频
容易踩的坑
- v0.3.63最新正式版2026-11-03 · 2026-11-03 04:36 UTC
Fixes
- An engine joined with
grid join --atand no--ctx-sizenow advertises the context window its own/modelsstates (vLLM'smax_model_len). The relay can then compact long conversations for it instead of passing on the engine's context-length refusal.--ctx-sizestill wins (64e1cbc)
Docs
docs/cli.mdand theopenai-errorschema describe theerrorobject a non-stream failure now carries for a consumer using a raw token (7c53742)
Full Changelog: https://github.com/autonomous-ai/autonomous-grid/compare/v0.3.62...v0.3.63
- An engine joined with
- v0.3.622026-11-02 · 2026-11-02 07:34 UTC
查看更新说明
Fixes
- A provider now passes on an engine's whole refusal, up to 4096 characters, instead of its first 200. A long error from the engine, such as a context-length refusal, reaches the client complete, with its type and parameter (4b10dab)
- The Windows install command that
grid updateandinstall.shprint now points at theinstall.ps1GitHub serves; the old address answered 404 (5ef2857)
Full Changelog: https://github.com/autonomous-ai/autonomous-grid/compare/v0.3.61...v0.3.62
- v0.3.612026-10-27 · 2026-10-27 10:29 UTC
查看更新说明
What changes for you
grid updateno longer breaks a Windows install. In 0.3.60 it reinstalled grid from inside the install it was replacing; Windows cannot delete files in use, so the update stopped half-way and left agridthat would not start. On Windows the update now finishes a few seconds after the command exits, in the same window. If you are on 0.3.60 on Windows, update by running the installer again instead ofgrid update:powershell -ExecutionPolicy ByPass -c "irm https://raw.githubusercontent.com/autonomous-ai/autonomous-grid/main/install.ps1 | iex". (2717e9f)- grid works on Windows 11 with Smart App Control on. Windows can block the small
grid.exelauncher uv creates, because it is unsigned. When that happens,install.ps1now starts grid through its signed Python with agrid.cmdlauncher instead (Ctrl+C does not ask "Terminate batch job?"), and grid's background processes never go throughgrid.exe. Agrid.exethat runs is left as it is. (f59ea90, 3d1d5df) - A program Windows blocks is named, with the way out, instead of a traceback — for example an unsigned
llama-server.exeunder Smart App Control. (0eb9851)
Full Changelog: https://github.com/autonomous-ai/autonomous-grid/compare/v0.3.60...v0.3.61
- v0.3.602026-10-27 · 2026-10-27 09:25 UTC
查看更新说明
What changes for you
- grid runs on Windows 10 and 11, with the same commands as on macOS and Linux. Install it in PowerShell:
powershell -ExecutionPolicy ByPass -c "irm https://grid.autonomous.ai/install.ps1 | iex". It installs on a signed Python (python.org's, through winget when none is found), so it also works with Smart App Control on. (9c3a2ba) - On Windows your grid keeps running when you close the terminal or end an SSH session, as it does on macOS and Linux. (390d759)
grid engine install llama.cppworks on Windows: upstream's checksum-verified build, CUDA for NVIDIA GPUs and CPU otherwise. Reinstalling it while an engine is serving keeps that engine running. (e7226a8, 9d6a412)grid leaveon Windows lets the engine unregister before it stops, and a remotegrid joinbeside a running engine hot-reloads it instead of restarting it. (6137a9a, 0bc6f8f)- Windows reports its real memory, disk and CPU without extra packages, so models are sized to the machine's RAM. (fccacd9)
- Also fixed on Windows:
grid join http://<host>:<port>, piped output such asgrid ls | findstr …,grid comfyui stop, the task workspace check, andgrid update, which now says to stop a running grid first instead of leaving a broken install. (2623238, 518c97a, 8a29611, a427393, 170e75c, e871de8) - The training extra installs from grid's own release wheel. The old advice,
pip install 'grid[train]', fetched an unrelated PyPI package. (1fc5874) - A remote engine no longer loses a join or brings back a record
grid leavejust removed — its own record writes now take the record lock. (d255dd8) - A refused local
grid joinfails cleanly:--apiasks for no key first, a seat join records its options instead of crashing, and--atstops talking about serving an engine it will not serve. (89aeec7, 9b77a40, 423417b)
There is no OS-community grid for Windows, and other members' tasks do not run on a Windows computer (no sandbox).
Full Changelog: https://github.com/autonomous-ai/autonomous-grid/compare/v0.3.59...v0.3.60
- grid runs on Windows 10 and 11, with the same commands as on macOS and Linux. Install it in PowerShell:
- v0.3.592026-10-14 · 2026-10-14 07:00 UTC
查看更新说明
What changes for you
- Model suggestions know about 40 more GPUs.
grid device-infonow reports memory bandwidth for the RTX 50 series and its laptop parts, RTX PRO 4000/4500/5000 Blackwell, RTX 2000/4000/4500/5000/5880 Ada, A2000, A4000, A5000, B200, DGX Spark GB10, Tesla P100/P40, Quadro P4000 and RTX 6000/8000, and TITAN RTX/Xp/X. These cards used to fall back to a generic default. The list was checked against local.sybilsolutions.ai/hardware and the GPUs vast.ai rents out, using the vendors' datasheets where the two disagree. (0099133, 77e895d) - Ti, SUPER and laptop cards get their own number instead of their base card's. Affected: 3060 Ti, 3070 Ti, 3080 Ti, 4060 Ti, 4070 Ti SUPER, 4080 SUPER, 2060 SUPER, 2080 SUPER, 3060 Laptop. (0099133, 77e895d)
- Wrong numbers fixed: RTX 4070 Ti 672 → 504 GB/s, RTX A4000 696 → 448, H100 PCIe 3350 → 2000, H100 NVL 3350 → 3900, A100 80GB PCIe 2039 → 1935, Apple M3 Ultra 800 → 819. (0099133, 77e895d)
- A binned Apple Max is told apart from the full one by its GPU core count: M3 Max 30-core 300 GB/s, M4 Max 32-core 410, M5 Max 32-core 460. These used to read the full chip's 400 / 546 / 614. (0099133)
Full Changelog: https://github.com/autonomous-ai/autonomous-grid/compare/v0.3.58...v0.3.59
- Model suggestions know about 40 more GPUs.
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
⚡ AI Grid
Your AI intranet: network the computers you already own for inference and training.
Quickstart · Omagrid + OpenCode · From anywhere · Inference · Training · Local AI patterns · How it works · CLI reference · Contributing
https://github.com/user-attachments/assets/9573e961-423f-45ae-ada6-b7a8a361f188
Grid puts every computer you own behind one OpenAI-compatible endpoint, and sends each request to whichever one runs the right model. Local by default — no account, no relay, nothing to sign into.
If you want a desktop app instead of a terminal, get it at autonomous.ai/grid. If your computers are in different places, start here then switch to remote mode. If you already run Ollama, vLLM or LM Studio, keep them — Grid networks them, it does not replace them.
Install
On every computer, macOS or Linux:
curl -fsSL https://grid.autonomous.ai/install.sh | bash
Windows 10 or 11, in PowerShell:
powershell -ExecutionPolicy ByPass -c "irm https://raw.githubusercontent.com/autonomous-ai/autonomous-grid/main/install.ps1 | iex"
That installs a command called grid. Check it with grid --version.
[!TIP] "command not found" — open a new terminal and try again.
Quickstart
Two computers: one hosts the grid, the other runs a model for it. They can be the same computer — or more than two; add each one the same way. Follow these steps in order.
Step 1 — the computer that will host the grid. It only routes requests, so it does not need a graphics card:
grid start
✓ Grid 'home' running — http://192.168.1.25:8090
Copy that address — the other computers join at it, and your apps send every request to it.
Lost it? grid info prints it again.
Step 2 — the computer that will run a model. A different machine from step 1:
# Install the program that runs models on this computer
grid engine install llama.cpp
# Download a model — several gigabytes, once. A repo with more than one file lists
# them and asks; press Enter to take the flagged default.
grid pull unsloth/gemma-3-4b-it-GGUF
Saved /Users/you/.grid/models/gemma-3-4b-it-Q4_K_M.gguf
Supports vision. Downloading unsloth/gemma-3-4b-it-GGUF/mmproj-F16.gguf ...
Saved /Users/you/.grid/models/gemma-3-4b-it-Q4_K_M.mmproj.gguf
This one also reads images — grid pull fetched the second file it needs for that automatically.
Now hand it to the grid. Four values, three of them yours to fill in:
grid join <grid-url> \
--serve "<model-file>" \
--advertise-as "<model-name>" \
--name "<computer-name>"
| what to put there | |
|---|---|
<grid-url> | the address step 1 printed |
<model-file> | the filename grid pull just saved, ending .gguf |
<model-name> | what apps will ask for — anything short and readable |
<computer-name> | a label for this computer, so you can tell it apart later |
Step 3 — back on the computer hosting the grid:
# What the grid can answer right now
grid models
# Ask it something — the <model-name> you chose above
grid chat -m "<model-name>" "write a haiku about local GPUs"
# Ask about a picture — only if the model reads images, which `grid pull` says
grid chat -m "<model-name>" --image "<image-path>" "what is in this image?"
Step 4 — point your apps at it. Anything that speaks the OpenAI API:
grid info --env
export OPENAI_BASE_URL='http://192.168.1.25:8090/v1'
export OPENAI_API_KEY='local-grid'
That is the whole path. Done for now? See Stopping, leaving, deleting. The rest of this page explains the pieces.
What a grid is
A model runs on one computer, and only that computer can use it.
A grid is a single address standing in front of several computers. Send a request there and it goes to whichever computer holds the right model. Add a computer and its models join the pool; stop one and the rest keep working.
- grid — the address apps send requests to. One computer hosts it.
- engine — the program that runs a model. Grid installs one for you.
- model — the AI itself. One file, several gigabytes, downloaded once.
Every grid has two ways to refer to it, and commands take one or the other:
| what it looks like | what takes it | |
|---|---|---|
| grid name | home, research | grid start, grid stop, grid delete, grid use |
| grid url | http://192.168.1.25:8090 | grid join, and your apps |
grid join takes either. A third thing that looks similar but is not a grid at all: --name at
join time labels the computer you are joining, not the grid.
Picking a model
grid catalog
Grid can pull:
unsloth/Qwen3.6-35B-A3B-MTP-GGUF:Qwen3.6-35B-A3B-UD-IQ3_S.gguf unsloth/Qwen3.6-35B-A3B-MTP-GGUF/Qwen3.6-35B-A3B-UD-IQ3_S.gguf (Apple Silicon, min 32 GB, language)
unsloth/Qwen3.6-27B-MTP-GGUF:Qwen3.6-27B-UD-Q5_K_XL.gguf unsloth/Qwen3.6-27B-MTP-GGUF/Qwen3.6-27B-UD-Q5_K_XL.gguf (NVIDIA, min 24 GB, language)
Each row twice: first what to pull, then the same repo and file as a path you can open on huggingface.co. Copy the first one:
grid pull unsloth/Qwen3.6-35B-A3B-MTP-GGUF:Qwen3.6-35B-A3B-UD-IQ3_S.gguf
Downloading unsloth/Qwen3.6-35B-A3B-MTP-GGUF/Qwen3.6-35B-A3B-UD-IQ3_S.gguf ...
Saved /Users/you/.grid/models/Qwen3.6-35B-A3B-UD-IQ3_S.gguf
The path after Saved is your own home directory, not literally /Users/you. What matters is the
filename at the end — the same one already visible in the grid catalog line above, after the
last /. That filename is what grid join --serve needs.
Not in the catalog? Any GGUF repo on Hugging Face works — just the repo, nothing else:
grid pull unsloth/gemma-3-4b-it-GGUF
A repo like this does not hold one file — it holds the same model saved several times, each a different size (that is what "quantized" means). In a real terminal you get all of them to choose from, biggest quality, smallest download flagged as the default:
unsloth/gemma-3-4b-it-GGUF ships 26 files:
1. gemma-3-4b-it-BF16.gguf
...
10. gemma-3-4b-it-Q4_K_M.gguf <- default
...
15. gemma-3-4b-it-Q8_0.gguf
Pick a number [1-26], or press Enter for the default:
Piped or scripted (no terminal to prompt), it takes that default — Q4_K_M, a reasonable middle
ground. Already know which file you want? Name it in full after a : and there is no prompt:
grid pull unsloth/gemma-3-4b-it-GGUF:gemma-3-4b-it-Q8_0.gguf
Two ways, then: the repo alone to pick from the list, or the repo plus a full filename to go straight there. Copy the filename from the list above, or from the repo's Files and versions tab on huggingface.co.
--advertise-asgives the grid a short name again, so apps ask for something readable instead of a filename.- Vision models need a second file.
grid pullfetches it automatically and--servefinds it — nothing extra to type. It saysSupports vision.when it does, and thengrid chat --image <path>sends a picture with your question. Send a PNG, JPEG, BMP or GIF.
Three ways to join a computer
<grid-url> below is the address the computer hosting the grid printed at grid start.
Nothing installed on it yet — install the engine Grid ships, download a model, then join:
grid engine install llama.cpp
grid pull unsloth/gemma-3-4b-it-GGUF
Then join with the filename grid pull just printed on its Saved line:
grid join <grid-url> --serve "<model-file>" --advertise-as "<model-name>"
grid engine install picks the build for that machine: Metal on macOS, Vulkan on a Linux box with
an NVIDIA card, CPU otherwise. It also says whether a faster CUDA build is possible there.
| you get | costs you | pick it when | |
|---|---|---|---|
| Vulkan (default on Linux) | GPU inference now | one download | you want to be running today |
CUDA --from-source | the fastest backend | CUDA toolkit + a long compile | the box is a permanent node |
It already runs Ollama, vLLM or LM Studio — keep it, and point Grid at it:
grid join <grid-url> --at <engine-url> -m "<model-name>" --name "<computer-name>"
<engine-url> is where that program already listens, and <model-name> is a model it already
serves — Grid does not download it or start it, it only routes to it:
grid join http://192.168.1.25:8090 --at http://192.168.1.20:11434/v1 -m "qwen3-coder" --name "gpu-4090"
Grid attaches to any engine that speaks the OpenAI API — Ollama, vLLM and LM Studio among them — so point it at whichever one you already run. Each prints its own URL when it starts.
It is somewhere else — another office, a friend's house, behind a VPN. Local mode needs every computer on the same network, so this one needs remote mode.
The engine sizes itself to whatever machine it lands on: at load it measures free memory and takes
the largest context that fits. --ctx-size N pins it instead — N is what one request may use, so
serving several at once reserves N × the slot count. --n-predict, --parallel,
--temp, --flash-attn and --endpoint-port are there too — see grid join --help.
Stopping, leaving, deleting
Three different commands, easy to mix up:
grid leave— this computer stops serving. Everyone else on the grid keeps working.grid stop— pauses the grid itself. Nothing is lost;grid startbrings it back exactly as it was.grid delete— removes a grid's local config for good. Cannot be undone.
# Done serving from this computer
grid leave
Left engine <computer-name> on <grid-name>.
Serving more than one thing from here? Say which — the --name you gave at join works, so does
the model it serves:
grid leave --engine "<computer-name>"
grid leave --engine "<model-name>"
grid leave --all # everything this computer joined
# Pause the grid itself
grid stop
✓ Grid 'home' stopped. Its setup is kept.
Deleting removes a grid for good, not just pauses it — it asks to confirm first:
grid delete <grid-name>
Delete grid '<grid-name>' (ag-a1b2c3d4)? This removes its local config and cannot be undone. [y/N] y
Deleted grid '<grid-name>'.
A grid name with a space needs quotes: grid delete "my grid".
Running commands from another computer
grid models and grid chat need no arguments on the computer that hosts the grid. From anywhere
else, name the grid by its URL:
grid models http://192.168.1.25:8090
grid chat --grid http://192.168.1.25:8090 -m "<model-name>" "hello"
No grid on this computer yet means this machine has no grid set up — not that yours has stopped.
More than one grid
Your first grid is called home. Pass a name to make another one:
grid start <grid-name>
✓ Grid '<grid-name>' running — http://192.168.1.25:8091
Starting it does not switch to it — grid info, grid models and grid chat still mean home
until you switch:
grid use <grid-name>
With one grid, none of this comes up.
Pointing apps at the grid
Every app below needs the two values grid info --env printed: OPENAI_BASE_URL becomes
baseUrl / base_url, OPENAI_API_KEY becomes apiKey.
Add Grid as a provider in ~/.openclaw/openclaw.json
(docs):
{
"agents": { "defaults": { "model": { "primary": "grid/<model-name>" } } },
"models": {
"providers": {
"grid": {
"baseUrl": "http://192.168.1.25:8090/v1",
"apiKey": "local-grid",
"api": "openai-completions",
"models": [{ "id": "<model-name>", "name": "<model-name> (via Grid)" }]
}
}
}
}
Set the endpoint in ~/.hermes/config.yaml
(docs):
model:
provider: custom
default: <model-name>
base_url: http://192.168.1.25:8090/v1
echo 'OPENAI_API_KEY=local-grid' >> ~/.hermes/.env
Any OpenAI SDK works the same way:
from openai import OpenAI
client = OpenAI(base_url="http://192.168.1.25:8090/v1", api_key="local-grid")
client.chat.completions.create(
model="<model-name>", # routed to whichever computer serves it
messages=[{"role": "user", "content": "hello"}],
)
The commands
grid start / grid stop | start or stop the grid on this computer |
grid delete | remove a grid's local config for good |
grid join / grid leave | add or remove this computer from a grid |
grid engine install | install the engine that runs models |
grid catalog | models available to pull, and models already here |
grid pull | download a model |
grid models | what the grid can answer right now |
grid chat | send one message, --image <path> to send a picture with it |
grid info | the address and key for apps |
grid ls / grid use | list grids, pick the active one |
grid mode | switch between local and remote |
Full reference: docs/cli.md.
Working from anywhere
Local mode needs every computer on the same network. Remote mode drops that: each machine dials out to Autonomous Relay, so it serves from behind a NAT with no inbound port and no public IP.
# Sign in; opens a browser. A fresh install is already in remote mode, and signing in
# switches this computer to it either way — `grid mode remote` first is not needed.
grid login
# Sign-in lists the grids you can reach and picks none of them, so pick one:
grid use <grid-name>
- The mode is remembered.
--local/--remoteoverrides one command. grid loginopens a browser.--no-browserprints a code to type instead.- Signing in prints the grids you can reach (name and type,
*on the active one) followed by the commands that operate on them —grid lsprints the same list any time, andgrid syncrefreshes it without signing in again. - Signing in never selects a grid, so
grid useis the step that makes one active. Until then the other commands have nothing to talk to.grid start <grid-name>on a new grid still needs it too. - Requests pass through our relay, which local mode never does. We forward and keep nothing — no stored prompts, no training on your traffic.
Three commands change. chat, models, info and your apps are identical.
| 🏠 local | 🌐 remote | |
|---|---|---|
| start a grid | grid start | grid start <grid-name> then grid use <grid-name> |
| add a computer | grid join <grid-url> --at <engine-url> | grid join <grid-name> --at <engine-url> |
| API key | local-grid — auth is off | your per-grid token, from grid info --env |
Remote --at is localhost because the engine dials out; nothing reaches in.
- On Omagrid with OpenCode? The Omagrid quickstart is the whole path in two commands.
grid ls— the grids your sign-in can reachgrid start <grid-name> --type permissioned-providers— restrict who may servegrid members add <grid-name> [email protected]— invite people (Members)grid leaveandgrid stopwork exactly like local.grid deletedoesn't — a remote grid lives on the account that created it, not your disk. Delete it for everyone from the grid's page on autonomous.ai/grid instead.
Inference
Images and video
Grid ships a second engine, ComfyUI, for media:
# Install the media engine
grid engine install comfyui
# Download the model files for what you want to make
grid engine pull image_generation # also: z_image, image_editing, i2v
# Join this computer as a media engine; repeat --bundle for more than one
grid join <grid-url> --media --bundle image_generation
# Make an image
grid image "a compact walnut desk beside a sunlit window" \
-m comfyui:image_generation --grid <grid-url>
Editing and video take a source image with -i:
grid edit "put a vase of tulips on the desk" \
-m comfyui:image_editing -i desk.png --grid <grid-url>
grid video "morning light moves across the desk" \
-m comfyui:i2v -i desk.png --duration 5s --aspect-ratio 1:1 --grid <grid-url>
- Each command needs
-m:comfyui:image_generation,comfyui:image_editingorcomfyui:i2v. A computer serves only the bundles it joined with. - Two models make images.
comfyui:image_generationis Krea 2 Turbo, also reachable ascomfyui:krea2;comfyui:z_imageis the lighter Z-Image Turbo. Pull and joinz_imageto serve both, then pick per request — the command is the same, only-mchanges. --stepsis optional, and better left off: each model ships with the step count it was distilled for. Both of these want 4, and asking for more is slower without being better.grid edittakes up to three-iimages.grid videotakes one, and--durationis5sor8s.--gridis only needed on local, because the positional argument is the prompt.- Results are written to
~/.grid/outputs—-oputs them somewhere else.
No GPU? Join with an API key
grid join --api openai serves OpenAI's models to your grid under your own key. Remote only.
See what a join would serve first — no key, no network call:
grid catalog --api openai
openai:gpt-5.5 1,050,000 ctx tools, vision, json, structured
openai:gpt-5.4-mini 400,000 ctx tools, vision, json, structured
# The key is read from the environment, never passed as a flag
export OPENAI_API_KEY=sk-…
grid join <grid-name> --api openai
- The key comes from the environment or a hidden prompt, never a flag. Stored
0o600. - It survives
grid logout— it is your vendor credential, not your grid sign-in. - Requests to
openai:*leave the grid under your own account's terms. The prefix keeps that visible in every model list. - No grid-side spend cap. Put a budget on the key's OpenAI project.
A ChatGPT subscription works instead of a key:
# See what a codex seat would serve — offline, no sign-in
grid catalog --api codex
# Sign into ChatGPT in a browser, then serve the seat
grid join <grid-name> --api codex
- No API key — the CLI signs into your ChatGPT account by browser OAuth (
--no-browserfor headless). - It probes the seat and your egress IP before advertising anything, so serve from a residential connection.
codex:*models serve the Responses API. Point a Codex app at your grid withgrid info --env(how) — that is the client for them, andgrid chatsays so if you reach for it.- Jobs spend the seat's own monthly allowance.
Walkthrough: docs/codex-quickstart.md.
Run Claude Code on your grid
Deprecated (2026-10-25):
grid launch claudeis no longer used and gets no further fixes. It still works; see docs/cli.md.
grid launch claude
grid launch starts an app already pointed at your grid.
- Endpoint, credential and model names go into that app's own process environment and nowhere else. Nothing exported to your shell, nothing written to a config file, nothing to undo.
- Remote only — Claude Code speaks the Anthropic Messages dialect, and only the relay translates it.
- It picks no model for you. Your own Claude Code config and
/modelstill decide, so checkgrid modelsand point the app at a name the grid serves.
Walkthrough: docs/claude-code-quickstart.md.
Don't know which model to ask for? Send auto
A grid's catalog shifts as engines join and leave. Instead of hardcoding a model name, an app can
send the reserved name auto, and the grid picks a capable model that is free.
# Pick the model that decides where each request goes
grid router set-advisors openai:gpt-5-mini --grid <grid-name>
grid router enable --grid <grid-name>
# Now ask for "auto" instead of a model name
grid chat -m auto "summarize this file in one line"
- Only a bounded excerpt of each request reaches the Advisor — never the full conversation — on the platform's key.
- A dead Advisor falls back to a deterministic pick, so
auto's availability equals your grid's rather than a vendor's. - The
modelfield and theX-Grid-Routed-Modelheader name whichever model actually answered.
Details in docs/cli.md.
Training (Experimental)
The loop runs end to end and the measured runs in
train/README.mdare real, but the capture path, the gate and the MLX backend are young. The join from real outcomes back into tasks exists only where your app reports a verdict — what is and is not built.
The models you can rent know nothing about you, and a bigger one will not fix that: the information was never on the internet. It is in your systems. What you get is an expert in your work rather than a generalist — worse than the frontier at everything, better at your thing.
# Ready-made setups for real business data
grid train packs
# Turn support tickets into a reply-drafting model
grid train init --pack support-replies
# Run this Mac as a rollout node (Apple Silicon)
grid train serve
# The climb
grid train run
# Watch the reward and eval curves
grid train ui
- The grid samples rollouts across its nodes; one machine holds the trainer.
- The LoRA adapter it produces goes back to the serving nodes under a stable name, where
autokeeps routing to it. - Rollouts run on your own hardware: training needs the token ids and logprobs a node sampled, which is something a machine you own reports and a rented API does not. API nodes serve inference on the same grid.
- In a hybrid grid that becomes the useful loop:
autosends what the local model can't do yet to a frontier node, those tasks are what tonight's run consumes, and the frontier share shrinks as the local model catches up. - Both backends train. vLLM returns sampled ids and logprobs natively;
grid train servedoes it from MLX, so an all-Apple-Silicon fleet needs no CUDA.grid train convert-adaptermoves an adapter between them.
A complete GRPO climb, no GPU:
# Any machine, CUDA or CPU — about six minutes
"$(uv tool dir)/grid/bin/python" -m train.torch_grpo_hello
# Apple Silicon — about one minute
"$(uv tool dir)/grid/bin/python" -m train.mlx.grpo_hello
Both need the training extra, and grid's own Python, which a plain python is not: see
docs/start-on-a-mac.md step 0.
Figures and measured curves: train/README.md. One Mac: docs/start-on-a-mac.md · two machines: docs/two-node-training.md · topologies: docs/topologies.md.
How it works
Grid sits above your computers the way an API gateway sits above services: one address in front of many. The analogy stops there — a gateway routes by path, Grid routes by model name.
- the grid — one endpoint routing each request to a computer serving that model. Locally a
proxy from
grid start; remotely a hosted grid on Autonomous Relay aftergrid login. - engines — what runs a model, yours or one Grid installed.
grid joinadvertises a computer's engines and heartbeats them; Grid never restarts or replaces them. Locally they register with the grid directly, remotely they poll the relay outbound — behind a NAT, no inbound port. - apps — anything speaking the OpenAI API. Text on
/v1/chat, media on/v1/media. - the trainer — a consumer of the grid, not a second control plane. It holds your tasks and the weights, asks for completions like any other client, and pushes its adapter back to the serving nodes.
Two things run on the same fleet: inference, and training (experimental) — the same machines teaching a small model your work, where the data, the attempts and the weights never leave your network. Intranet is the old word for a private network.
# What each computer serves, and how many requests it takes at once
grid engines
# Every model, and which computer answers for it
grid models --verbose
# The grid's uptime, memory pool and answered tokens (--verbose adds a card per computer)
grid stats
# Who spent them — also --by model / --by engine
grid usage --by member
engines lists what each computer serves and how many requests it takes at once; models lists
every model and which computer answers for it.
Request flow: ARCHITECTURE.md. Full command surface, including membership and remote grid types: docs/cli.md.
Contributing
git clone https://github.com/autonomous-ai/autonomous-grid
cd autonomous-grid
# Create the environment, with test dependencies
uv sync --extra dev
# Run the tests
uv run --extra dev pytest
Good first PRs: add a model to the catalog (shared/models/catalog.py) or a media bundle
(shared/models/media_bundles.py). Start with CONTRIBUTING.md and
ARCHITECTURE.md. Figures follow docs/STYLE.md.
Local state lives under ~/.grid (override with GRID_HOME).
License
MIT — see LICENSE.