Skip to content

feat(providers): add Alibaba Token Plan Responses compatibility - #3255

Merged
Astro-Han merged 8 commits into
apache:mainfrom
MoonOld:feat/alibaba-responses-3162
Aug 29, 2026
Merged

feat(providers): add Alibaba Token Plan Responses compatibility#3255
Astro-Han merged 8 commits into
apache:mainfrom
MoonOld:feat/alibaba-responses-3162

Conversation

@MoonOld

@MoonOld MoonOld commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Summary

Adds Alibaba Token Plan Responses support for qwen3.8-max while keeping the other Token Plan models on Chat Completions.

Core owns only protocol facts and explicit delegation:

  • openAiAdapterApiProtocol declares the Alibaba Token Plan qwen3.8-max → openai-responses wire;
  • both Token Plan registry entries reference the stable alibaba-token-plan Runtime profile;
  • the adapter type forbids declaring both a Core responses contract and a Runtime profile.

Runtime owns the concrete execution profile:

  • selects @ai-sdk/open-responses@2.0.34;
  • forces store: false, so continuation never depends on a provider-stored response ID;
  • preserves Alibaba's documented required and single-tool allowed_tools choices while rejecting unsupported forced shapes;
  • consumes both the official reasoning_summary_text and regional reasoning_text carriers through the upstream SDK mapping;
  • treats output_item.done.item.summary as the durable identity and summary-boundary authority;
  • persists bounded local item identity and summary parts for restart-safe replay;
  • isolates invalid, late, interrupted, or mismatched reasoning from finalized durable state;
  • preserves provider failure classifications without widening retry eligibility;
  • leaves DeepSeek on its existing plaintext-content replay path.

Fixes #3162

Upstream resolution

The temporary Maka raw-event normalizer is no longer needed:

This head upgrades to 2.0.34 and deletes the workaround, including the 328-line production normalizer and its 241-line dedicated test. The functional cleanup commit is 65 insertions and 633 deletions; the follow-up commit refreshes the generated Desktop/CLI legal notices for the new dependency graph.

Verification

Exact head bac63a56b, rebased onto main at a956b1ae0:

  • fresh root npm ci completed, reapplied repository patches, and reported 0 vulnerabilities;
  • full workspace build:test and full workspace typecheck passed;
  • npm run format:check, npm run lint, npm run check:asf-headers, and git diff --check passed;
  • the complete npm run check:release contract, including regenerated third-party notices, passed (110 release tests);
  • Runtime full suite: 3,101 passed, 13 skipped, 0 failed;
  • high-signal protocol/backend/provider set: 493 passed across 29 suites, 0 failed;
  • Core routing/catalog set: 25 passed, 0 failed;
  • the rebase retains main's new OpenAI tool_search name isolation and OpenAI/Claude reasoning-summary behavior alongside Alibaba replay;
  • official summary SSE, split into 7-byte UTF-8 chunks, produces the exact SDK reasoning deltas and final summary through unpatched 2.0.34;
  • durable replay, invalid/late IDs, abrupt transport, summary mismatch, provider failure, and Windows unhandled-rejection regressions remain covered.
  • the approved simplification pass removes 85 net lines of duplicate profile state, fetch wrapping, and superseded fixtures without deleting the durable codec, summary boundaries, or backend recovery scenarios.

GitHub CI and the independent Windows recovery job are expected to rerun on this new head.

Provider and live evidence

A protected live smoke on exact code tree 66d74c356 used production AiSdkBackend + ModelAdapter + getAIModel, the configured Token Plan China connection, and qwen3.8-max. The credential was read only in process and was never printed, placed in command arguments, persisted, or attached.

  • request 1: HTTP 200, store:false, no replay input, 54 live compatibility-carrier deltas, and one durable reasoning item;
  • the resulting reasoning item crossed SessionEvent → RuntimeEvent and was reconstructed for continuation;
  • request 2: HTTP 200, store:false, one replayed reasoning item and 34 live compatibility-carrier deltas;
  • both model steps completed with end_turn, and both final answers matched their probe sentinels.

Historical UI evidence remains available: a real Maka TUI run completed streamed reasoning, a Maka-owned Read continuation, and the final answer: #3255 (comment)

Review focus

  • Core owns provider/model protocol routing and the Runtime-profile reference; Runtime owns SDK selection, request policy, and durable replay.
  • Maka now consumes normal SDK reasoning chunks and carries no provider-SSE normalizer or mapped-chunk suppression path.
  • output_item.done.item.summary remains the final durable identity and summary-part authority.
  • A two-way contract test prevents missing and orphan Runtime profile implementations.
  • Account-declared ModelInfo.apiProtocol still overrides the catalog default.

AI use

  • No generative tool made a substantive contribution
  • Generative tooling made a substantive contribution

OpenAI Codex assisted with protocol research, implementation, automated tests, live verification, and PR drafting. The human contributor reviewed the scope and remains responsible for the contribution. The commits carry a Generated-by: OpenAI Codex trailer.

Checklist

  • Tests cover the changed behavior and fail without the upstream mapping
  • Lint, format, typecheck, build, and affected suites pass locally
  • Exact-tree live reasoning and durable replay evidence is recorded; historical Maka-owned tool continuation evidence remains linked

Does this PR entail a change in behavior?

  • Yes — described under Summary
  • No

@MoonOld

MoonOld commented Aug 19, 2026

Copy link
Copy Markdown
Contributor Author

@Astro-Han Could you review the compatibility architecture when convenient? Current main owns parsing/serialization through @ai-sdk/open-responses; Maka adds typed request policies and bounded durable summary identity for Alibaba while keeping DeepSeek content-only. The automated contract and negative-path coverage is in place. A protected Token Plan rerun with retained evidence and the requested real TUI screenshot are still pending.

@MoonOld

MoonOld commented Aug 19, 2026

Copy link
Copy Markdown
Contributor Author

