Commit Graph
549 Commits
Author SHA1 Message Date
_Kerman cb0747091b Merge remote-tracking branch 'origin/master' into xtr/projection-state-schema 2026-08-19 14:52:29 +08:00
_Kerman 571dba37cb Merge remote-tracking branch 'origin/master' into xtr/projection-state-schema 2026-08-19 14:50:24 +08:00
Yichen Jiang 07fbaa9b30 Merge remote-tracking branch 'origin/master' into HEAD 2026-08-19 14:39:44 +08:00
_Kerman 9127d7e8b7 fix(session-projection): keep host state off wire 2026-08-19 14:32:48 +08:00
Yichen Jiang 3b74deec3e fix(llm-pi-ai): pin compat field types both ways and refuse empty values
The upstream-type proof only ran covariantly, so it caught a profile
field wider than pi-ai's but not one narrower — the direction its own
JSDoc claimed to guard. It now asserts both directions; the reverse holds
today because every field is either derived from upstream or a boolean.

`ModelCompat` gained `BedrockCompat`, which the gate had already started
serving, and the per-field protocol lists now match what the gates
resolve: `docs/config-catalog.md` pastes that JSDoc verbatim, so a stale
list there contradicted the README in the same change. The interface
header names the Responses grouping, since a catalog reader never sees
the README passage that explains it.

Valueless keys are judged after the name, so a withheld or misspelled key
written bare is refused for being that name rather than sent back for a
value it would be refused with anyway; the remedy no longer promises an
installed catalog value that a hand-declared route does not have. The
check covers `undefined` beside `null`: schemastery keeps the key either
way, and a cordis.yml entry reaches that state through `!!js undefined`,
so it is a config boundary rather than a typed one.

Coverage follows the composed path: the rejection is asserted through a
written settings section, and a switch is carried from that section onto
the wire a provider receives.

Refs #2646
2026-08-19 13:58:55 +08:00
_Kerman 4c421ec882 refactor(session-projection): separate state from client views 2026-08-19 13:11:05 +08:00
Yichen Jiang 4a02791c9a fix(llm): address multimodal review findings 2026-08-19 12:47:24 +08:00
Yichen Jiang 1c64e72bcb Merge remote-tracking branch 'origin/master' into HEAD 2026-08-19 11:49:20 +08:00
Yichen Jiang cf4a27c471 fix(llm-pi-ai): refuse valueless compat and group gates by compat type
Review found two live defects in the compat surface.

A valueless key (`supportsDeveloperRole:`) survives schemastery as null,
and resolution carried it forward as a configured value. It landed on
`Model.compat` as null, which replaced the installed catalog entry's
value and left pi-ai's `??` reaching for its baseURL detection — the
catalog layer skipped entirely, and the switch written but not applied.
The vocabulary check now refuses it where it is written, matching the
`reasoningEfforts` precedent in the same file.

The gates were keyed by protocol name, but pi-ai keys compat by type:
`openai-responses`, `azure-openai-responses`, and `openai-codex-responses`
share one `OpenAIResponsesCompat`, so two shipped catalog routes were
refused the fields their own models declare. Gates now group by compat
type, `bedrock-converse-stream` gains its own, and the protocol set is
derived from `Model.compat`'s conditional so a release that gives a
further protocol a compat type fails the gate list by name.

Field types are derived from upstream rather than restated, with a proof
pinning the profile assignable to the upstream types, so a widened value
union cannot silently narrow what configuration accepts.

The `undefined` filter stays removed: `exactOptionalPropertyTypes` keeps
a typed caller from writing one, and schemastery never materializes one,
so it was validation for a value the static interface already excludes.

