Updated 2 hours ago
AI SDK 6.0.324 preserves tool disabling when SDK tools are absent

AI SDK 6.0.324 preserves tool disabling when SDK tools are absent

The v6 patch keeps an explicit toolChoice: none when SDK tools are omitted or empty. Perplexity users also need the compatible provider guard; package versions and the serialized request answer different upgrade questions.

An empty SDK tool list was dropping an explicit choice

The [AI SDK 6.0.324 release](https://github.com/vercel/ai/releases/tag/ai%406.0.324), published November 6, fixes a specific mismatch: a caller could set `toolChoice: 'none'` while omitting the SDK’s `tools` option, or supplying an empty object, and lose that explicit choice during normalization. The release also tells Perplexity users to update `@ai‑sdk/perplexity` to version `3.1.10` or a later compatible version. The [changed core function](https://github.com/vercel/ai/commit/ba3743f0f849c68985ba312782e2f655968e0124) shows the distinction. In its no‑tools branch, the returned `tools` value remains undefined. The old code also returned an undefined tool choice; the replacement preserves an explicit `none` as an object whose type is `none`. Other choices in that branch still return an undefined tool choice. This is a targeted change, not a new instruction to disable every tool in every request. Why can that matter when the application supplies no SDK tools? The tracked changeset identifies native tools configured through provider options. An empty SDK‑level collection does not establish that those separate options are empty. The setting has to survive the core layer before a provider can act on it.

The core package and the provider package are separate checks

The [tracked release guidance](https://github.com/vercel/ai/commit/ba3743f0f849c68985ba312782e2f655968e0124) names both packages because they have different jobs. Core preserves the caller’s explicit selection; the Perplexity integration needs the compatible provider‑side guard. The new core test dependency on the Perplexity workspace is development configuration for the repository’s tests. It is not evidence that updating `ai` automatically updates an application’s separately installed provider package. A useful upgrade record would therefore contain the resolved `ai` version and the resolved `@ai‑sdk/perplexity` version, rather than just the top‑level upgrade command. “A later compatible version” also matters: the source does not instruct every v6 application to install an arbitrary newest package from a different major line. The actual dependency resolution and compatibility remain the application team’s checks. The separate [Perplexity provider pull request](https://github.com/vercel/ai/pull/24413) merged into `main` on November 7. Its description says the active v6 release branch already had the equivalent provider guard, while main needed a separate provider change. That later merge is not the publication date of the v6 core patch. The discussion also leaves live preset enforcement, skill or continuation behavior and live acceptance of conversation history unverified in that provider check. This report does not turn those unverified paths into guarantees.

Read the regression assertions as request evidence

The [added integration‑test source](https://github.com/vercel/ai/commit/ba3743f0f849c68985ba312782e2f655968e0124) covers `generateText` and `streamText`, omitted and empty SDK tools, and a preset model identifier as well as a direct model identifier. For explicit `none`, the assertions look for no serialized `tools` property, a `max_tool_calls` value of zero and no dummy MCP secret in the outgoing request body. Another case supplies no explicit native tool list, addressing the preset path. Those assertions identify concrete evidence to inspect during an upgrade. They do not show that OpenTools ran the tests, contacted Perplexity or exercised an authenticated external connector. We inspected the published source; we did not execute an SDK reproduction. The test’s deterministic response is part of its setup, not a measured answer from a real tool. The same file includes a default‑selection case that expects the native tools and a positive call budget to remain. That is a useful control: this patch’s explicit opt‑out should not be described as removing automatic tool selection everywhere. A successful text response alone would also miss the request distinction the regression is designed to check.

An unexecuted migration check should record both intent and request

OpenTools analysis: consider an application that sometimes permits native connectors but has a separate request path intended to use none. A proposed verification record would name that path, both resolved package versions, whether SDK `tools` is omitted or empty, the chosen model identifier, the explicit tool choice and the native provider options. This is a hypothetical review procedure, not a test we performed or a report of an affected customer. For that opt‑out path, the published assertions suggest inspecting whether the serialized tool definitions are absent and the native call budget is zero. Where an allowed test setup uses dummy authorization or headers, the record should also check that those dummy values were not serialized. Record a redacted result; logging real credentials is not needed to describe the outcome. Keep generation and streaming as separate cases because the source exercises both public APIs. A contrasting request that intentionally uses the default selection needs its own expected result. Otherwise a team could mistake a configuration that disables everything for proof that only the intended path changed. Likewise, recording only an empty SDK `tools` object would leave the provider‑options question unanswered. The useful handoff is the intended choice, the resolved dependencies and the observed request fields together—not just “the model returned text.” This proposed check is narrower than proving the remote service never performs any action. The [source tests](https://github.com/vercel/ai/commit/ba3743f0f849c68985ba312782e2f655968e0124) establish their local assertions; an application’s live configuration, provider enforcement and any external service behavior require their own evidence. No exploit, credential compromise, severity rating or universal protection across SDK branches is established here.

Source and image context

The code and tracked changeset discussed here are in the repository carrying the [Vercel copyright and Apache 2.0 notice](https://github.com/vercel/ai/blob/ba3743f0f849c68985ba312782e2f655968e0124/LICENSE); the [full licence terms](https://www.apache.org/licenses/LICENSE‑2.0) remain available. Copyright 2023 Vercel, Inc. This article explains and comments on the source; its migration scenario is OpenTools analysis, and no source files were modified or redistributed as a software package. GitHub discussion, platform artwork and trademarks are not assigned a blanket licence by that repository notice. Archive portrait of Vercel founder Guillermo Rauch (Commons upload, June 2024); not an image of the AI SDK fix or a product test. Photo: [Oynickj / Wikimedia Commons](https://commons.wikimedia.org/wiki/File%3AGuillermo_Rauch_photo.jpg), [CC BY‑SA 4.0](https://creativecommons.org/licenses/by‑sa/4.0/). Cropped and downscaled; this image adaptation is also CC BY‑SA 4.0. No endorsement implied. The retained photo record has conflicting camera‑date descriptions, so the upload month is not presented as the date the photograph was taken.

Share this article

PostShare

Related News