Review follow-up complete on final head 41a1047. Four independently identified boundaries are now covered: header-only request customization cannot bypass store:false/tool-choice policy; legacy and foreign-profile reasoning degrades without blocking; multiple and empty reasoning items retain identity and summary-part boundaries; and streamed reasoning must equal the provider's final summary before durable metadata is attached. A mismatch flushes visible partial text without makaResponses and a later Turn remains usable. DeepSeek is explicitly unchanged from #2972: content-only replay, no new item ID or durable state. Three independent subagent reviews now report no remaining P0-P2. Local evidence: Core 557 passed, focused Runtime 263 passed, provider matrix/thinking 168 passed, root build passed; full Runtime recorded 2,962 passed / 12 skipped with one unrelated PTY 10-second timeout reproduced in isolation. The PR and #3162 descriptions have been updated to match the final behavior.

@MoonOld

MoonOld commented Aug 19, 2026

Copy link
Copy Markdown
Contributor Author

@Astro-Han The final review follow-ups are now on head 41a1047. DeepSeek has been restored exactly to main's content-only behavior, while Alibaba's request policy, profile-isolated durable replay, multi/empty item handling, and failure-safe summary verification now have focused regression coverage. Could you review this final architecture when convenient? GitHub still requires maintainer authorization before the external-fork Actions can start.

@Astro-Han

Copy link
Copy Markdown
Contributor

Reviewing! Thanks for asking~

@Astro-Han
Astro-Han marked this pull request as ready for review August 19, 2026 15:17

@Astro-Han Astro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the final architecture update. I re-reviewed this exact head and found one P2 in the reasoning-item failure path, added inline below.

The provider routing, final store: false override, profile isolation, durable summary validation, and AI provenance otherwise look sound. Approval also needs one author-provided screenshot from the actual user-facing surface: please attach a real terminal or Desktop capture showing qwen3.8-max reasoning followed by a Maka-owned tool continuation. Text-only live verification is not enough for this UI/UX gate.

The remaining exact-head CI gates are still pending, so this is not merge-ready yet.

AI-assisted review disclosure: OpenAI Codex performed the exact-head architecture, failure-recovery, provenance, UI-evidence, and CI analysis; I verified the reproduction, severity, smallest fix, and live GitHub state before posting.

中文说明

当前有一个 P2:第二个 reasoning item 的非法 ID 会让它的无 ID delta 追加到已完成的第一个 item,最终把持久化 summary 状态写坏,导致下一轮在发请求前失败。另请作者提供一张真实 terminal 或 Desktop 截图,展示 qwen3.8-max reasoning 后继续执行 Maka-owned tool;文字说明不能替代 UI/UX 截图。CI 也仍需全绿。

Comment thread packages/runtime/src/ai-sdk-backend.ts Outdated
@MoonOld

MoonOld commented Aug 20, 2026

Copy link
Copy Markdown
Contributor Author

Addressed Astro-Han’s P2 inline finding on head 34bed03. The finalized item can no longer be corrupted by deltas from a following unsafe-ID item, and the new restart/recovery regression proves the failed partial Turn does not brick the next request. The remaining reviewer request is the author-provided real Terminal/Desktop screenshot; code-side focused verification is green.

@MoonOld

MoonOld commented Aug 20, 2026

Copy link
Copy Markdown
Contributor Author

Correction to this correction: the credential owner has clarified that the supplied key is a Token Plan key; the brief Coding Plan classification was incorrect. The earlier temporary run still retained no raw HTTP artifact or request ID, so it remains withdrawn as merge evidence until the reproducible Token Plan probe and requested TUI screenshot complete.

@MoonOld

MoonOld commented Aug 20, 2026

Copy link
Copy Markdown
Contributor Author

Protected credential/routing probe completed on 2026-08-20 through the branch model factory. Coding Plan Chat returned HTTP 401 (invalid_api_key, request ID 3f605e8f-be3a-992a-a443-f57c2a1b7387), while Token Plan China /compatible-mode/v1/responses with qwen3.8-max completed successfully. This confirms the credential is Token Plan and the branch reaches the intended Responses endpoint. The probe used a 32-token output cap and produced no final text, so I am not treating it as reasoning/tool-loop evidence; the requested real TUI continuation screenshot remains pending.

@MoonOld

MoonOld commented Aug 20, 2026

Copy link
Copy Markdown
Contributor Author

Real Maka TUI verification on head 34bed03 using Alibaba Token Plan China with qwen3.8-max: streamed reasoning, a Maka-owned Read tool continuation, and the final answer completed successfully.
qwen3 8max

@MoonOld

MoonOld commented Aug 20, 2026

Copy link
Copy Markdown
Contributor Author

@Astro-Han The P2 reasoning-item isolation finding is fixed on head 34bed03f1202, and the requested real Maka TUI screenshot is now attached above. Could you do a final re-review when convenient? The external-fork CI is still awaiting maintainer authorization.

jackwener
jackwener previously approved these changes Aug 20, 2026

@Astro-Han Astro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed at 34bed03f. This does not work as written, and the reason is a single unverified assumption about the wire contract.

provider-registry.ts declares reasoningReplay: 'plaintext-summary' for the Alibaba Token Plan provider, which commits the adapter to receiving reasoning as a summary-channel event. The vendored @ai-sdk/open-responses@2.0.28 in this tree only handles response.reasoning_text.delta — the content channel — and emits nothing on the summary channel at all. Because ai-sdk-backend.ts:2394 checks the carrier with strict equality and throws on mismatch, every turn that produces reasoning ends in an error rather than a degraded rendering. That is a P0: the feature's primary path is the path that fails. The fix is either to declare the carrier the vendored SDK actually produces, or to verify against a live endpoint that the summary channel is emitted and pin the SDK version that does so.

Architecturally, the PR builds three things that already exist one seam over: a second provider-options key resolver alongside openAiCompatibleProviderName, a second body-rewriting fetch alongside request-customization-fetch.ts, and a STATE_VERSION that does not match the one sessions were written with. The first two are duplication that will drift; the third silently strands existing sessions. None of them is hard to fold back into the existing seam, and doing so now is much cheaper than after this ships.

Reviewed with Claude Opus as an analysis assistant. The carrier finding is confirmed by reading both this head and the vendored SDK source; it is not reproduced against a live Alibaba endpoint, and that verification is exactly what I am asking for. Reproduction status is stated per finding.

Comment thread packages/core/src/provider-registry.ts Outdated
Comment thread packages/runtime/src/model-adapter.ts
Comment thread packages/runtime/src/model-runtime.ts Outdated
Comment thread packages/runtime/src/open-responses-compatibility.ts Outdated
Comment thread packages/runtime/src/ai-sdk-backend.ts
Comment thread packages/runtime/src/open-responses-compatibility.ts Outdated
@MoonOld

