Repository navigation
fix(providers)!: align vendor packages with upstream and add missing model families - #220
cunninghamcard-bit wants to merge 55 commits into
Conversation
…parts What: fixes the differences that a package-by-package comparison against the pinned upstream sources found in OpenAI, Azure, Anthropic, Amazon Bedrock, Google, Google Vertex, Mistral, Cohere, xAI and the OpenAI-compatible package. The changes are in request building (option names and validation, schema handling, cache and beta merging, tool conversion), response mapping (usage, provider metadata keys, citations and sources, reasoning) and stream handling (error parts, raw chunks, finish data). Examples: - Bedrock percent-encodes the model id in the URL, writes metadata under both `amazonBedrock` and the legacy `bedrock` key, and applies upstream's capability rules to sampling settings and reasoning. - OpenAI embeddings request `encoding_format: "float"` and no longer decode base64 vectors; the Responses log-probability include follows upstream's condition. - Google no longer invents `response.model_id`; the call layer supplies the default, as upstream does. - Anthropic emits citation sources, forwards a mid-stream `error` event as an error part without a synthetic finish, and falls back to a JSON tool for structured output on models without native support. - Vertex accumulates partial function-call arguments; Vertex Anthropic uses the `googleVertex` namespace and never Express mode; Vertex transcription sends its credentials to the Speech-to-Text host (they were dropped before, so every such request went out unauthenticated). - xAI Responses returns image generation calls and results. - Each package sends its own `user-agent` suffix. Mistral has no `transform_request_body` setting. The deprecated `text_embedding` and `text_embedding_model` aliases are not carried over. Why: the direction is that Rust behaves as the AI SDK does, with upstream as the reference. Of 106 severe findings, 94 are fixed here; the 12 left need new model kinds, shared type changes or Google default credentials, and are listed with reasons in the pull request description. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WGwanvo9WLU9HWD7sRR8TS
What: - The cassette replay harness and the Bedrock regression mocks compare request paths after percent-decoding, so an encoded model id matches a recording made either way. - The upstream-sample tests ignore `user-agent` on both sides: the recorded value carries the upstream package version, ours carries this crate's. - The Google upstream-sample test no longer expects the provider result to carry a model id. - Bedrock regression tests accept the legacy `bedrock` metadata key next to `amazonBedrock` and read the reasoning signature from the delta that carries it. These tests replay values taken from recordings, so their assertions are adjusted rather than the tests removed. - Removed tests that pinned behaviour Rust no longer has: top-level `cached_tokens` usage for two preset rows, a synthetic error finish after a mid-stream Anthropic error, a Responses stream that ends itself after an error event, two OpenAI embedding replays whose recordings hold base64 vectors, and a Bedrock stream replay over recordings that stored the binary event stream as text. Why: these tests asserted the old behaviour. No cassette or fixture is changed; the recordings that can no longer be replayed are listed in the pull request description. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WGwanvo9WLU9HWD7sRR8TS
…am tests What: ten files, `<vendor>_upstream_e2e_test.rs`, for OpenAI, Azure, Anthropic, Bedrock, Google, Vertex, Mistral, Cohere, xAI and the OpenAI-compatible package: 67 tests. Each builds the provider through its public factory with an in-process transport, calls the model, and asserts the request that was sent and the parts that came back. Per model kind there is at most one test each for generate, stream, tool call and error. Every test names the upstream test it comes from. Why: Azure and Vertex had no replay test at all, and the alignment needed something that exercises it. This is a selection, not a case-by-case port. The Vertex transcription test is the one that showed requests went out without credentials. One test is ignored with its reason: `CallOptions::tool_choice` is not optional, so `tool_choice: "auto"` is always sent where upstream omits it. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WGwanvo9WLU9HWD7sRR8TS
Request URLs, metadata keys, embedding encoding and removed provider methods change for callers, so they are listed under Breaking. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WGwanvo9WLU9HWD7sRR8TS
What: a Cohere message-end event without a usage object is a parse error instead of a panic. Groq and DeepSeek return the raw response body again. Mistral takes the tool message name from the tool result only. Bedrock has one request builder. OpenAI and Azure lose the unused request-body transform slot. Two end-to-end tests assert what the upstream tests assert: the full OpenAI stream sequence, and native structured output selected by the model id the upstream test uses. Why: an independent review found a crash, two dropped fields, one finding marked fixed that was not, a second code path, and two weakened tests. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WGwanvo9WLU9HWD7sRR8TS
Why: bring the tool-result alias removal up the stack. The provider sources keep this branch's versions; they already read the base URL environment variables, skip empty keys and report upstream's provider names, as the vendor alignment did those first. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WGwanvo9WLU9HWD7sRR8TS
What: Bedrock structured JSON output for generate and stream, Bedrock provider-defined Anthropic tools, a closed set of Bedrock model families. Azure speech transcription with its own route and endpoint. Vertex and Vertex Anthropic application default credentials with the upstream auth options. A Gemini transcription model on Vertex. OpenAI Responses provider tools with their typed factories, request mapping and response and stream events. The Responses conversion returns an error where it could panic. One test per new feature is selected from the upstream test files. Why: these were listed as open differences from upstream; the owner's decision is to close them in this pull request rather than carry them. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WGwanvo9WLU9HWD7sRR8TS
What: brings up the tool, content and provider-option type changes and converts this branch's code to them. OpenAI Responses emits tool approval requests and compaction as custom content. Anthropic emits custom content where upstream does. Google and Vertex return thought images and files as reasoning files. A vendor omits tool_choice when the caller set none, and the test that was ignored for this runs again. Why: these open differences were waiting for the content variants that the lower branches now provide. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WGwanvo9WLU9HWD7sRR8TS
Why: carry the provider prompt changes up the stack: structured tool result output with a required tool name, signatures in provider options, and the reasoning-file, custom and tool-approval-response parts. Each vendor converter consumes them as its upstream package does. Hand-written tests that no longer compile are deleted. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WGwanvo9WLU9HWD7sRR8TS
Why: carry the factory branch's additions up the stack: completion(id) for OpenAI and the OpenAI-compatible package, Anthropic skills, registry middleware, and the private request-body builder. This branch's upstream-aligned vendor behaviour is kept. Vendor namespaces in the newly ported code go through the package constants so the boundary check passes. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WGwanvo9WLU9HWD7sRR8TS
…back What: the Bedrock stream test and the OpenAI factory test no longer expect a default tool choice, which upstream does not send; a Google request-body difference is fixed. In-file test modules and test functions that earlier merge resolutions had restored are removed. Test files ported from upstream test suites are kept. Why: tool choice is optional now and the vendors omit it when unset, as upstream does. Hand-written tests that pin Rust-only behaviour are deleted in this project, and the branches below had already deleted these. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WGwanvo9WLU9HWD7sRR8TS
Why: keep the stack linear after the factory branch dropped the hand-written tests that earlier merges had restored. This branch's upstream-aligned vendor code is kept in the conflicts. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WGwanvo9WLU9HWD7sRR8TS
…der docs What: the data-loss regression test keeps this branch's assertions, which follow the upstream-aligned Bedrock and Anthropic behaviour, instead of the factory branch's. The Google end-to-end test no longer expects a default tool config. docs/api/providers.md is regenerated. Why: the last merge took the lower branch's copy of the regression test, which asserts the pre-alignment behaviour, and the generated provider list was stale after the new models were added. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WGwanvo9WLU9HWD7sRR8TS
…ours What: brings back 30 test functions ported from upstream test suites (DeepSeek, Groq, Open Responses). Anthropic document citations are emitted as sources as far as the source type can carry them. Bedrock no longer returns a response body upstream does not return. A DeepSeek stream error event is reported as upstream reports it. The hand-written provider trait test is deleted. Why: an independent audit found that upstream-ported coverage had been removed together with hand-written tests, and listed these differences. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WGwanvo9WLU9HWD7sRR8TS
…ntract fixtures Why: carry up the stack the source union, the removal of the separate thought-signature field and the deletion of the self-generated contract fixtures. This branch's vendor code builds url and document sources and carries signatures in provider metadata and options as upstream does. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WGwanvo9WLU9HWD7sRR8TS
…nges from below Why: carry up the factory branch's settings alignment, image-model middleware and restored upstream-ported tests, together with the raw adapter removal from below. The settings take the factory branch's shape; this branch's upstream-aligned vendor behaviour is kept; the test files keep the union of upstream-ported tests from both sides. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WGwanvo9WLU9HWD7sRR8TS
What: drops one assertion from the Bedrock generate test. Why: upstream's Bedrock model returns id, timestamp, model id and headers as response information and no body; the source already follows that. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WGwanvo9WLU9HWD7sRR8TS
Why: the factory branch merged its split-out parts without changing any file; this keeps the stack linear. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WGwanvo9WLU9HWD7sRR8TS
What: Google and Vertex treat `partialArgs: null` and `args: null` as upstream does, Vertex rejects user file references and loses its old anthropic_model entry in favour of the Vertex Anthropic factory; Anthropic maps computer toolset calls back to the caller tool with action; OpenAI Responses maps approval ids to the original call id, keeps the async option on custom tool history and accepts a shell environment without a type tag; Bedrock detects inline media before validating it; Groq turns a first error event into stream-start, error, finish. Removes the GenerateResponse and StreamResponse aliases. The Bedrock e2e test regains the upstream toolChoice input and assertion. Why: review of this branch against the pinned vendor packages. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WGwanvo9WLU9HWD7sRR8TS
Why: carry up the stack the fixes made after the third independent review on the branches below; this branch's code is converted to them. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WGwanvo9WLU9HWD7sRR8TS
Why: carry up the stack the fixes made after the third independent review on the branches below; this branch's code is converted to them. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WGwanvo9WLU9HWD7sRR8TS
… the encoded model id
What: Groq and the openai-compatible chat model no longer pre-read the
first SSE event; an error event flows as stream-start, error, finish as
upstream does. Bedrock gains the S3 supported-url entry and sends an
empty tool-use input as {}; its temperature warning matches upstream.
The migrated Bedrock image and embedding tests mount the percent-encoded
model path the model now requests.
Why: the gate showed sixteen failures after the merges; in each case
the pinned upstream behaviour decides.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WGwanvo9WLU9HWD7sRR8TS
…d remaining cases What: brings back bedrock_remaining_test.rs (38 cases) and anthropic_remaining_test.rs (21 cases), translated from the upstream packages, adapted to the current API and no longer ignored; Anthropic gains the mid-conversation tool change handling, argument validation, leading system message handling and beta headers those cases cover, and the empty base-url error text. Six Bedrock cases are left out: three whose upstream expectation changed (merged into the hash case), two environment cases with no upstream counterpart, one duplicated by the e2e selection. Why: the files were deleted lower in the stack as hand-written; they are upstream translations and the project keeps those. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WGwanvo9WLU9HWD7sRR8TS
Why: carry up the stack the fixes made after the third independent review on the branches below; this branch's code is converted to them. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WGwanvo9WLU9HWD7sRR8TS
What: the Azure speech path spells the package name through options::NAMESPACE instead of a literal. Why: the provider boundary check forbids the literal outside options.rs. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WGwanvo9WLU9HWD7sRR8TS
Why: carry the formatting commit up the stack; no code change. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WGwanvo9WLU9HWD7sRR8TS
Why: carry the ancestry up the stack; no code change. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WGwanvo9WLU9HWD7sRR8TS
What: GroqTranscriptionModel (multipart POST to /audio/transcriptions, options parsed as the upstream schema does, text and strict JSON responses, segments from segments or words), exposed as provider.transcription() and through the Provider lookup; eight upstream test cases ported. Why: the upstream groq package has a transcription model and Rust did not; the user ruled that the missing model families are ported now. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WGwanvo9WLU9HWD7sRR8TS
What: MistralSpeechModel (/audio/speech, refAudio, upstream warnings and request-body redaction) and MistralTranscriptionModel (multipart /audio/transcriptions, upstream option rules, segments and usage metadata), exposed as provider.speech() and provider.transcription() and through the Provider lookups; 28 upstream test cases ported. The shared media_type_to_extension now maps mpeg, mp4, x-wav and opus as upstream does. Why: the upstream mistral package has both model families and Rust did not; the user ruled that the missing model families are ported now. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WGwanvo9WLU9HWD7sRR8TS
What: GoogleSpeechModel (WAV framing, option validation) and GoogleTranscriptionModel (unary /interactions call and the Live websocket loop, api key in the query, /v1beta stripped), exposed as provider.speech() and provider.transcription() and through the Provider lookups; Vertex gains speech() over the same implementation and its Gemini transcription reuses the shared options, offset parser and live loop (about 200 lines fewer). A peer close after the audio ended finishes the stream with the accumulated text as upstream does. 54 upstream test cases ported. Why: the upstream google package has both model families and Rust did not; the user ruled that the missing model families are ported now. Not ported: speech translation (no core type) and Vertex chirp text-to-speech. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WGwanvo9WLU9HWD7sRR8TS
|
OpenAI MCP 审批的标准化转换需要随公共类型范围调整(核对 head 本轮确认的范围调整:aimux 不承担审批运行时,也不定义统一的审批公共类型/语义;审批相关的定义、解释和处理由上层负责。这是对 #200 §0.4 原先“保留审批 variant”范围的收窄,不是否认 AI SDK 中存在这些类型。 本 PR 的 provider_events.rs 将 mcp_approval_request 构造成统一的 ToolCall 和 RawToolApprovalRequest;prompt_approval_tool_call_ids 及 responses_convert.rs 又维护 approval id 与 tool-call id 的对应关系,用于非流式和流式转换。审批回复转换为 mcp_approval_response 的路径则继承自 #219。 请配合 #219 撤去 aimux 统一审批输出和审批专用关联状态。范围是移除 aimux 的统一审批抽象;provider 原生参数的去留按其既有接口契约判断,不按 approval 关键词批量删除。保留并遵守现有原始响应/事件的返回契约。是否补充通用数据出入口另行评估,不把新增透传通道、完整审批往返或审批专用无损机制作为移除统一审批抽象的前置条件。 SDK 调研后的边界说明这里要解决的是:厂商返回 aimux 不负责解释的内容时,上层如何接管,而不是要求 aimux 实现审批。
调研依据与适用范围:
本轮结论:移除 aimux 统一审批语义;保留既有通用数据契约;通用回传能力是否扩展另行决定。以上是源码与文档路径核查,未进行真实服务的审批往返验证。 已核实:删掉审批类型后,上层还能不能发回结果?通过普通调用接口不能;Rust 调用者可以自己写 在审阅栈
源码依据:专用审批转换及 Custom 分支、Rust fetch 设置。绑定侧也已核查:Node/Python/C 没有公开该 fetch 回调;Node 的 因此,移除审批专用类型后,不能宣称普通调用者已经可以仅靠现有接口完成审批。现状是能读取厂商数据,但 Node/Python/C 调用者若要回复,必须自己调用厂商 API;Rust 还可以利用现有 fetch 扩展。这是已经确认的能力缺口,不再是“输入路径待核实”。若要求这些绑定也能通过 aimux 完成上层自定义流程,所缺的是通用原生请求入口,不是统一审批协议。 验证:1 个请求捕获测试、4 条路径全部通过;无真实 OpenAI 请求,无生产代码修改,临时测试已移出仓库。 |
|
补充澄清当前实现与 Rig 的比较(核对 #220 head 当前 aimux 已经能完成审批往返。 OpenAI 返回 与 Rig 的差别是承载方式,不是“能否让上层作决定”。 Rig 把厂商审批请求作为通用 因此,前面“普通调用接口不能回传”的结论仅针对移除 |
|
关于是否删除 不做审批 loop,并不要求删除 provider 层的审批传输类型。 当前实现只负责把 OpenAI 的 删除是范围选择,会改变现有能力。 我的建议:如果目标只是“不在 aimux 运行审批、决定权归上层”,保留这些传输类型即可,不必删除。 如果产品边界进一步要求“aimux 连审批传输协议也不提供”,则可以删除,但应明确这是撤销现有往返能力;不能同时声称上层仍可通过当前普通接口自行完成同一流程。请按这个能力取舍决定 #219 的公共类型和 #220 的转换是否保留,而不要仅凭“没有审批 runtime”决定删除。 |
…pstream
What: the OpenAI Chat encoder replays a non-object tool-call input as
`{}`. That is upstream's `serializeToolCallArguments` (@ai-sdk/openai
4.0.49 and later), not a loss of data: OpenAI function arguments are
always objects. A comment and a test now say so.
Why: the behaviour looked like a fidelity bug; it was kept on purpose to
stay with upstream.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QeURmKQzedTSiu2vL3yVes
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01R6wpZPfWrKN9XKB7WXXK2o
What
Aligns vendor request and response conversion, authentication and streaming with the pinned AI SDK sources, and ports the model families that the pinned packages have and aimux lacked, plus the evaluation model and
customProvider. Each new family translates the upstream model and options files; the upstream test file is ported case by case (/// TS:). Baserfc-0036/provider-factory(B); follows B, precedes D. The headrfc-0036/vendor-alignmentis fast-forwarded to the model-families commit. Replaces #220.Layers
rfc-0036/vendor-alignmentrfc-0036/model-familiescustomProviderBefore and after
encoding_format: "float", reads numeric vectorsOpenAIEmbeddingModelasync; local shell environment accepts an omittedtypeOpenAIResponsesLanguageModel,convertToOpenAIResponsesInput,shell.tsaction,toolsetName(kept in history); mid-stream errors forwarded without a synthetic finishAnthropicLanguageModelamazonBedrockandbedrock; no response body; S3 supported-url entry; empty tool-use input sent as{}AmazonBedrockChatLanguageModel"null"; nullpartialArgscould discard a callargsbecomes{}with no delta; nullpartialArgspermits the complete-call path; response model IDs unsetGoogleLanguageModelgoogleAuthOptions; separate Vertex Anthropic factory (googleVertexmetadata, no Express mode); main provider'santhropic_modelremovedGoogleVertexProvider,GoogleVertexAnthropicProviderMistralChatLanguageModelmessage-endusage; image-generation calls and results returnedCohereChatLanguageModel,XaiResponsesLanguageModelexplicit_message_item_typeset for Foundry project hosts (*.services.ai.azure.com)azure/src/azure-openai-provider.ts(explicitMessageItemType: isFoundryProject)groq/transcription.rs,GroqProvider::transcriptiongroq-transcription-model.tsmistral/speech.rs,mistral/transcription.rsmistral-speech-model.ts,mistral-transcription-model.tsgoogle/speech.rs,google/transcription.rs(including Live); Vertex reuses them with its own options namespacegoogle-speech-model.ts,google/src/transcription/*xai/speech.rs,xai/transcription.rs(HTTP and realtime WebSocket),xai/video.rsxai-speech-model.ts,xai-transcription-model.ts,xai-video-model.tsaimux-core/src/evaluation_model.rs,Provider::evaluation_model,EvaluationLanguageModeladapter in provider-utils; OpenAI and Google expose itevaluation-model/v4/*,evaluation-language-model.tscustomProvidercustomProviderevaluationModellookup with upstream'sNoSuchModelcontext; oneProviderimpl with per-modality alias tables and a fallback providerprovider-registry.ts,custom-provider.tsTests
toolChoice: "auto"end-to-end case; existing ports follow upstream behavior. Terminal-SSE regressions assert one non-recoverableStreamPart::Error, no successful finish, no finalized incomplete tool call.bedrock_remaining_test.rs(38 cases) andanthropic_remaining_test.rs(21 cases), deleted in A, return adapted and not ignored. Anthropic gains the tool change handling, argument validation, leading system message handling, beta headers and empty base-url error text they cover. Six Bedrock cases are left out: three with a changed upstream expectation, two env cases without upstream counterpart, one duplicated by e2e.upstream_e2e_test.rsfiles through public factories with an injected transport; not complete suites. Bedrock image and embedding tests use the percent-encoded model path.groq_transcription_test.rs(8),mistral_speech_test.rs(16),mistral_transcription_test.rs(12),google_speech_test.rs(39),google_transcription_test.rs(15),google_evaluation_test.rs(7),xai_speech_test.rs(17),xai_transcription_test.rs(17),xai_video_test.rs(76),evaluation_language_model_test.rs(16),custom_provider_test.rs(18): 241 cases. No hand-written tests added.body_base64stream replay; Google generated-file coverage is restored from recordings. Cassettes andfixtures/are unchanged.Not in this pull request
customProviderstring aliases,evaluate()andopenai-evaluation.test.tsare not ported. Bindings expose no constructors for the new families; only generated TypeScript types change.aimux-providers/src/openai/model.rs,openai/responses/mod.rs); no ported test covers it.aimux_providers::providerand theModelMessagetool-result shape: covered by D. D does not mention remaining tool-error behavior.Relation to the maintainer's design
Reference order: the pinned AI SDK source first; where it has no counterpart (C ABI, bindings, recording, code generation), the maintainer's RFCs 0039 (ops and bindings, #209), 0040 (provider construction and auth, #210), 0041 (replay governance, #211) and 0042 (V4 type boundaries, #212), which are Drafts that refine the #200 design doc
docs/aisdk-architecture-alignment.md; that design doc only where those RFCs defer to it. Where an RFC restates upstream behaviour differently from the pinned source, upstream wins and the RFC gets an amendment request. The stack targetsrfc-0036/integration; RFC-0039 §11 and RFC-0040 §7.2 require the whole closure to switch to master at once, so items marked "before master" must land on integration first. "Branch E" is the follow-up branch stacked on D, in progress.Verification
Gate on the head
f7bcb79d:cargo fmt --check,cargo clippy --workspace --all-targets -D warnings,cargo docwith-D warnings, tests of core, provider-utils, providers, ffi, web, replay and cli: 2,794 passed, 0 failed, 6 ignored; Node and Python bindingscargo check; provider boundary script;gen_ts_types.py --check;gen_providers_doc.py --check. Cassettes andfixtures/aisdkunchanged. Diff against the base: 199 files changed, 31643 insertions(+), 6483 deletions(-). After the restack onto the currentmaster, only this head was tested; the intermediate layers were checked with fmt and clippy only.Restacked head
ff339b50. Restack (2026-10-09): mergedmaster(#213, SSE) and the rewritten #204 tracker down the stack by merge, no history rewrite. This layer ports openai_compatible's end-of-stream flush of still-unnamed pending calls to the new API. Checked:cargo fmt --check,cargo clippy --workspace --all-targets -D warnings, tests of provider-utils and providers (129 test binaries, 0 failed).cargo doc, binding checks and the generator--checkscripts were not rerun.Not verified
No GitHub check runs were attached at the last refresh. Go, Java, Kotlin, Swift and Flutter were not compiled locally in that refresh; Node
npm testand Pythonpytestwere not run onmodel-families. Live vendor calls and unported upstream cases are outside validation.🤖 Generated with Claude Code