The declared-provider-catalog note still recorded modalities as closed because "nothing reads them: context.ts keeps only text blocks" — the same reasoning this change disproves. Rewrite that fact in place, keep pricing closed for its own still-current reason, and cross-link both directions. The new resolver cases never crossed the config schema, so neither acceptance path this change adds had an executable gate: config.spec.ts now refuses an unknown modality at both levels, pins the empty route list to the namespace validator the settings seam actually runs, and pins the `[]` materialization the inheritance rule depends on. A catalog.spec.ts case re-asserts every rung through a written settings section and `ctx.llm`, which is what the note's Testing section claimed. Also export PiAiModality from the package entry — it types two public config fields and consumers could not name it — record the unverified declaration as a Known Limitation, and stop sharing one fallback array across a route's models.
llm/ — LLM capability family
English | 中文
The LLM seam and its provider adapters. The llm package owns both the Service Definition and Consumer roles: the abstract service, content-block vocabulary, and stream-chunk assembler. Provider adapters register on ctx.llm. All product packages.
| Package | Role | ctx key |
|---|---|---|
llm/ |
LLM service and shared streaming vocabulary | ctx.llm |
token-meter/ |
Replay-aware token measurement | ctx.tokenMeter |
llm-retry/ |
Provider-scoped retry policy | listens to agent/request-error |
llm-deepseek/ |
Direct DeepSeek adapter | registers on ctx.llm |
llm-pi-ai/ |
Multi-provider pi-ai adapter | registers on ctx.llm |
Adapters register provider routes on the seam; retry and token measurement remain separate consumers. The child READMEs own routing, metadata, replay, and provider-wire details; the LLM architecture decisions own the rationale.
The subsystem reference — messages and blocks, the model request, the StreamChunk protocol, the adapter contract — is docs/subsystems/llm-streaming.md (token measurement: token-meter.md); see the twin adapters, replay token meter, and routed model context Agent Notes.