MoonOld commented Aug 20, 2026

Copy link
Copy Markdown
Contributor Author

@Astro-Han Thanks for the exact-head review. I rechecked 34bed03f, the pinned @ai-sdk/open-responses@2.0.28 package source, and every commit in this PR.

The P0 premise does not match the pinned adapter's two-stage stream mapping:

  1. response.reasoning_text.delta becomes reasoning-delta; this is the visible streamed text.
  2. response.output_item.done for a reasoning item becomes reasoning-end. Its createReasoningProviderMetadata maps the final item.summary into providerMetadata[providerOptionsName].reasoningSummary.

In this PR, plaintext-summary names the durable replay carrier, not the raw delta event name. ModelAdapter accumulates the content deltas, reads the final summary from the reasoning-end metadata, and AiSdkBackend verifies strict equality before attaching makaResponses. Missing, empty, or mismatched final summary fails the turn by design.

The real Maka TUI run on this exact head completed streamed reasoning, a Maka-owned Read continuation, and the final answer. That path cannot complete if the final summary metadata is absent or differs from the streamed text. Both package.json and the lockfile pin the adapter exactly to 2.0.28.

On the three architecture points:

  • responsesProviderOptionsKey repeats the small raw-provider-identity rule used by openAiCompatibleProviderName. I agree that helper can be centralized, but the current values are identical and contract-tested; this is a maintainability cleanup, not a failing path.
  • The two fetch layers have different authority. request-customization-fetch applies caller-owned additive headers/body fields and rejects collisions. The compatibility layer is deliberately final: it must override store to false and reject unsupported forced tool_choice, including after caller customization. Their JSON plumbing could share a utility later, but folding their authority semantics together would weaken the invariant this PR tests.
  • makaResponses does not exist on main. Its STATE_VERSION has been 1 since the first commit in this PR and never changed across the five commits, so there is no earlier released or PR-head version for this decoder to strand. Legacy/foreign state without this key remains on the tested fail-open skip path.

Given the green exact-head CI, approval, pinned adapter, and live strict-summary evidence, I do not see a code change required for these findings. If you have a concrete 2.0.28 stream shape that bypasses response.output_item.done.item.summary, please share it and I will test that exact case.

Review assistance disclosure: OpenAI Codex rechecked the exact head, pinned npm tarball, and PR commit history; I reviewed and approved this response.

@MoonOld

MoonOld commented Aug 20, 2026

Copy link
Copy Markdown
Contributor Author

Architecture follow-up before the next head update: the new Alibaba Token Plan wire selection, plaintext-summary replay contract, and request compatibility modules (store:false / forced tool-choice policy) are Runtime execution policy, not shared @maka/core domain facts. I am moving the #3255 additions out of Core and into @maka/runtime. The existing ModelInfo.apiProtocol field remains in Core because it is an account-declared cross-process model fact; only the default/effective wire resolution moves. This keeps the provider catalog shared while preventing API-adapter mechanics from widening the Core dependency boundary. The next pushed head will include the migration and updated Runtime-owned contract tests.

@MoonOld

MoonOld commented Aug 20, 2026

Copy link
Copy Markdown
Contributor Author

Follow-up completed locally for the next head update: (1) the conformance matrix now resolves reasoning replay through the effective Runtime adapter and binds both alibaba-token-plan-cn and alibaba-token-plan to an executable qwen3.8-max Responses tool-continuation test, while retaining generated Chat coverage for the other Token Plan models; (2) the branch is merged with current main (a6f33c952), so the real CI planner now reports full=false and selects Runtime plus its actual reverse dependents only. Verification on the merged tree: root build:test passed after applying repository dependency patches; Runtime test:dist passed 2,990 / skipped 13 / failed 0; focused provider matrix and Responses contracts passed 155/155. Core remains absent from the PR diff.

@Astro-Han Astro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

COMMENT. My earlier P1 and P3 are properly fixed; the P0 has moved rather than been answered, and the way it moved introduces a new architecture problem that I think is the most important thing in this round.

Fixed, and well:

  • P1, the throw on a metadata-less reasoning-end. isUnfinalizedPlaintextSummaryReasoningEnd (model-adapter.ts:869-879) now detects exactly the SDK's flush() trailer and :364-372 defers the decision to the terminal outcome, so an existing provider failure wins while a clean stream still fails closed rather than silently losing replay state. That is a more precise fix than the one I asked for, and the comment explains why.
  • P3, the unreachable reject-forced-tool-choice branch. It is now reachable — ALIBABA_TOKEN_PLAN_RESPONSES.compatibility lists it.

Still open from the previous head, and unchanged by this one: the second fetch wrapper in open-responses-compatibility.ts (parseJsonBody plus a wrapping fetch) rather than routing the body rewrite through request-customization-fetch.ts, and the duplicate provider-to-key resolver in model-runtime.ts alongside openAiCompatibleProviderName. Both are P2 and both are now more clearly worth doing, because the new provider-runtime-policy.ts makes three separate places where this provider's special-casing lives. On the STATE_VERSION P2 I will hold rather than restate it — the durable state moved into a new responses-reasoning-state.ts at version 1 and I could not re-derive at this head whether any previously written session reads back under a different version. Please say either way in the PR body.

Two P1s inline. To be explicit about what would move me: for the second one, a captured qwen3.8-max Responses body showing the reasoning on the reasoningSummary channel would close it outright and is probably ten minutes of work. For the first one, putting the contract back in the registry — verified — closes it too, so the two are really one decision.

AI disclosure: this review was assisted by Claude (Opus) for code search and cross-checking. Everything above I re-derived myself against the source at b625a699c.

Comment thread packages/runtime/src/provider-runtime-policy.ts
Comment thread packages/runtime/src/provider-runtime-policy.ts
@MoonOld

MoonOld commented Aug 20, 2026

Copy link
Copy Markdown
Contributor Author

