Hylon Admin Runbook
Operator runbook for Hylon billing and the node program, covering every tunable hylon_* config knob, per-model pricing, and the fleet ops endpoints.
Overview
Everything tunable about Hylon lives in two places, both adjustable at runtime with no redeploy:
credit_configrows (key/value): the free-tier allowance, warning threshold, and node point rates.hylon_model_pricingrows: per-model credit rates.
All endpoints on this page require an admin JWT (Authorization: Bearer with an admin role) and are mounted under /api/v1/admin. Responses use the standard { "success": true, "data": { } } envelope.
Points before token
The node program pays points only. Nothing in the admin surface converts points to ORB or writes to the token economy, and no such conversion is enabled anywhere. Any future points conversion ships as a separate admin-gated feature that is disabled by default; until you read an explicit announcement, treat every "points to token" expectation as unsupported.
Config knobs (credit_config)
These are the hylon_* keys the code reads today, stored as plain strings in credit_config (config_key / config_value columns). A missing key falls back to the registry default, so deleting a row is safe. GET /api/v1/admin/hylon/config is authoritative: its entries array enumerates the whole registry merged over whatever rows exist, with each key's type, default, description, and bounds.
Billing
| Key | Default | Seeded | Effect |
|---|---|---|---|
hylon_free_daily_tokens | 0 | 100000 (migration 113) | Free-tier allowance in raw tokens per user per UTC day. 0 makes Hylon paid-only. Preferred over the coarse key below. |
hylon_free_daily_mtok | 0 | — | Coarse fallback: free allowance in millions of tokens per day. Only consulted when hylon_free_daily_tokens is absent. |
hylon_low_balance_warning_credits | 0 | 500 (migration 111) | Credit balance below which client UIs show a low-balance warning. Display-only; never blocks requests. |
Node program point awards
| Key | Default | Seeded | Effect |
|---|---|---|---|
hylon_node_points_per_verify | 1 | 1 (migration 114) | Points awarded per server-verified verify.recompute task. |
hylon_node_points_per_bench | 5 | 5 (migration 114) | Points awarded per server-verified bench.cpu task. |
Economy: points→ORB bridge (default CLOSED)
| Key | Default | Effect |
|---|---|---|
hylon_points_bridge_enabled | false | Master gate for the points→ORB bridge. Points-before-token: while this is false, nothing can convert points into ORB. |
hylon_points_orb_rate | 0 | ORB credited per point. Both this (> 0) and the gate above must be opened; either alone still refuses with 409 gate_closed. |
Economy: earning lanes
Daily point caps by lane; a negative value means uncapped. These bound the earning rate only and never gate AI access.
| Key | Default | Effect |
|---|---|---|
hylon_lane_unattested_daily_cap | 20 | Daily point cap for unattested nodes. |
hylon_lane_attested_daily_cap | 200 | Daily point cap for attested nodes. |
hylon_lane_full_daily_cap | -1 | Daily point cap for attested paid-subscriber nodes (uncapped by default). |
hylon_lane_paid_tenure_days | 30 | Paid-subscriber tenure in days required to reach the full lane. |
Economy: Season Clearing
| Key | Default | Effect |
|---|---|---|
hylon_orb_per_usd | 20000 | ORB per USD, used to turn a season's banked-revenue budget into an ORB budget (1 ORB = $0.00005). |
hylon_season_max_points_orb_rate | 0 | Global ceiling on a season's settled per-point ORB rate. 0 = no cap beyond the season's own rate and its budget. |
Notes:
- Seeds only INSERT when the key is absent, so values you change are never reverted by a redeploy or container restart.
- Rate changes take effect immediately for new requests and new task verifications; they never rewrite history.
- A negative point rate is treated as
0at award time. - Every write is validated against the registry (type + bounds), applied in one transaction (all-or-nothing), and recorded in the audit log.
Billing config endpoints
/api/v1/admin/hylon/configRead every hylon_* knob (registry merged over live rows), the legacy billing shorthand, and all per-model pricing rows.
curl https://api.orbai.world/api/v1/admin/hylon/config \
-H "Authorization: Bearer <ADMIN_JWT>"{
"success": true,
"data": {
"config": {
"free_daily_tokens": 100000,
"low_balance_warning_credits": 500
},
"entries": [
{
"key": "hylon_points_bridge_enabled",
"value": "false",
"default": "false",
"type": "bool",
"known": true,
"description": "Hylon economy: master gate for the points->ORB bridge (default closed; points-before-token)"
}
],
"pricing": [
{
"model": "Qwen/Qwen2.5-3B-Instruct",
"input_credits_per_mtok": 20,
"output_credits_per_mtok": 60,
"cached_input_credits_per_mtok": 0,
"is_active": true
}
]
}
}entries is the complete, self-describing knob list (sorted by key) and is what the admin UI renders. config remains for the two legacy billing fields.
/api/v1/admin/hylon/configUpdate config. Accepts the legacy billing fields and/or a generic set map of any hylon_* key.
| Parameter | Type | Required | Description |
|---|---|---|---|
free_daily_tokens | integer | Optional | Legacy shorthand: raw tokens per user per UTC day. 0 disables the free tier. Negative is rejected. |
low_balance_warning_credits | integer | Optional | Legacy shorthand: warning threshold in credits. Negative is rejected. |
set | object | Optional | Generic map of hylon_* key to value (string, number, or bool). Each key is validated against the registry's type and bounds; one invalid entry rejects the whole request. |
# Legacy shorthand: halve the free allowance
curl -X PUT https://api.orbai.world/api/v1/admin/hylon/config \
-H "Authorization: Bearer <ADMIN_JWT>" \
-H "Content-Type: application/json" \
-d '{"free_daily_tokens": 50000}'
# Generic form: tune any hylon_* knob (all-or-nothing, audited)
curl -X PUT https://api.orbai.world/api/v1/admin/hylon/config \
-H "Authorization: Bearer <ADMIN_JWT>" \
-H "Content-Type: application/json" \
-d '{"set": {"hylon_lane_attested_daily_cap": 300, "hylon_lane_paid_tenure_days": 45}}'Opening the points bridge is a deliberate, two-key act
hylon_points_bridge_enabled: true alone does nothing, and hylon_points_orb_rate > 0 alone does nothing. Conversion only becomes possible when both are set. Until then every convert call returns 409 gate_closed and no ORB moves anywhere.
/api/v1/admin/hylon/pricingCreate or update one model's per-token credit pricing (upsert by model name).
| Parameter | Type | Required | Description |
|---|---|---|---|
model | string | Required | Model identifier exactly as the gateway bills it, e.g. Qwen/Qwen2.5-3B-Instruct. |
input_credits_per_mtok | integer | Required | Credits per million input tokens. Must be >= 0. |
output_credits_per_mtok | integer | Required | Credits per million output tokens. Must be >= 0. |
cached_input_credits_per_mtok | integer | Required | Credits per million cached input tokens. Must be >= 0. |
is_active | boolean | Required | Inactive models are rejected at settlement (fail-closed), not served for free. |
Unpriced means rejected
Settlement fails closed on any model without an active pricing row (422 model_not_priced). Before pointing the gateway at a new model, add its pricing here first.
Node program fleet ops
/api/v1/admin/hylon/nodesFleet overview: every enrolled node with owner, tier, status, points, and reported vs verified task counts, plus queue statistics.
curl https://api.orbai.world/api/v1/admin/hylon/nodes \
-H "Authorization: Bearer <ADMIN_JWT>"{
"success": true,
"data": {
"nodes": [
{
"id": 8,
"name": "my-mac",
"owner_user_id": 22468,
"device_type": "desktop",
"deployment_type": "HOME",
"tier": "server",
"status": "online",
"last_seen": "2026-07-28T10:00:00Z",
"points": 6,
"tasks_reported": 6,
"tasks_verified": 6,
"contributions": {
"tasks_completed": 6,
"compute_units": 0,
"inference_requests": 0
}
}
],
"task_counts": { "queued": 4, "leased": 2, "completed": 6 },
"queue_depth": 4,
"total_points_awarded": 6,
"program_status": "beta"
}
}Reading the fleet view:
statusisonlineonly when the node checked in within the last 5 minutes;disabledreflects a deactivated node record.- A wide gap between
tasks_reportedandtasks_verifiedon one node means its completions are failing server-side re-verification. That is the cheat signal; verified counts are the only ones that ever award points. task_countsis keyed by task status:queued,leased,completed,failed,unsupported, orexpired.queue_depthis the number ofqueuedtasks. The lease path self-replenishes with up to 10verify.recomputetasks when a node finds the queue empty, so an empty queue is not an outage.
/api/v1/admin/hylon/nodes/enqueueMint a batch of queued tasks. Count is clamped to 1..500 per call.
| Parameter | Type | Required | Description |
|---|---|---|---|
kind | string | Optional | verify.recompute (default) or bench.cpu. Anything else gets 400. |
count | integer | Optional | How many tasks to mint, clamped to 1..500. |
# Seed 50 benchmark tasks
curl -X POST https://api.orbai.world/api/v1/admin/hylon/nodes/enqueue \
-H "Authorization: Bearer <ADMIN_JWT>" \
-H "Content-Type: application/json" \
-d '{"kind": "bench.cpu", "count": 50}'bench.cpu tasks are only created by this endpoint (the auto-top-up mints verify.recompute only), so benchmark availability is entirely an operator decision.
Season ops (Season Clearing)
A season is the accounting window contributor rewards clear against. Its budget is banked from real service revenue, so rewards behave like a dividend rather than an emission: at settle time every earner is paid pro-rata out of a budget that already exists.
The lifecycle is open → closed → settled. Points are stamped with the open season at award time; only one season may be open at a time. Settlement records what each contributor cleared but credits no ORB — crediting happens only through the separately gated points→ORB bridge, so the points-before-token rule holds end to end.
/api/v1/admin/hylon/seasonsOpen a new season with a banked-revenue budget and a per-point rate cap. Rejected with 409 while another season is open.
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | Required | Human label for the season, e.g. Season 1. |
banked_revenue_usd | number | Required | Budget in USD, banked from real service revenue. Converted to ORB via hylon_orb_per_usd at settle. |
points_orb_rate | number | Optional | Per-point ORB rate cap for this season. The settled rate is the minimum of this, the budget-implied rate, and hylon_season_max_points_orb_rate. |
curl -X POST https://api.orbai.world/api/v1/admin/hylon/seasons \
-H "Authorization: Bearer <ADMIN_JWT>" \
-H "Content-Type: application/json" \
-d '{"name": "Season 1", "banked_revenue_usd": 5000, "points_orb_rate": 10}'/api/v1/admin/hylon/seasonsList all seasons with their status, budget, and point totals.
/api/v1/admin/hylon/seasons/{id}One season with its statistics (points accrued, distinct earners, settled totals).
/api/v1/admin/hylon/seasons/{id}/budgetAdjust a season's banked-revenue budget and/or rate cap before settlement. 409 once the season is settled.
| Parameter | Type | Required | Description |
|---|---|---|---|
banked_revenue_usd | number | Optional | New USD budget. |
points_orb_rate | number | Optional | New per-point ORB rate cap. |
/api/v1/admin/hylon/seasons/{id}/closeClose the season to new points. Awards after this stamp the next season. 409 unless the season is open.
/api/v1/admin/hylon/seasons/{id}/settleSettle a closed season: compute the effective per-point rate and write one clearing row per earner. Idempotent.
# Typical end-of-season sequence
curl -X POST .../seasons/3/close -H "Authorization: Bearer <ADMIN_JWT>"
curl -X POST .../seasons/3/settle -H "Authorization: Bearer <ADMIN_JWT>"The settled rate is min(budget_orb / total_points, season rate cap, hylon_season_max_points_orb_rate) where budget_orb = banked_revenue_usd × hylon_orb_per_usd, so a season can never clear more value than it banked. Re-running settle is a no-op; a settled season is immutable.
Clearing is not crediting
Settlement writes clearing rows with credited: false. No ORB balance moves until an operator opens the points→ORB bridge and a user converts. This separation is deliberate: it lets the economy run honestly and be audited long before any token is paid out.
Operational notes
- Free-tier accounting rolls up per user per UTC day; the cap check runs inside the settlement transaction, so raising or lowering the allowance mid-day applies to the next request.
- Settlement shortfalls: usage ingest settles what the account can cover and floors at zero rather than dropping a served request. A shortfall is recorded in the usage event metadata (
shortfall_credits) for reconciliation. Watch for repeated shortfalls from one account. - Idempotency everywhere: usage settlement is idempotent per
request_id; task points are awarded at most once per task; setup codes are single use. Re-sending a request never double-charges or double-awards. - Credit isolation:
hylon_credit_balanceis a dedicated pool. No admin action on VPN wallets, ORB balances, or scan credits touches it, and vice versa. - Payments: a completed Stripe payment for a
product='hylon'plan grants the Hylon subscription through the payment pipeline's Hylon branch. OrbVPN payment behavior is untouched by any of it.