G4: a page that makes 3D models, and ctl 3d

/3d beside /images, while some model makes meshes: a picture chosen, the
job asked for through the same path an API client's takes, its progress
shown (waiting for the card, n ahead; making it, the node and percent),
and the mesh in a viewer — model-viewer 4.4.0 (Apache 2.0, with three.js
and lit), served from the gateway since the page's policy loads scripts
from nowhere else — with a download and the model's licence. The mesh is
served to its owner from /3d/jobs/{id}/file; another project's person is
told there is no such job.

A job made from the portal acted for a key that does not exist: the
worker now rebuilds a session's principal from the account that made it,
while it is active and still in the project the job is charged to.

ctl 3d list|get|cancel, over /api/v1/client-jobs (/api/v1/jobs is the
control plane's own work, which ctl jobs shows).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Ilker ManapandClaude Opus 5.5 committed 2026-10-10 19:16:20 +02:00
1 parent dfc2f0bf15
commit 2f54780802
30 files changed
+2323 -15

No files matched your search

+176
View File
@@ -29,6 +29,9 @@
{
"name": "capacity"
},
{
"name": "client-jobs"
},
{
"name": "eval"
},
@@ -280,6 +283,133 @@
}
}
},
"/api/v1/client-jobs": {
"get": {
"operationId": "getClientJobs",
"summary": "Jobs clients asked for — 3D models — of every owner, newest first",
"tags": [
"client-jobs"
],
"parameters": [
{
"name": "status",
"in": "query",
"description": "Only jobs in this status: queued, running, cancelling, completed, failed, cancelled, expired.",
"schema": {
"type": "string"
}
},
{
"name": "limit",
"in": "query",
"description": "The most jobs to answer with; 50 when absent.",
"schema": {
"type": "integer"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/JobView"
}
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
}
},
"/api/v1/client-jobs/{id}": {
"get": {
"operationId": "getClientJobsId",
"summary": "One job a client asked for",
"tags": [
"client-jobs"
],
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"description": "The job's ID, job_….",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/JobView"
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
}
},
"/api/v1/client-jobs/{id}/cancel": {
"post": {
"operationId": "postClientJobsIdCancel",
"summary": "Stop a job, in the engine's queue too",
"tags": [
"client-jobs"
],
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"description": "The job's ID, job_….",
"schema": {
"type": "string"
}
},
{
"$ref": "#/components/parameters/Actor"
}
],
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/JobView"
}
}
}
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"default": {
"$ref": "#/components/responses/Error"
}
}
}
},
"/api/v1/eval/runs": {
"get": {
"operationId": "getEvalRuns",
@@ -6016,6 +6146,52 @@
}
}
},
"JobView": {
"type": "object",
"description": "JobView is one job.",
"properties": {
"id": {
"type": "string"
},
"owner": {
"type": "string"
},
"key_id": {
"type": "string"
},
"endpoint": {
"type": "string"
},
"model": {
"type": "string"
},
"status": {
"type": "string"
},
"progress": {
"description": "Any JSON value."
},
"output_file_id": {
"type": "string"
},
"content_type": {
"type": "string"
},
"error": {
"type": "string"
},
"created_at": {
"type": "string",
"format": "date-time"
},
"started_at": {
"type": "string"
},
"finished_at": {
"type": "string"
}
}
},
"JudgeAskRequest": {
"type": "object",
"description": "JudgeAskRequest is a text to have a judge read.",