Refs #2646
2026-08-19 11:48:01 +08:00
Yichen Jiang 7078918b30 feat(llm-deepseek): support multimodal requests 2026-08-19 11:39:52 +08:00
Yichen Jiang 78fc31d06b test(llm-pi-ai): remove unreachable compat fallback 2026-08-18 17:13:47 +08:00
Yichen Jiang 3ec495f8fa Merge remote-tracking branch 'origin/master' into worktree/llm-pi-ai-config-exposure-05f455
# Conflicts:
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.md
#	docs/config-catalog.zh.md
2026-08-18 17:10:13 +08:00
Yichen Jiang aef4b1323b Merge remote-tracking branch 'origin/master' into worktree/web-pi-ai-retry-default 2026-08-18 17:07:16 +08:00
Yichen Jiang 2ae1a4ebc7 Merge remote-tracking branch 'origin/master' into worktree/web-pi-ai-retry-default
# Conflicts:
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.md
#	docs/config-catalog.zh.md
#	packages/llm/llm-pi-ai/README.i18n.yaml
#	packages/llm/llm-pi-ai/README.md
#	packages/llm/llm-pi-ai/README.zh.md
#	packages/llm/llm-pi-ai/src/config.ts
2026-08-18 17:07:05 +08:00
lsdsjy 71ef418566 Merge pull request #2664 from deepseek-harness/docs/readme-cdn-links
feat(community,infra): publish README assets through CDN
2026-08-18 17:04:11 +08:00
Yichen Jiang 4f64e20b41 test(llm-pi-ai): cover compat validation branches 2026-08-18 16:43:59 +08:00
Yichen Jiang 5372fc384e chore(llm): trim retry default refactor 2026-08-18 16:36:41 +08:00
Yichen Jiang 0ca0f3d0b8 refactor(llm): use one five-retry default 2026-08-18 16:33:22 +08:00
lsdsjy 49b48369db fix(community,llm): remove duplicate README assets 2026-08-18 16:21:54 +08:00
Yichen Jiang f4551895bc Merge remote-tracking branch 'origin/master' into worktree/web-pi-ai-retry-default 2026-08-18 15:14:15 +08:00
Yichen Jiang 1dbafe2973 refactor(llm): centralize deployment retry defaults 2026-08-18 15:14:09 +08:00
creatixchu 5849c57c0c fix(images): align provider-safe payload defaults 2026-08-18 14:00:00 +08:00
creatixchu 28c2647293 fix(llm-pi-ai): address image offload review 2026-08-18 11:56:18 +08:00
Yichen Jiang 884f7b9c41 fix(llm-pi-ai): expose the pi-ai wire-compat surface
pi-ai infers a request's shape from the provider id and baseURL, and for
an endpoint it does not recognize it answers as though it were OpenAI
itself. A hand-declared route is by construction such an endpoint, so a
model declaring reasoningEfforts sent its system prompt as the developer
role with no configuration able to say otherwise — a gateway rejecting
that role could not be connected at all. Writing the switch anyway
validated, persisted, and was then dropped, so the misconfiguration
looked applied.

Three drift gates classify all thirty upstream compat fields as offered
or withheld, keyed by `keyof` so a pi-ai upgrade fails the build until
the new field is classified. Twenty are offered: what a private URL
cannot imply. The rest stay withheld because pi-ai's installed catalog
sets them for a named vendor.

Protocol applicability is now per field rather than per block, so
supportsDeveloperRole reaches an openai-responses route and the
anthropic-messages switches reach theirs. A compat key no protocol
declares, or one a gate withholds, is refused where it is written.

Fixes #2646
Refs #1976
2026-08-18 11:24:33 +08:00
creatixchu 0b4a322003 fix(llm-pi-ai): bound request image payload by offloading oldest images
Every image in history is base64-inlined into every request, so a long
session's request body grows until a gateway request-size cap rejects it
with 413 and every retry resends the same oversized body, permanently
wedging the session. Each provider route now carries maxRequestImageBytes
(default 24MiB): when the accumulated base64 image payload exceeds it,
the oldest images are replaced by a fixed model-facing placeholder until
the request fits, so the newest images survive and the session keeps
completing requests. 413 and request-body-cap wording now classify as
INVALID_REQUEST instead of the generic PI_AI_ERROR.

Fixes #2644
2026-08-18 11:18:51 +08:00
creatixchu 0e39055121 fix(attachment): refuse oversized image sides at admission
An image with a side above the deployed routes' 2000px many-image bound
could be durably committed by read_image, ride every later request, and
permanently fail the session with provider 400s. Admission now enforces a
configurable maxImageDimension (default 2000) during the full decode, so
read_image surfaces a recoverable tool error naming the limit instead of
poisoning durable history; the Web composer gets dedicated copy for the
new IMAGE_DIMENSION_TOO_LARGE reason.

Fixes #2626
2026-08-17 20:49:08 +08:00
imccyu bb4ca698d6 release(dsh): 0.1.0-rc.7 2026-08-17 18:47:02 +08:00
Yichen Jiang 2d2beda196 feat(web): default model retries to five 2026-08-17 17:59:06 +08:00
Yichen Jiang 7e95a00c8a fix(llm): align replay state with assembled content and degrade unusable state
A max-tokens response that included a tool call persisted assembler-transformed
content next to replay metadata projected from the untransformed native message,
so the next request died in history reconstruction with INVALID_REPLAY_STATE and
the session stayed permanently stuck.

Write side: the finish chunk's replayState becomes a typed ReplayEnvelope —
opaque response-level metadata plus optional per-block entries aligned with the
emitted block sequence. BlockAssembler computes one keep/drop decision for
blocks and entries together, so stored metadata always describes stored content
and retained blocks keep their signatures. pi-ai splits its state into a
version-2 response half and per-block signature entries.

