Turn your GPU into an AI inference endpoint and join the Swan Chain decentralized computing network.
The built-in dashboard — computing-provider dashboard. Model names, payout rates, and earnings figures are example values.
No wallet needed. No blockchain registration. No public IP required. The provider dials out to Swan Inference over a WebSocket, so it works behind NAT.
# Linux x86-64 — also computing-provider-linux-arm64, computing-provider-darwin-arm64
curl -fL -o computing-provider \
https://github.com/swanchain/computing-provider/releases/latest/download/computing-provider-linux-amd64
chmod +x computing-provider && sudo mv computing-provider /usr/local/bin/
computing-provider versionBuilding from source is optional — see installation.md.
Linux (NVIDIA GPU) — needs Docker with the NVIDIA Container Toolkit:
computing-provider models download Qwen/Qwen2.5-7B-Instruct
docker run -d --gpus all -p 30000:30000 --ipc=host --name sglang \
-v ~/.swan/models/Qwen/Qwen2.5-7B-Instruct:/models \
lmsysorg/sglang:latest \
python3 -m sglang.launch_server --model-path /models \
--host 0.0.0.0 --port 30000 \
--served-model-name Qwen/Qwen2.5-7B-InstructmacOS (Apple Silicon):
brew install ollama
ollama serve &
ollama pull qwen2.5:7bcomputing-provider setup # auth, config, and model discovery
computing-provider run # start serving
computing-provider inference status # confirm you are connectedThe wizard checks prerequisites, creates or logs into your Swan Inference
account, discovers the model servers you just started, matches them to catalog
model IDs, and writes config.toml and models.json. Start your model server
before running it, or it will have nothing to find.
Earnings come from traffic, not hardware. Qwen 2.5 7B is only an example. Serving models with demand and few providers routes more requests to you —
computing-provider inference recommend-modelsranks the catalog against your GPU. See models.md.
Your provider moves through these stages on its own. Most are fully active within a day.
Connect ──▶ Benchmark ──▶ Approval ──▶ Collateral ──▶ Active
(instant) (automatic) (< 24 hrs) (USD or crypto) (earning)
| Stage | What happens | Time |
|---|---|---|
| Connect | Provider connects to the network and registers its models | Immediate |
| Benchmark | Automated benchmarks verify your GPU can serve the registered models | Minutes (automatic) |
| Approval | Admin reviews your provider | < 24 hours |
| Collateral | Deposit collateral to secure your position and unlock earnings (card, USDC on Ethereum or Base, or SWAN on Swan Chain) | Instant |
| Active | Start receiving inference requests and earning rewards | Ongoing |
Grace period: new providers get 7 days after activation during which benchmark failures and low uptime do not affect routing priority, so you have time to stabilise your setup.
computing-provider inference status shows your current stage at any time.
Swan Inference (Cloud)
│
│ WebSocket (outbound connection - works behind NAT)
▼
┌───────────────────────┐
│ Computing Provider │
│ ┌─────────────────┐ │
│ │ Your GPU Server │ │
│ │ (SGLang/Ollama) │ │
│ └─────────────────┘ │
└───────────────────────┘
- The provider connects outbound to Swan Inference — no inbound ports
- It registers the models listed in
models.json - Inference requests arrive over that WebSocket
- Each is forwarded to your local model server and the response streamed back
- You are paid per token for completed requests
Request flow is managed for you, with no tuning required to run: endpoints are
health-checked continuously and unhealthy ones taken out of routing until they
recover; GPU-aware rate limits and per-model concurrency slots reject excess
work with HTTP 429 rather than overloading the GPU; transient upstream failures
are retried with exponential backoff; models.json edits hot-reload; and
SIGTERM/SIGINT drains cleanly. Limits can be retuned at runtime over the
REST API.
Two files, both in $CP_PATH (default ~/.swan/computing), both written by
computing-provider setup:
models.json maps catalog model IDs to your local servers:
{
"Qwen/Qwen2.5-7B-Instruct": {
"endpoint": "http://localhost:30000",
"gpu_memory": 16000,
"category": "text-generation"
}
}config.toml holds provider settings:
[API]
Port = 8085
NodeName = "my-provider"
[Inference]
Enable = true
WebSocketURL = "wss://inference-ws.swanchain.io"
ApiKey = "sk-prov-xxxxxxxxxxxxxxxxxxxx" # from https://inference.swanchain.io
Models = ["Qwen/Qwen2.5-7B-Instruct"]Every field, plus alerts, self-check, dashboard and logging settings, is documented in configuration.md.
Serving from Ollama, llama.cpp, LiteLLM or another proxy? Set
context_lengthexplicitly inmodels.json. Only vLLM and SGLang expose the real window, so otherwise the marketplace advertises the catalog's theoretical value and clients send prompts your backend rejects. See context windows.
The failures that cost a provider money are quiet: the daemon stays up and looks
healthy while a model earns nothing. computing-provider selfcheck audits for
exactly that.
OK models.json 8 models mapped
OK config/models.json agreement config.toml and models.json list the same models
OK Swan Inference connection connected
OK registered with Swan Inference all 8 models registered
OK model health all 8 models healthy
OK context window reported context matches every backend
FAIL inference probe openai/gpt-5.5: HTTP 401 authentication token has been invalidated
OK traffic every model has served requests
OK disk space /home/you/.swan/computing: 92.1 GB free of 438 GB (78% used)
It catches what no error message reveals: a model served but not advertised, a healthy model never registered upstream, a backend serving less context than you claim, one that answers health checks but cannot actually serve, a model that has never been called, and a disk about to fill.
The inference probe sends one max_tokens: 1 completion per model. It is the
only check that exercises the engine — GET /v1/models is answered by most
backends without touching it, so a dead engine or expired API token looks healthy
everywhere else.
It exits non-zero on failure, so it works as a cron or monitoring check
(--json for machine-readable output, --no-inference to skip the probe). The
daemon runs the same audit every 10 minutes and acts on it: a model whose backend
fails two consecutive probes is deregistered from Swan Inference and
re-registered once it serves again — no traffic beats traffic that fails. Only
backend-owned failures count; an over-long client prompt or your own rate limit
never pulls a model, and one you disabled by hand is never switched back on. Tune
it under [SelfCheck], see
configuration.md.
Point the provider at a webhook, an SMTP server, or both, and it tells you when something breaks:
[Alerts]
WebhookURL = "https://hooks.example.com/provider"
[Alerts.Email]
Host = "smtp.gmail.com"
Port = 587
Username = "you@example.com"
To = ["you@example.com"]Keep the password out of config.toml — the provider reads $CP_PATH/.env at
startup:
# Gmail, Outlook and Yahoo need an app password, not your login password
umask 077 && printf "SMTP_PASSWORD='your-app-password'\n" > $CP_PATH/.env
computing-provider alerts test # verify before you need itAlerts fire on a model going unhealthy, a model that passes health checks while failing most of its requests, a lost connection to Swan Inference, and a failed self-check — each with a matching recovery event. Passing runs are logged locally and never sent, so an "all clear" never trains you to ignore it. Payload and tuning in configuration.md.
computing-provider dashboard # http://localhost:3060Real-time metrics, earnings, model pricing, per-transaction token usage, GPU status, model management and request controls — the page shown at the top of this README.
It is read-only until you choose Unlock controls and paste the token from
$CP_PATH/dashboard.token, an owner-only file generated on first run.
Configuration, request limits, alerts, self-check and logging can then be edited
from Settings; stored secrets are never sent back to the browser. Host and
port are configurable under [Dashboard] — use 0.0.0.0 only on a network you
trust.
If you serve models through CLIProxyAPI — which turns a personal ChatGPT, Claude or Gemini subscription into an OpenAI-compatible endpoint — the provider can check and renew that backend's logins for you:
computing-provider cliproxy status # account, plan and expiry per credential
computing-provider cliproxy status --probe # and one real completion per model
computing-provider cliproxy login --device # re-authenticate; prints a code and a URLstatus reads credential metadata only — never a token — and exits non-zero on
an expired or disabled login, so it works as a cron check.
Use --probe. A login can be unexpired, enabled, and still rejected by the
subscription upstream, and the proxy answers /v1/models from a static list
either way — so the model reports healthy while every request fails. Only a real
completion tells those apart:
expiring codex you@example.com (plus) expires 2026-09-08 (in 128h0m0s)
Live probe
HTTP 503 gpt-5.5
auth_unavailable: no auth available (providers=codex, model=gpt-5.5)
That credential is not expired. Re-authenticating will not help — check whether the account still has access.
curl http://localhost:8085/api/v1/computing/inference/metrics| Endpoint | Description |
|---|---|
GET /inference/status |
Connection state, active models, what is registered upstream |
GET /inference/metrics |
Request counts, latency, GPU stats |
GET /inference/metrics/prometheus |
Prometheus format for Grafana |
GET /inference/models |
List all models with status |
GET /inference/health |
Health of every model |
POST /inference/models/:id/enable |
Enable a model |
POST /inference/models/:id/disable |
Disable a model |
POST /inference/models/reload |
Hot-reload models.json |
You are paid per token, for every request you serve. Each catalog model
publishes a payout price per 1M input and output tokens; earnings accrue at that
rate and appear in the
Provider Dashboard and in
computing-provider inference status. There is no UBI and no allocation for idle
hardware — the Swan 1.0 UBI program has ended — so traffic is the only thing that
earns.
computing-provider inference set-beneficiary 0xYourWalletAddressPayouts are requested from the dashboard: minimum $10, flat $1 fee, one request per chain per hour. Earnings can also be converted into inference credit on the same account.
Collateral is required for activation, not optional. Deposit on-chain (USDC on Ethereum or Base, SWAN on Swan Chain) or by card; it is refundable with a 7-day waiting period.
computing-provider inference deposit # chains, contracts, minimums
computing-provider inference deposit --check # current collateral statuscomputing-provider setup # interactive setup (recommended)
computing-provider run # start the provider
computing-provider selfcheck # audit this node
computing-provider dashboard # web UI on port 3060
computing-provider version # installed build
computing-provider update --check # is a newer release available?
sudo computing-provider update # install the newest release
computing-provider inference status # stage, models, earnings, context
computing-provider inference config # show inference config
computing-provider inference deposit # collateral instructions
computing-provider inference recommend-models
computing-provider inference set-beneficiary 0x...
computing-provider models catalog # supported models
computing-provider models download <id> # fetch weights
computing-provider models list # what is on disk
computing-provider cliproxy status --probe # subscription-backed models: are they serving?
computing-provider cliproxy login --device # re-authenticate one
computing-provider research hardware # hardware, GPU info, benchmarkssetup also takes --skip-discovery and --api-key=sk-prov-xxx, and has
discover, login and signup subcommands. Full reference in
docs/cli/; --help works on every command.
Updates are verified against the checksums published with each release and the
binary is replaced atomically. update deliberately does not restart a
running provider — see
keeping up to date.
| Guide | Covers |
|---|---|
| Installation | Requirements, binary install, building from source, updates |
| Getting started | First run, Linux and macOS walkthroughs |
| Configuration | config.toml, models.json, alerts, self-check, dashboard |
| Models | Catalog, VRAM sizing, downloading weights, switching models |
| SGLang deployment | Running SGLang for inference |
| SGLang tuning | GPU configs, memory tuning, multi-GPU TP |
| Apple Silicon | Ollama setup on M-series Macs |
| CLIProxyAPI | Serving a ChatGPT/Claude subscription as an endpoint |
| Troubleshooting | Error reference and FAQ |
Start with computing-provider selfcheck — it names the problem more precisely
than the logs will. The two most common:
| Symptom | Cause |
|---|---|
| Online but receiving no requests | --served-model-name, the models.json key, and the catalog ID must all match exactly |
invalid provider API key |
Provider keys start with sk-prov-; consumer keys (sk-swan-*) do not work |
Full error reference and FAQ: docs/troubleshooting.md.
- Discord — community support
- GitHub Issues — bug reports
- docs.swanchain.io — full documentation
Apache 2.0
