Skip to content

refactor(ai): flatten provider request options - #43513

Merged
kitlangton merged 2 commits into
v2from
flat-provider-options
Aug 19, 2026
Merged

refactor(ai): flatten provider request options#43513
kitlangton merged 2 commits into
v2from
flat-provider-options

Conversation

@kitlangton

@kitlangton kitlangton commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

What

Flatten provider-specific request options in the canonical AI request model. A selected LanguageModel<Options> now types providerOptions as that provider's direct option record instead of requiring an additional provider namespace.

Before / After

Before

LLM.request({
  model,
  prompt,
  providerOptions: {
    openai: { reasoningEffort: "low" },
  },
})

Native protocols had to select their own namespace from the canonical request even though the selected model had already established the provider. The legacy Vercel AI SDK shape and the canonical OpenCode shape were therefore coupled.

After

LLM.request({
  model,
  prompt,
  providerOptions: {
    reasoningEffort: "low",
  },
})

Native protocols decode the flat record directly. The legacy AI SDK adapter adds the provider namespace only when constructing LanguageModelV3CallOptions. Provider metadata remains namespaced because metadata can contain values from multiple providers and must round-trip with its source identity.

How

  • packages/ai/src/schema/options.ts changes the canonical schema to a flat unknown-value record and deep-merges route, model, and request defaults directly.
  • Anthropic Messages, Gemini, Open Responses, OpenRouter, Google Vertex, OpenAI, and xAI option types/defaults consume the flat record.
  • packages/core/src/aisdk.ts re-namespaces flat request options at the Vercel AI SDK boundary while preserving namespaced content-part metadata.
  • packages/core/src/aisdk-native.ts maps AI SDK catalog settings into flat native-provider defaults.
  • Type fixtures, protocol tests, package-entrypoint tests, adapter tests, the AI README, and the tutorial use the flat request shape.

Scope

This PR deliberately excludes structured native provider model({ id, settings, credential, defaults }) changes, credential selection/lowering, ProviderPackage credential helpers, model-resolver credential work, stale document deletions, and unrelated documentation changes from #43491.

Testing

  • cd packages/ai && bun typecheck
  • cd packages/core && bun typecheck
  • cd packages/ai && bun run test test/compile.test.ts test/llm.test.ts test/provider/anthropic-messages.test.ts test/provider/gemini.test.ts test/provider/openai-chat.test.ts test/provider/openai-compatible-responses.test.ts test/provider/openai-responses.test.ts test/provider/google-vertex.test.ts test/provider-package.test.ts (258 passed)
  • cd packages/ai && bun run test test/provider/openrouter.test.ts --test-name-pattern 'allows usage accounting|applies OpenRouter payload|filters invalid known OpenRouter' (3 passed)
  • cd packages/core && bun run test test/aisdk.test.ts test/aisdk-native.test.ts (39 passed)
  • cd packages/core && bun run test test/model-resolver.test.ts (39 passed)
  • cd packages/ai && RECORDED_PREFIX=gemini RECORDED_TEST=text bun run test test/provider/golden.recorded.test.ts (1 passed, 38 filtered/skipped)
  • bunx oxlint $(git diff --name-only origin/v2 -- '*.ts') (0 errors; existing warnings only)
  • Pre-push bun turbo typecheck --concurrency=3 (33/33 tasks passed)
  • Repository-wide bun run lint still exits on the pre-existing octal-escape error in packages/session-ui/src/v2/components/prompt-input/index.tsx:163; no changed file has a lint error.

Flow

flowchart LR
  Caller[LLM.request] -->|flat providerOptions| Canonical[Canonical LLMRequest]
  Canonical --> Native[Native protocol decoder]
  Canonical --> Legacy[Legacy AI SDK adapter]
  Legacy -->|add provider namespace| Vercel[LanguageModelV3CallOptions]
  Metadata[Provider metadata] -->|keep namespaces| Legacy
Loading

@kitlangton
kitlangton enabled auto-merge (squash) August 19, 2026 21:32
@kitlangton
kitlangton merged commit 6adb98c into v2 Aug 19, 2026
10 checks passed
@kitlangton
kitlangton deleted the flat-provider-options branch August 19, 2026 21:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant