diff --git a/CHANGELOG.d/2.20.1-orchestrator-temperature-negotiation.md b/CHANGELOG.d/2.20.1-orchestrator-temperature-negotiation.md new file mode 100644 index 000000000..dc05a43e7 --- /dev/null +++ b/CHANGELOG.d/2.20.1-orchestrator-temperature-negotiation.md @@ -0,0 +1,7 @@ +# 2.20.1 — Provider temperature capability negotiation + +- Compose now pins ContextualWisdomLab/contextual-orchestrator#779 so providers that accept + only their default sampling temperature can retry the same request without + the unsupported optional field instead of leaving summaries unavailable. +- The pin remains an immutable upstream commit and does not copy provider + behavior or credentials into LineageWeave. diff --git a/docker/contextual-orchestrator/Dockerfile b/docker/contextual-orchestrator/Dockerfile index 4e5726543..28eaee190 100644 --- a/docker/contextual-orchestrator/Dockerfile +++ b/docker/contextual-orchestrator/Dockerfile @@ -3,10 +3,10 @@ FROM python:3.12-slim@sha256:423ed6ab25b1921a477529254bfeeabf5855151dc2c3141699a WORKDIR /app # Reuse the upstream implementation without copying it into LineageWeave. -# Pin the runtime to PR #765's pushed commit until that protected PR merges; +# Pin the runtime to ContextualWisdomLab/contextual-orchestrator#779's pushed commit until that protected PR merges; # this keeps model selection, structured synthesis, and reasoning policy in # contextual-orchestrator itself. -ADD https://github.com/ContextualWisdomLab/contextual-orchestrator/archive/7df051a.tar.gz /tmp/contextual-orchestrator.tar.gz +ADD https://github.com/ContextualWisdomLab/contextual-orchestrator/archive/cf4a4501fa5057f89b21cad5033c5925755cd150.tar.gz /tmp/contextual-orchestrator.tar.gz RUN mkdir /tmp/contextual-orchestrator \ && tar -xzf /tmp/contextual-orchestrator.tar.gz --strip-components=1 -C /tmp/contextual-orchestrator \ && cp -R /tmp/contextual-orchestrator/contextual_orchestrator /app/contextual_orchestrator \ diff --git a/docs/adr/0083-orchestrator-runtime-commit-pin.md b/docs/adr/0083-orchestrator-runtime-commit-pin.md index f84cc8230..225032001 100644 --- a/docs/adr/0083-orchestrator-runtime-commit-pin.md +++ b/docs/adr/0083-orchestrator-runtime-commit-pin.md @@ -10,14 +10,18 @@ The orchestrator's `auto` reasoning mode is an internal routing decision and must not be forwarded as an upstream provider `reasoning_effort` value. The runtime also must discover provider models from the configured gateway rather than requiring `LLM_GATEWAY_MODEL`, and structured requests must remain -multi-agent. +multi-agent. Some provider deployments accept only their default sampling +temperature; retrying the same rejected value cannot recover that capability +mismatch. ## Decision `docker/contextual-orchestrator/Dockerfile` pins the downloaded archive to -commit `6db772e`, the pushed head of contextual-orchestrator PR #765. The pin -remains explicit and immutable until the protected PR merges; it is not a -moving `main` reference and it is not a LineageWeave monkey patch. +commit `cf4a4501fa5057f89b21cad5033c5925755cd150`, the pushed head of +ContextualWisdomLab/contextual-orchestrator#779, stacked on +ContextualWisdomLab/contextual-orchestrator#765. The pin remains explicit +and immutable until the protected PRs merge; it is not a moving `main` +reference and it is not a LineageWeave monkey patch. The runtime contract is: @@ -33,6 +37,9 @@ The runtime contract is: reconciliation prompt; independent VISION worker evidence is retained instead. - A provider 4xx is reported as a failed orchestration attempt, never as a successful empty semantic result. +- When HTTP 400/422 explicitly proves that `temperature` is unsupported, the + same endpoint is retried once with only that optional field omitted. Invalid + values and unrelated 4xx responses remain fail-closed. - An empty seed model is expanded from the configured gateway `/v1/models` endpoint; embedding-only rows are not added to the chat agent pool. - `json_object`, `json_schema`, and Responses JSON formats run conduct plus @@ -44,4 +51,5 @@ The runtime contract is: implementation. - Rebuilding the image is required after the upstream pin changes. - Protected-branch review and merge remain external gates; this pin does not - bypass PR #765. + bypass ContextualWisdomLab/contextual-orchestrator#765 or + ContextualWisdomLab/contextual-orchestrator#779. diff --git a/tests/test_orchestrator_runtime_pin.py b/tests/test_orchestrator_runtime_pin.py new file mode 100644 index 000000000..be37b930c --- /dev/null +++ b/tests/test_orchestrator_runtime_pin.py @@ -0,0 +1,22 @@ +"""Keep the reviewed contextual-orchestrator archive pin and ADR synchronized.""" + +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] +ORCHESTRATOR_COMMIT = "cf4a4501fa5057f89b21cad5033c5925755cd150" + + +def test_orchestrator_runtime_pin_matches_adr() -> None: + """The image and decision record must identify the same immutable commit.""" + dockerfile = (ROOT / "docker/contextual-orchestrator/Dockerfile").read_text( + encoding="utf-8" + ) + adr = (ROOT / "docs/adr/0083-orchestrator-runtime-commit-pin.md").read_text( + encoding="utf-8" + ) + + assert f"contextual-orchestrator/archive/{ORCHESTRATOR_COMMIT}.tar.gz" in dockerfile + assert f"commit `{ORCHESTRATOR_COMMIT}`" in adr + upstream_pr = "ContextualWisdomLab/contextual-orchestrator#779" + assert upstream_pr in dockerfile and upstream_pr in adr