From ef530d5fe2b05061ee9ed597a8b3702a0f280e79 Mon Sep 17 00:00:00 2001 From: zblocker64 Date: Mon, 8 Jun 2026 16:13:17 -0500 Subject: [PATCH 1/7] feat(provider): align attributes schema with audit requirements Sync GPU models from provider-configs and add SHM, CUDA, persistent storage, and discord-username fields. Remove Chia attributes and regenerate OpenAPI plus console-api-types via sdk:gen. --- .../provider-attributes-schema.schema.ts | 12 +- .../provider/http-schemas/provider.schema.ts | 20 +- .../provider/provider.service.spec.ts | 12 +- apps/api/src/types/provider.ts | 10 +- apps/api/src/utils/map/provider.ts | 54 +- apps/api/swagger/openapi.json | 338 ++- .../__snapshots__/docs.spec.ts.snap | 347 ++- apps/api/test/seeders/provider.seeder.ts | 8 +- .../components/providers/ProviderDetail.tsx | 3 +- .../components/providers/ProviderSpecs.tsx | 6 +- apps/deploy-web/src/types/provider.ts | 10 +- .../src/types/providerAttributes.ts | 12 +- apps/deploy-web/tests/seeders/provider.ts | 16 +- .../become-provider/ProviderAttributes.tsx | 12 +- apps/provider-console/src/types/provider.ts | 10 +- .../src/types/providerAttributes.ts | 24 +- config/provider-attributes.json | 2116 +++++++++++++++-- config/provider-attributes.md | 18 +- packages/console-api-types/src/schema.d.ts | 173 +- .../src/git-hub/git-hub-http.service.ts | 12 +- 20 files changed, 2761 insertions(+), 452 deletions(-) diff --git a/apps/api/src/provider/http-schemas/provider-attributes-schema.schema.ts b/apps/api/src/provider/http-schemas/provider-attributes-schema.schema.ts index 40d7bf6ac8..89bd3d72d6 100644 --- a/apps/api/src/provider/http-schemas/provider-attributes-schema.schema.ts +++ b/apps/api/src/provider/http-schemas/provider-attributes-schema.schema.ts @@ -20,6 +20,7 @@ const attributeSchemaType = z.object({ export const ProviderAttributesSchemaResponseSchema = z.object({ host: attributeSchemaType, email: attributeSchemaType, + "discord-username": attributeSchemaType, organization: attributeSchemaType, website: attributeSchemaType, tier: attributeSchemaType, @@ -34,15 +35,18 @@ export const ProviderAttributesSchemaResponseSchema = z.object({ "hardware-cpu-arch": attributeSchemaType, "hardware-gpu": attributeSchemaType, "hardware-gpu-model": attributeSchemaType, - "hardware-disk": attributeSchemaType, + "hardware-gpu-capability": attributeSchemaType, + "hardware-persistent-storage-class": attributeSchemaType, + "hardware-persistent-storage-capability": attributeSchemaType, + "hardware-cuda": attributeSchemaType, + datacenter: attributeSchemaType, "hardware-memory": attributeSchemaType, "network-provider": attributeSchemaType, "network-speed-up": attributeSchemaType, "network-speed-down": attributeSchemaType, "feat-persistent-storage": attributeSchemaType, - "feat-persistent-storage-type": attributeSchemaType, - "workload-support-chia": attributeSchemaType, - "workload-support-chia-capabilities": attributeSchemaType, + "feat-shm": attributeSchemaType, + "hardware-shm": attributeSchemaType, "feat-endpoint-ip": attributeSchemaType, "feat-endpoint-custom-domain": attributeSchemaType }); diff --git a/apps/api/src/provider/http-schemas/provider.schema.ts b/apps/api/src/provider/http-schemas/provider.schema.ts index 0bc5d1dca8..1c2d93dd26 100644 --- a/apps/api/src/provider/http-schemas/provider.schema.ts +++ b/apps/api/src/provider/http-schemas/provider.schema.ts @@ -73,17 +73,19 @@ export const ProviderListResponseSchema = z.array( hardwareCpuArch: z.string().nullable(), hardwareGpuVendor: z.string().nullable(), hardwareGpuModels: z.array(z.string()).nullable(), - hardwareDisk: z.array(z.string()).nullable(), + hardwareGpuCapabilities: z.array(z.string()).nullable(), + hardwarePersistentStorageClass: z.string().nullable(), featPersistentStorage: z.boolean(), - featPersistentStorageType: z.array(z.string()).nullable(), + featShm: z.boolean(), + hardwareShm: z.array(z.string()).nullable(), + hardwareCuda: z.string().nullable(), + datacenter: z.string().nullable(), hardwareMemory: z.string().nullable(), networkProvider: z.string().nullable(), networkSpeedDown: z.number(), networkSpeedUp: z.number(), tier: z.string().nullable(), featEndpointCustomDomain: z.boolean(), - workloadSupportChia: z.boolean(), - workloadSupportChiaCapabilities: z.array(z.string()).nullable(), featEndpointIp: z.boolean() }) ); @@ -163,17 +165,19 @@ export const ProviderResponseSchema = z.object({ hardwareCpuArch: z.string().nullable(), hardwareGpuVendor: z.string().nullable(), hardwareGpuModels: z.array(z.string()), - hardwareDisk: z.array(z.string()), + hardwareGpuCapabilities: z.array(z.string()), + hardwarePersistentStorageClass: z.string().nullable(), featPersistentStorage: z.boolean(), - featPersistentStorageType: z.array(z.string()), + featShm: z.boolean(), + hardwareShm: z.array(z.string()), + hardwareCuda: z.string().nullable(), + datacenter: z.string().nullable(), hardwareMemory: z.string().nullable(), networkProvider: z.string().nullable(), networkSpeedDown: z.number(), networkSpeedUp: z.number(), tier: z.string().nullable(), featEndpointCustomDomain: z.boolean(), - workloadSupportChia: z.boolean(), - workloadSupportChiaCapabilities: z.array(z.string()), featEndpointIp: z.boolean(), uptime: z.array( z.object({ diff --git a/apps/api/src/provider/services/provider/provider.service.spec.ts b/apps/api/src/provider/services/provider/provider.service.spec.ts index 5c73ef6fc1..ee8f81eb03 100644 --- a/apps/api/src/provider/services/provider/provider.service.spec.ts +++ b/apps/api/src/provider/services/provider/provider.service.spec.ts @@ -23,6 +23,7 @@ const schemaDetail = { key: "test", type: "string" as const, required: false, de const providerAttributeSchemaStub: ProviderAttributesSchema = { host: schemaDetail, email: schemaDetail, + "discord-username": schemaDetail, organization: schemaDetail, website: schemaDetail, tier: schemaDetail, @@ -37,15 +38,18 @@ const providerAttributeSchemaStub: ProviderAttributesSchema = { "hardware-cpu-arch": schemaDetail, "hardware-gpu": schemaDetail, "hardware-gpu-model": schemaDetail, - "hardware-disk": schemaDetail, + "hardware-gpu-capability": schemaDetail, + "hardware-persistent-storage-class": schemaDetail, + "hardware-persistent-storage-capability": schemaDetail, + "hardware-cuda": schemaDetail, + datacenter: schemaDetail, "hardware-memory": schemaDetail, "network-provider": schemaDetail, "network-speed-up": schemaDetail, "network-speed-down": schemaDetail, "feat-persistent-storage": schemaDetail, - "feat-persistent-storage-type": schemaDetail, - "workload-support-chia": schemaDetail, - "workload-support-chia-capabilities": schemaDetail, + "feat-shm": schemaDetail, + "hardware-shm": schemaDetail, "feat-endpoint-ip": schemaDetail, "feat-endpoint-custom-domain": schemaDetail }; diff --git a/apps/api/src/types/provider.ts b/apps/api/src/types/provider.ts index 2cc20efc4f..348befb689 100644 --- a/apps/api/src/types/provider.ts +++ b/apps/api/src/types/provider.ts @@ -50,17 +50,19 @@ export interface ProviderList { hardwareCpuArch: string | null; hardwareGpuVendor: string | null; hardwareGpuModels: string[] | null; - hardwareDisk: string[] | null; + hardwareGpuCapabilities: string[] | null; + hardwarePersistentStorageClass: string | null; featPersistentStorage: boolean; - featPersistentStorageType: string[] | null; + featShm: boolean; + hardwareShm: string[] | null; + hardwareCuda: string | null; + datacenter: string | null; hardwareMemory: string | null; networkProvider: string | null; networkSpeedDown: number; networkSpeedUp: number; tier: string | null; featEndpointCustomDomain: boolean; - workloadSupportChia: boolean; - workloadSupportChiaCapabilities: string[] | null; featEndpointIp: boolean; } diff --git a/apps/api/src/utils/map/provider.ts b/apps/api/src/utils/map/provider.ts index bac5d61e7e..f3f896cda2 100644 --- a/apps/api/src/utils/map/provider.ts +++ b/apps/api/src/utils/map/provider.ts @@ -82,7 +82,7 @@ export const mapProviderToList = ( host: getStringAttribute("host", attrMap, providerAttributeSchema), organization: getStringAttribute("organization", attrMap, providerAttributeSchema), statusPage: getStringAttribute("status-page", attrMap, providerAttributeSchema), - locationRegion: getStringAttribute("location-region", attrMap, providerAttributeSchema), + locationRegion: getLocationRegion(attrMap, providerAttributeSchema), country: getStringAttribute("country", attrMap, providerAttributeSchema), city: getStringAttribute("city", attrMap, providerAttributeSchema), timezone: getStringAttribute("timezone", attrMap, providerAttributeSchema), @@ -92,17 +92,19 @@ export const mapProviderToList = ( hardwareCpuArch: getStringAttribute("hardware-cpu-arch", attrMap, providerAttributeSchema), hardwareGpuVendor: getStringAttribute("hardware-gpu", attrMap, providerAttributeSchema), hardwareGpuModels: getStringArrayAttribute("hardware-gpu-model", provider, providerAttributeSchema), - hardwareDisk: getStringArrayAttribute("hardware-disk", provider, providerAttributeSchema), - featPersistentStorage: getBooleanAttribute("feat-persistent-storage", attrMap, providerAttributeSchema), - featPersistentStorageType: getStringArrayAttribute("feat-persistent-storage-type", provider, providerAttributeSchema), + hardwareGpuCapabilities: getStringArrayAttribute("hardware-gpu-capability", provider, providerAttributeSchema), + hardwarePersistentStorageClass: getStringAttribute("hardware-persistent-storage-class", attrMap, providerAttributeSchema), + featPersistentStorage: getPersistentStorageSupport(attrMap, providerAttributeSchema), + featShm: getShmSupport(attrMap, providerAttributeSchema), + hardwareShm: getStringArrayAttribute("hardware-shm", provider, providerAttributeSchema), + hardwareCuda: getStringAttribute("hardware-cuda", attrMap, providerAttributeSchema), + datacenter: getStringAttribute("datacenter", attrMap, providerAttributeSchema), hardwareMemory: getStringAttribute("hardware-memory", attrMap, providerAttributeSchema), networkProvider: getStringAttribute("network-provider", attrMap, providerAttributeSchema), networkSpeedDown: getNumberAttribute("network-speed-down", attrMap, providerAttributeSchema), networkSpeedUp: getNumberAttribute("network-speed-up", attrMap, providerAttributeSchema), tier: getStringAttribute("tier", attrMap, providerAttributeSchema), featEndpointCustomDomain: getBooleanAttribute("feat-endpoint-custom-domain", attrMap, providerAttributeSchema), - workloadSupportChia: getBooleanAttribute("workload-support-chia", attrMap, providerAttributeSchema), - workloadSupportChiaCapabilities: getStringArrayAttribute("workload-support-chia-capabilities", provider, providerAttributeSchema), featEndpointIp: getBooleanAttribute("feat-endpoint-ip", attrMap, providerAttributeSchema) }; }; @@ -125,12 +127,52 @@ function getStringAttribute(key: keyof ProviderAttributesSchema, attrMap: Map, schema: ProviderAttributesSchema): string | null { + const locationRegion = getStringAttribute("location-region", attrMap, schema); + if (locationRegion) { + return locationRegion; + } + + // Legacy providers may still have `region` on-chain; console expects `location-region`. + return attrMap.get("region") || null; +} + function getBooleanAttribute(key: keyof ProviderAttributesSchema, attrMap: Map, schema: ProviderAttributesSchema): boolean { const schemaKey = schema[key].key; const value = attrMap.get(schemaKey); return value === "true"; } +function hasShmCapability(attrMap: Map): boolean { + for (const [key, value] of attrMap.entries()) { + if (/^capabilities\/storage\/\d+\/class$/.test(key) && value === "ram") { + return true; + } + } + + return false; +} + +function getShmSupport(attrMap: Map, schema: ProviderAttributesSchema): boolean { + if (getBooleanAttribute("feat-shm", attrMap, schema)) { + return true; + } + + return hasShmCapability(attrMap); +} + +function getPersistentStorageSupport(attrMap: Map, schema: ProviderAttributesSchema): boolean { + if (getBooleanAttribute("feat-persistent-storage", attrMap, schema)) { + return true; + } + + if (getBooleanAttribute("hardware-persistent-storage-capability", attrMap, schema)) { + return true; + } + + return attrMap.get("capabilities/storage/1/persistent") === "true"; +} + function getNumberAttribute(key: keyof ProviderAttributesSchema, attrMap: Map, schema: ProviderAttributesSchema): number { const schemaKey = schema[key].key; const value = attrMap.get(schemaKey); diff --git a/apps/api/swagger/openapi.json b/apps/api/swagger/openapi.json index 3bae79e38e..f5efaa05f8 100644 --- a/apps/api/swagger/openapi.json +++ b/apps/api/swagger/openapi.json @@ -2,7 +2,7 @@ "openapi": "3.0.0", "servers": [ { - "url": "https://console-api-sandbox.akash.network" + "url": "http://localhost:3080" } ], "info": { @@ -76,6 +76,10 @@ "isTrialing": { "type": "boolean" }, + "topUpMinAmountUsd": { + "type": "number", + "description": "Minimum USD amount accepted by the next paid top-up for this wallet." + }, "createdAt": { "type": "string", "nullable": true @@ -103,6 +107,7 @@ "address", "denom", "isTrialing", + "topUpMinAmountUsd", "createdAt" ], "additionalProperties": false @@ -146,6 +151,10 @@ "isTrialing": { "type": "boolean" }, + "topUpMinAmountUsd": { + "type": "number", + "description": "Minimum USD amount accepted by the next paid top-up for this wallet." + }, "createdAt": { "type": "string", "nullable": true @@ -173,6 +182,7 @@ "address", "denom", "isTrialing", + "topUpMinAmountUsd", "createdAt" ], "additionalProperties": false @@ -248,6 +258,10 @@ "isTrialing": { "type": "boolean" }, + "topUpMinAmountUsd": { + "type": "number", + "description": "Minimum USD amount accepted by the next paid top-up for this wallet." + }, "createdAt": { "type": "string", "nullable": true @@ -275,6 +289,7 @@ "address", "denom", "isTrialing", + "topUpMinAmountUsd", "createdAt" ] } @@ -1905,7 +1920,7 @@ "schema": { "type": "string", "format": "date", - "default": "2026-05-20", + "default": "2026-06-08", "description": "End date (YYYY-MM-DD). Defaults to today by UTC 23:59:59", "example": "2024-01-31" }, @@ -2031,7 +2046,7 @@ "schema": { "type": "string", "format": "date", - "default": "2026-05-20", + "default": "2026-06-08", "description": "End date (YYYY-MM-DD). Defaults to today by UTC 23:59:59", "example": "2024-01-31" }, @@ -10017,23 +10032,38 @@ "type": "string" } }, - "hardwareDisk": { + "hardwareGpuCapabilities": { "type": "array", "nullable": true, "items": { "type": "string" } }, + "hardwarePersistentStorageClass": { + "type": "string", + "nullable": true + }, "featPersistentStorage": { "type": "boolean" }, - "featPersistentStorageType": { + "featShm": { + "type": "boolean" + }, + "hardwareShm": { "type": "array", "nullable": true, "items": { "type": "string" } }, + "hardwareCuda": { + "type": "string", + "nullable": true + }, + "datacenter": { + "type": "string", + "nullable": true + }, "hardwareMemory": { "type": "string", "nullable": true @@ -10055,16 +10085,6 @@ "featEndpointCustomDomain": { "type": "boolean" }, - "workloadSupportChia": { - "type": "boolean" - }, - "workloadSupportChiaCapabilities": { - "type": "array", - "nullable": true, - "items": { - "type": "string" - } - }, "featEndpointIp": { "type": "boolean" } @@ -10104,17 +10124,19 @@ "hardwareCpuArch", "hardwareGpuVendor", "hardwareGpuModels", - "hardwareDisk", + "hardwareGpuCapabilities", + "hardwarePersistentStorageClass", "featPersistentStorage", - "featPersistentStorageType", + "featShm", + "hardwareShm", + "hardwareCuda", + "datacenter", "hardwareMemory", "networkProvider", "networkSpeedDown", "networkSpeedUp", "tier", "featEndpointCustomDomain", - "workloadSupportChia", - "workloadSupportChiaCapabilities", "featEndpointIp" ] } @@ -10455,21 +10477,36 @@ "type": "string" } }, - "hardwareDisk": { + "hardwareGpuCapabilities": { "type": "array", "items": { "type": "string" } }, + "hardwarePersistentStorageClass": { + "type": "string", + "nullable": true + }, "featPersistentStorage": { "type": "boolean" }, - "featPersistentStorageType": { + "featShm": { + "type": "boolean" + }, + "hardwareShm": { "type": "array", "items": { "type": "string" } }, + "hardwareCuda": { + "type": "string", + "nullable": true + }, + "datacenter": { + "type": "string", + "nullable": true + }, "hardwareMemory": { "type": "string", "nullable": true @@ -10491,15 +10528,6 @@ "featEndpointCustomDomain": { "type": "boolean" }, - "workloadSupportChia": { - "type": "boolean" - }, - "workloadSupportChiaCapabilities": { - "type": "array", - "items": { - "type": "string" - } - }, "featEndpointIp": { "type": "boolean" }, @@ -10567,17 +10595,19 @@ "hardwareCpuArch", "hardwareGpuVendor", "hardwareGpuModels", - "hardwareDisk", + "hardwareGpuCapabilities", + "hardwarePersistentStorageClass", "featPersistentStorage", - "featPersistentStorageType", + "featShm", + "hardwareShm", + "hardwareCuda", + "datacenter", "hardwareMemory", "networkProvider", "networkSpeedDown", "networkSpeedUp", "tier", "featEndpointCustomDomain", - "workloadSupportChia", - "workloadSupportChiaCapabilities", "featEndpointIp", "uptime" ] @@ -10851,6 +10881,58 @@ "description" ] }, + "discord-username": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "string", + "number", + "boolean", + "option", + "multiple-option" + ] + }, + "required": { + "type": "boolean" + }, + "description": { + "type": "string" + }, + "values": { + "type": "array", + "nullable": true, + "items": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "description": { + "type": "string" + }, + "value": { + "nullable": true + } + }, + "required": [ + "key", + "description" + ] + } + } + }, + "required": [ + "key", + "type", + "required", + "description" + ] + }, "organization": { "type": "object", "properties": { @@ -11579,7 +11661,7 @@ "description" ] }, - "hardware-disk": { + "hardware-gpu-capability": { "type": "object", "properties": { "key": { @@ -11631,7 +11713,7 @@ "description" ] }, - "hardware-memory": { + "hardware-persistent-storage-class": { "type": "object", "properties": { "key": { @@ -11683,7 +11765,7 @@ "description" ] }, - "network-provider": { + "hardware-persistent-storage-capability": { "type": "object", "properties": { "key": { @@ -11735,7 +11817,7 @@ "description" ] }, - "network-speed-up": { + "hardware-cuda": { "type": "object", "properties": { "key": { @@ -11787,7 +11869,7 @@ "description" ] }, - "network-speed-down": { + "datacenter": { "type": "object", "properties": { "key": { @@ -11839,7 +11921,7 @@ "description" ] }, - "feat-persistent-storage": { + "hardware-memory": { "type": "object", "properties": { "key": { @@ -11891,7 +11973,163 @@ "description" ] }, - "feat-persistent-storage-type": { + "network-provider": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "string", + "number", + "boolean", + "option", + "multiple-option" + ] + }, + "required": { + "type": "boolean" + }, + "description": { + "type": "string" + }, + "values": { + "type": "array", + "nullable": true, + "items": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "description": { + "type": "string" + }, + "value": { + "nullable": true + } + }, + "required": [ + "key", + "description" + ] + } + } + }, + "required": [ + "key", + "type", + "required", + "description" + ] + }, + "network-speed-up": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "string", + "number", + "boolean", + "option", + "multiple-option" + ] + }, + "required": { + "type": "boolean" + }, + "description": { + "type": "string" + }, + "values": { + "type": "array", + "nullable": true, + "items": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "description": { + "type": "string" + }, + "value": { + "nullable": true + } + }, + "required": [ + "key", + "description" + ] + } + } + }, + "required": [ + "key", + "type", + "required", + "description" + ] + }, + "network-speed-down": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "string", + "number", + "boolean", + "option", + "multiple-option" + ] + }, + "required": { + "type": "boolean" + }, + "description": { + "type": "string" + }, + "values": { + "type": "array", + "nullable": true, + "items": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "description": { + "type": "string" + }, + "value": { + "nullable": true + } + }, + "required": [ + "key", + "description" + ] + } + } + }, + "required": [ + "key", + "type", + "required", + "description" + ] + }, + "feat-persistent-storage": { "type": "object", "properties": { "key": { @@ -11943,7 +12181,7 @@ "description" ] }, - "workload-support-chia": { + "feat-shm": { "type": "object", "properties": { "key": { @@ -11995,7 +12233,7 @@ "description" ] }, - "workload-support-chia-capabilities": { + "hardware-shm": { "type": "object", "properties": { "key": { @@ -12155,6 +12393,7 @@ "required": [ "host", "email", + "discord-username", "organization", "website", "tier", @@ -12169,15 +12408,18 @@ "hardware-cpu-arch", "hardware-gpu", "hardware-gpu-model", - "hardware-disk", + "hardware-gpu-capability", + "hardware-persistent-storage-class", + "hardware-persistent-storage-capability", + "hardware-cuda", + "datacenter", "hardware-memory", "network-provider", "network-speed-up", "network-speed-down", "feat-persistent-storage", - "feat-persistent-storage-type", - "workload-support-chia", - "workload-support-chia-capabilities", + "feat-shm", + "hardware-shm", "feat-endpoint-ip", "feat-endpoint-custom-domain" ] @@ -22337,4 +22579,4 @@ } } } -} +} \ No newline at end of file diff --git a/apps/api/test/functional/__snapshots__/docs.spec.ts.snap b/apps/api/test/functional/__snapshots__/docs.spec.ts.snap index 7c8ea9c89d..f305a524f9 100644 --- a/apps/api/test/functional/__snapshots__/docs.spec.ts.snap +++ b/apps/api/test/functional/__snapshots__/docs.spec.ts.snap @@ -9847,6 +9847,110 @@ exports[`API Docs > GET /v1/doc > returns docs with all routes expected 1`] = ` ], "type": "object", }, + "datacenter": { + "properties": { + "description": { + "type": "string", + }, + "key": { + "type": "string", + }, + "required": { + "type": "boolean", + }, + "type": { + "enum": [ + "string", + "number", + "boolean", + "option", + "multiple-option", + ], + "type": "string", + }, + "values": { + "items": { + "properties": { + "description": { + "type": "string", + }, + "key": { + "type": "string", + }, + "value": { + "nullable": true, + }, + }, + "required": [ + "key", + "description", + ], + "type": "object", + }, + "nullable": true, + "type": "array", + }, + }, + "required": [ + "key", + "type", + "required", + "description", + ], + "type": "object", + }, + "discord-username": { + "properties": { + "description": { + "type": "string", + }, + "key": { + "type": "string", + }, + "required": { + "type": "boolean", + }, + "type": { + "enum": [ + "string", + "number", + "boolean", + "option", + "multiple-option", + ], + "type": "string", + }, + "values": { + "items": { + "properties": { + "description": { + "type": "string", + }, + "key": { + "type": "string", + }, + "value": { + "nullable": true, + }, + }, + "required": [ + "key", + "description", + ], + "type": "object", + }, + "nullable": true, + "type": "array", + }, + }, + "required": [ + "key", + "type", + "required", + "description", + ], + "type": "object", + }, "email": { "properties": { "description": { @@ -10055,7 +10159,7 @@ exports[`API Docs > GET /v1/doc > returns docs with all routes expected 1`] = ` ], "type": "object", }, - "feat-persistent-storage-type": { + "feat-shm": { "properties": { "description": { "type": "string", @@ -10211,7 +10315,7 @@ exports[`API Docs > GET /v1/doc > returns docs with all routes expected 1`] = ` ], "type": "object", }, - "hardware-disk": { + "hardware-cuda": { "properties": { "description": { "type": "string", @@ -10315,6 +10419,58 @@ exports[`API Docs > GET /v1/doc > returns docs with all routes expected 1`] = ` ], "type": "object", }, + "hardware-gpu-capability": { + "properties": { + "description": { + "type": "string", + }, + "key": { + "type": "string", + }, + "required": { + "type": "boolean", + }, + "type": { + "enum": [ + "string", + "number", + "boolean", + "option", + "multiple-option", + ], + "type": "string", + }, + "values": { + "items": { + "properties": { + "description": { + "type": "string", + }, + "key": { + "type": "string", + }, + "value": { + "nullable": true, + }, + }, + "required": [ + "key", + "description", + ], + "type": "object", + }, + "nullable": true, + "type": "array", + }, + }, + "required": [ + "key", + "type", + "required", + "description", + ], + "type": "object", + }, "hardware-gpu-model": { "properties": { "description": { @@ -10419,7 +10575,7 @@ exports[`API Docs > GET /v1/doc > returns docs with all routes expected 1`] = ` ], "type": "object", }, - "host": { + "hardware-persistent-storage-capability": { "properties": { "description": { "type": "string", @@ -10471,7 +10627,7 @@ exports[`API Docs > GET /v1/doc > returns docs with all routes expected 1`] = ` ], "type": "object", }, - "hosting-provider": { + "hardware-persistent-storage-class": { "properties": { "description": { "type": "string", @@ -10523,7 +10679,7 @@ exports[`API Docs > GET /v1/doc > returns docs with all routes expected 1`] = ` ], "type": "object", }, - "location-region": { + "hardware-shm": { "properties": { "description": { "type": "string", @@ -10575,7 +10731,7 @@ exports[`API Docs > GET /v1/doc > returns docs with all routes expected 1`] = ` ], "type": "object", }, - "location-type": { + "host": { "properties": { "description": { "type": "string", @@ -10627,7 +10783,7 @@ exports[`API Docs > GET /v1/doc > returns docs with all routes expected 1`] = ` ], "type": "object", }, - "network-provider": { + "hosting-provider": { "properties": { "description": { "type": "string", @@ -10679,7 +10835,7 @@ exports[`API Docs > GET /v1/doc > returns docs with all routes expected 1`] = ` ], "type": "object", }, - "network-speed-down": { + "location-region": { "properties": { "description": { "type": "string", @@ -10731,7 +10887,7 @@ exports[`API Docs > GET /v1/doc > returns docs with all routes expected 1`] = ` ], "type": "object", }, - "network-speed-up": { + "location-type": { "properties": { "description": { "type": "string", @@ -10783,7 +10939,7 @@ exports[`API Docs > GET /v1/doc > returns docs with all routes expected 1`] = ` ], "type": "object", }, - "organization": { + "network-provider": { "properties": { "description": { "type": "string", @@ -10835,7 +10991,7 @@ exports[`API Docs > GET /v1/doc > returns docs with all routes expected 1`] = ` ], "type": "object", }, - "status-page": { + "network-speed-down": { "properties": { "description": { "type": "string", @@ -10887,7 +11043,7 @@ exports[`API Docs > GET /v1/doc > returns docs with all routes expected 1`] = ` ], "type": "object", }, - "tier": { + "network-speed-up": { "properties": { "description": { "type": "string", @@ -10939,7 +11095,7 @@ exports[`API Docs > GET /v1/doc > returns docs with all routes expected 1`] = ` ], "type": "object", }, - "timezone": { + "organization": { "properties": { "description": { "type": "string", @@ -10991,7 +11147,7 @@ exports[`API Docs > GET /v1/doc > returns docs with all routes expected 1`] = ` ], "type": "object", }, - "website": { + "status-page": { "properties": { "description": { "type": "string", @@ -11043,7 +11199,7 @@ exports[`API Docs > GET /v1/doc > returns docs with all routes expected 1`] = ` ], "type": "object", }, - "workload-support-chia": { + "tier": { "properties": { "description": { "type": "string", @@ -11095,7 +11251,59 @@ exports[`API Docs > GET /v1/doc > returns docs with all routes expected 1`] = ` ], "type": "object", }, - "workload-support-chia-capabilities": { + "timezone": { + "properties": { + "description": { + "type": "string", + }, + "key": { + "type": "string", + }, + "required": { + "type": "boolean", + }, + "type": { + "enum": [ + "string", + "number", + "boolean", + "option", + "multiple-option", + ], + "type": "string", + }, + "values": { + "items": { + "properties": { + "description": { + "type": "string", + }, + "key": { + "type": "string", + }, + "value": { + "nullable": true, + }, + }, + "required": [ + "key", + "description", + ], + "type": "object", + }, + "nullable": true, + "type": "array", + }, + }, + "required": [ + "key", + "type", + "required", + "description", + ], + "type": "object", + }, + "website": { "properties": { "description": { "type": "string", @@ -11151,6 +11359,7 @@ exports[`API Docs > GET /v1/doc > returns docs with all routes expected 1`] = ` "required": [ "host", "email", + "discord-username", "organization", "website", "tier", @@ -11165,15 +11374,18 @@ exports[`API Docs > GET /v1/doc > returns docs with all routes expected 1`] = ` "hardware-cpu-arch", "hardware-gpu", "hardware-gpu-model", - "hardware-disk", + "hardware-gpu-capability", + "hardware-persistent-storage-class", + "hardware-persistent-storage-capability", + "hardware-cuda", + "datacenter", "hardware-memory", "network-provider", "network-speed-up", "network-speed-down", "feat-persistent-storage", - "feat-persistent-storage-type", - "workload-support-chia", - "workload-support-chia-capabilities", + "feat-shm", + "hardware-shm", "feat-endpoint-ip", "feat-endpoint-custom-domain", ], @@ -11789,6 +12001,10 @@ exports[`API Docs > GET /v1/doc > returns docs with all routes expected 1`] = ` "createdHeight": { "type": "number", }, + "datacenter": { + "nullable": true, + "type": "string", + }, "deploymentCount": { "nullable": true, "type": "number", @@ -11806,12 +12022,8 @@ exports[`API Docs > GET /v1/doc > returns docs with all routes expected 1`] = ` "featPersistentStorage": { "type": "boolean", }, - "featPersistentStorageType": { - "items": { - "type": "string", - }, - "nullable": true, - "type": "array", + "featShm": { + "type": "boolean", }, "gpuModels": { "items": { @@ -11847,7 +12059,11 @@ exports[`API Docs > GET /v1/doc > returns docs with all routes expected 1`] = ` "nullable": true, "type": "string", }, - "hardwareDisk": { + "hardwareCuda": { + "nullable": true, + "type": "string", + }, + "hardwareGpuCapabilities": { "items": { "type": "string", }, @@ -11869,6 +12085,17 @@ exports[`API Docs > GET /v1/doc > returns docs with all routes expected 1`] = ` "nullable": true, "type": "string", }, + "hardwarePersistentStorageClass": { + "nullable": true, + "type": "string", + }, + "hardwareShm": { + "items": { + "type": "string", + }, + "nullable": true, + "type": "array", + }, "host": { "nullable": true, "type": "string", @@ -11982,16 +12209,6 @@ exports[`API Docs > GET /v1/doc > returns docs with all routes expected 1`] = ` "nullable": true, "type": "string", }, - "workloadSupportChia": { - "type": "boolean", - }, - "workloadSupportChiaCapabilities": { - "items": { - "type": "string", - }, - "nullable": true, - "type": "array", - }, }, "required": [ "owner", @@ -12028,17 +12245,19 @@ exports[`API Docs > GET /v1/doc > returns docs with all routes expected 1`] = ` "hardwareCpuArch", "hardwareGpuVendor", "hardwareGpuModels", - "hardwareDisk", + "hardwareGpuCapabilities", + "hardwarePersistentStorageClass", "featPersistentStorage", - "featPersistentStorageType", + "featShm", + "hardwareShm", + "hardwareCuda", + "datacenter", "hardwareMemory", "networkProvider", "networkSpeedDown", "networkSpeedUp", "tier", "featEndpointCustomDomain", - "workloadSupportChia", - "workloadSupportChiaCapabilities", "featEndpointIp", ], "type": "object", @@ -12119,6 +12338,10 @@ exports[`API Docs > GET /v1/doc > returns docs with all routes expected 1`] = ` "createdHeight": { "type": "number", }, + "datacenter": { + "nullable": true, + "type": "string", + }, "deploymentCount": { "type": "number", }, @@ -12135,11 +12358,8 @@ exports[`API Docs > GET /v1/doc > returns docs with all routes expected 1`] = ` "featPersistentStorage": { "type": "boolean", }, - "featPersistentStorageType": { - "items": { - "type": "string", - }, - "type": "array", + "featShm": { + "type": "boolean", }, "gpuModels": { "items": { @@ -12175,7 +12395,11 @@ exports[`API Docs > GET /v1/doc > returns docs with all routes expected 1`] = ` "nullable": true, "type": "string", }, - "hardwareDisk": { + "hardwareCuda": { + "nullable": true, + "type": "string", + }, + "hardwareGpuCapabilities": { "items": { "type": "string", }, @@ -12195,6 +12419,16 @@ exports[`API Docs > GET /v1/doc > returns docs with all routes expected 1`] = ` "nullable": true, "type": "string", }, + "hardwarePersistentStorageClass": { + "nullable": true, + "type": "string", + }, + "hardwareShm": { + "items": { + "type": "string", + }, + "type": "array", + }, "host": { "nullable": true, "type": "string", @@ -12441,15 +12675,6 @@ exports[`API Docs > GET /v1/doc > returns docs with all routes expected 1`] = ` "nullable": true, "type": "string", }, - "workloadSupportChia": { - "type": "boolean", - }, - "workloadSupportChiaCapabilities": { - "items": { - "type": "string", - }, - "type": "array", - }, }, "required": [ "owner", @@ -12492,17 +12717,19 @@ exports[`API Docs > GET /v1/doc > returns docs with all routes expected 1`] = ` "hardwareCpuArch", "hardwareGpuVendor", "hardwareGpuModels", - "hardwareDisk", + "hardwareGpuCapabilities", + "hardwarePersistentStorageClass", "featPersistentStorage", - "featPersistentStorageType", + "featShm", + "hardwareShm", + "hardwareCuda", + "datacenter", "hardwareMemory", "networkProvider", "networkSpeedDown", "networkSpeedUp", "tier", "featEndpointCustomDomain", - "workloadSupportChia", - "workloadSupportChiaCapabilities", "featEndpointIp", "uptime", ], diff --git a/apps/api/test/seeders/provider.seeder.ts b/apps/api/test/seeders/provider.seeder.ts index cf20f2a6b7..49f73853e2 100644 --- a/apps/api/test/seeders/provider.seeder.ts +++ b/apps/api/test/seeders/provider.seeder.ts @@ -43,8 +43,8 @@ export const createProvider = async (overrides: Partial = ({ owner, _provide
} /> - } /> + } />
} /> -
diff --git a/apps/deploy-web/src/components/providers/ProviderSpecs.tsx b/apps/deploy-web/src/components/providers/ProviderSpecs.tsx index 19b0125d4a..6df3617009 100644 --- a/apps/deploy-web/src/components/providers/ProviderSpecs.tsx +++ b/apps/deploy-web/src/components/providers/ProviderSpecs.tsx @@ -25,6 +25,7 @@ export const ProviderSpecs: React.FunctionComponent = ({ provider }) => { } /> + } /> @@ -39,8 +40,9 @@ export const ProviderSpecs: React.FunctionComponent = ({ provider }) => { ))} /> - - + + + diff --git a/apps/deploy-web/src/types/provider.ts b/apps/deploy-web/src/types/provider.ts index b509a54d73..a769b98cf6 100644 --- a/apps/deploy-web/src/types/provider.ts +++ b/apps/deploy-web/src/types/provider.ts @@ -220,17 +220,19 @@ export interface ApiProviderList { hardwareCpuArch: string; hardwareGpuVendor: string; hardwareGpuModels: string[]; - hardwareDisk: string[]; + hardwareGpuCapabilities: string[]; + hardwarePersistentStorageClass: string; featPersistentStorage: boolean; - featPersistentStorageType: string[]; + featShm: boolean; + hardwareShm: string[]; + hardwareCuda: string; + datacenter: string; hardwareMemory: string; networkProvider: string; networkSpeedDown: number; networkSpeedUp: number; tier: string; featEndpointCustomDomain: boolean; - workloadSupportChia: boolean; - workloadSupportChiaCapabilities: string[]; featEndpointIp: boolean; } diff --git a/apps/deploy-web/src/types/providerAttributes.ts b/apps/deploy-web/src/types/providerAttributes.ts index 1d4948f55b..681faaae8a 100644 --- a/apps/deploy-web/src/types/providerAttributes.ts +++ b/apps/deploy-web/src/types/providerAttributes.ts @@ -1,6 +1,7 @@ export type ProviderAttributesSchema = { host: ProviderAttributeSchemaDetail; email: ProviderAttributeSchemaDetail; + "discord-username": ProviderAttributeSchemaDetail; organization: ProviderAttributeSchemaDetail; website: ProviderAttributeSchemaDetail; tier: ProviderAttributeSchemaDetail; @@ -15,15 +16,18 @@ export type ProviderAttributesSchema = { "hardware-cpu-arch": ProviderAttributeSchemaDetail; "hardware-gpu": ProviderAttributeSchemaDetail; "hardware-gpu-model": ProviderAttributeSchemaDetail; - "hardware-disk": ProviderAttributeSchemaDetail; + "hardware-gpu-capability": ProviderAttributeSchemaDetail; + "hardware-persistent-storage-class": ProviderAttributeSchemaDetail; + "hardware-persistent-storage-capability": ProviderAttributeSchemaDetail; + "hardware-cuda": ProviderAttributeSchemaDetail; + datacenter: ProviderAttributeSchemaDetail; "hardware-memory": ProviderAttributeSchemaDetail; "network-provider": ProviderAttributeSchemaDetail; "network-speed-up": ProviderAttributeSchemaDetail; "network-speed-down": ProviderAttributeSchemaDetail; "feat-persistent-storage": ProviderAttributeSchemaDetail; - "feat-persistent-storage-type": ProviderAttributeSchemaDetail; - "workload-support-chia": ProviderAttributeSchemaDetail; - "workload-support-chia-capabilities": ProviderAttributeSchemaDetail; + "feat-shm": ProviderAttributeSchemaDetail; + "hardware-shm": ProviderAttributeSchemaDetail; "feat-endpoint-ip": ProviderAttributeSchemaDetail; "feat-endpoint-custom-domain": ProviderAttributeSchemaDetail; }; diff --git a/apps/deploy-web/tests/seeders/provider.ts b/apps/deploy-web/tests/seeders/provider.ts index d95fb607b9..87b80e6dc5 100644 --- a/apps/deploy-web/tests/seeders/provider.ts +++ b/apps/deploy-web/tests/seeders/provider.ts @@ -67,7 +67,7 @@ export function buildProvider(overrides?: Partial): ApiProvid lastOnlineDate: faker.date.recent().toISOString(), isAudited: faker.datatype.boolean(), attributes: [ - { key: "region", value: "us-east", auditedBy: [faker.string.alphanumeric(42)] }, + { key: "location-region", value: "na-us-southeast", auditedBy: [faker.string.alphanumeric(42)] }, { key: "host", value: faker.internet.domainWord(), auditedBy: [faker.string.alphanumeric(42)] }, { key: "tier", value: "community", auditedBy: [faker.string.alphanumeric(42)] }, { key: "organization", value: "overclock", auditedBy: [faker.string.alphanumeric(42)] }, @@ -78,7 +78,7 @@ export function buildProvider(overrides?: Partial): ApiProvid host: faker.internet.domainWord(), organization: faker.company.name(), statusPage: null, - locationRegion: faker.location.state(), + locationRegion: "na-us-southeast", country: faker.location.countryCode(), city: faker.location.city(), timezone: faker.location.timeZone(), @@ -88,17 +88,19 @@ export function buildProvider(overrides?: Partial): ApiProvid hardwareCpuArch: "", hardwareGpuVendor: "", hardwareGpuModels: ["Nvidia Quadro RTX 4000"], - hardwareDisk: ["hdd"], - featPersistentStorage: faker.datatype.boolean(), - featPersistentStorageType: ["hdd"], + hardwareGpuCapabilities: ["nvidia rtx4000 8Gi pcie"], + hardwarePersistentStorageClass: "beta3", + featPersistentStorage: true, + featShm: true, + hardwareShm: ["SHM storage class"], + hardwareCuda: "12.7", + datacenter: "us-southeast-atl-1", hardwareMemory: "", networkProvider: "", networkSpeedDown: faker.number.int({ min: 0, max: 1000 }), networkSpeedUp: faker.number.int({ min: 0, max: 1000 }), tier: "Community hosted provider", featEndpointCustomDomain: faker.datatype.boolean(), - workloadSupportChia: faker.datatype.boolean(), - workloadSupportChiaCapabilities: [], featEndpointIp: faker.datatype.boolean(), uptime: [], ...overrides diff --git a/apps/provider-console/src/components/become-provider/ProviderAttributes.tsx b/apps/provider-console/src/components/become-provider/ProviderAttributes.tsx index b726bc450f..3894a5a080 100644 --- a/apps/provider-console/src/components/become-provider/ProviderAttributes.tsx +++ b/apps/provider-console/src/components/become-provider/ProviderAttributes.tsx @@ -81,24 +81,24 @@ const createGpuAttributes = (gpuConfigs: GpuConfig[] | undefined) => { return [ { - key: "unknown-attributes", + key: "hardware-gpu-capability", value: "true", customKey: `capabilities/gpu/vendor/${vendor}/model/${model}` }, { - key: "unknown-attributes", + key: "hardware-gpu-capability", value: "true", customKey: `capabilities/gpu/vendor/${vendor}/model/${model}/ram/${memory}` }, { - key: "unknown-attributes", + key: "hardware-gpu-capability", value: "true", - customKey: `capabilities/gpu/vendor/${vendor}/model/${model}/ram/${memory}/interface/${iface}` + customKey: `capabilities/gpu/vendor/${vendor}/model/${model}/interface/${iface}` }, { - key: "unknown-attributes", + key: "hardware-gpu-capability", value: "true", - customKey: `capabilities/gpu/vendor/${vendor}/model/${model}/interface/${iface}` + customKey: `capabilities/gpu/vendor/${vendor}/model/${model}/interface/${iface}/ram/${memory}` } ]; }); diff --git a/apps/provider-console/src/types/provider.ts b/apps/provider-console/src/types/provider.ts index e243930c31..ee5db2236f 100644 --- a/apps/provider-console/src/types/provider.ts +++ b/apps/provider-console/src/types/provider.ts @@ -38,17 +38,19 @@ export interface ProviderDetails { hardwareCpuArch: string[]; hardwareGpuVendor: string[]; hardwareGpuModels: string[]; - hardwareDisk: string[]; + hardwareGpuCapabilities: string[]; + hardwarePersistentStorageClass: string[]; featPersistentStorage: boolean; - featPersistentStorageType: string[]; + featShm: boolean; + hardwareShm: string[]; + hardwareCuda: string | null; + datacenter: string | null; hardwareMemory: string[]; networkProvider: string | null; networkSpeedDown: number; networkSpeedUp: number; tier: string[]; featEndpointCustomDomain: boolean; - workloadSupportChia: boolean; - workloadSupportChiaCapabilities: string[]; featEndpointIp: boolean; uptime: Uptime[]; stats: { diff --git a/apps/provider-console/src/types/providerAttributes.ts b/apps/provider-console/src/types/providerAttributes.ts index 964e99aabe..e639c5ba9b 100644 --- a/apps/provider-console/src/types/providerAttributes.ts +++ b/apps/provider-console/src/types/providerAttributes.ts @@ -10,6 +10,7 @@ export const providerAttributesFormValuesSchema = z.object({ host: z.string().min(1, { message: "Host is required." }), tier: z.string().optional(), email: z.string().email({ message: "Email is invalid." }).optional(), + "discord-username": z.string().optional(), organization: z.string().optional(), website: z.string().optional(), "status-page": z.string().optional(), @@ -23,15 +24,18 @@ export const providerAttributesFormValuesSchema = z.object({ "hardware-cpu-arch": z.string().optional(), "hardware-gpu": z.string().optional(), "hardware-gpu-model": z.array(providerAttributeSchemaDetailValueSchema), - "hardware-disk": z.array(providerAttributeSchemaDetailValueSchema).min(1, { message: "Hardware disk is required." }), + "hardware-gpu-capability": z.array(providerAttributeSchemaDetailValueSchema).optional(), + "hardware-persistent-storage-class": z.string().optional(), + "hardware-persistent-storage-capability": z.boolean().optional(), + "hardware-cuda": z.string().optional(), + datacenter: z.string().optional(), "hardware-memory": z.string().min(1, { message: "Hardware memory is required." }), "network-provider": z.string().optional(), "network-speed-up": z.number().optional(), "network-speed-down": z.number().optional(), "feat-persistent-storage": z.boolean().optional(), - "feat-persistent-storage-type": z.array(providerAttributeSchemaDetailValueSchema).optional(), - "workload-support-chia": z.boolean().optional(), - "workload-support-chia-capabilities": z.array(providerAttributeSchemaDetailValueSchema).optional(), + "feat-shm": z.boolean().optional(), + "hardware-shm": z.array(providerAttributeSchemaDetailValueSchema).optional(), "feat-endpoint-ip": z.boolean().optional(), "feat-endpoint-custom-domain": z.boolean().optional(), "unknown-attributes": z @@ -48,6 +52,7 @@ export const providerAttributesFormValuesSchema = z.object({ export type ProviderAttributesSchema = { host: ProviderAttributeSchemaDetail; email: ProviderAttributeSchemaDetail; + "discord-username": ProviderAttributeSchemaDetail; organization: ProviderAttributeSchemaDetail; website: ProviderAttributeSchemaDetail; tier: ProviderAttributeSchemaDetail; @@ -62,15 +67,18 @@ export type ProviderAttributesSchema = { "hardware-cpu-arch": ProviderAttributeSchemaDetail; "hardware-gpu": ProviderAttributeSchemaDetail; "hardware-gpu-model": ProviderAttributeSchemaDetail; - "hardware-disk": ProviderAttributeSchemaDetail; + "hardware-gpu-capability": ProviderAttributeSchemaDetail; + "hardware-persistent-storage-class": ProviderAttributeSchemaDetail; + "hardware-persistent-storage-capability": ProviderAttributeSchemaDetail; + "hardware-cuda": ProviderAttributeSchemaDetail; + datacenter: ProviderAttributeSchemaDetail; "hardware-memory": ProviderAttributeSchemaDetail; "network-provider": ProviderAttributeSchemaDetail; "network-speed-up": ProviderAttributeSchemaDetail; "network-speed-down": ProviderAttributeSchemaDetail; "feat-persistent-storage": ProviderAttributeSchemaDetail; - "feat-persistent-storage-type": ProviderAttributeSchemaDetail; - "workload-support-chia": ProviderAttributeSchemaDetail; - "workload-support-chia-capabilities": ProviderAttributeSchemaDetail; + "feat-shm": ProviderAttributeSchemaDetail; + "hardware-shm": ProviderAttributeSchemaDetail; "feat-endpoint-ip": ProviderAttributeSchemaDetail; "feat-endpoint-custom-domain": ProviderAttributeSchemaDetail; }; diff --git a/config/provider-attributes.json b/config/provider-attributes.json index 9e9b9be481..7d7fb465c0 100644 --- a/config/provider-attributes.json +++ b/config/provider-attributes.json @@ -11,6 +11,12 @@ "required": true, "description": "Email associated with the provider." }, + "discord-username": { + "key": "discord-username", + "type": "string", + "required": false, + "description": "Discord username for provider contact. Required for audited providers; you must be in the Akash Discord with the Provider role." + }, "organization": { "key": "organization", "type": "string", @@ -33,7 +39,7 @@ "key": "location-region", "type": "option", "required": true, - "description": "Geo location region of the provider. Based on the United Nations geoscheme. https://en.wikipedia.org/wiki/United_Nations_geoscheme", + "description": "Geo location region of the provider. Required on-chain key is location-region (not the legacy region key). Based on the United Nations geoscheme. https://en.wikipedia.org/wiki/United_Nations_geoscheme", "values": [ { "key": "na-ca-west", @@ -430,8 +436,13 @@ "description": "GPU model.", "values": [ { - "key": "capabilities/gpu/vendor/nvidia/model/h100", - "description": "Nvidia h100", + "key": "capabilities/gpu/vendor/amd/model/mi100", + "description": "AMD mi100", + "value": true + }, + { + "key": "capabilities/gpu/vendor/amd/model/mi60", + "description": "AMD mi60", "value": true }, { @@ -445,28 +456,118 @@ "value": true }, { - "key": "capabilities/gpu/vendor/nvidia/model/a16", - "description": "Nvidia a16", + "key": "capabilities/gpu/vendor/nvidia/model/a5000", + "description": "Nvidia Quadro A5000", "value": true }, { - "key": "capabilities/gpu/vendor/nvidia/model/t4", - "description": "Nvidia t4", + "key": "capabilities/gpu/vendor/nvidia/model/a800", + "description": "Nvidia a800", "value": true }, { - "key": "capabilities/gpu/vendor/nvidia/model/v100", - "description": "Nvidia v100", + "key": "capabilities/gpu/vendor/nvidia/model/gt1030", + "description": "Nvidia gt1030", "value": true }, { - "key": "capabilities/gpu/vendor/nvidia/model/p4", - "description": "Nvidia tesla-p4", + "key": "capabilities/gpu/vendor/nvidia/model/gtx1050", + "description": "Nvidia gtx-1050", "value": true }, { - "key": "capabilities/gpu/vendor/nvidia/model/p40", - "description": "Nvidia tesla-p40", + "key": "capabilities/gpu/vendor/nvidia/model/gtx1050ti", + "description": "Nvidia gtx-1050-ti", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1060", + "description": "Nvidia gtx-1060", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1070", + "description": "Nvidia gtx-1070", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1070ti", + "description": "Nvidia gtx-1070-ti", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1080", + "description": "Nvidia gtx-1080", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1080ti", + "description": "Nvidia gtx-1080-ti", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1650s", + "description": "Nvidia gtx-1650-s", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1650ti", + "description": "Nvidia gtx-1650-ti", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1660", + "description": "Nvidia gtx-1660", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1660ti", + "description": "Nvidia gtx-1660-ti", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx960", + "description": "Nvidia gtx-960", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx970", + "description": "Nvidia gtx-970", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx980", + "description": "Nvidia gtx-980", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx980ti", + "description": "Nvidia gtx-980-ti", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/h100", + "description": "Nvidia h100", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/h200", + "description": "Nvidia h200", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/h200nvl", + "description": "Nvidia h200nvl", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/m4000", + "description": "Nvidia m4000", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/mx150", + "description": "Nvidia mx150", "value": true }, { @@ -475,310 +576,1965 @@ "value": true }, { - "key": "capabilities/gpu/vendor/nvidia/model/k80", - "description": "Nvidia tesla-k80", + "key": "capabilities/gpu/vendor/nvidia/model/p2000", + "description": "Nvidia p2000", "value": true }, { - "key": "capabilities/gpu/vendor/nvidia/model/rtx4000", - "description": "Nvidia Quadro RTX 4000", + "key": "capabilities/gpu/vendor/nvidia/model/p4", + "description": "Nvidia tesla-p4", "value": true }, { - "key": "capabilities/gpu/vendor/nvidia/model/rtx5000", - "description": "Nvidia Quadro RTX 5000", + "key": "capabilities/gpu/vendor/nvidia/model/p40", + "description": "Nvidia tesla-p40", "value": true }, { - "key": "capabilities/gpu/vendor/nvidia/model/rtx6000", - "description": "Nvidia Quadro RTX 6000", + "key": "capabilities/gpu/vendor/nvidia/model/p4000", + "description": "Nvidia p4000", "value": true }, { - "key": "capabilities/gpu/vendor/nvidia/model/rtx8000", - "description": "Nvidia Quadro RTX 8000", + "key": "capabilities/gpu/vendor/nvidia/model/p5000", + "description": "Nvidia p5000", "value": true }, { - "key": "capabilities/gpu/vendor/nvidia/model/a2000", - "description": "Nvidia Quadro A2000", + "key": "capabilities/gpu/vendor/nvidia/model/p6000", + "description": "Nvidia p6000", "value": true }, { - "key": "capabilities/gpu/vendor/nvidia/model/a4000", - "description": "Nvidia Quadro A4000", + "key": "capabilities/gpu/vendor/nvidia/model/pro6000mq", + "description": "Nvidia pro6000mq", "value": true }, { - "key": "capabilities/gpu/vendor/nvidia/model/a5000", - "description": "Nvidia Quadro A5000", + "key": "capabilities/gpu/vendor/nvidia/model/pro6000se", + "description": "Nvidia pro6000se", "value": true }, { - "key": "capabilities/gpu/vendor/nvidia/model/a6000", - "description": "Nvidia Quadro A6000", + "key": "capabilities/gpu/vendor/nvidia/model/pro6000we", + "description": "Nvidia pro6000we", "value": true }, { - "key": "capabilities/gpu/vendor/nvidia/model/4060", - "description": "Nvidia rtx-4060", + "key": "capabilities/gpu/vendor/nvidia/model/rtx2000eada", + "description": "Nvidia rtx-2000-eada", "value": true }, { - "key": "capabilities/gpu/vendor/nvidia/model/4060ti", - "description": "Nvidia rtx-4060-ti", + "key": "capabilities/gpu/vendor/nvidia/model/rtx2060", + "description": "Nvidia rtx-2060", "value": true }, { - "key": "capabilities/gpu/vendor/nvidia/model/4070", - "description": "Nvidia rtx-4070", + "key": "capabilities/gpu/vendor/nvidia/model/rtx2060s", + "description": "Nvidia rtx-2060-s", "value": true }, { - "key": "capabilities/gpu/vendor/nvidia/model/4070ti", - "description": "Nvidia rtx-4070-ti", + "key": "capabilities/gpu/vendor/nvidia/model/rtx2070", + "description": "Nvidia rtx-2070", "value": true }, { - "key": "capabilities/gpu/vendor/nvidia/model/4080", - "description": "Nvidia rtx-4080", + "key": "capabilities/gpu/vendor/nvidia/model/rtx2070s", + "description": "Nvidia rtx-2070-s", "value": true }, { - "key": "capabilities/gpu/vendor/nvidia/model/4090", - "description": "Nvidia rtx-4090", + "key": "capabilities/gpu/vendor/nvidia/model/rtx2080", + "description": "Nvidia rtx-2080", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx2080s", + "description": "Nvidia rtx-2080-s", "value": true }, { - "key": "capabilities/gpu/vendor/nvidia/model/3050", - "description": "Nvidia rtx-3050", + "key": "capabilities/gpu/vendor/nvidia/model/rtx2080ti", + "description": "Nvidia rtx-2080-ti", "value": true }, { - "key": "capabilities/gpu/vendor/nvidia/model/3060", + "key": "capabilities/gpu/vendor/nvidia/model/rtx3060", "description": "Nvidia rtx-3060", "value": true }, { - "key": "capabilities/gpu/vendor/nvidia/model/3060ti", + "key": "capabilities/gpu/vendor/nvidia/model/rtx3060m", + "description": "Nvidia rtx-3060-m", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx3060ti", "description": "Nvidia rtx-3060-ti", "value": true }, { - "key": "capabilities/gpu/vendor/nvidia/model/3070", + "key": "capabilities/gpu/vendor/nvidia/model/rtx3070", "description": "Nvidia rtx-3070", "value": true }, { - "key": "capabilities/gpu/vendor/nvidia/model/3070ti", - "description": "Nvidia rtx-3070-ti", + "key": "capabilities/gpu/vendor/nvidia/model/rtx3080", + "description": "Nvidia rtx-3080", "value": true }, { - "key": "capabilities/gpu/vendor/nvidia/model/3080", - "description": "Nvidia rtx-3080", + "key": "capabilities/gpu/vendor/nvidia/model/rtx3090", + "description": "Nvidia rtx-3090", "value": true }, { - "key": "capabilities/gpu/vendor/nvidia/model/3080ti", - "description": "Nvidia rtx-3080-ti", + "key": "capabilities/gpu/vendor/nvidia/model/rtx3090ti", + "description": "Nvidia rtx-3090-ti", "value": true }, { - "key": "capabilities/gpu/vendor/nvidia/model/3090", - "description": "Nvidia rtx-3090", + "key": "capabilities/gpu/vendor/nvidia/model/rtx4000", + "description": "Nvidia Quadro RTX 4000", "value": true }, { - "key": "capabilities/gpu/vendor/nvidia/model/3090ti", - "description": "Nvidia rtx-3090-ti", + "key": "capabilities/gpu/vendor/nvidia/model/rtx4000ada", + "description": "Nvidia rtx-4000-ada", "value": true }, { - "key": "capabilities/gpu/vendor/nvidia/model/1050", - "description": "Nvidia gtx-1050", + "key": "capabilities/gpu/vendor/nvidia/model/rtx4000sada", + "description": "Nvidia rtx-4000-sada", "value": true }, { - "key": "capabilities/gpu/vendor/nvidia/model/1050ti", - "description": "Nvidia gtx-1050-ti", + "key": "capabilities/gpu/vendor/nvidia/model/rtx4060", + "description": "Nvidia rtx-4060", "value": true }, { - "key": "capabilities/gpu/vendor/nvidia/model/1060", - "description": "Nvidia gtx-1060", + "key": "capabilities/gpu/vendor/nvidia/model/rtx4060ti", + "description": "Nvidia rtx-4060-ti", "value": true }, { - "key": "capabilities/gpu/vendor/nvidia/model/1070", - "description": "Nvidia gtx-1070", + "key": "capabilities/gpu/vendor/nvidia/model/rtx4070", + "description": "Nvidia rtx-4070", "value": true }, { - "key": "capabilities/gpu/vendor/nvidia/model/1070ti", - "description": "Nvidia gtx-1070-ti", + "key": "capabilities/gpu/vendor/nvidia/model/rtx4070s", + "description": "Nvidia rtx-4070-s", "value": true }, { - "key": "capabilities/gpu/vendor/nvidia/model/1080", - "description": "Nvidia gtx-1080", + "key": "capabilities/gpu/vendor/nvidia/model/rtx4070ti", + "description": "Nvidia rtx-4070-ti", "value": true }, { - "key": "capabilities/gpu/vendor/nvidia/model/1080ti", - "description": "Nvidia gtx-1080-ti", + "key": "capabilities/gpu/vendor/nvidia/model/rtx4080", + "description": "Nvidia rtx-4080", "value": true - } - ] - }, - "hardware-disk": { - "key": "capabilities/storage", - "type": "multiple-option", - "required": true, - "description": "Storage type.", - "values": [ + }, { - "key": "capabilities/storage/1/class", - "description": "hdd", - "value": "default" + "key": "capabilities/gpu/vendor/nvidia/model/rtx4080s", + "description": "Nvidia rtx-4080-s", + "value": true }, { - "key": "capabilities/storage/2/class", - "description": "ssd", - "value": "beta2" + "key": "capabilities/gpu/vendor/nvidia/model/rtx4090", + "description": "Nvidia rtx-4090", + "value": true }, { - "key": "capabilities/storage/3/class", - "description": "nvme", - "value": "beta3" - } - ] - }, - "hardware-memory": { - "key": "capabilities/memory", - "type": "option", - "required": true, - "description": "Memory (RAM) type.", - "values": [ + "key": "capabilities/gpu/vendor/nvidia/model/rtx5000", + "description": "Nvidia Quadro RTX 5000", + "value": true + }, { - "key": "ddr2", - "description": "DDR2" + "key": "capabilities/gpu/vendor/nvidia/model/rtx5070", + "description": "Nvidia rtx-5070", + "value": true }, { - "key": "ddr3", - "description": "DDR3" + "key": "capabilities/gpu/vendor/nvidia/model/rtx5080", + "description": "Nvidia rtx-5080", + "value": true }, { - "key": "ddr3ecc", - "description": "DDR3ECC" + "key": "capabilities/gpu/vendor/nvidia/model/rtx5090", + "description": "Nvidia rtx-5090", + "value": true }, { - "key": "ddr4", - "description": "DDR4" + "key": "capabilities/gpu/vendor/nvidia/model/rtx5090m", + "description": "Nvidia rtx-5090-m", + "value": true }, { - "key": "ddr4ecc", - "description": "DDR4ECC" + "key": "capabilities/gpu/vendor/nvidia/model/rtx6000", + "description": "Nvidia Quadro RTX 6000", + "value": true }, { - "key": "ddr5", - "description": "DDR5" + "key": "capabilities/gpu/vendor/nvidia/model/rtx8000", + "description": "Nvidia Quadro RTX 8000", + "value": true }, { - "key": "ddr5ecc", - "description": "DDR5ECC" + "key": "capabilities/gpu/vendor/nvidia/model/rtxa2000", + "description": "Nvidia Quadro A2000", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtxa6000", + "description": "Nvidia Quadro A6000", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/t4", + "description": "Nvidia t4", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/v100", + "description": "Nvidia v100", + "value": true } ] }, - "network-provider": { - "key": "network-provider", - "type": "string", - "required": false, - "description": "Internet service provider." - }, - "network-speed-up": { - "key": "network-speed-up", - "type": "number", - "required": false, - "description": "Upload Bandwidth in mbps." - }, - "network-speed-down": { - "key": "network-speed-down", - "type": "number", - "required": false, - "description": "Download Bandwidth in mbps." - }, - "feat-persistent-storage": { - "key": "feat-persistent-storage", - "type": "boolean", - "required": true, - "description": "True if the provider offers persistent storage." - }, - "feat-persistent-storage-type": { - "key": "feat-persistent-storage", + "hardware-gpu-capability": { + "key": "capabilities/gpu/capability", "type": "multiple-option", "required": false, - "description": "Type of persistent storage offered.", + "description": "GPU capability keys including model, RAM, and interface.", "values": [ { - "key": "capabilities/storage/1/persistent", - "description": "hdd", + "key": "capabilities/gpu/vendor/amd/model/mi100", + "description": "amd mi100 32Gi pcie", "value": true }, { - "key": "capabilities/storage/2/persistent", - "description": "ssd", + "key": "capabilities/gpu/vendor/amd/model/mi100/ram/32Gi", + "description": "amd mi100 32Gi pcie", "value": true }, { - "key": "capabilities/storage/3/persistent", - "description": "nvme", + "key": "capabilities/gpu/vendor/amd/model/mi100/interface/pcie", + "description": "amd mi100 32Gi pcie", "value": true - } - ] - }, - "tier": { - "key": "tier", - "type": "option", - "required": false, - "description": "Is this an Akash hosted provider or community hosted?", - "values": [ + }, { - "key": "akash", - "description": "Akash hosted provider" + "key": "capabilities/gpu/vendor/amd/model/mi100/interface/pcie/ram/32Gi", + "description": "amd mi100 32Gi pcie", + "value": true }, { - "key": "community", - "description": "Community hosted provider" - } - ] - }, - "workload-support-chia": { - "key": "workload-support-chia", - "type": "boolean", - "required": false, - "description": "Does this provider support Chia plotting?" - }, - "workload-support-chia-capabilities": { - "key": "workload-support-chia-capabilities", - "type": "multiple-option", - "required": false, - "description": "What specific capabilities does the provider support for Chia?", - "values": [ + "key": "capabilities/gpu/vendor/amd/model/mi60", + "description": "amd mi60 32Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/amd/model/mi60/ram/32Gi", + "description": "amd mi60 32Gi pcie", + "value": true + }, { - "key": "bladebit", - "description": "bladebit", + "key": "capabilities/gpu/vendor/amd/model/mi60/interface/pcie", + "description": "amd mi60 32Gi pcie", "value": true }, { - "key": "madmax", - "description": "madmax", + "key": "capabilities/gpu/vendor/amd/model/mi60/interface/pcie/ram/32Gi", + "description": "amd mi60 32Gi pcie", "value": true }, { - "key": "bladebit-disk", - "description": "bladebit-disk", + "key": "capabilities/gpu/vendor/nvidia/model/a100", + "description": "nvidia a100 40Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/a100/ram/40Gi", + "description": "nvidia a100 40Gi pcie", "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/a100/interface/pcie", + "description": "nvidia a100 40Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/a100/interface/pcie/ram/40Gi", + "description": "nvidia a100 40Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/a100/interface/sxm", + "description": "nvidia a100 40Gi sxm", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/a100/interface/sxm/ram/40Gi", + "description": "nvidia a100 40Gi sxm", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/a100/ram/64Gi", + "description": "nvidia a100 64Gi sxm", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/a100/interface/sxm/ram/64Gi", + "description": "nvidia a100 64Gi sxm", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/a100/ram/80Gi", + "description": "nvidia a100 80Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/a100/interface/pcie/ram/80Gi", + "description": "nvidia a100 80Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/a100/interface/sxm/ram/80Gi", + "description": "nvidia a100 80Gi sxm", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/a40", + "description": "nvidia a40 48Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/a40/ram/48Gi", + "description": "nvidia a40 48Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/a40/interface/pcie", + "description": "nvidia a40 48Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/a40/interface/pcie/ram/48Gi", + "description": "nvidia a40 48Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/a5000", + "description": "nvidia a5000 24Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/a5000/ram/24Gi", + "description": "nvidia a5000 24Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/a5000/interface/pcie", + "description": "nvidia a5000 24Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/a5000/interface/pcie/ram/24Gi", + "description": "nvidia a5000 24Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/a800", + "description": "nvidia a800 80Gi sxm", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/a800/ram/80Gi", + "description": "nvidia a800 80Gi sxm", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/a800/interface/sxm", + "description": "nvidia a800 80Gi sxm", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/a800/interface/sxm/ram/80Gi", + "description": "nvidia a800 80Gi sxm", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gt1030", + "description": "nvidia gt1030 2Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gt1030/ram/2Gi", + "description": "nvidia gt1030 2Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gt1030/interface/pcie", + "description": "nvidia gt1030 2Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gt1030/interface/pcie/ram/2Gi", + "description": "nvidia gt1030 2Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1050", + "description": "nvidia gtx1050 2Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1050/ram/2Gi", + "description": "nvidia gtx1050 2Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1050/interface/pcie", + "description": "nvidia gtx1050 2Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1050/interface/pcie/ram/2Gi", + "description": "nvidia gtx1050 2Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1050/ram/3Gi", + "description": "nvidia gtx1050 3Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1050/interface/pcie/ram/3Gi", + "description": "nvidia gtx1050 3Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1050ti", + "description": "nvidia gtx1050ti 4Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1050ti/ram/4Gi", + "description": "nvidia gtx1050ti 4Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1050ti/interface/pcie", + "description": "nvidia gtx1050ti 4Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1050ti/interface/pcie/ram/4Gi", + "description": "nvidia gtx1050ti 4Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1060", + "description": "nvidia gtx1060 3Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1060/ram/3Gi", + "description": "nvidia gtx1060 3Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1060/interface/pcie", + "description": "nvidia gtx1060 3Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1060/interface/pcie/ram/3Gi", + "description": "nvidia gtx1060 3Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1060/ram/5Gi", + "description": "nvidia gtx1060 5Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1060/interface/pcie/ram/5Gi", + "description": "nvidia gtx1060 5Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1060/ram/6Gi", + "description": "nvidia gtx1060 6Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1060/interface/pcie/ram/6Gi", + "description": "nvidia gtx1060 6Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1070", + "description": "nvidia gtx1070 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1070/ram/8Gi", + "description": "nvidia gtx1070 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1070/interface/pcie", + "description": "nvidia gtx1070 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1070/interface/pcie/ram/8Gi", + "description": "nvidia gtx1070 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1070ti", + "description": "nvidia gtx1070ti 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1070ti/ram/8Gi", + "description": "nvidia gtx1070ti 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1070ti/interface/pcie", + "description": "nvidia gtx1070ti 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1070ti/interface/pcie/ram/8Gi", + "description": "nvidia gtx1070ti 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1080", + "description": "nvidia gtx1080 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1080/ram/8Gi", + "description": "nvidia gtx1080 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1080/interface/pcie", + "description": "nvidia gtx1080 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1080/interface/pcie/ram/8Gi", + "description": "nvidia gtx1080 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1080ti", + "description": "nvidia gtx1080ti 11Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1080ti/ram/11Gi", + "description": "nvidia gtx1080ti 11Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1080ti/interface/pcie", + "description": "nvidia gtx1080ti 11Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1080ti/interface/pcie/ram/11Gi", + "description": "nvidia gtx1080ti 11Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1650s", + "description": "nvidia gtx1650s 4Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1650s/ram/4Gi", + "description": "nvidia gtx1650s 4Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1650s/interface/pcie", + "description": "nvidia gtx1650s 4Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1650s/interface/pcie/ram/4Gi", + "description": "nvidia gtx1650s 4Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1650ti", + "description": "nvidia gtx1650ti 4Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1650ti/ram/4Gi", + "description": "nvidia gtx1650ti 4Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1650ti/interface/pcie", + "description": "nvidia gtx1650ti 4Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1650ti/interface/pcie/ram/4Gi", + "description": "nvidia gtx1650ti 4Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1660", + "description": "nvidia gtx1660 6Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1660/ram/6Gi", + "description": "nvidia gtx1660 6Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1660/interface/pcie", + "description": "nvidia gtx1660 6Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1660/interface/pcie/ram/6Gi", + "description": "nvidia gtx1660 6Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1660ti", + "description": "nvidia gtx1660ti 6Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1660ti/ram/6Gi", + "description": "nvidia gtx1660ti 6Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1660ti/interface/pcie", + "description": "nvidia gtx1660ti 6Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx1660ti/interface/pcie/ram/6Gi", + "description": "nvidia gtx1660ti 6Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx960", + "description": "nvidia gtx960 2Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx960/ram/2Gi", + "description": "nvidia gtx960 2Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx960/interface/pcie", + "description": "nvidia gtx960 2Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx960/interface/pcie/ram/2Gi", + "description": "nvidia gtx960 2Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx960/ram/4Gi", + "description": "nvidia gtx960 4Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx960/interface/pcie/ram/4Gi", + "description": "nvidia gtx960 4Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx970", + "description": "nvidia gtx970 4Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx970/ram/4Gi", + "description": "nvidia gtx970 4Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx970/interface/pcie", + "description": "nvidia gtx970 4Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx970/interface/pcie/ram/4Gi", + "description": "nvidia gtx970 4Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx980", + "description": "nvidia gtx980 4Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx980/ram/4Gi", + "description": "nvidia gtx980 4Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx980/interface/pcie", + "description": "nvidia gtx980 4Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx980/interface/pcie/ram/4Gi", + "description": "nvidia gtx980 4Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx980ti", + "description": "nvidia gtx980ti 6Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx980ti/ram/6Gi", + "description": "nvidia gtx980ti 6Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx980ti/interface/pcie", + "description": "nvidia gtx980ti 6Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/gtx980ti/interface/pcie/ram/6Gi", + "description": "nvidia gtx980ti 6Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/h100", + "description": "nvidia h100 80Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/h100/ram/80Gi", + "description": "nvidia h100 80Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/h100/interface/pcie", + "description": "nvidia h100 80Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/h100/interface/pcie/ram/80Gi", + "description": "nvidia h100 80Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/h100/interface/sxm", + "description": "nvidia h100 80Gi sxm", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/h100/interface/sxm/ram/80Gi", + "description": "nvidia h100 80Gi sxm", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/h200", + "description": "nvidia h200 141Gi sxm", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/h200/ram/141Gi", + "description": "nvidia h200 141Gi sxm", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/h200/interface/sxm", + "description": "nvidia h200 141Gi sxm", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/h200/interface/sxm/ram/141Gi", + "description": "nvidia h200 141Gi sxm", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/h200nvl", + "description": "nvidia h200nvl 141Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/h200nvl/ram/141Gi", + "description": "nvidia h200nvl 141Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/h200nvl/interface/pcie", + "description": "nvidia h200nvl 141Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/h200nvl/interface/pcie/ram/141Gi", + "description": "nvidia h200nvl 141Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/m4000", + "description": "nvidia m4000 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/m4000/ram/8Gi", + "description": "nvidia m4000 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/m4000/interface/pcie", + "description": "nvidia m4000 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/m4000/interface/pcie/ram/8Gi", + "description": "nvidia m4000 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/mx150", + "description": "nvidia mx150 2Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/mx150/ram/2Gi", + "description": "nvidia mx150 2Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/mx150/interface/pcie", + "description": "nvidia mx150 2Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/mx150/interface/pcie/ram/2Gi", + "description": "nvidia mx150 2Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/p100", + "description": "nvidia p100 16Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/p100/ram/16Gi", + "description": "nvidia p100 16Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/p100/interface/pcie", + "description": "nvidia p100 16Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/p100/interface/pcie/ram/16Gi", + "description": "nvidia p100 16Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/p2000", + "description": "nvidia p2000 4Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/p2000/ram/4Gi", + "description": "nvidia p2000 4Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/p2000/interface/pcie", + "description": "nvidia p2000 4Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/p2000/interface/pcie/ram/4Gi", + "description": "nvidia p2000 4Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/p2000/ram/5Gi", + "description": "nvidia p2000 5Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/p2000/interface/pcie/ram/5Gi", + "description": "nvidia p2000 5Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/p4", + "description": "nvidia p4 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/p4/ram/8Gi", + "description": "nvidia p4 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/p4/interface/pcie", + "description": "nvidia p4 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/p4/interface/pcie/ram/8Gi", + "description": "nvidia p4 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/p40", + "description": "nvidia p40 24Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/p40/ram/24Gi", + "description": "nvidia p40 24Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/p40/interface/pcie", + "description": "nvidia p40 24Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/p40/interface/pcie/ram/24Gi", + "description": "nvidia p40 24Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/p4000", + "description": "nvidia p4000 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/p4000/ram/8Gi", + "description": "nvidia p4000 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/p4000/interface/pcie", + "description": "nvidia p4000 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/p4000/interface/pcie/ram/8Gi", + "description": "nvidia p4000 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/p5000", + "description": "nvidia p5000 16Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/p5000/ram/16Gi", + "description": "nvidia p5000 16Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/p5000/interface/pcie", + "description": "nvidia p5000 16Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/p5000/interface/pcie/ram/16Gi", + "description": "nvidia p5000 16Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/p6000", + "description": "nvidia p6000 24Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/p6000/ram/24Gi", + "description": "nvidia p6000 24Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/p6000/interface/pcie", + "description": "nvidia p6000 24Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/p6000/interface/pcie/ram/24Gi", + "description": "nvidia p6000 24Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/pro6000mq", + "description": "nvidia pro6000mq 96Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/pro6000mq/ram/96Gi", + "description": "nvidia pro6000mq 96Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/pro6000mq/interface/pcie", + "description": "nvidia pro6000mq 96Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/pro6000mq/interface/pcie/ram/96Gi", + "description": "nvidia pro6000mq 96Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/pro6000se", + "description": "nvidia pro6000se 96Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/pro6000se/ram/96Gi", + "description": "nvidia pro6000se 96Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/pro6000se/interface/pcie", + "description": "nvidia pro6000se 96Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/pro6000se/interface/pcie/ram/96Gi", + "description": "nvidia pro6000se 96Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/pro6000we", + "description": "nvidia pro6000we 96Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/pro6000we/ram/96Gi", + "description": "nvidia pro6000we 96Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/pro6000we/interface/pcie", + "description": "nvidia pro6000we 96Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/pro6000we/interface/pcie/ram/96Gi", + "description": "nvidia pro6000we 96Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx2000eada", + "description": "nvidia rtx2000eada 16Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx2000eada/ram/16Gi", + "description": "nvidia rtx2000eada 16Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx2000eada/interface/pcie", + "description": "nvidia rtx2000eada 16Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx2000eada/interface/pcie/ram/16Gi", + "description": "nvidia rtx2000eada 16Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx2060", + "description": "nvidia rtx2060 6Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx2060/ram/6Gi", + "description": "nvidia rtx2060 6Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx2060/interface/pcie", + "description": "nvidia rtx2060 6Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx2060/interface/pcie/ram/6Gi", + "description": "nvidia rtx2060 6Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx2060s", + "description": "nvidia rtx2060s 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx2060s/ram/8Gi", + "description": "nvidia rtx2060s 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx2060s/interface/pcie", + "description": "nvidia rtx2060s 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx2060s/interface/pcie/ram/8Gi", + "description": "nvidia rtx2060s 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx2070", + "description": "nvidia rtx2070 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx2070/ram/8Gi", + "description": "nvidia rtx2070 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx2070/interface/pcie", + "description": "nvidia rtx2070 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx2070/interface/pcie/ram/8Gi", + "description": "nvidia rtx2070 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx2070s", + "description": "nvidia rtx2070s 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx2070s/ram/8Gi", + "description": "nvidia rtx2070s 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx2070s/interface/pcie", + "description": "nvidia rtx2070s 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx2070s/interface/pcie/ram/8Gi", + "description": "nvidia rtx2070s 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx2080", + "description": "nvidia rtx2080 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx2080/ram/8Gi", + "description": "nvidia rtx2080 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx2080/interface/pcie", + "description": "nvidia rtx2080 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx2080/interface/pcie/ram/8Gi", + "description": "nvidia rtx2080 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx2080s", + "description": "nvidia rtx2080s 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx2080s/ram/8Gi", + "description": "nvidia rtx2080s 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx2080s/interface/pcie", + "description": "nvidia rtx2080s 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx2080s/interface/pcie/ram/8Gi", + "description": "nvidia rtx2080s 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx2080ti", + "description": "nvidia rtx2080ti 11Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx2080ti/ram/11Gi", + "description": "nvidia rtx2080ti 11Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx2080ti/interface/pcie", + "description": "nvidia rtx2080ti 11Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx2080ti/interface/pcie/ram/11Gi", + "description": "nvidia rtx2080ti 11Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx3060", + "description": "nvidia rtx3060 12Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx3060/ram/12Gi", + "description": "nvidia rtx3060 12Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx3060/interface/pcie", + "description": "nvidia rtx3060 12Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx3060/interface/pcie/ram/12Gi", + "description": "nvidia rtx3060 12Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx3060m", + "description": "nvidia rtx3060m 6Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx3060m/ram/6Gi", + "description": "nvidia rtx3060m 6Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx3060m/interface/pcie", + "description": "nvidia rtx3060m 6Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx3060m/interface/pcie/ram/6Gi", + "description": "nvidia rtx3060m 6Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx3060ti", + "description": "nvidia rtx3060ti 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx3060ti/ram/8Gi", + "description": "nvidia rtx3060ti 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx3060ti/interface/pcie", + "description": "nvidia rtx3060ti 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx3060ti/interface/pcie/ram/8Gi", + "description": "nvidia rtx3060ti 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx3070", + "description": "nvidia rtx3070 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx3070/ram/8Gi", + "description": "nvidia rtx3070 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx3070/interface/pcie", + "description": "nvidia rtx3070 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx3070/interface/pcie/ram/8Gi", + "description": "nvidia rtx3070 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx3080", + "description": "nvidia rtx3080 10Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx3080/ram/10Gi", + "description": "nvidia rtx3080 10Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx3080/interface/pcie", + "description": "nvidia rtx3080 10Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx3080/interface/pcie/ram/10Gi", + "description": "nvidia rtx3080 10Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx3090", + "description": "nvidia rtx3090 24Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx3090/ram/24Gi", + "description": "nvidia rtx3090 24Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx3090/interface/pcie", + "description": "nvidia rtx3090 24Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx3090/interface/pcie/ram/24Gi", + "description": "nvidia rtx3090 24Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx3090ti", + "description": "nvidia rtx3090ti 24Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx3090ti/ram/24Gi", + "description": "nvidia rtx3090ti 24Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx3090ti/interface/pcie", + "description": "nvidia rtx3090ti 24Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx3090ti/interface/pcie/ram/24Gi", + "description": "nvidia rtx3090ti 24Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4000", + "description": "nvidia rtx4000 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4000/ram/8Gi", + "description": "nvidia rtx4000 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4000/interface/pcie", + "description": "nvidia rtx4000 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4000/interface/pcie/ram/8Gi", + "description": "nvidia rtx4000 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4000ada", + "description": "nvidia rtx4000ada 20Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4000ada/ram/20Gi", + "description": "nvidia rtx4000ada 20Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4000ada/interface/pcie", + "description": "nvidia rtx4000ada 20Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4000ada/interface/pcie/ram/20Gi", + "description": "nvidia rtx4000ada 20Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4000sada", + "description": "nvidia rtx4000sada 20Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4000sada/ram/20Gi", + "description": "nvidia rtx4000sada 20Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4000sada/interface/pcie", + "description": "nvidia rtx4000sada 20Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4000sada/interface/pcie/ram/20Gi", + "description": "nvidia rtx4000sada 20Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4060", + "description": "nvidia rtx4060 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4060/ram/8Gi", + "description": "nvidia rtx4060 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4060/interface/pcie", + "description": "nvidia rtx4060 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4060/interface/pcie/ram/8Gi", + "description": "nvidia rtx4060 8Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4060ti", + "description": "nvidia rtx4060ti 16Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4060ti/ram/16Gi", + "description": "nvidia rtx4060ti 16Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4060ti/interface/pcie", + "description": "nvidia rtx4060ti 16Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4060ti/interface/pcie/ram/16Gi", + "description": "nvidia rtx4060ti 16Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4070", + "description": "nvidia rtx4070 12Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4070/ram/12Gi", + "description": "nvidia rtx4070 12Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4070/interface/pcie", + "description": "nvidia rtx4070 12Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4070/interface/pcie/ram/12Gi", + "description": "nvidia rtx4070 12Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4070s", + "description": "nvidia rtx4070s 12Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4070s/ram/12Gi", + "description": "nvidia rtx4070s 12Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4070s/interface/pcie", + "description": "nvidia rtx4070s 12Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4070s/interface/pcie/ram/12Gi", + "description": "nvidia rtx4070s 12Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4070ti", + "description": "nvidia rtx4070ti 12Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4070ti/ram/12Gi", + "description": "nvidia rtx4070ti 12Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4070ti/interface/pcie", + "description": "nvidia rtx4070ti 12Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4070ti/interface/pcie/ram/12Gi", + "description": "nvidia rtx4070ti 12Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4080", + "description": "nvidia rtx4080 16Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4080/ram/16Gi", + "description": "nvidia rtx4080 16Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4080/interface/pcie", + "description": "nvidia rtx4080 16Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4080/interface/pcie/ram/16Gi", + "description": "nvidia rtx4080 16Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4080s", + "description": "nvidia rtx4080s 16Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4080s/ram/16Gi", + "description": "nvidia rtx4080s 16Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4080s/interface/pcie", + "description": "nvidia rtx4080s 16Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4080s/interface/pcie/ram/16Gi", + "description": "nvidia rtx4080s 16Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4090", + "description": "nvidia rtx4090 24Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4090/ram/24Gi", + "description": "nvidia rtx4090 24Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4090/interface/pcie", + "description": "nvidia rtx4090 24Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx4090/interface/pcie/ram/24Gi", + "description": "nvidia rtx4090 24Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx5000", + "description": "nvidia rtx5000 16Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx5000/ram/16Gi", + "description": "nvidia rtx5000 16Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx5000/interface/pcie", + "description": "nvidia rtx5000 16Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx5000/interface/pcie/ram/16Gi", + "description": "nvidia rtx5000 16Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx5070", + "description": "nvidia rtx5070 12Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx5070/ram/12Gi", + "description": "nvidia rtx5070 12Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx5070/interface/pcie", + "description": "nvidia rtx5070 12Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx5070/interface/pcie/ram/12Gi", + "description": "nvidia rtx5070 12Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx5080", + "description": "nvidia rtx5080 16Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx5080/ram/16Gi", + "description": "nvidia rtx5080 16Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx5080/interface/pcie", + "description": "nvidia rtx5080 16Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx5080/interface/pcie/ram/16Gi", + "description": "nvidia rtx5080 16Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx5090", + "description": "nvidia rtx5090 32Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx5090/ram/32Gi", + "description": "nvidia rtx5090 32Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx5090/interface/pcie", + "description": "nvidia rtx5090 32Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx5090/interface/pcie/ram/32Gi", + "description": "nvidia rtx5090 32Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx5090m", + "description": "nvidia rtx5090m 24Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx5090m/ram/24Gi", + "description": "nvidia rtx5090m 24Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx5090m/interface/pcie", + "description": "nvidia rtx5090m 24Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx5090m/interface/pcie/ram/24Gi", + "description": "nvidia rtx5090m 24Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx6000", + "description": "nvidia rtx6000 24Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx6000/ram/24Gi", + "description": "nvidia rtx6000 24Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx6000/interface/pcie", + "description": "nvidia rtx6000 24Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx6000/interface/pcie/ram/24Gi", + "description": "nvidia rtx6000 24Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx8000", + "description": "nvidia rtx8000 48Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx8000/ram/48Gi", + "description": "nvidia rtx8000 48Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx8000/interface/pcie", + "description": "nvidia rtx8000 48Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtx8000/interface/pcie/ram/48Gi", + "description": "nvidia rtx8000 48Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtxa2000", + "description": "nvidia rtxa2000 6Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtxa2000/ram/6Gi", + "description": "nvidia rtxa2000 6Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtxa2000/interface/pcie", + "description": "nvidia rtxa2000 6Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtxa2000/interface/pcie/ram/6Gi", + "description": "nvidia rtxa2000 6Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtxa6000", + "description": "nvidia rtxa6000 48Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtxa6000/ram/48Gi", + "description": "nvidia rtxa6000 48Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtxa6000/interface/pcie", + "description": "nvidia rtxa6000 48Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/rtxa6000/interface/pcie/ram/48Gi", + "description": "nvidia rtxa6000 48Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/t4", + "description": "nvidia t4 16Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/t4/ram/16Gi", + "description": "nvidia t4 16Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/t4/interface/pcie", + "description": "nvidia t4 16Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/t4/interface/pcie/ram/16Gi", + "description": "nvidia t4 16Gi pcie", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/v100", + "description": "nvidia v100 16Gi sxm", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/v100/ram/16Gi", + "description": "nvidia v100 16Gi sxm", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/v100/interface/sxm", + "description": "nvidia v100 16Gi sxm", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/v100/interface/sxm/ram/16Gi", + "description": "nvidia v100 16Gi sxm", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/v100/ram/32Gi", + "description": "nvidia v100 32Gi sxm", + "value": true + }, + { + "key": "capabilities/gpu/vendor/nvidia/model/v100/interface/sxm/ram/32Gi", + "description": "nvidia v100 32Gi sxm", + "value": true + } + ] + }, + "hardware-persistent-storage-class": { + "key": "capabilities/storage/1/class", + "type": "option", + "required": false, + "description": "Primary persistent storage class (beta1 HDD, beta2 SSD, beta3 NVMe).", + "values": [ + { + "key": "beta1", + "description": "HDD (beta1)" + }, + { + "key": "beta2", + "description": "SSD (beta2)" + }, + { + "key": "beta3", + "description": "NVMe (beta3)" + } + ] + }, + "hardware-persistent-storage-capability": { + "key": "capabilities/storage/1/persistent", + "type": "boolean", + "required": false, + "description": "True if storage class 1 provides persistent storage." + }, + "hardware-cuda": { + "key": "cuda", + "type": "string", + "required": false, + "description": "CUDA version available on GPU nodes (for example 12.7)." + }, + "datacenter": { + "key": "datacenter", + "type": "string", + "required": false, + "description": "Provider datacenter or site identifier." + }, + "hardware-memory": { + "key": "capabilities/memory", + "type": "option", + "required": true, + "description": "Memory (RAM) type.", + "values": [ + { + "key": "ddr2", + "description": "DDR2" + }, + { + "key": "ddr3", + "description": "DDR3" + }, + { + "key": "ddr3ecc", + "description": "DDR3ECC" + }, + { + "key": "ddr4", + "description": "DDR4" + }, + { + "key": "ddr4ecc", + "description": "DDR4ECC" + }, + { + "key": "ddr5", + "description": "DDR5" + }, + { + "key": "ddr5ecc", + "description": "DDR5ECC" + } + ] + }, + "network-provider": { + "key": "network-provider", + "type": "string", + "required": false, + "description": "Internet service provider." + }, + "network-speed-up": { + "key": "network-speed-up", + "type": "number", + "required": false, + "description": "Upload Bandwidth in mbps." + }, + "network-speed-down": { + "key": "network-speed-down", + "type": "number", + "required": false, + "description": "Download Bandwidth in mbps." + }, + "feat-persistent-storage": { + "key": "feat-persistent-storage", + "type": "boolean", + "required": true, + "description": "True if the provider offers persistent storage." + }, + "feat-shm": { + "key": "feat-shm", + "type": "boolean", + "required": false, + "description": "True if the provider offers shared memory (SHM) via the ram storage class." + }, + "hardware-shm": { + "key": "capabilities/shm", + "type": "multiple-option", + "required": false, + "description": "Shared memory (SHM) capability keys.", + "values": [ + { + "key": "capabilities/storage/2/class", + "description": "SHM storage class", + "value": "ram" + }, + { + "key": "capabilities/storage/2/persistent", + "description": "SHM non-persistent", + "value": "false" + } + ] + }, + "tier": { + "key": "tier", + "type": "option", + "required": false, + "description": "Is this an Akash hosted provider or community hosted?", + "values": [ + { + "key": "akash", + "description": "Akash hosted provider" + }, + { + "key": "community", + "description": "Community hosted provider" } ] }, diff --git a/config/provider-attributes.md b/config/provider-attributes.md index 0f34fc38b4..a89cfc5da2 100644 --- a/config/provider-attributes.md +++ b/config/provider-attributes.md @@ -4,10 +4,11 @@ | ---------------------------- | ------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | | host | string | true | Name of the host. Ex.: 'd3akash.cloud'. | | | email | string | true | Email associated with the provider. | | +| discord-username | string | false | Discord username for provider contact. **Required for audited providers**; you must be in the [Akash Discord](https://discord.gg/akash) with the Provider role. | | | organization | string | true | Name of the organization that owns the provider. | | | website | string | false | Link to the organization's website. | | | status-page | string | false | Link to a status page for the provider. | | -| location-region | option | true | Geo location region of the provider. Based on the United Nations geoscheme. [UN Geoscheme](https://en.wikipedia.org/wiki/United_Nations_geoscheme) | See [Location Region Values](#location-region-values) | +| location-region | option | true | Geo location region of the provider. **Required key: `location-region`** (the legacy `region` key is not supported). [UN Geoscheme](https://en.wikipedia.org/wiki/United_Nations_geoscheme) | See [Location Region Values](#location-region-values) | | country | string | false | Country ISO 3166 Alpha-2 code of the provider. [ISO 3166 Country Codes](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes) | | | city | string | false | City 3 letter code of the provider. [Harbor Code](https://www.hh-express.com/en/support/three_code/harbor.html) | | | timezone | option | false | Timezone UTC-12 to UTC+14 of the provider. [Timezone Map](https://www.timeanddate.com/time/map/) | See [Timezone Values](#timezone-values) | @@ -16,17 +17,20 @@ | hardware-cpu | option | true | CPU manufacturer. | intel, amd, arm | | hardware-cpu-arch | option | false | CPU architecture. | x86, x86-64, arm, arm-64 | | hardware-gpu | option | false | GPU manufacturer. | nvidia, amd, intel, xilinx | -| hardware-gpu-model | multiple-option | false | GPU model. | h100, a100, a40, a16, t4, v100, tesla-p4, tesla-p100, tesla-k80, Quadro RTX 4000, Quadro RTX 5000, Quadro RTX 6000, Quadro A2000, Quadro A4000, Quadro A5000, Quadro A6000, rtx-4060, rtx-4060-ti, rtx-4070, rtx-4070-ti, rtx-4080, rtx-4090, rtx-3050, rtx-3060, rtx-3060-ti, rtx-3070, rtx-3070-ti, rtx-3080, rtx-3080-ti, rtx-3090, rtx-3090-ti, gtx-1050, gtx-1050-ti, gtx-1060, gtx-1070, gtx-1070-ti, gtx-1080 | -| hardware-disk | multiple-option | true | Storage type. | hdd, ssd, nvme | +| hardware-gpu-model | multiple-option | false | GPU model. Synced from [provider-configs/devices/pcie/gpus.json](https://github.com/akash-network/provider-configs/blob/main/devices/pcie/gpus.json). | AMD mi100, AMD mi60, Nvidia a100, ... | +| hardware-gpu-capability | multiple-option | false | GPU capability keys (model, RAM, interface). Synced from provider-configs. | Per-model RAM/interface keys | +| hardware-persistent-storage-class | option | false | Primary persistent storage class on `capabilities/storage/1/class`. | beta1 (HDD), beta2 (SSD), beta3 (NVMe) | +| hardware-persistent-storage-capability | boolean | false | Persistent storage on storage class 1 (`capabilities/storage/1/persistent`). | | +| hardware-cuda | string | false | CUDA version on GPU nodes (for example 12.7). | | +| datacenter | string | false | Provider datacenter or site identifier. | | | hardware-memory | option | true | Memory (RAM) type. | ddr2, ddr3, ddr3ecc, ddr4, ddr4ecc, ddr5, ddr5ecc | | network-provider | string | false | Internet service provider. | | | network-speed-up | number | false | Upload Bandwidth in mbps. | | | network-speed-down | number | false | Download Bandwidth in mbps. | | -| feat-persistent-storage | boolean | true | True if the provider offers persistent storage. | | -| feat-persistent-storage-type | option | false | Type of persistent storage offered. | ssd, hdd, nvme | +| feat-persistent-storage | boolean | true | True if the provider offers persistent storage (legacy flag; also use storage class 1 capability keys). | | +| feat-shm | boolean | false | True if the provider offers shared memory (SHM) via the ram storage class. | | +| hardware-shm | multiple-option | false | On-chain SHM capability keys (`capabilities/storage/2/class=ram`, `capabilities/storage/2/persistent=false`). | SHM storage class, SHM non-persistent | | tier | option | false | Is this an Akash hosted provider or community hosted? | akash, community | -| workload-support-chia | boolean | false | Does this provider support Chia plotting? | | -| workload-support-chia-capabilities | option | false | What specific capabilities does the provider support for Chia? | bladebit, madmax, bladebit-disk | | feat-endpoint-ip | boolean | false | Does this provider support leasing of IP addresses? | | | feat-endpoint-custom-domain | boolean | false | Does this provider support custom domains? | | diff --git a/packages/console-api-types/src/schema.d.ts b/packages/console-api-types/src/schema.d.ts index 74a585cf02..c27f378621 100644 --- a/packages/console-api-types/src/schema.d.ts +++ b/packages/console-api-types/src/schema.d.ts @@ -48,6 +48,8 @@ export interface paths { address: string | null; denom: string; isTrialing: boolean; + /** @description Minimum USD amount accepted by the next paid top-up for this wallet. */ + topUpMinAmountUsd: number; createdAt: string | null; requires3DS?: boolean; clientSecret?: string | null; @@ -71,6 +73,8 @@ export interface paths { address: string | null; denom: string; isTrialing: boolean; + /** @description Minimum USD amount accepted by the next paid top-up for this wallet. */ + topUpMinAmountUsd: number; createdAt: string | null; requires3DS?: boolean; clientSecret?: string | null; @@ -122,6 +126,8 @@ export interface paths { address: string | null; denom: string; isTrialing: boolean; + /** @description Minimum USD amount accepted by the next paid top-up for this wallet. */ + topUpMinAmountUsd: number; createdAt: string | null; requires3DS?: boolean; clientSecret?: string | null; @@ -364,55 +370,6 @@ export interface paths { patch?: never; trace?: never; }; - "/v1/stripe-webhook": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Stripe Webhook Handler */ - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: { - content: { - "text/plain": string; - }; - }; - responses: { - /** @description Webhook processed successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Stripe signature is required */ - 400: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - error: string; - }; - }; - }; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; "/v1/stripe/prices": { parameters: { query?: never; @@ -3909,17 +3866,19 @@ export interface paths { hardwareCpuArch: string | null; hardwareGpuVendor: string | null; hardwareGpuModels: string[] | null; - hardwareDisk: string[] | null; + hardwareGpuCapabilities: string[] | null; + hardwarePersistentStorageClass: string | null; featPersistentStorage: boolean; - featPersistentStorageType: string[] | null; + featShm: boolean; + hardwareShm: string[] | null; + hardwareCuda: string | null; + datacenter: string | null; hardwareMemory: string | null; networkProvider: string | null; networkSpeedDown: number; networkSpeedUp: number; tier: string | null; featEndpointCustomDomain: boolean; - workloadSupportChia: boolean; - workloadSupportChiaCapabilities: string[] | null; featEndpointIp: boolean; }[]; }; @@ -4037,17 +3996,19 @@ export interface paths { hardwareCpuArch: string | null; hardwareGpuVendor: string | null; hardwareGpuModels: string[]; - hardwareDisk: string[]; + hardwareGpuCapabilities: string[]; + hardwarePersistentStorageClass: string | null; featPersistentStorage: boolean; - featPersistentStorageType: string[]; + featShm: boolean; + hardwareShm: string[]; + hardwareCuda: string | null; + datacenter: string | null; hardwareMemory: string | null; networkProvider: string | null; networkSpeedDown: number; networkSpeedUp: number; tier: string | null; featEndpointCustomDomain: boolean; - workloadSupportChia: boolean; - workloadSupportChiaCapabilities: string[]; featEndpointIp: boolean; uptime: { id: string; @@ -4235,6 +4196,20 @@ export interface paths { }[] | null; }; + "discord-username": { + key: string; + /** @enum {string} */ + type: "string" | "number" | "boolean" | "option" | "multiple-option"; + required: boolean; + description: string; + values?: + | { + key: string; + description: string; + value?: unknown; + }[] + | null; + }; organization: { key: string; /** @enum {string} */ @@ -4431,7 +4406,7 @@ export interface paths { }[] | null; }; - "hardware-disk": { + "hardware-gpu-capability": { key: string; /** @enum {string} */ type: "string" | "number" | "boolean" | "option" | "multiple-option"; @@ -4445,7 +4420,7 @@ export interface paths { }[] | null; }; - "hardware-memory": { + "hardware-persistent-storage-class": { key: string; /** @enum {string} */ type: "string" | "number" | "boolean" | "option" | "multiple-option"; @@ -4459,7 +4434,7 @@ export interface paths { }[] | null; }; - "network-provider": { + "hardware-persistent-storage-capability": { key: string; /** @enum {string} */ type: "string" | "number" | "boolean" | "option" | "multiple-option"; @@ -4473,7 +4448,7 @@ export interface paths { }[] | null; }; - "network-speed-up": { + "hardware-cuda": { key: string; /** @enum {string} */ type: "string" | "number" | "boolean" | "option" | "multiple-option"; @@ -4487,7 +4462,7 @@ export interface paths { }[] | null; }; - "network-speed-down": { + datacenter: { key: string; /** @enum {string} */ type: "string" | "number" | "boolean" | "option" | "multiple-option"; @@ -4501,7 +4476,7 @@ export interface paths { }[] | null; }; - "feat-persistent-storage": { + "hardware-memory": { key: string; /** @enum {string} */ type: "string" | "number" | "boolean" | "option" | "multiple-option"; @@ -4515,7 +4490,7 @@ export interface paths { }[] | null; }; - "feat-persistent-storage-type": { + "network-provider": { key: string; /** @enum {string} */ type: "string" | "number" | "boolean" | "option" | "multiple-option"; @@ -4529,7 +4504,7 @@ export interface paths { }[] | null; }; - "workload-support-chia": { + "network-speed-up": { key: string; /** @enum {string} */ type: "string" | "number" | "boolean" | "option" | "multiple-option"; @@ -4543,7 +4518,49 @@ export interface paths { }[] | null; }; - "workload-support-chia-capabilities": { + "network-speed-down": { + key: string; + /** @enum {string} */ + type: "string" | "number" | "boolean" | "option" | "multiple-option"; + required: boolean; + description: string; + values?: + | { + key: string; + description: string; + value?: unknown; + }[] + | null; + }; + "feat-persistent-storage": { + key: string; + /** @enum {string} */ + type: "string" | "number" | "boolean" | "option" | "multiple-option"; + required: boolean; + description: string; + values?: + | { + key: string; + description: string; + value?: unknown; + }[] + | null; + }; + "feat-shm": { + key: string; + /** @enum {string} */ + type: "string" | "number" | "boolean" | "option" | "multiple-option"; + required: boolean; + description: string; + values?: + | { + key: string; + description: string; + value?: unknown; + }[] + | null; + }; + "hardware-shm": { key: string; /** @enum {string} */ type: "string" | "number" | "boolean" | "option" | "multiple-option"; @@ -6837,13 +6854,9 @@ export interface paths { id: number; cpu: { units: { - /** - * @description String-encoded integer value - * @example 1000 - */ val: string; }; - attributes: { + attributes?: { /** * @description Attribute key * @example persistent @@ -6858,13 +6871,9 @@ export interface paths { }; memory: { quantity: { - /** - * @description String-encoded integer value - * @example 1000 - */ val: string; }; - attributes: { + attributes?: { /** * @description Attribute key * @example persistent @@ -6879,13 +6888,9 @@ export interface paths { }; gpu: { units: { - /** - * @description String-encoded integer value - * @example 1000 - */ val: string; }; - attributes: { + attributes?: { /** * @description Attribute key * @example persistent @@ -6905,13 +6910,9 @@ export interface paths { */ name: string; quantity: { - /** - * @description String-encoded integer value - * @example 1000 - */ val: string; }; - attributes: { + attributes?: { /** * @description Attribute key * @example persistent diff --git a/packages/http-sdk/src/git-hub/git-hub-http.service.ts b/packages/http-sdk/src/git-hub/git-hub-http.service.ts index ec58f30d65..b626e2b58b 100644 --- a/packages/http-sdk/src/git-hub/git-hub-http.service.ts +++ b/packages/http-sdk/src/git-hub/git-hub-http.service.ts @@ -15,6 +15,7 @@ type ProviderAttributeSchemaDetail = { export type ProviderAttributesSchema = { host: ProviderAttributeSchemaDetail; email: ProviderAttributeSchemaDetail; + "discord-username": ProviderAttributeSchemaDetail; organization: ProviderAttributeSchemaDetail; website: ProviderAttributeSchemaDetail; tier: ProviderAttributeSchemaDetail; @@ -29,15 +30,18 @@ export type ProviderAttributesSchema = { "hardware-cpu-arch": ProviderAttributeSchemaDetail; "hardware-gpu": ProviderAttributeSchemaDetail; "hardware-gpu-model": ProviderAttributeSchemaDetail; - "hardware-disk": ProviderAttributeSchemaDetail; + "hardware-gpu-capability": ProviderAttributeSchemaDetail; + "hardware-persistent-storage-class": ProviderAttributeSchemaDetail; + "hardware-persistent-storage-capability": ProviderAttributeSchemaDetail; + "hardware-cuda": ProviderAttributeSchemaDetail; + datacenter: ProviderAttributeSchemaDetail; "hardware-memory": ProviderAttributeSchemaDetail; "network-provider": ProviderAttributeSchemaDetail; "network-speed-up": ProviderAttributeSchemaDetail; "network-speed-down": ProviderAttributeSchemaDetail; "feat-persistent-storage": ProviderAttributeSchemaDetail; - "feat-persistent-storage-type": ProviderAttributeSchemaDetail; - "workload-support-chia": ProviderAttributeSchemaDetail; - "workload-support-chia-capabilities": ProviderAttributeSchemaDetail; + "feat-shm": ProviderAttributeSchemaDetail; + "hardware-shm": ProviderAttributeSchemaDetail; "feat-endpoint-ip": ProviderAttributeSchemaDetail; "feat-endpoint-custom-domain": ProviderAttributeSchemaDetail; }; From 2506e947861a6ad24c3d0553604a986be0ad0caf Mon Sep 17 00:00:00 2001 From: zblocker64 Date: Mon, 8 Jun 2026 16:22:22 -0500 Subject: [PATCH 2/7] fix(provider): load local attributes schema in test env Use config/provider-attributes.json when DEPLOYMENT_ENV=test so provider API tests match the branch schema. Add ProviderSpecs coverage for new fields. --- .../provider-attributes-schema.service.ts | 7 +++ .../providers/ProviderSpecs.spec.tsx | 44 +++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 apps/deploy-web/src/components/providers/ProviderSpecs.spec.tsx diff --git a/apps/api/src/provider/services/provider-attributes-schema/provider-attributes-schema.service.ts b/apps/api/src/provider/services/provider-attributes-schema/provider-attributes-schema.service.ts index a8c7b3dae1..c8b65d1280 100644 --- a/apps/api/src/provider/services/provider-attributes-schema/provider-attributes-schema.service.ts +++ b/apps/api/src/provider/services/provider-attributes-schema/provider-attributes-schema.service.ts @@ -1,5 +1,7 @@ import { GitHubHttpService } from "@akashnetwork/http-sdk"; import { minutesToSeconds } from "date-fns"; +import fs from "fs/promises"; +import path from "path"; import { singleton } from "tsyringe"; import { Memoize } from "@src/caching/helpers"; @@ -10,6 +12,11 @@ export class ProviderAttributesSchemaService { @Memoize({ ttlInSeconds: minutesToSeconds(5) }) async getProviderAttributesSchema() { + if (process.env.DEPLOYMENT_ENV === "test") { + const schemaPath = path.join(__dirname, "../../../../../../config/provider-attributes.json"); + return JSON.parse(await fs.readFile(schemaPath, "utf8")); + } + return await this.gitHubHttpService.getProviderAttributesSchema(); } } diff --git a/apps/deploy-web/src/components/providers/ProviderSpecs.spec.tsx b/apps/deploy-web/src/components/providers/ProviderSpecs.spec.tsx new file mode 100644 index 0000000000..4244015a84 --- /dev/null +++ b/apps/deploy-web/src/components/providers/ProviderSpecs.spec.tsx @@ -0,0 +1,44 @@ +import { describe, expect, it } from "vitest"; + +import { ProviderSpecs } from "./ProviderSpecs"; + +import { render, screen } from "@testing-library/react"; +import { buildProvider } from "@tests/seeders/provider"; + +describe(ProviderSpecs.name, () => { + it("renders provider hardware and feature attributes", () => { + render( + + ); + + expect(screen.getByText("GPU")).toBeInTheDocument(); + expect(screen.getByText("nvidia")).toBeInTheDocument(); + expect(screen.getByText("Shared Memory (SHM)")).toBeInTheDocument(); + expect(screen.getByText("Persistent Storage Class")).toBeInTheDocument(); + expect(screen.getByText("beta3")).toBeInTheDocument(); + expect(screen.getByText("CUDA")).toBeInTheDocument(); + expect(screen.getByText("12.7")).toBeInTheDocument(); + expect(screen.getByText("rtx4090 24Gi")).toBeInTheDocument(); + }); +}); From 8e45e001e5d628a239b9590952526a17d8f94b91 Mon Sep 17 00:00:00 2001 From: zblocker64 Date: Mon, 8 Jun 2026 17:47:29 -0500 Subject: [PATCH 3/7] chore: code rabbit review --- .../provider-attributes-schema.service.ts | 6 +- .../provider-regions.service.integration.ts | 6 +- .../services/provider/provider.service.ts | 6 +- apps/api/src/types/provider.ts | 4 +- apps/api/src/utils/map/provider.spec.ts | 131 ++++++++++++++++++ apps/api/src/utils/map/provider.ts | 12 +- apps/api/swagger/openapi.json | 4 +- .../become-provider/ProviderAttributes.tsx | 4 +- config/provider-attributes.json | 2 +- config/provider-attributes.md | 2 +- 10 files changed, 161 insertions(+), 16 deletions(-) create mode 100644 apps/api/src/utils/map/provider.spec.ts diff --git a/apps/api/src/provider/services/provider-attributes-schema/provider-attributes-schema.service.ts b/apps/api/src/provider/services/provider-attributes-schema/provider-attributes-schema.service.ts index c8b65d1280..5e86ce03e2 100644 --- a/apps/api/src/provider/services/provider-attributes-schema/provider-attributes-schema.service.ts +++ b/apps/api/src/provider/services/provider-attributes-schema/provider-attributes-schema.service.ts @@ -1,4 +1,4 @@ -import { GitHubHttpService } from "@akashnetwork/http-sdk"; +import { GitHubHttpService, type ProviderAttributesSchema } from "@akashnetwork/http-sdk"; import { minutesToSeconds } from "date-fns"; import fs from "fs/promises"; import path from "path"; @@ -11,10 +11,10 @@ export class ProviderAttributesSchemaService { constructor(private readonly gitHubHttpService: GitHubHttpService) {} @Memoize({ ttlInSeconds: minutesToSeconds(5) }) - async getProviderAttributesSchema() { + async getProviderAttributesSchema(): Promise { if (process.env.DEPLOYMENT_ENV === "test") { const schemaPath = path.join(__dirname, "../../../../../../config/provider-attributes.json"); - return JSON.parse(await fs.readFile(schemaPath, "utf8")); + return JSON.parse(await fs.readFile(schemaPath, "utf8")) as ProviderAttributesSchema; } return await this.gitHubHttpService.getProviderAttributesSchema(); diff --git a/apps/api/src/provider/services/provider-regions/provider-regions.service.integration.ts b/apps/api/src/provider/services/provider-regions/provider-regions.service.integration.ts index 27b80dc0a1..137d504192 100644 --- a/apps/api/src/provider/services/provider-regions/provider-regions.service.integration.ts +++ b/apps/api/src/provider/services/provider-regions/provider-regions.service.integration.ts @@ -1,6 +1,6 @@ import type { Provider } from "@akashnetwork/database/dbSchemas/akash"; import { ProviderAttribute } from "@akashnetwork/database/dbSchemas/akash"; -import type { GitHubHttpService } from "@akashnetwork/http-sdk"; +import type { GitHubHttpService, ProviderAttributesSchema } from "@akashnetwork/http-sdk"; import fs from "fs/promises"; import path from "path"; import { container } from "tsyringe"; @@ -50,8 +50,8 @@ describe("ProviderRegions", () => { function setup() { return new ProviderRegionsService( new ProviderAttributesSchemaService({ - async getProviderAttributesSchema() { - return JSON.parse(await fs.readFile(path.join(__dirname, "../../../../../../config/provider-attributes.json"), "utf8")); + async getProviderAttributesSchema(): Promise { + return JSON.parse(await fs.readFile(path.join(__dirname, "../../../../../../config/provider-attributes.json"), "utf8")) as ProviderAttributesSchema; } } as unknown as GitHubHttpService) ); diff --git a/apps/api/src/provider/services/provider/provider.service.ts b/apps/api/src/provider/services/provider/provider.service.ts index fa5a57f933..724f97f08b 100644 --- a/apps/api/src/provider/services/provider/provider.service.ts +++ b/apps/api/src/provider/services/provider/provider.service.ts @@ -254,8 +254,12 @@ export class ProviderService { this.providerAttributesSchemaService.getProviderAttributesSchema() ]); + const mapped = mapProviderToList(provider, providerAttributeSchema, auditors, lastSuccessfulSnapshot ?? undefined); + return { - ...mapProviderToList(provider, providerAttributeSchema, auditors, lastSuccessfulSnapshot ?? undefined), + ...mapped, + hardwareGpuCapabilities: mapped.hardwareGpuCapabilities ?? [], + hardwareShm: mapped.hardwareShm ?? [], uptime: uptimeSnapshots.map(ps => ({ id: ps.id, isOnline: ps.isOnline, diff --git a/apps/api/src/types/provider.ts b/apps/api/src/types/provider.ts index 348befb689..183f75a8a6 100644 --- a/apps/api/src/types/provider.ts +++ b/apps/api/src/types/provider.ts @@ -77,7 +77,9 @@ export interface ProviderCapacityStats { }; } -export interface ProviderDetail extends ProviderList { +export interface ProviderDetail extends Omit { + hardwareGpuCapabilities: string[]; + hardwareShm: string[]; uptime: { id: string; isOnline: boolean; diff --git a/apps/api/src/utils/map/provider.spec.ts b/apps/api/src/utils/map/provider.spec.ts new file mode 100644 index 0000000000..8f37bf2c1a --- /dev/null +++ b/apps/api/src/utils/map/provider.spec.ts @@ -0,0 +1,131 @@ +import type { Provider } from "@akashnetwork/database/dbSchemas/akash"; +import type { ProviderAttributesSchema } from "@akashnetwork/http-sdk"; +import { describe, expect, it } from "vitest"; + +import { createProviderSeed } from "../../../test/seeders/provider.seeder"; +import { mapProviderToList } from "./provider"; + +const schemaDetail = { key: "test", type: "string" as const, required: false, description: "test", values: null }; + +const providerAttributeSchemaStub: ProviderAttributesSchema = { + host: { ...schemaDetail, key: "host" }, + email: { ...schemaDetail, key: "email" }, + "discord-username": { ...schemaDetail, key: "discord-username" }, + organization: { ...schemaDetail, key: "organization" }, + website: { ...schemaDetail, key: "website" }, + tier: { ...schemaDetail, key: "tier" }, + "status-page": { ...schemaDetail, key: "status-page" }, + "location-region": { ...schemaDetail, key: "location-region", type: "option" }, + country: { ...schemaDetail, key: "country" }, + city: { ...schemaDetail, key: "city" }, + timezone: { ...schemaDetail, key: "timezone" }, + "location-type": { ...schemaDetail, key: "location-type" }, + "hosting-provider": { ...schemaDetail, key: "hosting-provider" }, + "hardware-cpu": { ...schemaDetail, key: "hardware-cpu" }, + "hardware-cpu-arch": { ...schemaDetail, key: "hardware-cpu-arch" }, + "hardware-gpu": { ...schemaDetail, key: "hardware-gpu" }, + "hardware-gpu-model": { ...schemaDetail, key: "hardware-gpu-model", type: "multiple-option" }, + "hardware-gpu-capability": { ...schemaDetail, key: "hardware-gpu-capability", type: "multiple-option" }, + "hardware-persistent-storage-class": { ...schemaDetail, key: "hardware-persistent-storage-class", type: "option" }, + "hardware-persistent-storage-capability": { ...schemaDetail, key: "hardware-persistent-storage-capability", type: "boolean" }, + "hardware-cuda": { ...schemaDetail, key: "hardware-cuda" }, + datacenter: { ...schemaDetail, key: "datacenter" }, + "hardware-memory": { ...schemaDetail, key: "hardware-memory" }, + "network-provider": { ...schemaDetail, key: "network-provider" }, + "network-speed-up": { ...schemaDetail, key: "network-speed-up", type: "number" }, + "network-speed-down": { ...schemaDetail, key: "network-speed-down", type: "number" }, + "feat-persistent-storage": { ...schemaDetail, key: "feat-persistent-storage", type: "boolean" }, + "feat-shm": { ...schemaDetail, key: "feat-shm", type: "boolean" }, + "hardware-shm": { ...schemaDetail, key: "hardware-shm", type: "multiple-option" }, + "feat-endpoint-ip": { ...schemaDetail, key: "feat-endpoint-ip", type: "boolean" }, + "feat-endpoint-custom-domain": { ...schemaDetail, key: "feat-endpoint-custom-domain", type: "boolean" } +}; + +function mapWithAttributes(attributes: Array<{ key: string; value: string }>) { + const provider = { + ...createProviderSeed({ isOnline: true, cosmosSdkVersion: "v0.45.9" }), + providerAttributes: attributes, + providerAttributeSignatures: [] + } as Provider; + + return mapProviderToList(provider, providerAttributeSchemaStub, [], undefined); +} + +describe(mapProviderToList.name, () => { + describe("locationRegion", () => { + it("prefers location-region over legacy region", () => { + const mapped = mapWithAttributes([ + { key: "location-region", value: "na-us-west" }, + { key: "region", value: "us-west" } + ]); + + expect(mapped.locationRegion).toBe("na-us-west"); + }); + + it("falls back to legacy region when location-region is absent", () => { + const mapped = mapWithAttributes([{ key: "region", value: "us-west" }]); + + expect(mapped.locationRegion).toBe("us-west"); + }); + }); + + describe("featShm", () => { + it("is true when feat-shm is true", () => { + const mapped = mapWithAttributes([{ key: "feat-shm", value: "true" }]); + + expect(mapped.featShm).toBe(true); + }); + + it("is true when any storage class is ram", () => { + const mapped = mapWithAttributes([ + { key: "capabilities/storage/2/class", value: "ram" }, + { key: "capabilities/storage/2/persistent", value: "false" } + ]); + + expect(mapped.featShm).toBe(true); + }); + + it("is false when no shm signals are present", () => { + const mapped = mapWithAttributes([{ key: "capabilities/storage/1/class", value: "beta3" }]); + + expect(mapped.featShm).toBe(false); + }); + }); + + describe("featPersistentStorage", () => { + it("is true when feat-persistent-storage is true", () => { + const mapped = mapWithAttributes([{ key: "feat-persistent-storage", value: "true" }]); + + expect(mapped.featPersistentStorage).toBe(true); + }); + + it("is true when hardware-persistent-storage-capability is true", () => { + const mapped = mapWithAttributes([{ key: "hardware-persistent-storage-capability", value: "true" }]); + + expect(mapped.featPersistentStorage).toBe(true); + }); + + it("is true when capabilities/storage/1/persistent is true", () => { + const mapped = mapWithAttributes([{ key: "capabilities/storage/1/persistent", value: "true" }]); + + expect(mapped.featPersistentStorage).toBe(true); + }); + + it("is true when persistent storage is declared on a non-default storage index", () => { + const mapped = mapWithAttributes([ + { key: "capabilities/storage/1/class", value: "beta3" }, + { key: "capabilities/storage/1/persistent", value: "false" }, + { key: "capabilities/storage/2/class", value: "beta2" }, + { key: "capabilities/storage/2/persistent", value: "true" } + ]); + + expect(mapped.featPersistentStorage).toBe(true); + }); + + it("is false when no persistent storage signals are present", () => { + const mapped = mapWithAttributes([{ key: "capabilities/storage/1/persistent", value: "false" }]); + + expect(mapped.featPersistentStorage).toBe(false); + }); + }); +}); diff --git a/apps/api/src/utils/map/provider.ts b/apps/api/src/utils/map/provider.ts index f3f896cda2..bf6da3cb9c 100644 --- a/apps/api/src/utils/map/provider.ts +++ b/apps/api/src/utils/map/provider.ts @@ -161,6 +161,16 @@ function getShmSupport(attrMap: Map, schema: ProviderAttributesS return hasShmCapability(attrMap); } +function hasPersistentStorageCapability(attrMap: Map): boolean { + for (const [key, value] of attrMap.entries()) { + if (/^capabilities\/storage\/\d+\/persistent$/.test(key) && value === "true") { + return true; + } + } + + return false; +} + function getPersistentStorageSupport(attrMap: Map, schema: ProviderAttributesSchema): boolean { if (getBooleanAttribute("feat-persistent-storage", attrMap, schema)) { return true; @@ -170,7 +180,7 @@ function getPersistentStorageSupport(attrMap: Map, schema: Provi return true; } - return attrMap.get("capabilities/storage/1/persistent") === "true"; + return hasPersistentStorageCapability(attrMap); } function getNumberAttribute(key: keyof ProviderAttributesSchema, attrMap: Map, schema: ProviderAttributesSchema): number { diff --git a/apps/api/swagger/openapi.json b/apps/api/swagger/openapi.json index f5efaa05f8..4f319eaa39 100644 --- a/apps/api/swagger/openapi.json +++ b/apps/api/swagger/openapi.json @@ -2,7 +2,7 @@ "openapi": "3.0.0", "servers": [ { - "url": "http://localhost:3080" + "url": "https://console-api-sandbox.akash.network" } ], "info": { @@ -1920,7 +1920,6 @@ "schema": { "type": "string", "format": "date", - "default": "2026-06-08", "description": "End date (YYYY-MM-DD). Defaults to today by UTC 23:59:59", "example": "2024-01-31" }, @@ -2046,7 +2045,6 @@ "schema": { "type": "string", "format": "date", - "default": "2026-06-08", "description": "End date (YYYY-MM-DD). Defaults to today by UTC 23:59:59", "example": "2024-01-31" }, diff --git a/apps/provider-console/src/components/become-provider/ProviderAttributes.tsx b/apps/provider-console/src/components/become-provider/ProviderAttributes.tsx index 3894a5a080..5d56c4a87a 100644 --- a/apps/provider-console/src/components/become-provider/ProviderAttributes.tsx +++ b/apps/provider-console/src/components/become-provider/ProviderAttributes.tsx @@ -163,7 +163,7 @@ export const ProviderAttributes: React.FunctionComponent ({ - key: attr.key === "unknown-attributes" ? attr.customKey || "" : attr.key || "", + key: attr.customKey?.trim() ? attr.customKey : attr.key || "", value: attr.value })) }; @@ -171,7 +171,7 @@ export const ProviderAttributes: React.FunctionComponent ({ - key: attr.key === "unknown-attributes" ? attr.customKey || "" : attr.key || "", + key: attr.customKey?.trim() ? attr.customKey : attr.key || "", value: attr.value })); const request = { diff --git a/config/provider-attributes.json b/config/provider-attributes.json index 7d7fb465c0..856bff8d15 100644 --- a/config/provider-attributes.json +++ b/config/provider-attributes.json @@ -39,7 +39,7 @@ "key": "location-region", "type": "option", "required": true, - "description": "Geo location region of the provider. Required on-chain key is location-region (not the legacy region key). Based on the United Nations geoscheme. https://en.wikipedia.org/wiki/United_Nations_geoscheme", + "description": "Geo location region of the provider. Preferred on-chain key is location-region; legacy region is still read for backward compatibility. Based on the United Nations geoscheme. https://en.wikipedia.org/wiki/United_Nations_geoscheme", "values": [ { "key": "na-ca-west", diff --git a/config/provider-attributes.md b/config/provider-attributes.md index a89cfc5da2..c4f1640c2a 100644 --- a/config/provider-attributes.md +++ b/config/provider-attributes.md @@ -8,7 +8,7 @@ | organization | string | true | Name of the organization that owns the provider. | | | website | string | false | Link to the organization's website. | | | status-page | string | false | Link to a status page for the provider. | | -| location-region | option | true | Geo location region of the provider. **Required key: `location-region`** (the legacy `region` key is not supported). [UN Geoscheme](https://en.wikipedia.org/wiki/United_Nations_geoscheme) | See [Location Region Values](#location-region-values) | +| location-region | option | true | Geo location region of the provider. **Preferred key: `location-region`**; legacy `region` is still read for backward compatibility. [UN Geoscheme](https://en.wikipedia.org/wiki/United_Nations_geoscheme) | See [Location Region Values](#location-region-values) | | country | string | false | Country ISO 3166 Alpha-2 code of the provider. [ISO 3166 Country Codes](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes) | | | city | string | false | City 3 letter code of the provider. [Harbor Code](https://www.hh-express.com/en/support/three_code/harbor.html) | | | timezone | option | false | Timezone UTC-12 to UTC+14 of the provider. [Timezone Map](https://www.timeanddate.com/time/map/) | See [Timezone Values](#timezone-values) | From 6d919d598f7b8b667d56a2ed97f8c47f8c28cd21 Mon Sep 17 00:00:00 2001 From: zblocker64 Date: Mon, 8 Jun 2026 22:01:44 -0500 Subject: [PATCH 4/7] fix(provider): load attributes schema via test bootstrap Remove the DEPLOYMENT_ENV branch from ProviderAttributesSchemaService and register a local GitHubHttpService mock in functional/integration setup instead. Share createProviderAttributesSchema() across mapper and service specs. Scope ProviderAttributes customKey overrides to GPU capabilities and unknown attributes only, with a shared toOnChainAttributes helper. --- .../provider-attributes-schema.service.ts | 11 +--- .../provider-regions.service.integration.ts | 16 +---- .../provider/provider.service.spec.ts | 37 +---------- apps/api/src/utils/map/provider.spec.ts | 63 +++++++------------ ...gister-local-provider-attributes-schema.ts | 13 ++++ apps/api/test/seeders/index.ts | 1 + .../provider-attributes-schema.seeder.ts | 15 +++++ apps/api/test/setup-functional-tests.ts | 3 + apps/api/test/setup-integration-tests.ts | 4 ++ .../become-provider/ProviderAttributes.tsx | 32 +++++++--- 10 files changed, 86 insertions(+), 109 deletions(-) create mode 100644 apps/api/test/helpers/register-local-provider-attributes-schema.ts create mode 100644 apps/api/test/seeders/provider-attributes-schema.seeder.ts diff --git a/apps/api/src/provider/services/provider-attributes-schema/provider-attributes-schema.service.ts b/apps/api/src/provider/services/provider-attributes-schema/provider-attributes-schema.service.ts index 5e86ce03e2..a8c7b3dae1 100644 --- a/apps/api/src/provider/services/provider-attributes-schema/provider-attributes-schema.service.ts +++ b/apps/api/src/provider/services/provider-attributes-schema/provider-attributes-schema.service.ts @@ -1,7 +1,5 @@ -import { GitHubHttpService, type ProviderAttributesSchema } from "@akashnetwork/http-sdk"; +import { GitHubHttpService } from "@akashnetwork/http-sdk"; import { minutesToSeconds } from "date-fns"; -import fs from "fs/promises"; -import path from "path"; import { singleton } from "tsyringe"; import { Memoize } from "@src/caching/helpers"; @@ -11,12 +9,7 @@ export class ProviderAttributesSchemaService { constructor(private readonly gitHubHttpService: GitHubHttpService) {} @Memoize({ ttlInSeconds: minutesToSeconds(5) }) - async getProviderAttributesSchema(): Promise { - if (process.env.DEPLOYMENT_ENV === "test") { - const schemaPath = path.join(__dirname, "../../../../../../config/provider-attributes.json"); - return JSON.parse(await fs.readFile(schemaPath, "utf8")) as ProviderAttributesSchema; - } - + async getProviderAttributesSchema() { return await this.gitHubHttpService.getProviderAttributesSchema(); } } diff --git a/apps/api/src/provider/services/provider-regions/provider-regions.service.integration.ts b/apps/api/src/provider/services/provider-regions/provider-regions.service.integration.ts index 137d504192..4913bfb134 100644 --- a/apps/api/src/provider/services/provider-regions/provider-regions.service.integration.ts +++ b/apps/api/src/provider/services/provider-regions/provider-regions.service.integration.ts @@ -1,12 +1,8 @@ import type { Provider } from "@akashnetwork/database/dbSchemas/akash"; import { ProviderAttribute } from "@akashnetwork/database/dbSchemas/akash"; -import type { GitHubHttpService, ProviderAttributesSchema } from "@akashnetwork/http-sdk"; -import fs from "fs/promises"; -import path from "path"; import { container } from "tsyringe"; import { CHAIN_DB } from "@src/chain"; -import { ProviderAttributesSchemaService } from "../provider-attributes-schema/provider-attributes-schema.service"; import { ProviderRegionsService } from "./provider-regions.service"; import { createProvider } from "@test/seeders"; @@ -38,7 +34,7 @@ describe("ProviderRegions", () => { describe("GET /v1/provider-regions", () => { it("returns providers grouped by regions", async () => { - const service = setup(); + const service = container.resolve(ProviderRegionsService); const data = Object.groupBy(await service.getProviderRegions(), item => item.key); expect(data["na-ca-west"]?.[0]?.providers?.sort()).toEqual([providers[0].owner].sort()); @@ -46,14 +42,4 @@ describe("ProviderRegions", () => { expect(data["na-ca-prairie"]?.[0]?.providers?.sort()).toEqual([]); }); }); - - function setup() { - return new ProviderRegionsService( - new ProviderAttributesSchemaService({ - async getProviderAttributesSchema(): Promise { - return JSON.parse(await fs.readFile(path.join(__dirname, "../../../../../../config/provider-attributes.json"), "utf8")) as ProviderAttributesSchema; - } - } as unknown as GitHubHttpService) - ); - } }); diff --git a/apps/api/src/provider/services/provider/provider.service.spec.ts b/apps/api/src/provider/services/provider/provider.service.spec.ts index ee8f81eb03..738e779028 100644 --- a/apps/api/src/provider/services/provider/provider.service.spec.ts +++ b/apps/api/src/provider/services/provider/provider.service.spec.ts @@ -1,6 +1,5 @@ import type { JwtTokenPayload } from "@akashnetwork/chain-sdk"; import type { Provider } from "@akashnetwork/database/dbSchemas/akash"; -import type { ProviderAttributesSchema } from "@akashnetwork/http-sdk"; import { faker } from "@faker-js/faker"; import { AxiosError } from "axios"; import { Ok } from "ts-results"; @@ -11,6 +10,7 @@ import { cacheEngine } from "@src/caching/helpers"; import { AUDITOR } from "@src/deployment/config/provider.config"; import { createLeaseStatus } from "../../../../test/seeders/lease-status.seeder"; import { createProviderSeed, createProviderWithAttributeSignatures } from "../../../../test/seeders/provider.seeder"; +import { createProviderAttributesSchema } from "../../../../test/seeders/provider-attributes-schema.seeder"; import { createUserWallet } from "../../../../test/seeders/user-wallet.seeder"; import type { ProviderRepository } from "../../repositories/provider/provider.repository"; import type { AuditorService } from "../auditors/auditors.service"; @@ -19,40 +19,7 @@ import type { ProviderJwtTokenService } from "../provider-jwt-token/provider-jwt import { ProviderService } from "./provider.service"; import type { ProviderProxyService } from "./provider-proxy.service"; -const schemaDetail = { key: "test", type: "string" as const, required: false, description: "test", values: null }; -const providerAttributeSchemaStub: ProviderAttributesSchema = { - host: schemaDetail, - email: schemaDetail, - "discord-username": schemaDetail, - organization: schemaDetail, - website: schemaDetail, - tier: schemaDetail, - "status-page": schemaDetail, - "location-region": schemaDetail, - country: schemaDetail, - city: schemaDetail, - timezone: schemaDetail, - "location-type": schemaDetail, - "hosting-provider": schemaDetail, - "hardware-cpu": schemaDetail, - "hardware-cpu-arch": schemaDetail, - "hardware-gpu": schemaDetail, - "hardware-gpu-model": schemaDetail, - "hardware-gpu-capability": schemaDetail, - "hardware-persistent-storage-class": schemaDetail, - "hardware-persistent-storage-capability": schemaDetail, - "hardware-cuda": schemaDetail, - datacenter: schemaDetail, - "hardware-memory": schemaDetail, - "network-provider": schemaDetail, - "network-speed-up": schemaDetail, - "network-speed-down": schemaDetail, - "feat-persistent-storage": schemaDetail, - "feat-shm": schemaDetail, - "hardware-shm": schemaDetail, - "feat-endpoint-ip": schemaDetail, - "feat-endpoint-custom-domain": schemaDetail -}; +const providerAttributeSchemaStub = createProviderAttributesSchema(); describe(ProviderService.name, () => { describe("sendManifest", () => { diff --git a/apps/api/src/utils/map/provider.spec.ts b/apps/api/src/utils/map/provider.spec.ts index 8f37bf2c1a..576763ca83 100644 --- a/apps/api/src/utils/map/provider.spec.ts +++ b/apps/api/src/utils/map/provider.spec.ts @@ -1,45 +1,11 @@ import type { Provider } from "@akashnetwork/database/dbSchemas/akash"; -import type { ProviderAttributesSchema } from "@akashnetwork/http-sdk"; import { describe, expect, it } from "vitest"; import { createProviderSeed } from "../../../test/seeders/provider.seeder"; +import { createProviderAttributesSchema } from "../../../test/seeders/provider-attributes-schema.seeder"; import { mapProviderToList } from "./provider"; -const schemaDetail = { key: "test", type: "string" as const, required: false, description: "test", values: null }; - -const providerAttributeSchemaStub: ProviderAttributesSchema = { - host: { ...schemaDetail, key: "host" }, - email: { ...schemaDetail, key: "email" }, - "discord-username": { ...schemaDetail, key: "discord-username" }, - organization: { ...schemaDetail, key: "organization" }, - website: { ...schemaDetail, key: "website" }, - tier: { ...schemaDetail, key: "tier" }, - "status-page": { ...schemaDetail, key: "status-page" }, - "location-region": { ...schemaDetail, key: "location-region", type: "option" }, - country: { ...schemaDetail, key: "country" }, - city: { ...schemaDetail, key: "city" }, - timezone: { ...schemaDetail, key: "timezone" }, - "location-type": { ...schemaDetail, key: "location-type" }, - "hosting-provider": { ...schemaDetail, key: "hosting-provider" }, - "hardware-cpu": { ...schemaDetail, key: "hardware-cpu" }, - "hardware-cpu-arch": { ...schemaDetail, key: "hardware-cpu-arch" }, - "hardware-gpu": { ...schemaDetail, key: "hardware-gpu" }, - "hardware-gpu-model": { ...schemaDetail, key: "hardware-gpu-model", type: "multiple-option" }, - "hardware-gpu-capability": { ...schemaDetail, key: "hardware-gpu-capability", type: "multiple-option" }, - "hardware-persistent-storage-class": { ...schemaDetail, key: "hardware-persistent-storage-class", type: "option" }, - "hardware-persistent-storage-capability": { ...schemaDetail, key: "hardware-persistent-storage-capability", type: "boolean" }, - "hardware-cuda": { ...schemaDetail, key: "hardware-cuda" }, - datacenter: { ...schemaDetail, key: "datacenter" }, - "hardware-memory": { ...schemaDetail, key: "hardware-memory" }, - "network-provider": { ...schemaDetail, key: "network-provider" }, - "network-speed-up": { ...schemaDetail, key: "network-speed-up", type: "number" }, - "network-speed-down": { ...schemaDetail, key: "network-speed-down", type: "number" }, - "feat-persistent-storage": { ...schemaDetail, key: "feat-persistent-storage", type: "boolean" }, - "feat-shm": { ...schemaDetail, key: "feat-shm", type: "boolean" }, - "hardware-shm": { ...schemaDetail, key: "hardware-shm", type: "multiple-option" }, - "feat-endpoint-ip": { ...schemaDetail, key: "feat-endpoint-ip", type: "boolean" }, - "feat-endpoint-custom-domain": { ...schemaDetail, key: "feat-endpoint-custom-domain", type: "boolean" } -}; +const providerAttributeSchemaStub = createProviderAttributesSchema(); function mapWithAttributes(attributes: Array<{ key: string; value: string }>) { const provider = { @@ -92,15 +58,28 @@ describe(mapProviderToList.name, () => { }); }); - describe("featPersistentStorage", () => { - it("is true when feat-persistent-storage is true", () => { - const mapped = mapWithAttributes([{ key: "feat-persistent-storage", value: "true" }]); + describe("hardwareShm", () => { + it("maps shm capability attributes from the schema", () => { + const mapped = mapWithAttributes([ + { key: "capabilities/storage/2/class", value: "ram" }, + { key: "capabilities/storage/2/persistent", value: "false" } + ]); - expect(mapped.featPersistentStorage).toBe(true); + expect(mapped.hardwareShm).toEqual(["SHM storage class", "SHM non-persistent"]); }); + }); + + describe("hardwareGpuCapabilities", () => { + it("maps gpu capability attributes from the schema", () => { + const mapped = mapWithAttributes([{ key: "capabilities/gpu/vendor/nvidia/model/rtx4090", value: "true" }]); + + expect(mapped.hardwareGpuCapabilities).toEqual(["nvidia rtx4090 24Gi pcie"]); + }); + }); - it("is true when hardware-persistent-storage-capability is true", () => { - const mapped = mapWithAttributes([{ key: "hardware-persistent-storage-capability", value: "true" }]); + describe("featPersistentStorage", () => { + it("is true when feat-persistent-storage is true", () => { + const mapped = mapWithAttributes([{ key: "feat-persistent-storage", value: "true" }]); expect(mapped.featPersistentStorage).toBe(true); }); diff --git a/apps/api/test/helpers/register-local-provider-attributes-schema.ts b/apps/api/test/helpers/register-local-provider-attributes-schema.ts new file mode 100644 index 0000000000..dbd501b748 --- /dev/null +++ b/apps/api/test/helpers/register-local-provider-attributes-schema.ts @@ -0,0 +1,13 @@ +import { GitHubHttpService } from "@akashnetwork/http-sdk"; +import { container } from "tsyringe"; +import { mock } from "vitest-mock-extended"; + +import { loadLocalProviderAttributesSchema } from "../seeders/provider-attributes-schema.seeder"; + +export function registerLocalProviderAttributesSchemaGitHubHttpService() { + container.register(GitHubHttpService, { + useValue: mock({ + getProviderAttributesSchema: async () => loadLocalProviderAttributesSchema() + }) + }); +} diff --git a/apps/api/test/seeders/index.ts b/apps/api/test/seeders/index.ts index d8e477a858..10da3008b6 100644 --- a/apps/api/test/seeders/index.ts +++ b/apps/api/test/seeders/index.ts @@ -2,6 +2,7 @@ export * from "./akash-block.seeder"; export * from "./auth0-user.seeder"; export * from "./day.seeder"; export * from "./provider.seeder"; +export * from "./provider-attributes-schema.seeder"; export * from "./provider-snapshot.seeder"; export * from "./provider-snapshot-node.seeder"; export * from "./provider-snapshot-node-gpu.seeder"; diff --git a/apps/api/test/seeders/provider-attributes-schema.seeder.ts b/apps/api/test/seeders/provider-attributes-schema.seeder.ts new file mode 100644 index 0000000000..52d95d044c --- /dev/null +++ b/apps/api/test/seeders/provider-attributes-schema.seeder.ts @@ -0,0 +1,15 @@ +import type { ProviderAttributesSchema } from "@akashnetwork/http-sdk"; +import { readFileSync } from "node:fs"; +import path from "node:path"; + +let cachedSchema: ProviderAttributesSchema | undefined; + +export function loadLocalProviderAttributesSchema(): ProviderAttributesSchema { + cachedSchema ??= JSON.parse(readFileSync(path.join(__dirname, "../../../../config/provider-attributes.json"), "utf8")) as ProviderAttributesSchema; + + return cachedSchema; +} + +export function createProviderAttributesSchema(): ProviderAttributesSchema { + return loadLocalProviderAttributesSchema(); +} diff --git a/apps/api/test/setup-functional-tests.ts b/apps/api/test/setup-functional-tests.ts index c8949b7e89..7895c129d7 100644 --- a/apps/api/test/setup-functional-tests.ts +++ b/apps/api/test/setup-functional-tests.ts @@ -1,9 +1,11 @@ import "reflect-metadata"; +import "@src/core/providers/http-sdk.provider"; import { container } from "tsyringe"; import { cacheEngine } from "@src/caching/helpers"; import { RAW_APP_CONFIG } from "@src/core/providers/raw-app-config.provider"; +import { registerLocalProviderAttributesSchemaGitHubHttpService } from "./helpers/register-local-provider-attributes-schema"; import { TestDatabaseService } from "./services/test-database.service"; const testPath = expect.getState().testPath; @@ -34,6 +36,7 @@ export function clearCache(keyOrPrefix?: string) { } container.register(RAW_APP_CONFIG, { useValue: process.env }); +registerLocalProviderAttributesSchemaGitHubHttpService(); beforeAll(async () => { cacheEngine.clearAllKeyInCache(); diff --git a/apps/api/test/setup-integration-tests.ts b/apps/api/test/setup-integration-tests.ts index 346a405202..cedb5bc65a 100644 --- a/apps/api/test/setup-integration-tests.ts +++ b/apps/api/test/setup-integration-tests.ts @@ -1,13 +1,17 @@ import "reflect-metadata"; +import "@src/core/providers/http-sdk.provider"; import { container } from "tsyringe"; import { cacheEngine } from "@src/caching/helpers"; +import { registerLocalProviderAttributesSchemaGitHubHttpService } from "./helpers/register-local-provider-attributes-schema"; import { TestDatabaseService } from "./services/test-database.service"; const testPath = expect.getState().testPath; const dbService = new TestDatabaseService(testPath!); +registerLocalProviderAttributesSchemaGitHubHttpService(); + beforeAll(async () => { cacheEngine.clearAllKeyInCache(); await dbService.setup(); diff --git a/apps/provider-console/src/components/become-provider/ProviderAttributes.tsx b/apps/provider-console/src/components/become-provider/ProviderAttributes.tsx index 5d56c4a87a..20df651b7b 100644 --- a/apps/provider-console/src/components/become-provider/ProviderAttributes.tsx +++ b/apps/provider-console/src/components/become-provider/ProviderAttributes.tsx @@ -122,6 +122,27 @@ const providerFormSchema = z.object({ type ProviderFormValues = z.infer; +type ProviderFormAttribute = ProviderFormValues["attributes"][number]; + +function toOnChainAttributeKey(attr: ProviderFormAttribute): string { + if (attr.key === "unknown-attributes") { + return attr.customKey?.trim() || ""; + } + + if (attr.key === "hardware-gpu-capability" && attr.customKey?.trim()) { + return attr.customKey.trim(); + } + + return attr.key || ""; +} + +function toOnChainAttributes(attributes: ProviderFormValues["attributes"]): Array<{ key: string; value: string }> { + return attributes.map(attr => ({ + key: toOnChainAttributeKey(attr), + value: attr.value + })); +} + export const ProviderAttributes: React.FunctionComponent = ({ onComplete, existingAttributes, editMode }) => { const [providerProcess, setProviderProcess] = useAtom(providerProcessStore.providerProcessAtom); const organizationName = providerProcess.config?.organization; @@ -159,21 +180,16 @@ export const ProviderAttributes: React.FunctionComponent = async data => { + const attributes = toOnChainAttributes(data.attributes); + if (!editMode) { const updatedProviderProcess = { ...providerProcess, - attributes: data.attributes.map(attr => ({ - key: attr.customKey?.trim() ? attr.customKey : attr.key || "", - value: attr.value - })) + attributes }; setProviderProcess(updatedProviderProcess); onComplete && onComplete(); } else { - const attributes = data.attributes.map(attr => ({ - key: attr.customKey?.trim() ? attr.customKey : attr.key || "", - value: attr.value - })); const request = { control_machine: sanitizeMachineAccess(activeControlMachine), attributes From 5cb7f613e722dbcfa9ba33a35c87f4e8b0bb63f1 Mon Sep 17 00:00:00 2001 From: zblocker64 Date: Mon, 8 Jun 2026 22:30:44 -0500 Subject: [PATCH 5/7] fix(provider): use ram-before-interface GPU capability key Match chain-sdk transformGpuAttributes key order so fully-specified GPU capabilities bid against deployments that pin both ram and interface. --- .../src/components/become-provider/ProviderAttributes.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/provider-console/src/components/become-provider/ProviderAttributes.tsx b/apps/provider-console/src/components/become-provider/ProviderAttributes.tsx index 20df651b7b..51cbfbc001 100644 --- a/apps/provider-console/src/components/become-provider/ProviderAttributes.tsx +++ b/apps/provider-console/src/components/become-provider/ProviderAttributes.tsx @@ -98,7 +98,7 @@ const createGpuAttributes = (gpuConfigs: GpuConfig[] | undefined) => { { key: "hardware-gpu-capability", value: "true", - customKey: `capabilities/gpu/vendor/${vendor}/model/${model}/interface/${iface}/ram/${memory}` + customKey: `capabilities/gpu/vendor/${vendor}/model/${model}/ram/${memory}/interface/${iface}` } ]; }); From 575b70481bd5bdd83740615cc86f0d930fb7e225 Mon Sep 17 00:00:00 2001 From: zblocker64 Date: Mon, 8 Jun 2026 22:48:57 -0500 Subject: [PATCH 6/7] fix(provider): expose discordUsername and fix GPU catalog key order Map discord-username through the provider API, deploy-web detail UI, and provider-console onboarding defaults. Reorder combined GPU capability keys in the attributes catalog to ram-before-interface for chain bid matching. Regenerate OpenAPI and console-api-types via sdk:gen. --- .../provider/http-schemas/provider.schema.ts | 2 + apps/api/src/types/provider.ts | 1 + apps/api/src/utils/map/provider.spec.ts | 14 ++ apps/api/src/utils/map/provider.ts | 1 + apps/api/swagger/openapi.json | 14 +- .../__snapshots__/docs.spec.ts.snap | 10 ++ .../components/providers/ProviderDetail.tsx | 1 + apps/deploy-web/src/types/provider.ts | 1 + apps/deploy-web/tests/seeders/provider.ts | 1 + .../become-provider/ProviderAttributes.tsx | 1 + config/provider-attributes.json | 170 +++++++++--------- packages/console-api-types/src/schema.d.ts | 2 + 12 files changed, 132 insertions(+), 86 deletions(-) diff --git a/apps/api/src/provider/http-schemas/provider.schema.ts b/apps/api/src/provider/http-schemas/provider.schema.ts index 1c2d93dd26..113f9a08bc 100644 --- a/apps/api/src/provider/http-schemas/provider.schema.ts +++ b/apps/api/src/provider/http-schemas/provider.schema.ts @@ -61,6 +61,7 @@ export const ProviderListResponseSchema = z.array( }) ), host: z.string().nullable(), + discordUsername: z.string().nullable(), organization: z.string().nullable(), statusPage: z.string().nullable(), locationRegion: z.string().nullable(), @@ -153,6 +154,7 @@ export const ProviderResponseSchema = z.object({ }) ), host: z.string().nullable(), + discordUsername: z.string().nullable(), organization: z.string().nullable(), statusPage: z.string().nullable(), locationRegion: z.string().nullable(), diff --git a/apps/api/src/types/provider.ts b/apps/api/src/types/provider.ts index 183f75a8a6..698b4dcf8f 100644 --- a/apps/api/src/types/provider.ts +++ b/apps/api/src/types/provider.ts @@ -38,6 +38,7 @@ export interface ProviderList { // Attributes schema host: string | null; + discordUsername: string | null; organization: string | null; statusPage: string | null; locationRegion: string | null; diff --git a/apps/api/src/utils/map/provider.spec.ts b/apps/api/src/utils/map/provider.spec.ts index 576763ca83..0416ede604 100644 --- a/apps/api/src/utils/map/provider.spec.ts +++ b/apps/api/src/utils/map/provider.spec.ts @@ -18,6 +18,20 @@ function mapWithAttributes(attributes: Array<{ key: string; value: string }>) { } describe(mapProviderToList.name, () => { + describe("discordUsername", () => { + it("maps discord-username from on-chain attributes", () => { + const mapped = mapWithAttributes([{ key: "discord-username", value: "provider_contact" }]); + + expect(mapped.discordUsername).toBe("provider_contact"); + }); + + it("is null when discord-username is absent", () => { + const mapped = mapWithAttributes([{ key: "host", value: "example.com" }]); + + expect(mapped.discordUsername).toBeNull(); + }); + }); + describe("locationRegion", () => { it("prefers location-region over legacy region", () => { const mapped = mapWithAttributes([ diff --git a/apps/api/src/utils/map/provider.ts b/apps/api/src/utils/map/provider.ts index bf6da3cb9c..3f07625339 100644 --- a/apps/api/src/utils/map/provider.ts +++ b/apps/api/src/utils/map/provider.ts @@ -80,6 +80,7 @@ export const mapProviderToList = ( })), host: getStringAttribute("host", attrMap, providerAttributeSchema), + discordUsername: getStringAttribute("discord-username", attrMap, providerAttributeSchema), organization: getStringAttribute("organization", attrMap, providerAttributeSchema), statusPage: getStringAttribute("status-page", attrMap, providerAttributeSchema), locationRegion: getLocationRegion(attrMap, providerAttributeSchema), diff --git a/apps/api/swagger/openapi.json b/apps/api/swagger/openapi.json index 4f319eaa39..2043ad58b9 100644 --- a/apps/api/swagger/openapi.json +++ b/apps/api/swagger/openapi.json @@ -2,7 +2,7 @@ "openapi": "3.0.0", "servers": [ { - "url": "https://console-api-sandbox.akash.network" + "url": "http://localhost:3080" } ], "info": { @@ -1920,6 +1920,7 @@ "schema": { "type": "string", "format": "date", + "default": "2026-06-09", "description": "End date (YYYY-MM-DD). Defaults to today by UTC 23:59:59", "example": "2024-01-31" }, @@ -2045,6 +2046,7 @@ "schema": { "type": "string", "format": "date", + "default": "2026-06-09", "description": "End date (YYYY-MM-DD). Defaults to today by UTC 23:59:59", "example": "2024-01-31" }, @@ -9979,6 +9981,10 @@ "type": "string", "nullable": true }, + "discordUsername": { + "type": "string", + "nullable": true + }, "organization": { "type": "string", "nullable": true @@ -10110,6 +10116,7 @@ "gpuModels", "attributes", "host", + "discordUsername", "organization", "statusPage", "locationRegion", @@ -10425,6 +10432,10 @@ "type": "string", "nullable": true }, + "discordUsername": { + "type": "string", + "nullable": true + }, "organization": { "type": "string", "nullable": true @@ -10581,6 +10592,7 @@ "gpuModels", "attributes", "host", + "discordUsername", "organization", "statusPage", "locationRegion", diff --git a/apps/api/test/functional/__snapshots__/docs.spec.ts.snap b/apps/api/test/functional/__snapshots__/docs.spec.ts.snap index f305a524f9..80cf4b2d72 100644 --- a/apps/api/test/functional/__snapshots__/docs.spec.ts.snap +++ b/apps/api/test/functional/__snapshots__/docs.spec.ts.snap @@ -12009,6 +12009,10 @@ exports[`API Docs > GET /v1/doc > returns docs with all routes expected 1`] = ` "nullable": true, "type": "number", }, + "discordUsername": { + "nullable": true, + "type": "string", + }, "email": { "nullable": true, "type": "string", @@ -12233,6 +12237,7 @@ exports[`API Docs > GET /v1/doc > returns docs with all routes expected 1`] = ` "gpuModels", "attributes", "host", + "discordUsername", "organization", "statusPage", "locationRegion", @@ -12345,6 +12350,10 @@ exports[`API Docs > GET /v1/doc > returns docs with all routes expected 1`] = ` "deploymentCount": { "type": "number", }, + "discordUsername": { + "nullable": true, + "type": "string", + }, "email": { "nullable": true, "type": "string", @@ -12705,6 +12714,7 @@ exports[`API Docs > GET /v1/doc > returns docs with all routes expected 1`] = ` "gpuModels", "attributes", "host", + "discordUsername", "organization", "statusPage", "locationRegion", diff --git a/apps/deploy-web/src/components/providers/ProviderDetail.tsx b/apps/deploy-web/src/components/providers/ProviderDetail.tsx index 12568d246c..dc3cbae02e 100644 --- a/apps/deploy-web/src/components/providers/ProviderDetail.tsx +++ b/apps/deploy-web/src/components/providers/ProviderDetail.tsx @@ -192,6 +192,7 @@ export const ProviderDetail: React.FunctionComponent = ({ owner, _provide
+ diff --git a/apps/deploy-web/src/types/provider.ts b/apps/deploy-web/src/types/provider.ts index a769b98cf6..a9cddd1a10 100644 --- a/apps/deploy-web/src/types/provider.ts +++ b/apps/deploy-web/src/types/provider.ts @@ -208,6 +208,7 @@ export interface ApiProviderList { // Attributes schema host: string; + discordUsername: string | null; organization: string; statusPage: string; locationRegion: string; diff --git a/apps/deploy-web/tests/seeders/provider.ts b/apps/deploy-web/tests/seeders/provider.ts index 87b80e6dc5..b1ee505fdc 100644 --- a/apps/deploy-web/tests/seeders/provider.ts +++ b/apps/deploy-web/tests/seeders/provider.ts @@ -76,6 +76,7 @@ export function buildProvider(overrides?: Partial): ApiProvid { key: "capabilities/gpu/vendor/nvidia/model/rtx4000", value: "true", auditedBy: [faker.string.alphanumeric(42)] } ], host: faker.internet.domainWord(), + discordUsername: faker.internet.userName(), organization: faker.company.name(), statusPage: null, locationRegion: "na-us-southeast", diff --git a/apps/provider-console/src/components/become-provider/ProviderAttributes.tsx b/apps/provider-console/src/components/become-provider/ProviderAttributes.tsx index 51cbfbc001..38cc58f7f0 100644 --- a/apps/provider-console/src/components/become-provider/ProviderAttributes.tsx +++ b/apps/provider-console/src/components/become-provider/ProviderAttributes.tsx @@ -163,6 +163,7 @@ export const ProviderAttributes: React.FunctionComponent Date: Tue, 9 Jun 2026 22:55:13 -0500 Subject: [PATCH 7/7] chore: review --- .../provider-regions.service.integration.ts | 2 ++ apps/api/src/utils/map/provider.spec.ts | 11 ++++------- apps/api/src/utils/map/provider.ts | 8 +------- apps/api/swagger/openapi.json | 2 +- .../functional/__snapshots__/docs.spec.ts.snap | 2 +- apps/api/test/functional/providers.spec.ts | 2 ++ apps/api/test/setup-functional-tests.ts | 2 -- apps/api/test/setup-integration-tests.ts | 3 --- .../test/setup-provider-attributes-schema.ts | 3 +++ config/community.code-workspace | 17 +++++++++++++++++ config/provider-attributes.json | 2 +- config/provider-attributes.md | 2 +- 12 files changed, 33 insertions(+), 23 deletions(-) create mode 100644 apps/api/test/setup-provider-attributes-schema.ts create mode 100644 config/community.code-workspace diff --git a/apps/api/src/provider/services/provider-regions/provider-regions.service.integration.ts b/apps/api/src/provider/services/provider-regions/provider-regions.service.integration.ts index 4913bfb134..cb805244b5 100644 --- a/apps/api/src/provider/services/provider-regions/provider-regions.service.integration.ts +++ b/apps/api/src/provider/services/provider-regions/provider-regions.service.integration.ts @@ -1,3 +1,5 @@ +import "@test/setup-provider-attributes-schema"; + import type { Provider } from "@akashnetwork/database/dbSchemas/akash"; import { ProviderAttribute } from "@akashnetwork/database/dbSchemas/akash"; import { container } from "tsyringe"; diff --git a/apps/api/src/utils/map/provider.spec.ts b/apps/api/src/utils/map/provider.spec.ts index 0416ede604..4b35f3176b 100644 --- a/apps/api/src/utils/map/provider.spec.ts +++ b/apps/api/src/utils/map/provider.spec.ts @@ -33,19 +33,16 @@ describe(mapProviderToList.name, () => { }); describe("locationRegion", () => { - it("prefers location-region over legacy region", () => { - const mapped = mapWithAttributes([ - { key: "location-region", value: "na-us-west" }, - { key: "region", value: "us-west" } - ]); + it("maps location-region from on-chain attributes", () => { + const mapped = mapWithAttributes([{ key: "location-region", value: "na-us-west" }]); expect(mapped.locationRegion).toBe("na-us-west"); }); - it("falls back to legacy region when location-region is absent", () => { + it("is null when only legacy region is present", () => { const mapped = mapWithAttributes([{ key: "region", value: "us-west" }]); - expect(mapped.locationRegion).toBe("us-west"); + expect(mapped.locationRegion).toBeNull(); }); }); diff --git a/apps/api/src/utils/map/provider.ts b/apps/api/src/utils/map/provider.ts index 3f07625339..fc17904629 100644 --- a/apps/api/src/utils/map/provider.ts +++ b/apps/api/src/utils/map/provider.ts @@ -129,13 +129,7 @@ function getStringAttribute(key: keyof ProviderAttributesSchema, attrMap: Map, schema: ProviderAttributesSchema): string | null { - const locationRegion = getStringAttribute("location-region", attrMap, schema); - if (locationRegion) { - return locationRegion; - } - - // Legacy providers may still have `region` on-chain; console expects `location-region`. - return attrMap.get("region") || null; + return getStringAttribute("location-region", attrMap, schema); } function getBooleanAttribute(key: keyof ProviderAttributesSchema, attrMap: Map, schema: ProviderAttributesSchema): boolean { diff --git a/apps/api/swagger/openapi.json b/apps/api/swagger/openapi.json index 2043ad58b9..7ed543ad60 100644 --- a/apps/api/swagger/openapi.json +++ b/apps/api/swagger/openapi.json @@ -2,7 +2,7 @@ "openapi": "3.0.0", "servers": [ { - "url": "http://localhost:3080" + "url": "https://console-api-sandbox.akash.network" } ], "info": { diff --git a/apps/api/test/functional/__snapshots__/docs.spec.ts.snap b/apps/api/test/functional/__snapshots__/docs.spec.ts.snap index 80cf4b2d72..2b806add3a 100644 --- a/apps/api/test/functional/__snapshots__/docs.spec.ts.snap +++ b/apps/api/test/functional/__snapshots__/docs.spec.ts.snap @@ -17036,7 +17036,7 @@ exports[`API Docs > GET /v1/doc > returns docs with all routes expected 1`] = ` }, "servers": [ { - "url": "http://localhost:3080", + "url": "https://console-api-sandbox.akash.network", }, ], } diff --git a/apps/api/test/functional/providers.spec.ts b/apps/api/test/functional/providers.spec.ts index b41a6a01d9..d4ef07d8a6 100644 --- a/apps/api/test/functional/providers.spec.ts +++ b/apps/api/test/functional/providers.spec.ts @@ -1,3 +1,5 @@ +import "@test/setup-provider-attributes-schema"; + import type { Provider, ProviderSnapshot } from "@akashnetwork/database/dbSchemas/akash"; import { ProviderAttributeSignature } from "@akashnetwork/database/dbSchemas/akash"; import subDays from "date-fns/subDays"; diff --git a/apps/api/test/setup-functional-tests.ts b/apps/api/test/setup-functional-tests.ts index 7895c129d7..db73125339 100644 --- a/apps/api/test/setup-functional-tests.ts +++ b/apps/api/test/setup-functional-tests.ts @@ -5,7 +5,6 @@ import { container } from "tsyringe"; import { cacheEngine } from "@src/caching/helpers"; import { RAW_APP_CONFIG } from "@src/core/providers/raw-app-config.provider"; -import { registerLocalProviderAttributesSchemaGitHubHttpService } from "./helpers/register-local-provider-attributes-schema"; import { TestDatabaseService } from "./services/test-database.service"; const testPath = expect.getState().testPath; @@ -36,7 +35,6 @@ export function clearCache(keyOrPrefix?: string) { } container.register(RAW_APP_CONFIG, { useValue: process.env }); -registerLocalProviderAttributesSchemaGitHubHttpService(); beforeAll(async () => { cacheEngine.clearAllKeyInCache(); diff --git a/apps/api/test/setup-integration-tests.ts b/apps/api/test/setup-integration-tests.ts index cedb5bc65a..ace66eb5cd 100644 --- a/apps/api/test/setup-integration-tests.ts +++ b/apps/api/test/setup-integration-tests.ts @@ -4,14 +4,11 @@ import "@src/core/providers/http-sdk.provider"; import { container } from "tsyringe"; import { cacheEngine } from "@src/caching/helpers"; -import { registerLocalProviderAttributesSchemaGitHubHttpService } from "./helpers/register-local-provider-attributes-schema"; import { TestDatabaseService } from "./services/test-database.service"; const testPath = expect.getState().testPath; const dbService = new TestDatabaseService(testPath!); -registerLocalProviderAttributesSchemaGitHubHttpService(); - beforeAll(async () => { cacheEngine.clearAllKeyInCache(); await dbService.setup(); diff --git a/apps/api/test/setup-provider-attributes-schema.ts b/apps/api/test/setup-provider-attributes-schema.ts new file mode 100644 index 0000000000..0ec884d109 --- /dev/null +++ b/apps/api/test/setup-provider-attributes-schema.ts @@ -0,0 +1,3 @@ +import { registerLocalProviderAttributesSchemaGitHubHttpService } from "./helpers/register-local-provider-attributes-schema"; + +registerLocalProviderAttributesSchemaGitHubHttpService(); diff --git a/config/community.code-workspace b/config/community.code-workspace new file mode 100644 index 0000000000..39cc2ecd40 --- /dev/null +++ b/config/community.code-workspace @@ -0,0 +1,17 @@ +{ + "folders": [ + { + "path": "../../community" + }, + { + "path": "../../website" + }, + { + "path": ".." + }, + { + "path": "../../provider-configs" + } + ], + "settings": {} +} \ No newline at end of file diff --git a/config/provider-attributes.json b/config/provider-attributes.json index cd1e8ce701..5de7aab295 100644 --- a/config/provider-attributes.json +++ b/config/provider-attributes.json @@ -39,7 +39,7 @@ "key": "location-region", "type": "option", "required": true, - "description": "Geo location region of the provider. Preferred on-chain key is location-region; legacy region is still read for backward compatibility. Based on the United Nations geoscheme. https://en.wikipedia.org/wiki/United_Nations_geoscheme", + "description": "Geo location region of the provider. On-chain key is location-region. Legacy region is not read. Based on the United Nations geoscheme. https://en.wikipedia.org/wiki/United_Nations_geoscheme", "values": [ { "key": "na-ca-west", diff --git a/config/provider-attributes.md b/config/provider-attributes.md index c4f1640c2a..6e2fa5a946 100644 --- a/config/provider-attributes.md +++ b/config/provider-attributes.md @@ -8,7 +8,7 @@ | organization | string | true | Name of the organization that owns the provider. | | | website | string | false | Link to the organization's website. | | | status-page | string | false | Link to a status page for the provider. | | -| location-region | option | true | Geo location region of the provider. **Preferred key: `location-region`**; legacy `region` is still read for backward compatibility. [UN Geoscheme](https://en.wikipedia.org/wiki/United_Nations_geoscheme) | See [Location Region Values](#location-region-values) | +| location-region | option | true | Geo location region of the provider. On-chain key is `location-region`; legacy `region` is not read. [UN Geoscheme](https://en.wikipedia.org/wiki/United_Nations_geoscheme) | See [Location Region Values](#location-region-values) | | country | string | false | Country ISO 3166 Alpha-2 code of the provider. [ISO 3166 Country Codes](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes) | | | city | string | false | City 3 letter code of the provider. [Harbor Code](https://www.hh-express.com/en/support/three_code/harbor.html) | | | timezone | option | false | Timezone UTC-12 to UTC+14 of the provider. [Timezone Map](https://www.timeanddate.com/time/map/) | See [Timezone Values](#timezone-values) |