Add cloud-runtime experiment node-schema endpoints to spec (#13806)

* Add cloud-runtime experiment node-schema endpoints to spec

Replace the GET operations at /api/experiment/nodes and
/api/experiment/nodes/{id} with getNodeInfoSchema and getNodeByID —
the optimized, ETag-tagged object_info schema endpoints the cloud
frontend depends on for the workflow editor.

Each operation is tagged x-runtime: [cloud] and uses the runtime-only
tag for cloud-side codegen exclusion. Response headers document the
ETag and Cache-Control validators; 304 Not Modified is declared for
RFC 7232 conditional GETs.

Remove the now-unused CloudNodeList schema to keep Spectral clean.

Co-authored-by: Matt Miller <MillerMedia@users.noreply.github.com>

* spec: document If-None-Match header on conditional GET endpoints

Both `getNodeInfoSchema` and `getNodeByID` advertise `ETag` response
headers and a `304 Not Modified` response, but the spec didn't declare
the `If-None-Match` request header that triggers conditional validation.
Adding it as an optional header parameter on both ops so client codegen
exposes the conditional-GET pattern.
This commit is contained in:
Matt Miller 2026-05-08 19:14:23 -07:00 committed by GitHub
parent 66669b2ded
commit 4e823431cc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -74,6 +74,8 @@ tags:
description: Cloud workflow management and versioning (cloud-only) description: Cloud workflow management and versioning (cloud-only)
- name: task - name: task
description: Background task management (cloud-only) description: Background task management (cloud-only)
- name: runtime-only
description: Operations served exclusively by the cloud runtime with no local equivalent
paths: paths:
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
@ -2573,35 +2575,38 @@ paths:
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
/api/experiment/nodes: /api/experiment/nodes:
get: get:
operationId: listCloudNodes operationId: getNodeInfoSchema
tags: [node] tags: [runtime-only]
summary: List installed custom nodes summary: Get pre-rendered node info schema
description: "[cloud-only] Returns the list of custom node packages installed in the cloud runtime." description: "[cloud-only] Returns the static ComfyUI object_info schema, identical for every caller, rendered once at startup with empty model/user-file context. Served by a raw HTTP handler that writes pre-rendered bytes with ETag + Cache-Control validators for RFC 7232 conditional GETs."
x-runtime: [cloud] x-runtime: [cloud]
parameters: parameters:
- name: limit - name: If-None-Match
in: query in: header
required: false
schema: schema:
type: integer type: string
description: Maximum number of results description: Entity tag previously returned by this endpoint. When present and matching, the server returns 304 Not Modified.
- name: offset
in: query
schema:
type: integer
description: Pagination offset
responses: responses:
"200": "200":
description: Custom node list description: Node info schema
headers:
ETag:
schema:
type: string
description: Entity tag for conditional request validation
Cache-Control:
schema:
type: string
description: Cache directives for the response
content: content:
application/json: application/json:
schema: schema:
$ref: "#/components/schemas/CloudNodeList" type: object
"401": additionalProperties:
description: Unauthorized $ref: "#/components/schemas/NodeInfo"
content: "304":
application/json: description: Not Modified — returned when the client sends a matching If-None-Match header
schema:
$ref: "#/components/schemas/CloudError"
post: post:
operationId: installCloudNode operationId: installCloudNode
tags: [node] tags: [node]
@ -2651,10 +2656,10 @@ paths:
/api/experiment/nodes/{id}: /api/experiment/nodes/{id}:
get: get:
operationId: getCloudNode operationId: getNodeByID
tags: [node] tags: [runtime-only]
summary: Get details of an installed custom node summary: Get a single node definition by ID
description: "[cloud-only] Returns details about a specific installed custom node package." description: "[cloud-only] Returns one node's definition from the pre-indexed object_info schema. Served by a raw HTTP handler that writes pre-rendered bytes with ETag + Cache-Control validators for RFC 7232 conditional GETs."
x-runtime: [cloud] x-runtime: [cloud]
parameters: parameters:
- name: id - name: id
@ -2662,26 +2667,33 @@ paths:
required: true required: true
schema: schema:
type: string type: string
description: Custom node package ID description: Node class identifier
- name: If-None-Match
in: header
required: false
schema:
type: string
description: Entity tag previously returned by this endpoint. When present and matching, the server returns 304 Not Modified.
responses: responses:
"200": "200":
description: Node detail description: Single node definition
headers:
ETag:
schema:
type: string
description: Entity tag for conditional request validation
Cache-Control:
schema:
type: string
description: Cache directives for the response
content: content:
application/json: application/json:
schema: schema:
$ref: "#/components/schemas/CloudNode" $ref: "#/components/schemas/NodeInfo"
"401": "304":
description: Unauthorized description: Not Modified — returned when the client sends a matching If-None-Match header
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404": "404":
description: Not found description: Node not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
delete: delete:
operationId: uninstallCloudNode operationId: uninstallCloudNode
tags: [node] tags: [node]
@ -7100,22 +7112,6 @@ components:
enabled: enabled:
type: boolean type: boolean
CloudNodeList:
type: object
x-runtime: [cloud]
description: "[cloud-only] Paginated list of installed custom node packages."
required:
- nodes
properties:
nodes:
type: array
items:
$ref: "#/components/schemas/CloudNode"
total:
type: integer
has_more:
type: boolean
HubLabel: HubLabel:
type: object type: object
x-runtime: [cloud] x-runtime: [cloud]