openvibers/openvibe.contracts Commits

ai.run@1 1.1.0: the explain says why the run answered as it did (L33 P3, L36 Y7) (#270)

OP OpenVibers committed 12 days ago · b1995c3dbe · 49 files, +1340 −93

* ai.run@1 1.1.0: the explain says why the run answered as it did (L33 P3, L36 Y7)

The task-aware router's account of a run, as an optional member of the run response: the requirement set it read off the request (task), the candidates it ranked and why (ranked), and every attempt with why it was chosen and why it failed (attempts). Additive: the contract's id and major stay, no field changed, and the package is 0.258.0 with no tag cut yet.

* ai.run@1 1.1.0: let the explain's selected be a machine too

A run on the person's own machine reports which machine answered, so selected may be an object; and a candidate that was never placed (a machine that was skipped) still has a provider. Both are additive.

* 0.262.0: ai.run@1 1.1.0: the explain says why the run answered as it did (L33 P3, L36 Y7)

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex 5d21e89a..45e32c1a 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -1,5 +1,19 @@
# Changelog
++## 0.262.0 — 2026-10-31
++
++- **The task-aware router's explain** (L33 P3 "the router picks for the task", L36 Y7 "a smarter router";
++ OpenVibe.AI). `ai.run@1` (1.1.0) gains an optional `explain`: why the run answered as it did.
++ - `task`: the requirement set the router read off the request with no model call — `vision`, `tools`, `json`,
++ `min_context` (tokens), `reasoning` (none, some, deep), `output` (text, image, audio, video) and `weight`
++ (light, standard, heavy).
++ - `ranked`: the candidates the router ranked for that task, best first (at most five), each with its reason
++ (the cheapest with vision, the strong tier, warm cache), its price and its catalogue tier.
++ - `attempts`: every provider that was tried, why it was chosen and what went wrong when it failed.
++ - `objective`, `reasons`, `selected`, `candidates` and `paid_by`: the placement view the ranking came from and
++ who paid. `bench` and `usage_readings` stay the optional projections they are.
++ - Nothing else changed: the release is additive, the contract's own id and major stay, and no tag is cut yet.
++
## 0.261.0 — 2026-10-31
- **The machines hub** (plan L34, steps M2 and M4). A person's computers are the network's: Bot stays the device
ddiff --git a/contracts/ai/run.v1.json b/contracts/ai/run.v1.json
iindex 4af3d9c5..855d565a 100644
---- a/contracts/ai/run.v1.json
++++ b/contracts/ai/run.v1.json
@@@ -2,7 +2,7 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/ai/run.v1.json",
"title": "AiRun",
-- "description": "A workflow run on OpenVibe.AI (ADR-015; server/runs.js decode): the `run` member of every run response (POST /api/v1/runs and the direct operations, GET /api/v1/runs/:id, cancel, retry) and each item of GET /api/v1/runs { runs }. Output is attributable to workflow + version + template version + route version + provider/model + run id, never to a person. A draft stays a draft: products store it with ai/ai_assisted authorship and publish nothing until a person reviews it. input keeps no inline media (replaced by data_url_sha256 and data_url_bytes) and no passthrough prompt ({ not_retained }); output is null until the run succeeded or was served from cache and then matches the workflow version's output_schema. requester is the token principal (service, app or mod). A run interrupted by a restart or shutdown ends failed with error.code run.interrupted.",
++ "description": "A workflow run on OpenVibe.AI (ADR-015; server/runs.js decode): the `run` member of every run response (POST /api/v1/runs and the direct operations, GET /api/v1/runs/:id, cancel, retry) and each item of GET /api/v1/runs { runs }. Output is attributable to workflow + version + template version + route version + provider/model + run id, never to a person. A draft stays a draft: products store it with ai/ai_assisted authorship and publish nothing until a person reviews it. input keeps no inline media (replaced by data_url_sha256 and data_url_bytes) and no passthrough prompt ({ not_retained }); output is null until the run succeeded or was served from cache and then matches the workflow version's output_schema. requester is the token principal (service, app or mod). A run interrupted by a restart or shutdown ends failed with error.code run.interrupted. explain says why the run answered as it did: the task it read, the candidates it ranked and every attempt.",
"type": "object",
"required": ["id", "status", "workflow", "template", "route", "requester", "on_behalf_of", "attribution", "source_service", "target", "input", "output", "error", "synthetic", "provenance", "usage", "citations_count", "retry_of", "idempotency_key", "trace_id", "created_at", "started_at", "finished_at"],
"additionalProperties": false,
@@@ -74,6 +74,253 @@
"trace_id": { "type": ["string", "null"] },
"created_at": { "type": "string", "format": "date-time" },
"started_at": { "type": ["string", "null"], "format": "date-time" },
-- "finished_at": { "type": ["string", "null"], "format": "date-time" }
++ "finished_at": { "type": ["string", "null"], "format": "date-time" },
++ "explain": {
++ "type": [
++ "object",
++ "null"
++ ],
++ "description": "Why the run answered as it did: the task-aware router's explain (L33 P3, L36 Y7). task is the requirement set it read from the request, ranked the candidates it considered and why, attempts every provider it tried with why it was chosen and why it failed, and the placement view it ranked from (objective, reasons, selected, candidates). A run that never reached a provider has no explain.",
++ "required": [
++ "objective",
++ "reasons",
++ "selected",
++ "candidates"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "objective": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "description": "The objective the pool planned with (cheapest, balanced, correctness, own-keys, own-machine), or null for a pinned route."
++ },
++ "reasons": {
++ "type": "array",
++ "items": {
++ "type": "string"
++ },
++ "description": "Why the router chose what it chose, in words."
++ },
++ "selected": {
++ "type": [
++ "string",
++ "object",
++ "null"
++ ],
++ "description": "The provider that answered (provider, or provider/model, or the machine that answered), or null when nothing answered."
++ },
++ "candidates": {
++ "type": "array",
++ "description": "Every candidate the pool considered, with why it was excluded when it was.",
++ "items": {
++ "type": "object",
++ "required": [
++ "provider"
++ ],
++ "additionalProperties": true,
++ "properties": {
++ "provider": {
++ "type": "string"
++ },
++ "model": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "eligible": {
++ "type": "boolean"
++ },
++ "excluded_reason": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "cost": {
++ "type": [
++ "number",
++ "null"
++ ]
++ },
++ "latency": {
++ "type": [
++ "number",
++ "null"
++ ]
++ }
++ }
++ }
++ },
++ "paid_by": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "description": "Who paid for the run: the network, the person's own key, their own machine, or a project's own provider."
++ },
++ "task": {
++ "type": "object",
++ "description": "The requirement set the router read off the request, with no model call.",
++ "required": [
++ "vision",
++ "tools",
++ "json",
++ "min_context",
++ "reasoning",
++ "output",
++ "weight"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "vision": {
++ "type": "boolean",
++ "description": "The request carried a picture."
++ },
++ "tools": {
++ "type": "boolean",
++ "description": "The request carried tools."
++ },
++ "json": {
++ "type": "boolean",
++ "description": "The request asked for JSON out."
++ },
++ "min_context": {
++ "type": "integer",
++ "minimum": 0,
++ "description": "The context window the request needs, in tokens."
++ },
++ "reasoning": {
++ "enum": [
++ "none",
++ "some",
++ "deep"
++ ],
++ "description": "How much thinking the request asked for."
++ },
++ "output": {
++ "enum": [
++ "text",
++ "image",
++ "audio",
++ "video"
++ ],
++ "description": "What the request wants out."
++ },
++ "weight": {
++ "enum": [
++ "light",
++ "standard",
++ "heavy"
++ ],
++ "description": "How heavy the work is."
++ }
++ }
++ },
++ "ranked": {
++ "type": "array",
++ "maxItems": 5,
++ "description": "The candidates the router ranked for this task, best first, each with its reason.",
++ "items": {
++ "type": "object",
++ "required": [
++ "provider",
++ "why"
++ ],
++ "additionalProperties": true,
++ "properties": {
++ "provider": {
++ "type": "string"
++ },
++ "model": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "why": {
++ "type": "string",
++ "description": "Why this candidate is here (the cheapest with vision, the strong tier, warm cache)."
++ },
++ "cost": {
++ "type": [
++ "number",
++ "null"
++ ],
++ "description": "The input price per million tokens, or null when the price is unknown."
++ },
++ "tier": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "description": "The catalogue's strength tier: fast, balanced, strong or frontier."
++ }
++ }
++ }
++ },
++ "attempts": {
++ "type": "array",
++ "description": "Every attempt, in order: why it was chosen, and what went wrong when it failed.",
++ "items": {
++ "type": "object",
++ "required": [
++ "provider",
++ "status"
++ ],
++ "additionalProperties": true,
++ "properties": {
++ "key": {
++ "type": "string",
++ "description": "Which key or wallet paid for the attempt; never a key."
++ },
++ "provider": {
++ "type": "string"
++ },
++ "model": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "why": {
++ "type": "string",
++ "description": "Why this provider was tried."
++ },
++ "status": {
++ "enum": [
++ "ok",
++ "failed",
++ "timeout",
++ "skipped"
++ ]
++ },
++ "error": {
++ "type": [
++ "string",
++ "null"
++ ]
++ }
++ }
++ }
++ },
++ "bench": {
++ "type": [
++ "object",
++ "null"
++ ],
++ "description": "The Bench evidence the route used, when it opted in."
++ },
++ "usage_readings": {
++ "type": "array",
++ "items": {
++ "type": "object"
++ },
++ "description": "The billing readings of the run, when it has any."
++ }
++ }
++ }
}
}
ddiff --git a/contracts/catalog.json b/contracts/catalog.json
iindex a146443a..f06707b7 100644
---- a/contracts/catalog.json
++++ b/contracts/catalog.json
@@@ -1372,7 +1372,7 @@
},
{
"id": "ai.run",
-- "version": "1.0.0",
++ "version": "1.1.0",
"owner": "ai",
"schema": "ai/run.v1.json",
"visibility": "first-party",
ddiff --git a/fixtures/ai.run/valid/with-explain.json b/fixtures/ai.run/valid/with-explain.json
nnew file mode 100644
iindex 00000000..a97dd2f8
---- /dev/null
++++ b/fixtures/ai.run/valid/with-explain.json
@@@ -0,0 +1,128 @@
++{
++ "id": "run_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "status": "succeeded",
++ "workflow": {
++ "key": "news.summarize_story",
++ "version": 2
++ },
++ "template": {
++ "key": "news.summarize_story",
++ "version": 3
++ },
++ "route": {
++ "key": "default.text",
++ "version": 1
++ },
++ "requester": {
++ "type": "service",
++ "id": "news"
++ },
++ "on_behalf_of": null,
++ "attribution": null,
++ "source_service": "news",
++ "target": {
++ "service": "news",
++ "type": "story",
++ "id": "sty_01JAB2C3D4E5F6G7H8J9K0MNPQ"
++ },
++ "input": {
++ "topic": "Transit strike",
++ "sources": [
++ {
++ "source_type": "news.item",
++ "source_id": "itm_42"
++ }
++ ]
++ },
++ "output": {
++ "headline": "Transit strike begins",
++ "summary": "Workers walked out.",
++ "citations": [
++ 0
++ ],
++ "gaps": []
++ },
++ "error": null,
++ "synthetic": false,
++ "provenance": {
++ "origin": "ai",
++ "workflow": "news.summarize_story",
++ "workflow_version": 2,
++ "template_version": 3,
++ "route": "default.text",
++ "route_version": 1,
++ "provider": "anthropic",
++ "model": "claude-sonnet",
++ "fallback_used": true,
++ "run_id": "run_01JAB2C3D4E5F6G7H8J9K0MNPQ",
++ "cached_from": null,
++ "synthetic": false
++ },
++ "usage": {
++ "tokens_in": 1200,
++ "tokens_out": 300,
++ "cost_usd": 0.0081,
++ "attempts": 2
++ },
++ "citations_count": 1,
++ "retry_of": null,
++ "idempotency_key": null,
++ "trace_id": "4bf92f3577b34da6a3ce929d0e0e4736",
++ "created_at": "2026-09-23T10:00:00.000Z",
++ "started_at": "2026-09-23T10:00:00.050Z",
++ "finished_at": "2026-09-23T10:00:04.200Z",
++ "explain": {
++ "objective": "cheapest",
++ "reasons": [
++ "the cheapest model that can do this job"
++ ],
++ "selected": "anthropic",
++ "candidates": [
++ {
++ "provider": "anthropic",
++ "model": "claude-sonnet",
++ "eligible": true,
++ "excluded_reason": null,
++ "cost": 3e-06,
++ "latency": 900
++ },
++ {
++ "provider": "openai",
++ "model": "gpt-4o-mini",
++ "eligible": false,
++ "excluded_reason": "no_vision",
++ "cost": 1e-06,
++ "latency": 700
++ }
++ ],
++ "paid_by": "openvibe",
++ "task": {
++ "vision": true,
++ "tools": false,
++ "json": false,
++ "min_context": 1536,
++ "reasoning": "none",
++ "output": "text",
++ "weight": "standard"
++ },
++ "ranked": [
++ {
++ "provider": "anthropic",
++ "model": "claude-sonnet",
++ "why": "the cheapest with vision",
++ "cost": 3,
++ "tier": "strong"
++ }
++ ],
++ "attempts": [
++ {
++ "key": "openvibe",
++ "provider": "anthropic",
++ "model": "claude-sonnet",
++ "why": "the cheapest with vision",
++ "status": "ok",
++ "error": null
++ }
++ ]
++ }
++}
ddiff --git a/generated/json-schema/bundle.json b/generated/json-schema/bundle.json
iindex 85ef529d..dc34b43b 100644
---- a/generated/json-schema/bundle.json
++++ b/generated/json-schema/bundle.json
@@@ -14686,14 +14686,14 @@
}
},
"ai.run": {
-- "version": "1.0.0",
++ "version": "1.1.0",
"owner": "ai",
"status": "active",
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://openvibe.network/contracts/ai/run.v1.json",
"title": "AiRun",
-- "description": "A workflow run on OpenVibe.AI (ADR-015; server/runs.js decode): the `run` member of every run response (POST /api/v1/runs and the direct operations, GET /api/v1/runs/:id, cancel, retry) and each item of GET /api/v1/runs { runs }. Output is attributable to workflow + version + template version + route version + provider/model + run id, never to a person. A draft stays a draft: products store it with ai/ai_assisted authorship and publish nothing until a person reviews it. input keeps no inline media (replaced by data_url_sha256 and data_url_bytes) and no passthrough prompt ({ not_retained }); output is null until the run succeeded or was served from cache and then matches the workflow version's output_schema. requester is the token principal (service, app or mod). A run interrupted by a restart or shutdown ends failed with error.code run.interrupted.",
++ "description": "A workflow run on OpenVibe.AI (ADR-015; server/runs.js decode): the `run` member of every run response (POST /api/v1/runs and the direct operations, GET /api/v1/runs/:id, cancel, retry) and each item of GET /api/v1/runs { runs }. Output is attributable to workflow + version + template version + route version + provider/model + run id, never to a person. A draft stays a draft: products store it with ai/ai_assisted authorship and publish nothing until a person reviews it. input keeps no inline media (replaced by data_url_sha256 and data_url_bytes) and no passthrough prompt ({ not_retained }); output is null until the run succeeded or was served from cache and then matches the workflow version's output_schema. requester is the token principal (service, app or mod). A run interrupted by a restart or shutdown ends failed with error.code run.interrupted. explain says why the run answered as it did: the task it read, the candidates it ranked and every attempt.",
"type": "object",
"required": [
"id",
@@@ -15027,6 +15027,253 @@
"null"
],
"format": "date-time"
++ },
++ "explain": {
++ "type": [
++ "object",
++ "null"
++ ],
++ "description": "Why the run answered as it did: the task-aware router's explain (L33 P3, L36 Y7). task is the requirement set it read from the request, ranked the candidates it considered and why, attempts every provider it tried with why it was chosen and why it failed, and the placement view it ranked from (objective, reasons, selected, candidates). A run that never reached a provider has no explain.",
++ "required": [
++ "objective",
++ "reasons",
++ "selected",
++ "candidates"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "objective": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "description": "The objective the pool planned with (cheapest, balanced, correctness, own-keys, own-machine), or null for a pinned route."
++ },
++ "reasons": {
++ "type": "array",
++ "items": {
++ "type": "string"
++ },
++ "description": "Why the router chose what it chose, in words."
++ },
++ "selected": {
++ "type": [
++ "string",
++ "object",
++ "null"
++ ],
++ "description": "The provider that answered (provider, or provider/model, or the machine that answered), or null when nothing answered."
++ },
++ "candidates": {
++ "type": "array",
++ "description": "Every candidate the pool considered, with why it was excluded when it was.",
++ "items": {
++ "type": "object",
++ "required": [
++ "provider"
++ ],
++ "additionalProperties": true,
++ "properties": {
++ "provider": {
++ "type": "string"
++ },
++ "model": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "eligible": {
++ "type": "boolean"
++ },
++ "excluded_reason": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "cost": {
++ "type": [
++ "number",
++ "null"
++ ]
++ },
++ "latency": {
++ "type": [
++ "number",
++ "null"
++ ]
++ }
++ }
++ }
++ },
++ "paid_by": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "description": "Who paid for the run: the network, the person's own key, their own machine, or a project's own provider."
++ },
++ "task": {
++ "type": "object",
++ "description": "The requirement set the router read off the request, with no model call.",
++ "required": [
++ "vision",
++ "tools",
++ "json",
++ "min_context",
++ "reasoning",
++ "output",
++ "weight"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "vision": {
++ "type": "boolean",
++ "description": "The request carried a picture."
++ },
++ "tools": {
++ "type": "boolean",
++ "description": "The request carried tools."
++ },
++ "json": {
++ "type": "boolean",
++ "description": "The request asked for JSON out."
++ },
++ "min_context": {
++ "type": "integer",
++ "minimum": 0,
++ "description": "The context window the request needs, in tokens."
++ },
++ "reasoning": {
++ "enum": [
++ "none",
++ "some",
++ "deep"
++ ],
++ "description": "How much thinking the request asked for."
++ },
++ "output": {
++ "enum": [
++ "text",
++ "image",
++ "audio",
++ "video"
++ ],
++ "description": "What the request wants out."
++ },
++ "weight": {
++ "enum": [
++ "light",
++ "standard",
++ "heavy"
++ ],
++ "description": "How heavy the work is."
++ }
++ }
++ },
++ "ranked": {
++ "type": "array",
++ "maxItems": 5,
++ "description": "The candidates the router ranked for this task, best first, each with its reason.",
++ "items": {
++ "type": "object",
++ "required": [
++ "provider",
++ "why"
++ ],
++ "additionalProperties": true,
++ "properties": {
++ "provider": {
++ "type": "string"
++ },
++ "model": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "why": {
++ "type": "string",
++ "description": "Why this candidate is here (the cheapest with vision, the strong tier, warm cache)."
++ },
++ "cost": {
++ "type": [
++ "number",
++ "null"
++ ],
++ "description": "The input price per million tokens, or null when the price is unknown."
++ },
++ "tier": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "description": "The catalogue's strength tier: fast, balanced, strong or frontier."
++ }
++ }
++ }
++ },
++ "attempts": {
++ "type": "array",
++ "description": "Every attempt, in order: why it was chosen, and what went wrong when it failed.",
++ "items": {
++ "type": "object",
++ "required": [
++ "provider",
++ "status"
++ ],
++ "additionalProperties": true,
++ "properties": {
++ "key": {
++ "type": "string",
++ "description": "Which key or wallet paid for the attempt; never a key."
++ },
++ "provider": {
++ "type": "string"
++ },
++ "model": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "why": {
++ "type": "string",
++ "description": "Why this provider was tried."
++ },
++ "status": {
++ "enum": [
++ "ok",
++ "failed",
++ "timeout",
++ "skipped"
++ ]
++ },
++ "error": {
++ "type": [
++ "string",
++ "null"
++ ]
++ }
++ }
++ }
++ },
++ "bench": {
++ "type": [
++ "object",
++ "null"
++ ],
++ "description": "The Bench evidence the route used, when it opted in."
++ },
++ "usage_readings": {
++ "type": "array",
++ "items": {
++ "type": "object"
++ },
++ "description": "The billing readings of the run, when it has any."
++ }
++ }
}
}
}
ddiff --git a/generated/openapi/actor.json b/generated/openapi/actor.json
iindex 8e66f930..4c935e75 100644
---- a/generated/openapi/actor.json
++++ b/generated/openapi/actor.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Actor API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/ai.json b/generated/openapi/ai.json
iindex 62d0abe7..29019169 100644
---- a/generated/openapi/ai.json
++++ b/generated/openapi/ai.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.AI API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
@@@ -6136,7 +6136,7 @@
},
"ai.run.v1": {
"title": "AiRun",
-- "description": "A workflow run on OpenVibe.AI (ADR-015; server/runs.js decode): the `run` member of every run response (POST /api/v1/runs and the direct operations, GET /api/v1/runs/:id, cancel, retry) and each item of GET /api/v1/runs { runs }. Output is attributable to workflow + version + template version + route version + provider/model + run id, never to a person. A draft stays a draft: products store it with ai/ai_assisted authorship and publish nothing until a person reviews it. input keeps no inline media (replaced by data_url_sha256 and data_url_bytes) and no passthrough prompt ({ not_retained }); output is null until the run succeeded or was served from cache and then matches the workflow version's output_schema. requester is the token principal (service, app or mod). A run interrupted by a restart or shutdown ends failed with error.code run.interrupted.",
++ "description": "A workflow run on OpenVibe.AI (ADR-015; server/runs.js decode): the `run` member of every run response (POST /api/v1/runs and the direct operations, GET /api/v1/runs/:id, cancel, retry) and each item of GET /api/v1/runs { runs }. Output is attributable to workflow + version + template version + route version + provider/model + run id, never to a person. A draft stays a draft: products store it with ai/ai_assisted authorship and publish nothing until a person reviews it. input keeps no inline media (replaced by data_url_sha256 and data_url_bytes) and no passthrough prompt ({ not_retained }); output is null until the run succeeded or was served from cache and then matches the workflow version's output_schema. requester is the token principal (service, app or mod). A run interrupted by a restart or shutdown ends failed with error.code run.interrupted. explain says why the run answered as it did: the task it read, the candidates it ranked and every attempt.",
"type": "object",
"required": [
"id",
@@@ -6470,6 +6470,253 @@
"null"
],
"format": "date-time"
++ },
++ "explain": {
++ "type": [
++ "object",
++ "null"
++ ],
++ "description": "Why the run answered as it did: the task-aware router's explain (L33 P3, L36 Y7). task is the requirement set it read from the request, ranked the candidates it considered and why, attempts every provider it tried with why it was chosen and why it failed, and the placement view it ranked from (objective, reasons, selected, candidates). A run that never reached a provider has no explain.",
++ "required": [
++ "objective",
++ "reasons",
++ "selected",
++ "candidates"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "objective": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "description": "The objective the pool planned with (cheapest, balanced, correctness, own-keys, own-machine), or null for a pinned route."
++ },
++ "reasons": {
++ "type": "array",
++ "items": {
++ "type": "string"
++ },
++ "description": "Why the router chose what it chose, in words."
++ },
++ "selected": {
++ "type": [
++ "string",
++ "object",
++ "null"
++ ],
++ "description": "The provider that answered (provider, or provider/model, or the machine that answered), or null when nothing answered."
++ },
++ "candidates": {
++ "type": "array",
++ "description": "Every candidate the pool considered, with why it was excluded when it was.",
++ "items": {
++ "type": "object",
++ "required": [
++ "provider"
++ ],
++ "additionalProperties": true,
++ "properties": {
++ "provider": {
++ "type": "string"
++ },
++ "model": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "eligible": {
++ "type": "boolean"
++ },
++ "excluded_reason": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "cost": {
++ "type": [
++ "number",
++ "null"
++ ]
++ },
++ "latency": {
++ "type": [
++ "number",
++ "null"
++ ]
++ }
++ }
++ }
++ },
++ "paid_by": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "description": "Who paid for the run: the network, the person's own key, their own machine, or a project's own provider."
++ },
++ "task": {
++ "type": "object",
++ "description": "The requirement set the router read off the request, with no model call.",
++ "required": [
++ "vision",
++ "tools",
++ "json",
++ "min_context",
++ "reasoning",
++ "output",
++ "weight"
++ ],
++ "additionalProperties": false,
++ "properties": {
++ "vision": {
++ "type": "boolean",
++ "description": "The request carried a picture."
++ },
++ "tools": {
++ "type": "boolean",
++ "description": "The request carried tools."
++ },
++ "json": {
++ "type": "boolean",
++ "description": "The request asked for JSON out."
++ },
++ "min_context": {
++ "type": "integer",
++ "minimum": 0,
++ "description": "The context window the request needs, in tokens."
++ },
++ "reasoning": {
++ "enum": [
++ "none",
++ "some",
++ "deep"
++ ],
++ "description": "How much thinking the request asked for."
++ },
++ "output": {
++ "enum": [
++ "text",
++ "image",
++ "audio",
++ "video"
++ ],
++ "description": "What the request wants out."
++ },
++ "weight": {
++ "enum": [
++ "light",
++ "standard",
++ "heavy"
++ ],
++ "description": "How heavy the work is."
++ }
++ }
++ },
++ "ranked": {
++ "type": "array",
++ "maxItems": 5,
++ "description": "The candidates the router ranked for this task, best first, each with its reason.",
++ "items": {
++ "type": "object",
++ "required": [
++ "provider",
++ "why"
++ ],
++ "additionalProperties": true,
++ "properties": {
++ "provider": {
++ "type": "string"
++ },
++ "model": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "why": {
++ "type": "string",
++ "description": "Why this candidate is here (the cheapest with vision, the strong tier, warm cache)."
++ },
++ "cost": {
++ "type": [
++ "number",
++ "null"
++ ],
++ "description": "The input price per million tokens, or null when the price is unknown."
++ },
++ "tier": {
++ "type": [
++ "string",
++ "null"
++ ],
++ "description": "The catalogue's strength tier: fast, balanced, strong or frontier."
++ }
++ }
++ }
++ },
++ "attempts": {
++ "type": "array",
++ "description": "Every attempt, in order: why it was chosen, and what went wrong when it failed.",
++ "items": {
++ "type": "object",
++ "required": [
++ "provider",
++ "status"
++ ],
++ "additionalProperties": true,
++ "properties": {
++ "key": {
++ "type": "string",
++ "description": "Which key or wallet paid for the attempt; never a key."
++ },
++ "provider": {
++ "type": "string"
++ },
++ "model": {
++ "type": [
++ "string",
++ "null"
++ ]
++ },
++ "why": {
++ "type": "string",
++ "description": "Why this provider was tried."
++ },
++ "status": {
++ "enum": [
++ "ok",
++ "failed",
++ "timeout",
++ "skipped"
++ ]
++ },
++ "error": {
++ "type": [
++ "string",
++ "null"
++ ]
++ }
++ }
++ }
++ },
++ "bench": {
++ "type": [
++ "object",
++ "null"
++ ],
++ "description": "The Bench evidence the route used, when it opted in."
++ },
++ "usage_readings": {
++ "type": "array",
++ "items": {
++ "type": "object"
++ },
++ "description": "The billing readings of the run, when it has any."
++ }
++ }
}
}
},
ddiff --git a/generated/openapi/bench.json b/generated/openapi/bench.json
iindex be8fd374..25c2eb5e 100644
---- a/generated/openapi/bench.json
++++ b/generated/openapi/bench.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Bench API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.Bench as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/billing.json b/generated/openapi/billing.json
iindex aa801400..a0de5946 100644
---- a/generated/openapi/billing.json
++++ b/generated/openapi/billing.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Billing API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/blog.json b/generated/openapi/blog.json
iindex 090718af..e83635a9 100644
---- a/generated/openapi/blog.json
++++ b/generated/openapi/blog.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Blog API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/bot.json b/generated/openapi/bot.json
iindex eaab4fc4..5415c6a9 100644
---- a/generated/openapi/bot.json
++++ b/generated/openapi/bot.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Bot API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/chat.json b/generated/openapi/chat.json
iindex 37a60d13..768db176 100644
---- a/generated/openapi/chat.json
++++ b/generated/openapi/chat.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Chat API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/codes.json b/generated/openapi/codes.json
iindex c818b8c7..c2b4ced5 100644
---- a/generated/openapi/codes.json
++++ b/generated/openapi/codes.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Codes API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/community.json b/generated/openapi/community.json
iindex ab8ee4a9..e9d3ff5c 100644
---- a/generated/openapi/community.json
++++ b/generated/openapi/community.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Community API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/coupons.json b/generated/openapi/coupons.json
iindex cf54a2f9..d68eafb1 100644
---- a/generated/openapi/coupons.json
++++ b/generated/openapi/coupons.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Coupons API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/deals.json b/generated/openapi/deals.json
iindex 5f46e621..2e0e82c8 100644
---- a/generated/openapi/deals.json
++++ b/generated/openapi/deals.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Deals API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/domains.json b/generated/openapi/domains.json
iindex 8ee1b193..34809407 100644
---- a/generated/openapi/domains.json
++++ b/generated/openapi/domains.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Domains API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.Domains as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/events.json b/generated/openapi/events.json
iindex 8bb4389a..f9915ab4 100644
---- a/generated/openapi/events.json
++++ b/generated/openapi/events.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Events API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/food.json b/generated/openapi/food.json
iindex c3fd6cd2..272c9772 100644
---- a/generated/openapi/food.json
++++ b/generated/openapi/food.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Food API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/games.json b/generated/openapi/games.json
iindex cd094c44..a1a8fa86 100644
---- a/generated/openapi/games.json
++++ b/generated/openapi/games.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Games API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/host.json b/generated/openapi/host.json
iindex dc4b630e..966e8ff6 100644
---- a/generated/openapi/host.json
++++ b/generated/openapi/host.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Host API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/inventory.json b/generated/openapi/inventory.json
iindex e60c1bf9..b89c2915 100644
---- a/generated/openapi/inventory.json
++++ b/generated/openapi/inventory.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Inventory API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/live.json b/generated/openapi/live.json
iindex 410bcf83..1d287be8 100644
---- a/generated/openapi/live.json
++++ b/generated/openapi/live.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Live API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/media-hub.json b/generated/openapi/media-hub.json
iindex 029d188e..42a84528 100644
---- a/generated/openapi/media-hub.json
++++ b/generated/openapi/media-hub.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.MediaHub API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/media.json b/generated/openapi/media.json
iindex 4dc9cd38..c6ae9517 100644
---- a/generated/openapi/media.json
++++ b/generated/openapi/media.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Media API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/network.json b/generated/openapi/network.json
iindex 85033d48..4f723e5c 100644
---- a/generated/openapi/network.json
++++ b/generated/openapi/network.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Network API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/news.json b/generated/openapi/news.json
iindex 38218319..98121492 100644
---- a/generated/openapi/news.json
++++ b/generated/openapi/news.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.News API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/openre.json b/generated/openapi/openre.json
iindex 25d456b7..fbc4c000 100644
---- a/generated/openapi/openre.json
++++ b/generated/openapi/openre.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenRestream API",
-- "version": "0.261.0",
-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/play.json b/generated/openapi/play.json
iindex e4f8fa62..0cdeeca5 100644
---- a/generated/openapi/play.json
++++ b/generated/openapi/play.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Play API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/quest.json b/generated/openapi/quest.json
iindex c667086f..ed00b16c 100644
---- a/generated/openapi/quest.json
++++ b/generated/openapi/quest.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Quest API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/report.json b/generated/openapi/report.json
iindex 533768b1..2fe61105 100644
---- a/generated/openapi/report.json
++++ b/generated/openapi/report.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Report API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.Report as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/reviews.json b/generated/openapi/reviews.json
iindex af4d929c..55a5c8cd 100644
---- a/generated/openapi/reviews.json
++++ b/generated/openapi/reviews.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Reviews API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/run.json b/generated/openapi/run.json
iindex 637651ed..4555dc67 100644
---- a/generated/openapi/run.json
++++ b/generated/openapi/run.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Run API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/search.json b/generated/openapi/search.json
iindex dba69dc9..0a29d362 100644
---- a/generated/openapi/search.json
++++ b/generated/openapi/search.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Search API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/services.json b/generated/openapi/services.json
iindex 7e7c3841..00e12a7c 100644
---- a/generated/openapi/services.json
++++ b/generated/openapi/services.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Services API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/sources.json b/generated/openapi/sources.json
iindex 7692dc4e..6faa6c07 100644
---- a/generated/openapi/sources.json
++++ b/generated/openapi/sources.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Sources API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/space.json b/generated/openapi/space.json
iindex c882a98d..1bfbb270 100644
---- a/generated/openapi/space.json
++++ b/generated/openapi/space.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Space API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/tips.json b/generated/openapi/tips.json
iindex dd395258..31297e37 100644
---- a/generated/openapi/tips.json
++++ b/generated/openapi/tips.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Tips API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/tools.json b/generated/openapi/tools.json
iindex f7858605..93cb68db 100644
---- a/generated/openapi/tools.json
++++ b/generated/openapi/tools.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Tools API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/trade.json b/generated/openapi/trade.json
iindex 613294d2..18a02c1a 100644
---- a/generated/openapi/trade.json
++++ b/generated/openapi/trade.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Trade API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/vip.json b/generated/openapi/vip.json
iindex 0798d112..f25342b3 100644
---- a/generated/openapi/vip.json
++++ b/generated/openapi/vip.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.VIP API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/vision.json b/generated/openapi/vision.json
iindex df38a3f1..532edad5 100644
---- a/generated/openapi/vision.json
++++ b/generated/openapi/vision.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Vision API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.Vision as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/watch.json b/generated/openapi/watch.json
iindex a4470734..949ae9a7 100644
---- a/generated/openapi/watch.json
++++ b/generated/openapi/watch.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Watch API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/wiki.json b/generated/openapi/wiki.json
iindex 07246315..c7bb530d 100644
---- a/generated/openapi/wiki.json
++++ b/generated/openapi/wiki.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Wiki API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/work.json b/generated/openapi/work.json
iindex eafa84e3..5395ab80 100644
---- a/generated/openapi/work.json
++++ b/generated/openapi/work.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Work API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/openapi/zone.json b/generated/openapi/zone.json
iindex f320bef7..653a1af0 100644
---- a/generated/openapi/zone.json
++++ b/generated/openapi/zone.json
@@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "OpenVibe.Zone API",
-- "version": "0.261.0",
-- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.261.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
++ "version": "0.262.0",
++ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.262.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"name": "MIT",
"identifier": "MIT"
ddiff --git a/generated/typescript/index.d.ts b/generated/typescript/index.d.ts
iindex 5560e549..b7d10a75 100644
---- a/generated/typescript/index.d.ts
++++ b/generated/typescript/index.d.ts
@@@ -152213,9 +152213,9 @@ export interface AiRunRequest {
};
}
--/** [email protected] (owner: ai) */
++/** [email protected] (owner: ai) */
/**
-- * A workflow run on OpenVibe.AI (ADR-015; server/runs.js decode): the `run` member of every run response (POST /api/v1/runs and the direct operations, GET /api/v1/runs/:id, cancel, retry) and each item of GET /api/v1/runs { runs }. Output is attributable to workflow + version + template version + route version + provider/model + run id, never to a person. A draft stays a draft: products store it with ai/ai_assisted authorship and publish nothing until a person reviews it. input keeps no inline media (replaced by data_url_sha256 and data_url_bytes) and no passthrough prompt ({ not_retained }); output is null until the run succeeded or was served from cache and then matches the workflow version's output_schema. requester is the token principal (service, app or mod). A run interrupted by a restart or shutdown ends failed with error.code run.interrupted.
++ * A workflow run on OpenVibe.AI (ADR-015; server/runs.js decode): the `run` member of every run response (POST /api/v1/runs and the direct operations, GET /api/v1/runs/:id, cancel, retry) and each item of GET /api/v1/runs { runs }. Output is attributable to workflow + version + template version + route version + provider/model + run id, never to a person. A draft stays a draft: products store it with ai/ai_assisted authorship and publish nothing until a person reviews it. input keeps no inline media (replaced by data_url_sha256 and data_url_bytes) and no passthrough prompt ({ not_retained }); output is null until the run succeeded or was served from cache and then matches the workflow version's output_schema. requester is the token principal (service, app or mod). A run interrupted by a restart or shutdown ends failed with error.code run.interrupted. explain says why the run answered as it did: the task it read, the candidates it ranked and every attempt.
*/
export interface AiRun {
id: string;
@@@ -152304,6 +152304,370 @@ export interface AiRun {
created_at: string;
started_at: string | null;
finished_at: string | null;
++ /**
++ * Why the run answered as it did: the task-aware router's explain (L33 P3, L36 Y7). task is the requirement set it read from the request, ranked the candidates it considered and why, attempts every provider it tried with why it was chosen and why it failed, and the placement view it ranked from (objective, reasons, selected, candidates). A run that never reached a provider has no explain.
++ */
++ explain?: {
++ /**
++ * The objective the pool planned with (cheapest, balanced, correctness, own-keys, own-machine), or null for a pinned route.
++ */
++ objective: string | null;
++ /**
++ * Why the router chose what it chose, in words.
++ */
++ reasons: string[];
++ /**
++ * The provider that answered (provider, or provider/model, or the machine that answered), or null when nothing answered.
++ */
++ selected: string | {} | null;
++ /**
++ * Every candidate the pool considered, with why it was excluded when it was.
++ */
++ candidates: {
++ provider: string;
++ model?: string | null;
++ eligible?: boolean;
++ excluded_reason?: string | null;
++ cost?: number | null;
++ latency?: number | null;
++ [k: string]: unknown | undefined;
++ }[];
++ /**
++ * Who paid for the run: the network, the person's own key, their own machine, or a project's own provider.
++ */
++ paid_by?: string | null;
++ /**
++ * The requirement set the router read off the request, with no model call.
++ */
++ task?: {
++ /**
++ * The request carried a picture.
++ */
++ vision: boolean;
++ /**
++ * The request carried tools.
++ */
++ tools: boolean;
++ /**
++ * The request asked for JSON out.
++ */
++ json: boolean;
++ /**
++ * The context window the request needs, in tokens.
++ */
++ min_context: number;
++ /**
++ * How much thinking the request asked for.
++ */
++ reasoning: "none" | "some" | "deep";
++ /**
++ * What the request wants out.
++ */
++ output: "text" | "image" | "audio" | "video";
++ /**
++ * How heavy the work is.
++ */
++ weight: "light" | "standard" | "heavy";
++ };
++ /**
++ * The candidates the router ranked for this task, best first, each with its reason.
++ *
++ * @maxItems 5
++ */
++ ranked?:
++ | []
++ | [
++ {
++ provider: string;
++ model?: string | null;
++ /**
++ * Why this candidate is here (the cheapest with vision, the strong tier, warm cache).
++ */
++ why: string;
++ /**
++ * The input price per million tokens, or null when the price is unknown.
++ */
++ cost?: number | null;
++ /**
++ * The catalogue's strength tier: fast, balanced, strong or frontier.
++ */
++ tier?: string | null;
++ [k: string]: unknown | undefined;
++ }
++ ]
++ | [
++ {
++ provider: string;
++ model?: string | null;
++ /**
++ * Why this candidate is here (the cheapest with vision, the strong tier, warm cache).
++ */
++ why: string;
++ /**
++ * The input price per million tokens, or null when the price is unknown.
++ */
++ cost?: number | null;
++ /**
++ * The catalogue's strength tier: fast, balanced, strong or frontier.
++ */
++ tier?: string | null;
++ [k: string]: unknown | undefined;
++ },
++ {
++ provider: string;
++ model?: string | null;
++ /**
++ * Why this candidate is here (the cheapest with vision, the strong tier, warm cache).
++ */
++ why: string;
++ /**
++ * The input price per million tokens, or null when the price is unknown.
++ */
++ cost?: number | null;
++ /**
++ * The catalogue's strength tier: fast, balanced, strong or frontier.
++ */
++ tier?: string | null;
++ [k: string]: unknown | undefined;
++ }
++ ]
++ | [
++ {
++ provider: string;
++ model?: string | null;
++ /**
++ * Why this candidate is here (the cheapest with vision, the strong tier, warm cache).
++ */
++ why: string;
++ /**
++ * The input price per million tokens, or null when the price is unknown.
++ */
++ cost?: number | null;
++ /**
++ * The catalogue's strength tier: fast, balanced, strong or frontier.
++ */
++ tier?: string | null;
++ [k: string]: unknown | undefined;
++ },
++ {
++ provider: string;
++ model?: string | null;
++ /**
++ * Why this candidate is here (the cheapest with vision, the strong tier, warm cache).
++ */
++ why: string;
++ /**
++ * The input price per million tokens, or null when the price is unknown.
++ */
++ cost?: number | null;
++ /**
++ * The catalogue's strength tier: fast, balanced, strong or frontier.
++ */
++ tier?: string | null;
++ [k: string]: unknown | undefined;
++ },
++ {
++ provider: string;
++ model?: string | null;
++ /**
++ * Why this candidate is here (the cheapest with vision, the strong tier, warm cache).
++ */
++ why: string;
++ /**
++ * The input price per million tokens, or null when the price is unknown.
++ */
++ cost?: number | null;
++ /**
++ * The catalogue's strength tier: fast, balanced, strong or frontier.
++ */
++ tier?: string | null;
++ [k: string]: unknown | undefined;
++ }
++ ]
++ | [
++ {
++ provider: string;
++ model?: string | null;
++ /**
++ * Why this candidate is here (the cheapest with vision, the strong tier, warm cache).
++ */
++ why: string;
++ /**
++ * The input price per million tokens, or null when the price is unknown.
++ */
++ cost?: number | null;
++ /**
++ * The catalogue's strength tier: fast, balanced, strong or frontier.
++ */
++ tier?: string | null;
++ [k: string]: unknown | undefined;
++ },
++ {
++ provider: string;
++ model?: string | null;
++ /**
++ * Why this candidate is here (the cheapest with vision, the strong tier, warm cache).
++ */
++ why: string;
++ /**
++ * The input price per million tokens, or null when the price is unknown.
++ */
++ cost?: number | null;
++ /**
++ * The catalogue's strength tier: fast, balanced, strong or frontier.
++ */
++ tier?: string | null;
++ [k: string]: unknown | undefined;
++ },
++ {
++ provider: string;
++ model?: string | null;
++ /**
++ * Why this candidate is here (the cheapest with vision, the strong tier, warm cache).
++ */
++ why: string;
++ /**
++ * The input price per million tokens, or null when the price is unknown.
++ */
++ cost?: number | null;
++ /**
++ * The catalogue's strength tier: fast, balanced, strong or frontier.
++ */
++ tier?: string | null;
++ [k: string]: unknown | undefined;
++ },
++ {
++ provider: string;
++ model?: string | null;
++ /**
++ * Why this candidate is here (the cheapest with vision, the strong tier, warm cache).
++ */
++ why: string;
++ /**
++ * The input price per million tokens, or null when the price is unknown.
++ */
++ cost?: number | null;
++ /**
++ * The catalogue's strength tier: fast, balanced, strong or frontier.
++ */
++ tier?: string | null;
++ [k: string]: unknown | undefined;
++ }
++ ]
++ | [
++ {
++ provider: string;
++ model?: string | null;
++ /**
++ * Why this candidate is here (the cheapest with vision, the strong tier, warm cache).
++ */
++ why: string;
++ /**
++ * The input price per million tokens, or null when the price is unknown.
++ */
++ cost?: number | null;
++ /**
++ * The catalogue's strength tier: fast, balanced, strong or frontier.
++ */
++ tier?: string | null;
++ [k: string]: unknown | undefined;
++ },
++ {
++ provider: string;
++ model?: string | null;
++ /**
++ * Why this candidate is here (the cheapest with vision, the strong tier, warm cache).
++ */
++ why: string;
++ /**
++ * The input price per million tokens, or null when the price is unknown.
++ */
++ cost?: number | null;
++ /**
++ * The catalogue's strength tier: fast, balanced, strong or frontier.
++ */
++ tier?: string | null;
++ [k: string]: unknown | undefined;
++ },
++ {
++ provider: string;
++ model?: string | null;
++ /**
++ * Why this candidate is here (the cheapest with vision, the strong tier, warm cache).
++ */
++ why: string;
++ /**
++ * The input price per million tokens, or null when the price is unknown.
++ */
++ cost?: number | null;
++ /**
++ * The catalogue's strength tier: fast, balanced, strong or frontier.
++ */
++ tier?: string | null;
++ [k: string]: unknown | undefined;
++ },
++ {
++ provider: string;
++ model?: string | null;
++ /**
++ * Why this candidate is here (the cheapest with vision, the strong tier, warm cache).
++ */
++ why: string;
++ /**
++ * The input price per million tokens, or null when the price is unknown.
++ */
++ cost?: number | null;
++ /**
++ * The catalogue's strength tier: fast, balanced, strong or frontier.
++ */
++ tier?: string | null;
++ [k: string]: unknown | undefined;
++ },
++ {
++ provider: string;
++ model?: string | null;
++ /**
++ * Why this candidate is here (the cheapest with vision, the strong tier, warm cache).
++ */
++ why: string;
++ /**
++ * The input price per million tokens, or null when the price is unknown.
++ */
++ cost?: number | null;
++ /**
++ * The catalogue's strength tier: fast, balanced, strong or frontier.
++ */
++ tier?: string | null;
++ [k: string]: unknown | undefined;
++ }
++ ];
++ /**
++ * Every attempt, in order: why it was chosen, and what went wrong when it failed.
++ */
++ attempts?: {
++ /**
++ * Which key or wallet paid for the attempt; never a key.
++ */
++ key?: string;
++ provider: string;
++ model?: string | null;
++ /**
++ * Why this provider was tried.
++ */
++ why?: string;
++ status: "ok" | "failed" | "timeout" | "skipped";
++ error?: string | null;
++ [k: string]: unknown | undefined;
++ }[];
++ /**
++ * The Bench evidence the route used, when it opted in.
++ */
++ bench?: {} | null;
++ /**
++ * The billing readings of the run, when it has any.
++ */
++ usage_readings?: {}[];
++ } | null;
}
/** [email protected] (owner: ai) */
ddiff --git a/package-lock.json b/package-lock.json
iindex e1c5752a..46599d17 100644
---- a/package-lock.json
++++ b/package-lock.json
@@@ -1,12 +1,12 @@
{
"name": "openvibe-contracts",
-- "version": "0.261.0",
++ "version": "0.262.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "openvibe-contracts",
-- "version": "0.261.0",
++ "version": "0.262.0",
"license": "AGPL-3.0-only",
"dependencies": {
"ajv": "^8.17.1",
ddiff --git a/package.json b/package.json
iindex 76ac8530..7476270f 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.261.0",
++ "version": "0.262.0",
"description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.",
"main": "index.js",
"types": "generated/typescript/index.d.ts",