Final review/fix loop update on pushed head fc20601c0: response.failed now preserves its raw provider code through settlement and usage telemetry, so rate_limit_exceeded is classified as rate_limit instead of generic provider_unavailable. Existing policy remains unchanged: without Retry-After, the failure is classified correctly but is not automatically retried. The provider conformance matrix now enforces a duplicate-free bijection between override cells and executable bindings; DeepSeek/xAI/custom-Responses gaps use real two-request HTTP continuation tests. Current main 84fbe05db is merged; planner is full=false, asf_source=false, and Core diff is zero. Local evidence: root build:test passed; focused matrix/Responses tests passed; Runtime full suite passed 2,992 with 13 skipped, with only the known local Node 25 PTY 10-second child timeout failing. Independent production re-review reports no remaining P0-P2. Exact-head Actions still await external-fork maintainer authorization and renewed approval.

@MoonOld

MoonOld commented Aug 20, 2026

Copy link
Copy Markdown
Contributor Author

@Astro-Han I updated the PR body with direct provider evidence for the two remaining architecture/carrier questions. Alibaba official Responses documentation defines reasoning items with required id and required summary entries of type summary_text, and publishes response.output_item.done examples carrying exactly that shape: https://help.aliyun.com/en/model-studio/qwen-api-via-openai-responses. The real Maka TUI run on this feature path also completed the strict streamed-text == final-summary gate before a Maka-owned Read continuation, so this is no longer based only on a synthetic fixture. Core remains the shared provider/catalog/account-fact authority; the Alibaba @ai-sdk choice, replay carrier, and body policy are intentionally Runtime execution policy, with one effective resolver and zero Core diff. The latest pushed head also preserves raw response.failed codes (rate_limit_exceeded now classifies as rate_limit) and closes the matrix override/binding gap. Could you re-review fc20601c0 when convenient? Exact-head Actions still await maintainer authorization.

@MoonOld

MoonOld commented Aug 20, 2026

Copy link
Copy Markdown
Contributor Author