Read side: durable content is authoritative. toPiAssistant degrades any
unusable state — foreign kind, other versions (including the flat v1 form
already on disk), malformed metadata, or content/block mismatches — to the
existing provider-neutral conversion with an onReplayDegrade diagnostic instead
of failing the request, which un-bricks sessions poisoned before this change.

Covered by assembler and replay unit tests, an agent-loop continuation
regression, keyless real-composition continuation tests (native pruned-envelope
replay and legacy flat-state degrade), and the authored keyless snapshot
scenario max-tokens-continue through the assembled ACP app.
2026-08-15 16:07:30 +08:00
Yichen Jiang 226600147e feat(llm-deepseek): support low reasoning effort 2026-08-14 11:47:59 +08:00
imccyu 15148dbd9a release(dsh): 0.1.0-rc.6 2026-08-13 19:52:05 +08:00
imccyu abe560f81e release(dsh): 0.1.0-rc.5 2026-08-13 18:49:33 +08:00
imccyu 8c1e8d9890 build(release): publish the dsh family publicly
Every release member now declares publishConfig.access: public, so the scope no
longer mixes levels: the 221 packages/*/* and apps/* manifests join the vendored
framework and the native packages.

check-workspace-constraints drops the per-sequence expectation and holds every
release member to public, which is what stops a member from drifting back.

Access is a property of the package, not of a version: the dsh packages already
published as restricted become world-readable at their next publication.
2026-08-13 18:49:32 +08:00
imccyu 8a954b2eca release(dsh): 0.1.0-rc.3 2026-08-13 18:39:06 +08:00
imccyu 60b04b6ef7 release(dsh): 0.1.0-rc.2 2026-08-13 17:19:37 +08:00
j-xiang f34eda53e3 Merge branch 'master' into docs/readme-human-polish-3 2026-08-13 16:59:11 +08:00
j-xiang 952c6c3c9c docs(i18n): finish README fidelity review 2026-08-13 16:56:10 +08:00
j-xiang 9afdf79782 docs(i18n): resolve remaining README review 2026-08-13 16:23:03 +08:00
imccyu 22ab3beac1 release(dsh): 0.1.0-rc.1 2026-08-13 16:22:33 +08:00
j-xiang 1b03574fb5 docs(i18n): address focused README review 2026-08-13 15:25:00 +08:00
j-xiang ab08eb30a2 docs(i18n): human-polish additional Chinese READMEs 2026-08-13 14:21:33 +08:00
Yichen Jiang 914344d253 Merge branch 'master' into fix/withhold-oauth-only-providers 2026-08-13 13:20:44 +08:00
Yichen Jiang a5a83bd1d9 fix(llm-pi-ai): withhold OAuth-only providers from the configurable directory
pi-ai resolves an OAuth provider from a stored OAuth credential alone, and
this adapter builds its Models collection with no credential store and runs
no login flow. `openai-codex` — the one installed provider declaring
`auth.oauth` with no `auth.apiKey` — was therefore offered on the Models page
with the keyless placeholder every pi-ai route carries, and every request on
it failed `Provider is not configured` before going out.

`catalogProviderTakesApiKey()` answers whether pi-ai's installed provider for
a route declares the one method this adapter can supply, and the directory
skips the catalog routes that fail it. Catalog membership is unchanged, so
`declared` still answers what pi-ai ships; the profile half of the union stays
unconditional, so a route a settings document already names keeps its entry
and can be edited or deleted.

Resolution is untouched: a profile naming `apiKeyEnv` on such a route still
builds a working provider.
2026-08-13 13:15:47 +08:00
Tianyi Cui c905c4694e Adopt MIT for DSH packages 2026-08-13 13:07:24 +08:00
imccyu 3e8a1cfa33 release(dsh): 0.0.1-rc.5 2026-08-13 06:14:27 +08:00
imccyu a90d9af1b2 release(dsh): 0.0.1-rc.4 2026-08-13 05:16:02 +08:00
imccyu 1e99f20963 release(dsh): 0.0.1-rc.3 2026-08-13 03:24:38 +08:00
Tianyi Cui a2d0f7f411 refactor: apply repository naming contract
Apply the accepted pre-release package, service, type, directory, and role renames as one repository-wide change.
2026-08-13 00:54:38 +08:00
07akioni ae3f89e772 Merge remote-tracking branch 'origin/master' into fix/stats 2026-08-12 21:29:00 +08:00
07akioni efb1857853 Merge remote-tracking branch 'origin/master' into fix/stats 2026-08-12 21:22:05 +08:00