docs(llm): record that non-reasoning catalog models lose the lone off level

The adapter omits the seam's reasoning field whenever a model carries no
reasoning metadata, which is the model's own property and says nothing
about where the model came from. Both the JSDoc and the Agent Note read
as though only hand-declared models were meant, so a reader would infer
that the 251 installed-catalog models pi-ai marks as non-reasoning still
offer their single off level. They do not, and that is the point: a
picker holding only off misrepresents a provider that thinks by default,
because off dispatches the same bytes as naming no effort at all.

Behavior is unchanged; only the prose that describes it was narrower
than the contract. adapter.spec.ts already pins the catalog case through
openai/gpt-4.1 and catalog.spec.ts pins the hand-declared one.
This commit is contained in:
Yichen Jiang
2026-08-04 14:47:09 +08:00
parent f376ee23d1
commit 236b1f6d97
4 changed files with 23 additions and 10 deletions

View File

@@ -110,14 +110,15 @@ function resolveReasoningLevel(
/**
* Selectable reasoning efforts for one model, or nothing at all.
*
* A model the installed catalog does not describe carries no reasoning
* metadata, and pi-ai reports that as the single level `off`. Passing that
* through would offer a control that cannot do what it says: `off` is
* translated to *omitting* the reasoning option, which for such a model is
* byte-for-byte the same request as naming no effort — so a provider whose own
* default is to think would keep thinking with `off` selected. Omitting
* `reasoning` entirely is the seam's way of saying the capability is
* unavailable, which leaves the surface offering only the provider's default.
* A model that carries no reasoning metadata — every hand-declared one, and
* every catalog model pi-ai marks as non-reasoning — is reported by pi-ai as
* supporting the single level `off`. Passing that through would offer a control
* that cannot do what it says: `off` is translated to *omitting* the reasoning
* option, which for such a model is byte-for-byte the same request as naming no
* effort — so a provider whose own default is to think would keep thinking with
* `off` selected. Omitting `reasoning` entirely is the seam's way of saying the
* capability is unavailable, which leaves the surface offering only the
* provider's default.
* @param model - the resolved model descriptor.
* @param defaultLevel - the profile's configured effort, already validated.
* @returns the `reasoning` field, or an empty object when none can be offered.