Occam/razor cleanup pushed on b0d4362fe: compared with the prior head, the PR is 200 net lines smaller. The two nested fetch wrappers now share one JSON/Request customization seam with an explicit finalizer; provider identity has one Runtime authority; Alibaba uses one named compatibility profile instead of a hypothetical module list; and the unreleased durable state no longer carries unused content-carrier branches or a single-value carrier field. Root build:test and exact-head high-signal suites passed (199/199), with Biome and diff checks green. Current main advanced only through Windows CI workflow repairs (#3317); it does not touch Runtime and the merge tree is clean, so I did not add another merge commit or retrigger Actions solely for that unrelated change.

@Astro-Han Astro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-reviewed at b0d4362fe. I started this round on fc20601c0, the head moved while I was verifying, and I re-derived every finding against the new head rather than carrying anything forward. I dispatched four scoped sub-reviews — security, correctness and resource bounds, integration, simplification and test quality — and used them as leads only; everything published below I confirmed myself by reading this head.

Four things are fixed, two of them the way I would have asked for.

The second fetch wrapper is gone. open-responses-compatibility.ts is now a fourteen-line body finalizer plugged into the existing request-customization-fetch.ts seam instead of a parallel wrapper with its own request reconstruction — that is exactly the right shape, and it removes the behavioural divergence I was about to file (the old copy hard-threw on GET/HEAD/null-body/non-JSON requests where the established wrapper passes them through). The carrier dimension is also gone: plaintext-summary no longer carries a carrier discriminant, which deletes a union arm no code path could produce. The reasoning-end-without-metadata throw is replaced by a deferral, and the yield in the finally does deliver the deferred error because the generator body completes normally there. reject-forced-tool-choice is now genuinely declared.

I have to correct my own P1 about the declaration split. Two of the three things I offered as evidence do not hold, and I would rather retract them than have you refute them one at a time:

  • I said the deleted core routing test was not moved. It was, and it is stronger than what it replaced: __tests__/responses-wire-contract.test.ts asserts both Token Plan providers route qwen3.8-max to Responses, that qwen3.7-max stays on chat, and that an account-declared apiProtocol override wins. The rule is covered at the layer it now lives in.
  • I said settings and capability display would see a contract the runtime does not use. There is no such consumer. Outside provider-registry.ts itself and packages/runtime/, nothing in the repo reads runtimeAdapter — not desktop, not the CLI. The divergence is latent, not observable today.

What survives is one thing, and I still think it matters: one fact has two declaration sites, and the core side states the opposite of the truth rather than a stale version of it. packages/core/src/provider-registry.ts gives both Alibaba Token Plan providers a runtimeAdapter with no responses at all, and ProviderResponsesContract has no plaintext-summary member, so core's declared position is "this provider does not support Responses" while the runtime routes it there. Relatedly, the docstring at packages/core/src/model-metadata.ts:94-98 now asserts two things that are false at this head — it calls itself the single declared source of the protocol split, and names the runtime model factory and the conformance matrix as its consumers, both of which have moved to defaultOpenAiApiProtocol. Whichever way the layering decision goes, that paragraph has to change.

The architectural question I would like a maintainer to settle, because it outlives this PR: are we adopting "core declares catalog facts, runtime declares execution policy, and runtime policy may add capabilities core says are absent" as a layering? Today it is neither documented nor annotated at runtimeAdapter. A smaller instance of the same question: model-protocol.ts adds reasoningItemId and reasoningSummaryText to the generic thinking event, filled only by the plaintext-summary path. Extending our own protocol is legitimate, but it sets the precedent that every new provider carrier adds fields to the shared event, and that is worth accepting or declining explicitly rather than by default.

For the record on the Runtime Host boundary: this PR does not touch packages/runtime-host at all, and settleModelStepOutcome decides a model step's terminal state, a kind already produced on main. The P2 below is intent bundling, not an authority violation.

One open thread I re-confirmed rather than re-filed, with a sharper mechanism than I first gave: the STATE_VERSION trap is worse than described. The profile is parsed before the version check, so a same-profile version mismatch decodes as malformed with a matching profile, misses the graceful return undefined in materializeRuntimeReplayPlan, and falls through to the throw. A future version bump therefore bricks every session written at version 1. It should degrade the way a profile mismatch already does — that is a two-line change and it is the difference between a migration and a data loss.

Carrying a P1 → COMMENT, not approval.

AI disclosure: reviewed with Claude Code, including four scoped sub-reviews used as leads. Every finding published here I re-derived at b0d4362fe myself — I read the pinned @ai-sdk/open-responses@2.0.28 stream mapping, the decode and replay paths, and the finish-classification diff, and I ran the repo-wide enumeration that retracts my two earlier evidence claims. Sub-review findings I could not confirm at this head are not included.

Comment thread packages/runtime/src/ai-sdk-backend.ts
Comment thread packages/runtime/src/model-adapter.ts
Comment thread packages/runtime/src/provider-runtime-policy.ts
Comment thread packages/runtime/src/model-adapter.ts
@MoonOld

MoonOld commented Aug 20, 2026

Copy link
Copy Markdown
Contributor Author

@Astro-Han @jackwener Exact-head follow-up is pushed at d84bfc901, merged with current main fd9ad4baa (merge, not rebase).

The latest review findings are addressed:

  • late same-ID reasoning deltas now start an undurable part after a finalized item; the regression persists the split and proves the following turn replays instead of throwing;
  • raw finishReason: error classification keeps its diagnostic code but is forced non-retryable, with a provider-agnostic 503 settlement regression, so this PR no longer widens retry behavior;
  • an exact raw-SSE fixture drives pinned @ai-sdk/open-responses@2.0.28 and asserts response.reasoning_text.delta text equals response.output_item.done.item.summary;
  • the duplicate reasoning-start switch label is deleted;
  • well-formed future durable-state versions now decode as unsupported and degrade out of replay, while malformed current-version state remains fail-closed.

The earlier invalid-ID isolation, metadata-less trailer settlement, shared request-customization seam, single Runtime provider-name authority, forced-tool-choice declaration, and real TUI evidence remain intact. Core still has zero diff. Runtime now explicitly documents that its provider policy is layered over Core's catalog-level adapter default and that account ModelInfo.apiProtocol wins. @jackwener, the remaining question is the maintainer-level layering decision: whether this Runtime execution overlay is the intended boundary; I do not see a remaining functional divergence.

Current-main integration also exposed three stale legacy surface fields in owned-candidate.test.ts that no longer typecheck on main; this head removes only those fixture fields, without changing Runtime Host production behavior.

Verification on the pushed tree: root npm run build:test passed; exact high-signal Runtime/Runtime Host set passed 453/453; Biome and diff checks passed; CI planner reports full=false, Core is not selected. Exact-head Actions is currently action_required and needs maintainer authorization: https://github.com/apache/maka/actions/runs/32374114698

@Astro-Han

Copy link
Copy Markdown
Contributor

Hi — this PR conflicts with current main and cannot be merged as-is.

I tested a rebase onto current main locally (in a throwaway worktree — your branch was not touched). It stops on these files:

  • packages/runtime/src/__tests__/provider-contract-matrix.ts
  • packages/runtime/src/model-factory.ts
  • packages/runtime/src/model-runtime.ts

These are real source conflicts, so they need your judgement rather than a mechanical rebase — please rebase onto current main and resolve them yourself, then push. Once the branch is conflict-free and CI is green on the new head, I will pick it up for review.

git fetch upstream && git rebase upstream/main
# resolve, then
git push --force-with-lease

Thanks for the contribution — happy to help if any conflict is unclear.


AI-assisted maintenance note, not a review. It does not count as the required human review under CONTRIBUTING.md §Review.

@MoonOld
MoonOld force-pushed the feat/alibaba-responses-3162 branch from d84bfc9 to 41427b5 Compare August 23, 2026 14:33
@MoonOld

MoonOld commented Aug 23, 2026

Copy link
Copy Markdown
Contributor Author

@Astro-Han @jackwener Rebase requested in the maintenance note is complete on head 41427b515, directly based on current main 8adb74b4f. GitHub now reports the PR mergeable.

The three conflicts were resolved semantically:

  • provider-contract-matrix.ts keeps main's retired/unavailable-provider guard, then applies the Runtime Alibaba adapter overlay;
  • model-runtime.ts keeps main's retired-provider refusal and layers the Alibaba default wire policy without restoring Core declarations;
  • model-factory.ts keeps main's camelCase OpenAI-compatible provider-options mapping and Fast serviceTier, while runtimeProviderName remains the one raw identity used by open-responses and provider metadata.

Core and Runtime Host both have zero diff. Verification on the rebased tree: root npm run build:test, repo lint, format check, full workspace typecheck, and the exact high-signal Runtime set (440/440) passed; CI planner remains full=false.

The new exact-head Actions run again needs external-fork authorization: https://github.com/apache/maka/actions/runs/32645781601. Once it is green, this head is ready for the promised review pickup.

@Astro-Han Astro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for this. test is green on e88e07c2, and the 25 changed files all serve the Token Plan work — I checked each one against the merge base and found nothing riding along.

Two things in the request finalizer are worth another look before this lands; both are inline. They share a shape: the finalizer makes a claim about what the provider supports or does, and the tests assert the claim rather than the provider's behaviour.

One housekeeping note: the verification and live-probe comments in the description still refer to 850ae74a9, an earlier head. They cannot stand as evidence for e88e07c2 — worth refreshing so a later reader does not mistake them for current.

中文

感谢。e88e07c2test 已绿;25 个改动文件我对着 merge-base 逐个过了,都服务于 Token Plan 这条主题,没有夹带。

请求 finalizer 里有两处建议再看一下,都在行内。它们形状相同:finalizer 对供应商的支持范围或行为下了断言,而测试验证的是这个断言本身,不是供应商的实际行为。

另外一件小事:描述里的验证与 live probe 说明仍然指向更早的 head 850ae74a9,不能作为 e88e07c2 的证据,建议更新,免得后来的人误当成当前状态。

Comment thread packages/runtime/src/open-responses-compatibility.ts Outdated
Comment thread packages/runtime/src/open-responses-compatibility.ts

@Astro-Han Astro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I reviewed this head and found a blocking issue.

[P1] Official Alibaba reasoning stream is treated as a mismatch and fails the turn

The official Responses API uses response.reasoning_summary_text.delta/.done, but the pinned SDK does not convert these to reasoning deltas and instead emits reasoning-end with a final summary. With zero reasoning deltas, the backend's nextPartText === '' vs non-empty summary check throws Streamed plaintext Responses reasoning does not match final provider summary.

Existing tests use DeepSeek's reasoning_text extension fixture and non-streaming overrides, so they do not cover the official event shape. The fix should preserve reasoning_summary_text deltas or treat the completed summary as canonical when no delta is available, and cover official SSE persistence/replay.

The separate provider-profile authority check (B-line) is GO — no competing authority.

Checks on 424619b351 are test: success.

简体中文存在官方推理流误判导致转轮失败的阻断。

@MoonOld
MoonOld force-pushed the feat/alibaba-responses-3162 branch from 424619b to 54dbb8c Compare August 25, 2026 05:47
@MoonOld

MoonOld commented Aug 25, 2026

Copy link
Copy Markdown
Contributor Author

@Astro-Han @zhiiw The official Alibaba reasoning-stream P1 is confirmed and fixed on exact head 54dbb8c4d, rebased onto current main 81a811975.

I did not patch @ai-sdk/open-responses. Its published include.rawChunks seam already preserves provider events the adapter does not map, so Runtime now owns one Alibaba-profile-only normalizer:

  • accepts both published migration shapes: standard reasoning_summary_text and compatibility reasoning_text;
  • keeps the first carrier token-live and treats a second carrier as validation-only, preventing duplicate reasoning;
  • validates per-index delta → done → output_item.done.item.summary, including empty done/final cases;
  • uses final summary canonically only when the provider supplied no delta/done evidence;
  • fails closed on mismatches, duplicate finalization, missing parts, invalid/late IDs, or bounded item/part/text limits;
  • keeps unsafe-ID and interrupted partial text visible but permanently undurable;
  • activates only for Core's explicit alibaba-token-plan Runtime profile, leaving DeepSeek unchanged.

Product-level evidence now drives official raw SSE through the pristine pinned SDK, ModelAdapter, AiSdkBackend, SessionEvent → RuntimeEvent, and a second real Responses request. That second wire request is asserted to contain the exact reasoning IDs and summary boundaries. Separate real-raw regressions cover final mismatch teardown, abrupt transport error, unsafe IDs, and late same-ID recovery.

Exact-head gates:

  • fresh npm ci and full workspace build/typecheck;
  • Runtime full suite: 3,078 passed / 13 skipped / 0 failed;
  • exact high-signal protocol/Backend/provider set: 421/421;
  • format, lint, ASF headers, and diff checks passed.

Protected Token Plan China live smoke on the exact code tree completed two production ModelAdapter requests: store:false both times, Maka Read tool call, one durable reasoning item replayed in request 2, live compatibility deltas equal to final summaries, both steps completed, and final LIVE_SMOKE_OK. No credential or raw reasoning was printed or retained.

Three independent review passes report no remaining P0–P2 and score the current implementation 97–98/100. The only outstanding evidence boundary is the requested Windows exact-head re-run; the real raw mismatch test retains the unhandledRejection trap and passes locally.

Could you re-review 54dbb8c4d and, if possible, rerun the Windows high-signal set?

@Astro-Han Astro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The P1 is genuinely fixed on 54dbb8c4d — I verified the include.rawChunks seam and the gating myself, and the implementation is careful. My objection is to where it lives, not whether it is correct.

The size is the problem. Production diff is +1161. In this repo, #3329 (add the Alibaba China provider) was +44 lines of production code, and #2972 (route DeepSeek reasoning through Open Responses, with tool fallbacks — the closest precedent) was +277 / −292, a net reduction. This PR is 4.2× that precedent.

The provider work is not what grew. provider-runtime-policy.ts +92, open-responses-compatibility.ts +52, request-customization-fetch.ts +34 — 178 lines, right in line with precedent. But 805 of the 1,161 lines sit in open-responses-reasoning-stream.ts +328, model-adapter.ts +288, and responses-reasoning-state.ts +189, rebuilding provider-SSE-to-reasoning mapping inside Maka.

All of that exists because @ai-sdk/open-responses maps response.reasoning_text.delta (dist/index.js:803) and has no reasoning_summary_text branch anywhere — I checked the pinned 2.0.29. That is a small upstream gap, answered here with a permanent in-tree module that suppresses the SDK's own reasoning chunks.

Please go upstream instead. We have filed eight issues against vercel/ai, five against @ai-sdk/open-responses specifically. Median close time is 10 hours; five of seven closed within 34 hours. The two reasoning-related ones were slowest (#18513 at 5.4 days, #18511 at 13.5 days) — still far cheaper than carrying 328 lines indefinitely.

What I am asking:

  1. File the missing reasoning_summary_text mapping upstream. Same shape as #18872 and #18870, both closed in about two hours.
  2. If Token Plan must work before that lands, use patches/. @ai-sdk/provider-utils is the precedent, and patches/README.md already carries the retirement rule — "Delete when that guard passes against an unpatched package." A patch has an exit condition; a Runtime module does not.
  3. Split the PR. The ~178 lines of provider onboarding stand on their own merits and can land.

The rot is specific: suppressMappedChunk drops the SDK's reasoning/reasoning-delta chunks once any raw reasoning event appears. When upstream adds the mapping, Maka keeps hiding the SDK's now-correct output and keeps running its own normalizer, with nothing to signal the workaround is obsolete.

Three minor points I would not hold anything for: the evidence cites @ai-sdk/open-responses@2.0.28 while packages/runtime/package.json:132 pins 2.0.29 and this PR changes no manifest; output_item.done throws on an unsafe item id while reasoning_summary_text.delta degrades gracefully for the same input, contradicting the stated "visible but permanently undurable" contract; and per AGENTS.md, AI review passes are not independent human review, so their scores should not stand as review evidence.

Not approving on this head — the ask is structural, not a defect.

简体中文

P1 在 54dbb8c4d 上确实修好了,机制我自己验过,实现也扎实。我反对的是它放在哪里,不是它对不对。

问题是体量。 生产代码 +1161 行。仓库内对比:#3329 加 Alibaba China 服务商是 +44 行生产代码;#2972 把 DeepSeek reasoning 走 Open Responses(还含 tool fallback,最近似的先例)是 +277 / −292,净减。本 PR 是该先例的 4.2 倍。

膨胀的不是接服务商那部分——provider-runtime-policy.ts +92、open-responses-compatibility.ts +52、request-customization-fetch.ts +34,共 178 行,量级正常。但 1161 行里有 805 行在三个文件:open-responses-reasoning-stream.ts +328、model-adapter.ts +288、responses-reasoning-state.ts +189,是在 Maka 内部重建 provider SSE → reasoning 的映射。

这些之所以存在,只因为 @ai-sdk/open-responses 只映射 response.reasoning_text.deltadist/index.js:803),全包没有 reasoning_summary_text 分支——我对着 pinned 的 2.0.29 核实过。一个很小的上游缺口,这里用一个常驻的自建模块绕过去,还把 SDK 自己的 reasoning chunk 压掉了。

请改走上游。 我们向 vercel/ai 提过 8 个 issue,其中 5 个正是 @ai-sdk/open-responses。关闭耗时中位数 10 小时,7 个已关的里 5 个在 34 小时内。最慢的两个恰好是 reasoning 相关(#18513 5.4 天、#18511 13.5 天)——即便如此,也远比永久背 328 行便宜。

具体请求:

  1. 把缺失的 reasoning_summary_text 映射报到上游。形状与 #18872、#18870 相同,那两个都是约两小时关闭。
  2. 如果 Token Plan 必须在上游落地前可用,走 patches/@ai-sdk/provider-utils 有现成先例,patches/README.md 也已写明退出规则——"Delete when that guard passes against an unpatched package"。patch 有退出条件,Runtime 模块没有。
  3. 拆分 PR。那约 178 行的服务商接入本身站得住,可以单独合。

腐烂点很具体:suppressMappedChunk 一旦见到 raw reasoning 事件就丢掉 SDK 的 reasoning/reasoning-delta。等上游补上映射,Maka 会继续压制 SDK 已经正确的输出、继续跑自建 normalizer,而没有任何信号提示这个 workaround 该删了。

三条不阻塞的小点:证据仍写 @ai-sdk/open-responses@2.0.28,但 packages/runtime/package.json:132 pin 的是 2.0.29 且本 PR 不动任何 manifest;output_item.done 对不合法 item id 直接 throw,而 reasoning_summary_text.delta 对同样输入是优雅降级,与自述的 "visible but permanently undurable" 契约矛盾;另按 AGENTS.md,AI review 不算独立人类审查,其评分不宜作为审查证据。

本 head 不 approve——请求是结构性的,不是缺陷。

AI use: drafted with Claude Code (Opus 5); I verified the size comparison, the upstream SDK source, and the issue turnaround data myself before posting.

@Astro-Han

Copy link
Copy Markdown
Contributor

Filed the upstream gap for you: vercel/ai#19659

It covers exactly the defect this PR works around — @ai-sdk/open-responses maps response.reasoning_text.delta at dist/index.js:803 but has no branch for response.reasoning_summary_text.delta, and since the SSE handler is createEventSourceResponseHandler(z.any()) those events parse fine, match nothing, and are dropped silently. The issue includes a runnable reproduction and the one-branch fix. I also checked 2.0.31, the current latest — the gap is still there, so this is not something a version bump resolves.

Please watch that issue. For calibration on how long this usually takes: of the eight issues we have filed against vercel/ai, five were against this same package, and the median time to close is 10 hours.

Once it lands, open-responses-reasoning-stream.ts and the suppressMappedChunk path should be deleted rather than kept alongside the SDK's mapping. If Token Plan needs to work before then, patches/ is the right place — it carries a retirement rule that a Runtime module does not.

简体中文

已代为提交上游 issue:vercel/ai#19659

覆盖的正是本 PR 绕过的那个缺陷:@ai-sdk/open-responsesdist/index.js:803 映射了 response.reasoning_text.delta,但没有 response.reasoning_summary_text.delta 分支;而 SSE handler 是 createEventSourceResponseHandler(z.any()),所以这些事件能正常解析、匹配不到任何分支、被静默丢弃。issue 里带了可运行的复现和只需一个分支的修复建议。我也核实了当前最新的 2.0.31,缺口仍在,升版本解决不了。

请盯一下这个 issue。参考节奏:我们向 vercel/ai 提过 8 个 issue,其中 5 个是这同一个包,关闭耗时中位数是 10 小时。

上游落地后,open-responses-reasoning-stream.tssuppressMappedChunk 这条路径应当删除,而不是与 SDK 的映射并存。如果 Token Plan 必须在那之前可用,正确的位置是 patches/——它自带退出规则,Runtime 模块没有。

@M4n5ter
M4n5ter force-pushed the feat/alibaba-responses-3162 branch 4 times, most recently from ab303c6 to 9e8e8ae Compare August 26, 2026 09:52
@github-actions github-actions Bot added the effort/XL Over 1000 readable lines label Aug 27, 2026
@MoonOld
MoonOld force-pushed the feat/alibaba-responses-3162 branch from 9e8e8ae to 879e4f4 Compare August 27, 2026 03:30
@MoonOld

MoonOld commented Aug 27, 2026

Copy link
Copy Markdown
Contributor Author

@Astro-Han The upstream path you requested is complete on head 879e4f420:

Local gates are green: fresh npm ci (0 vulnerabilities), build, workspace typecheck, format, lint, ASF headers, Runtime 3,076 passed / 13 skipped, and the 417-test high-signal set. The PR description has been refreshed for this exact head. Could you re-review the smaller upstream-based implementation when convenient?

A consumer that stops the adapter mid-stream (the reasoning-mismatch
throw, a user stop) leaves the SDK without a finish chunk, so teardown
rejects every result promise. usage and finishReason were already
consumed, but response was only read on the completed continuation
path — its rejection could surface as an unhandled rejection after the
turn unwound, scheduler-timing owned (observed post-test on Windows,
where Node makes it a crash). Sink it unconditionally in the teardown
finally, and pin the property with an unhandledRejection trap in the
mismatch test so every event loop proves the path leaves none behind.
Permit documented required and allowed_tools choices when they select exactly one tool, while keeping provider-owned store:false finalization and rejecting unsupported forced shapes.\n\nGenerated-by: OpenAI Codex
Consume both published Alibaba plaintext reasoning carriers through the AI SDK raw-chunk seam, validate their item and summary boundaries, and preserve durable replay across official, compatibility, error, and migration stream shapes.

Generated-by: OpenAI Codex
Upgrade @ai-sdk/open-responses to 2.0.34, which maps both official and regional Alibaba reasoning carriers, and remove the temporary raw-event normalizer while retaining durable summary validation and replay.

Generated-by: OpenAI Codex
Record the exact Apache-2.0 override for provider-utils 5.0.32, whose published tarball omits its LICENSE, and regenerate the Desktop and CLI dependency notices for the 2.0.34 dependency graph.

Generated-by: OpenAI Codex
Keep the replay and reasoning comments bound to the 2.0.34 version now pinned after the upstream fix.

Generated-by: OpenAI Codex
@MoonOld
MoonOld force-pushed the feat/alibaba-responses-3162 branch from 6eddb57 to 66d74c3 Compare August 28, 2026 08:14
@MoonOld

MoonOld commented Aug 28, 2026

Copy link
Copy Markdown
Contributor Author

@Astro-Han #3255 is now rebased onto current main (a956b1ae0) at exact head 66d74c356; the PR is no longer carrying the stale conflict base.

The four conflicts were resolved by retaining both sides' behavior:

  • main's OpenAI Responses tool_search provider-name isolation remains intact;
  • main's OpenAI/Claude reasoning-summary changes remain intact;
  • Alibaba's Runtime profile, official/regional reasoning mapping, durable summary replay, request finalizer, and provider-error handling remain intact;
  • the legal notice generator retains exact-version overrides for both @ai-sdk/provider-utils@5.0.32 and main's @sigstore/verify@4.1.2.

Exact-head local gates are green: fresh npm ci (0 vulnerabilities), build:test, workspace typecheck, format/lint/ASF headers, release contracts 110/110, Runtime 3,103 passed / 13 skipped / 0 failed, focused cross-surface set 495/495, and Core routing/catalog 25/25.

The protected Token Plan China smoke was also repeated on this rebased tree through production AiSdkBackend + ModelAdapter + getAIModel: two HTTP 200 store:false turns completed, the first produced one durable reasoning item, and the second request replayed exactly one reasoning item. The PR description is refreshed for this head. Could you re-review when convenient after the new CI completes?

@Astro-Han Astro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for staying with this through several rounds of review. I re-reviewed exact head 66d74c356.

The size is less alarming once separated: roughly 805 production additions, 2,137 test additions, and 466 generated dependency/license lines. More importantly, moving the carrier mapping upstream to @ai-sdk/open-responses@2.0.34 already removed Maka’s 328-line raw-event normalizer.

I found no remaining P0/P1 issue. The earlier carrier, late-delta, finish-reason, missing-metadata, and provider-authority concerns are either fixed on this head or no longer supported by the current evidence. CI is green, so I’m approving.

I do think a final simplification pass would improve the change before merge:

  • remove the test-only RUNTIME_PROVIDER_PROFILE_IDS export and its redundant bijection assertion;
  • remove the direct serialization test already covered more strongly by the two-provider contract-matrix tool-continuation test;
  • reuse the existing request customization fetch when no provider finalizer exists, instead of wrapping it again;
  • drop the resolved adapter’s original runtimeProfile field once it has been converted into the concrete responses contract;
  • remove the redundant unsupported-version fixture.

These are non-blocking, but they are concrete deletions with no capability loss, and I would prefer to land them in this PR. I would not remove the durable reasoning codec, summary boundaries, or the seven backend integration scenarios: those protect different stream, persistence, replay, and recovery boundaries.

OpenAI Codex and delegated @reviewer agents assisted with the code-path and simplification analysis. Astro-Han reviewed the evidence and made the final approval decision.

中文对照

谢谢你耐心跟进这么多轮审查。我重新检查了当前 head 66d74c356

拆开看以后,这个 PR 的规模没有表面上那么夸张:大约 805 行生产代码、2,137 行测试,以及 466 行自动生成的依赖与许可证内容。更重要的是,carrier mapping 上移到 @ai-sdk/open-responses@2.0.34 后,Maka 自己维护的 328 行 raw-event normalizer 已经删除。

当前没有剩余 P0/P1。之前关于 carrier、late delta、finish reason、缺少 metadata 和 provider authority 的意见,要么已经修复,要么已不再被当前证据支持。CI 全绿,因此我批准这个 PR。

合并前仍建议做一次明确的简化:删除只供测试使用的 profile ID 列表及重复契约测试、删除已被更强端到端测试覆盖的直序列化测试、没有 finalizer 时复用现有 request fetch、解析 profile 后不再保留重复表示,并删除一条重复的 future-version fixture。

这些不阻塞批准,但都属于不损失能力的确定删除项,最好在本 PR 内完成。durable reasoning codec、summary boundaries 和七个 backend 集成场景分别保护真实的流式、持久化、重放与恢复边界,不建议为了缩行数删除。

Apply the approved cleanup pass by dropping redundant profile state and tests, and reuse the existing request customization fetch when no provider finalizer is required.

Generated-by: OpenAI Codex
@MoonOld

MoonOld commented Aug 29, 2026

Copy link
Copy Markdown
Contributor Author

@Astro-Han Implemented all five non-blocking simplifications on head bac63a56b:

  • removed the test-only RUNTIME_PROVIDER_PROFILE_IDS export and redundant bijection assertion;
  • removed the direct replay serialization test superseded by the two-provider contract-matrix continuation scenario;
  • reused requestFetch for Open Responses profiles without a provider finalizer;
  • removed runtimeProfile from the resolved adapter after materializing its concrete responses contract, including at the type boundary;
  • removed the duplicate unsupported-version fixture while retaining the dedicated graceful-degradation test.

Net result: 13 insertions / 98 deletions. The durable reasoning codec, summary-boundary validation, and seven backend integration/recovery scenarios remain unchanged.

Exact-head gates: workspace typecheck, format, lint, ASF headers, Runtime 3,101 passed / 13 skipped / 0 failed, focused cross-surface 493/493, and release contracts 110/110. The PR description is refreshed; new CI is running.

@Astro-Han
Astro-Han merged commit be78daf into apache:main Aug 29, 2026
20 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

effort/XL Over 1000 readable lines

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat(providers): add Alibaba Token Plan Responses wire with durable Qwen reasoning replay

4 participants