OpenServer: memory and gpu at the top level, range on any block

Three additions from the OpenCPU, OpenMemory, OpenGPU and OpenBandwidth
session, none renaming a unit. An offer may carry a memory block and a
gpu block at its top level, each winning over the compute copy when both
are present, so a resource spec's own shape nests without a translation.
Any resource block may carry a range, what a buyer can dial at checkout,
with its own per-unit price. ipv6 may be a prefix string, read as true,
and a provider selling one resource may serve the same descriptor at the
resource's own well-known name.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Khk1C6Ese6xjdHAWLVstca
This commit is contained in:
Anthony Ettinger 2026-09-13 01:39:27 +00:00
parent 4402402884
commit da32e70633

View file

@ -46,7 +46,7 @@ A provider serves a JSON document at `/.well-known/openserver.json` on its own o
"tenancy": "shared",
"model": "centralized",
"location": { "regions": ["ams1", "fra1"], "countries": ["NL", "DE"] },
"compute": { "vcpu": 4, "ram_mb": 8192, "arch": "arm64" },
"compute": { "vcpu": 4, "ram_mb": 8192, "arch": "arm64", "range": { "key": "vcpu", "min": 1, "max": 32, "step": 1, "price": { "amount": 1.5, "currency": "EUR", "interval": "month", "per": 1 } } },
"storage": [{ "type": "nvme", "size_gb": 80 }],
"network": { "bandwidth_mbps": 1000, "transfer_gb": 4000, "ipv4": 1, "ipv6": true },
"price": { "amount": 7.5, "currency": "EUR", "interval": "month" },
@ -117,7 +117,10 @@ The rules, and every one degrades:
4. **`offers[].id`** is stable for as long as the offer is the same thing. It is the dedupe key: a reader that sees the same provider origin and `id` tomorrow updates its row rather than adding one. Absent, the reader derives one from `name`, and a renamed offer becomes a new one, which is the cost of not stating it.
5. **`kind`** is what is sold, one word from the list below. **`premises`**, **`management`**, **`tenancy`** and **`model`** are four axes that cut across every kind, each its own key so a reader filters on them without guessing from the kind. A `dedicated` offer is usually `tenancy: dedicated`; a `managed` one is usually `management: managed`; but the axes are stated, not inferred, because a managed VPS and an unmanaged one are the same kind and different offers.
6. **`location`** is where the offer runs. `regions` are the provider's own region names, unchanged, so a buyer can use them at the order form. `countries` are ISO codes, so a directory can group across providers. An on-prem offer has no location, because it runs wherever the buyer puts it.
7. **`compute`, `storage`, `network`** describe the thing. Units are fixed: `ram_mb` and `vram_mb` in mebibytes, `size_gb` in gigabytes, `bandwidth_mbps` in megabits per second, `transfer_gb` per interval. `vcpu` is threads sold, `cores` is physical cores; a dedicated box states `cores`, a virtual one states `vcpu`, and one may state both. `arch` is `x86_64`, `arm64`, `riscv64` or the provider's own word. `storage` is a list, one entry per volume, so two drives are two entries. `ipv4` is a count, `ipv6` a boolean.
7. **`compute`, `storage`, `network`** describe the thing. Units are fixed: `ram_mb` and `vram_mb` in mebibytes, `size_gb` in gigabytes, `bandwidth_mbps` in megabits per second, `transfer_gb` per interval. `vcpu` is threads sold, `cores` is physical cores; a dedicated box states `cores`, a virtual one states `vcpu`, and one may state both. `arch` is `x86_64`, `arm64`, `riscv64` or the provider's own word. `storage` is a list, one entry per volume, so two drives are two entries. `ipv4` is a count, `ipv6` a boolean, or a prefix string such as `"/64"`, which a reader treats as true.
- **`memory`** may sit at the offer's top level as its own block, `{ram_mb, type, ecc, allocation, ...}` as [OpenMemory](/docs/openmemory) defines it. When both are present it wins over `compute.ram_mb`; `compute.ram_mb` alone stays valid.
- **`gpu`** may likewise sit at the offer's top level beside `compute`, as [OpenGPU](/docs/opengpu) defines it. When both `compute.gpu` and a top-level `gpu` are present, the top level wins.
- Any resource block, `compute`, `memory`, `gpu`, one `storage` entry or `network`, may carry **`range`**: `{key, min, max, step, price {amount, currency, interval, per}}`, for what a buyer can dial at checkout. `key` names the field in that block, `min`, `max` and `step` bound it, and `price` is what each `per` units above the offer's base costs. The VPS in the example sells 1 to 32 vCPU in steps of 1 at 1.5 EUR a month each.
8. **`price`** is one price. `amount` is a number, `currency` an ISO 4217 code, `interval` is `hour`, `month`, `year` or `once`. `setup` is a one-time amount on top. `commitment` is the shortest term a buyer signs for, in words the provider uses. An offer sold at several intervals is several offers with a shared prefix in `id`, or one offer at the interval the provider quotes first, and a reader shows what it was given.
9. **`stock`** is `in_stock`, `out_of_stock`, `preorder` or `unknown`. Absent means `unknown`. A directory that shows stock shows when it was read.
10. **Unknown keys are kept.** A provider says more than this document names, and a reader passes it through under the provider's own key.
@ -204,7 +207,7 @@ By hand, from the same table the order form reads. A provider with a database ha
## Related standards
- [OpenSwarm](/openswarm): the settlement and proof layer under a peer-to-peer offer; [c0mpute](https://github.com/profullstack/logicsrc/blob/master/docs/openswarm/c0mpute.md) is its compute marketplace and [OpenDisk](/docs/opendisk) its disk-for-rent peer, each listable here as an offer.
- [OpenCPU](/docs/opencpu), [OpenMemory](/docs/openmemory), [OpenGPU](/docs/opengpu), [OpenBandwidth](/docs/openbandwidth): the resource blocks. An offer's `compute` (cpu and memory), `compute.gpu` and `network` may carry those specs' fields when the provider has them, and each can stand alone as an offer of its own.
- [OpenCPU](/docs/opencpu), [OpenMemory](/docs/openmemory), [OpenGPU](/docs/opengpu), [OpenBandwidth](/docs/openbandwidth): the resource blocks. An offer's `compute` (cpu and memory), `compute.gpu` and `network` may carry those specs' fields when the provider has them, and each can stand alone as an offer of its own. A provider selling one resource may serve the same descriptor shape at `/.well-known/opencpu.json`, `openmemory.json`, `opengpu.json` or `openbandwidth.json`, and a reader that finds one of those reads it as an OpenServer descriptor.
- [OpenProfile.md](/openprofile): the `operator` behind a provider.
- [OpenMCP](/openmcp): a directory that also serves its rows over MCP describes that door with an OpenMCP descriptor.
- [OpenAccess](/openaccess): how a buyer's agent carries the credential it needs at the provider's order form, if the provider honours one.