Skip to content

fix!: forward the same model.parameters keys as the Python SDK - #118

Merged
jeffdupont merged 21 commits into
mainfrom
fix/forwarding-parity
Oct 23, 2026
Merged

jeffdupont merged 21 commits into
mainfrom
fix/forwarding-parity

Conversation

@apucacao

@apucacao apucacao commented Oct 7, 2026 •

Copy link
Copy Markdown
Contributor

The JS and Python SDKs have to forward the same model.parameters keys before 1.0. Jeff's review of launchdarkly/python-ai-sdk#107 found that the lists from #73 differ from Python's. The shared lists are now in the cross-SDK spec (launchdarkly/ai-sdks-monorepo#42, TESTING.md §1.12), and Python is moving to them too. This PR makes each JS handler forward exactly those lists, minus the keys the spec marks as not supported in TypeScript.

What changed:

  • Claude Messages: stops forwarding container, inference_geo and metadata. output_config keeps only effort (a top-level effort still moves into it, and an explicit output_config.effort wins). output_config.format is dropped, because structured output belongs to the config's outputFormat: forwarding it let a config ask for one schema in outputFormat while the API enforced another, and made stream return JSON.
  • OpenAI Messages: stops forwarding context_management, include, instructions, metadata, moderation, prompt_cache_retention, safety_identifier, store, truncation and user, on both invoke and stream. max_tool_calls is not forwarded: the spec marks it not supported in TypeScript, because the openai package's responses.create has no such parameter.
  • OpenAI Agents (handler and native graph): stops forwarding context_management, prompt_cache_retention, store and truncation. tool_choice is forwarded only as a string.
  • LiteLLM Agents (handler and native graph): stops forwarding store. reasoning keeps only effort, because the Chat Completions model sends it as reasoning_effort and has no field for summary. tool_choice is forwarded only as a string.
  • Claude Agents (handler and native graph): stops forwarding output_format, for the same reason as output_config.format: the handler applies the config's outputFormat itself. thinking is kept only with a type the Claude Agent SDK knows, an enabled thinking needs a numeric budget, and display is kept only as summarized or omitted.
  • Vercel (messages and agents): a reasoning object is read as its effort, and any other non-string reasoning is dropped. tool_choice is forwarded only as a string, since the AI SDK reads any other value as a call to a named tool.
  • LangChain ChatOpenAI (both LangChain packages and the LangGraph native graph's default model): stops forwarding audio, disable_streaming, metadata, modalities, output_version, prompt_cache_retention, reasoning, stream_usage, streaming, tags, use_responses_api, user, verbose and zdr_enabled. prompt_cache_key is still forwarded: the spec marks it not supported in Python only, where ChatOpenAI has no such field.
  • LangChain ChatAnthropic: stops forwarding context_management, disable_streaming, inference_geo, metadata, output_version, stream_usage, streaming, tags and verbose. It now takes stop as stopSequences and max_tokens_to_sample as maxTokens, because ChatAnthropic has neither field under those names. outputConfig keeps only effort, as in Claude Messages.
  • LangChain ChatBedrockConverse: stops forwarding disable_streaming, guardrail_config, metadata, output_version, stream_usage, streaming, supports_tool_choice_values, tags and verbose.
  • LiteLLM Messages and TypeSafe: no change. LiteLLM Messages already forwarded the spec's list, and TypeSafe forwards no model.parameters key.

Following the spec, nested values with the wrong shape are dropped instead of sent. Examples are a thinking without a type, a reasoning that is not an object, a tool_choice of the wrong type, or an output_config without a string effort. OpenAI Messages reasoning keeps only effort and summary, as OpenAI Agents already did.

Testing:

  • Each handler and native graph has a test that the forwarded keys are exactly the spec's list, and, where the handler has both, that invoke and stream forward the same keys and values. This now includes LiteLLM Messages and LiteLLM Agents. TypeSafe has a test that it forwards no model.parameters key at all.
  • Every package's never-forward bag is built from one shared key list in packages/client/src/__tests__/never-forwarded-keys.ts, which covers every never-forward category in the spec, including user, metadata, inference_geo and container. Each package's __tests__/never-forwarded.ts adds only the keys its own table leaves out, so the bags can't drift apart.
  • New tests cover dropping malformed nested values, output_config.format on invoke and stream, and output_format in Claude Agents.
  • Each changed package's tests and tsc --noEmit, and biome check ., pass locally.

Note

Overview
Aligns every JS provider handler with TESTING.md §1.12 so model.parameters forwards the same generation-related keys as the Python SDK, and drops everything else (credentials, retention, metadata, wiring, etc.).

Allowlists are tightened across packages: OpenAI Messages/Agents stop forwarding retention and attribution fields (store, user, context_management, …); Claude Messages keeps output_config to { effort } only and strips format; Claude Agents no longer forwards output_format (structured output stays on config outputFormat); LangChain constructors lose base-model wiring keys and narrow ChatAnthropic outputConfig; LiteLLM/Vercel agents drop store and non-string tool_choice; Vercel maps object reasoning to a string effort. Malformed nested values (thinking, tool_choice, reasoning, typed Anthropic objects) are dropped instead of passed through.

Tests: Shared createNeverForwarded() in packages/client replaces duplicated never-forward lists; each handler/native graph gets §1.12 canonical-key tests and invoke/stream parity checks where applicable.

Reviewed by Cursor Bugbot for commit 0dd95ab. Bugbot is set up for automated code reviews on this repo. Configure here.

@apucacao

apucacao commented Oct 7, 2026

Copy link
Copy Markdown
Contributor Author

bugbot run

@cursor cursor Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Stale Bugbot comment from a previous run.

@apucacao

apucacao commented Oct 7, 2026

Copy link
Copy Markdown
Contributor Author

bugbot run

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

✅ Bugbot reviewed your changes and found no new issues!

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit 0e963d3. Configure here.

@apucacao
apucacao force-pushed the fix/forwarding-parity branch from 0e963d3 to 5f9835d Compare October 21, 2026 22:06
apucacao and others added 16 commits October 22, 2026 16:48
…meters

Stop forwarding container, inference_geo and metadata, so the handler
forwards the same model.parameters keys as the Python SDK. Drop a
thinking, tool_choice, cache_control or output_config value of the wrong
shape instead of sending it.
…meters

Stop forwarding context_management, include, instructions, metadata,
moderation, prompt_cache_retention, safety_identifier, store, truncation
and user, so invoke and stream forward the same keys as the Python SDK.
reasoning keeps only effort and summary, and a malformed reasoning or
tool_choice is dropped instead of sent.

max_tool_calls is on the shared list but not on ResponseCreateParamsBase
in the installed openai package, so it is not forwarded.
Stop forwarding context_management, prompt_cache_retention, store and
truncation into ModelSettings, in the handler and the native graph, so
they match the Python SDK. A tool_choice that is not a string is now
dropped instead of passed on.
Narrow the ChatOpenAI, ChatAnthropic and ChatBedrockConverse allowlists,
used by both LangChain packages and the LangGraph native graph's default
model, to the lists the Python SDK forwards. This stops forwarding
LangChain wiring and logging settings (tags, metadata, verbose,
streaming, stream_usage, disable_streaming, output_version), settings
that switch ChatOpenAI to the Responses API (reasoning,
use_responses_api), data location and retention settings (inference_geo,
prompt_cache_retention, zdr_enabled), and audio, modalities, user,
context_management, guardrail_config and supports_tool_choice_values.

ChatAnthropic now also takes stop as stopSequences and
max_tokens_to_sample as maxTokens, since it has neither field under
those names. A malformed thinking, output_config, logit_bias or
performance_config is dropped instead of passed on.
…K list

The list itself is unchanged. The new test proves invoke and stream add
exactly those query options and nothing else.
The Python ChatOpenAI has no such field, so the cross-SDK list cuts it
for both SDKs. OpenAI Messages still forwards it to the Responses API.
store is data retention, which is never forwarded. The OpenAI Agents
handler already dropped it, but the LiteLLM Agents list was copied from
the old OpenAI Agents list and still carried it, and the Chat
Completions model really sends it to the proxy.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Agents SDK's ModelSettings types tool_choice as a string (auto,
required, none, or a tool name). An object such as {"type": "auto"},
which other handlers' configs use, is now dropped instead of passed on,
the same way the OpenAI Agents handler already handles it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Chat Completions model the proxy is reached through sends
reasoning.effort as reasoning_effort and drops reasoning.summary without
a word, so forwarding summary did nothing. The Python LiteLLM Agents
model drops it too, and logs a warning on every call that sets it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The AI SDK reads any tool_choice that is not a string as a forced call
to value.toolName. An object in another provider's shape, such as
{"type": "auto"} or {"type": "function", "name": "f"}, therefore became a
forced call to a tool named undefined. Both Vercel handlers now drop a
tool_choice that is not a string, as the Agents handlers do.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The AI SDK's reasoning option is a string, but configs written for the
OpenAI handlers carry reasoning as {"effort": "low"}, and that object was
passed to the AI SDK as written. Both Vercel handlers now read effort out
of a reasoning object and drop any other value that is not a string. A
reasoning_effort still fills in when reasoning gives no effort.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Commit 5f9835d cut prompt_cache_key only because the Python ChatOpenAI has
no such field. The spec now keeps a key that one language's library cannot
take and marks it not supported there, so this SDK forwards it again in
both LangChain packages, and it leaves the never-forwarded test bag.

Checked against @langchain/openai 1.4.7 in node_modules: promptCacheKey is a
constructor field (dist/chat_models/base.js reads fields.promptCacheKey),
the Chat Completions request sends it as prompt_cache_key
(dist/chat_models/completions.js), and it is not one of the keys that
_useResponsesApi switches on (dist/chat_models/index.js), so the handler
still reads a Chat Completions reply.

vitest in langchain-agents (159 passed) and langchain-messages (123
passed), tsc --noEmit and biome check clean in both.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…thout a known type

These were kept when they were objects with any string type, so
{ type: 'enabled' } with no budget_tokens, { type: 'tool' } with no name, or
an unknown type reached the request and the Anthropic API rejected it.

Each one is now rebuilt from the variants the Anthropic SDK declares
(ThinkingConfigParam, ToolChoice, CacheControlEphemeral): it is dropped
unless its type is one of those variants and it has that variant's required
sub-keys, and any other sub-key is removed. The shape table is checked
against the SDK types at compile time. The Python SDK makes the same check.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
thinking was kept whenever it had a string type. The Claude Agent SDK
ignores a type it does not know, and runs an enabled thinking without
budgetTokens as adaptive, so a config could ask for a fixed budget and
silently get adaptive thinking. The Python SDK raises on the same config.

thinking is now dropped unless its type is adaptive, enabled or disabled
(the SDK's ThinkingConfig, checked at compile time), and an enabled thinking
is dropped without a numeric budget. display is kept only for a type that
takes it and only with a value the SDK knows. Both SDKs now treat each of
these configs the same way.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ChatAnthropic sends thinking to the Messages API as written, and the check
accepted any object with a string type, so { type: 'enabled' } with no
budget_tokens, or an unknown type, reached the API and was rejected there.

thinking is now rebuilt from the variants the Messages API takes (enabled
with budget_tokens, adaptive, disabled), keeping only their sub-keys, the
same shapes the Claude Messages handler uses in both SDKs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The comment said reasoning control waits until both SDKs can set it without
switching APIs. The Python SDK now forwards the Chat Completions
reasoning_effort, and the spec marks it not supported in TypeScript because
the TypeScript ChatOpenAI takes it only per call. The comment now says that,
and that a reasoning with a summary switches ChatOpenAI to the Responses API.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@apucacao
apucacao force-pushed the fix/forwarding-parity branch from bd2fc38 to 7dce38d Compare October 22, 2026 20:49
@apucacao
apucacao marked this pull request as ready for review October 22, 2026 20:58
@apucacao
apucacao requested a review from jeffdupont October 22, 2026 20:58

@jeffdupont jeffdupont 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 allowlists look right. Every list matches its §1.12 table, minus the keys marked not supported in TypeScript, and credentials, hosts and headers can't reach any provider call. A few things before merging:

  1. output_config.format gets through (claude-messages/src/handler.ts:461-467, and the LangChain ChatAnthropic model-parameters.ts). output_config is checked only for being an object, so Anthropic's structured-output format reaches the API. If a config sets outputFormat to schema A and output_config.format to schema B, invoke asks for A and the API enforces B. On stream, which normally returns free text, it returns JSON shaped like B. I've asked in mono#42 for output_config to keep only effort. Once that lands, rebuild it as {effort} and flip the tests that assert it passes through. py#107 has the same issue.
  2. The §1.12 required tests are missing for LiteLLM Messages, LiteLLM Agents (handler and native graph), and TypeSafe. They have no list-equals-table probe, no full never-forward bag and no invoke/stream agreement test. TypeSafe has no test that it forwards nothing. The never-forwarded.ts and "cross-SDK allowlist" pattern from openai-agents would carry over.
  3. Several never-forward bags leave out keys the spec names, for example user, metadata, inference_geo and container in claude-agents, openai-agents and vercel. The allowlists are fine today, so this is only coverage. One shared key list would keep the bags from drifting.
  4. The PR description is out of date. prompt_cache_key is still forwarded for ChatOpenAI, max_tool_calls is marked not supported in TypeScript rather than cut for both SDKs, Claude Agents and Vercel did change, and the LiteLLM Agents changes aren't mentioned.

apucacao and others added 5 commits October 22, 2026 19:26
output_config.format is Anthropic structured output, which the handlers own
through outputFormat. Forwarding it let a config ask for one schema in
outputFormat while the API enforced another, and made stream return JSON.
Claude Messages and LangChain ChatAnthropic now rebuild output_config as
{ effort } and drop it when there is no string effort.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Structured output belongs to the config's outputFormat, which the handler
applies itself. A schema in model.parameters would only fight it, so it is
no longer forwarded to query(), from the handler or the native graph.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The per-package bags had drifted and left out keys the spec names, such as
user, metadata, inference_geo and container. The key list from every
never-forward category now lives in client/src/__tests__, and each
package's never-forwarded.ts adds only the keys its own table leaves out.
Tests where the handler sets system or instructions itself mark them as
handler-owned; the deep value check still proves the config's value never
lands there.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
LiteLLM Messages and LiteLLM Agents (handler and native graph) had no
test that the forwarded keys equal the spec table, no full never-forward
bag, and no check that invoke and stream forward the same settings. They
now have all three, using the shared never-forward key list.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The spec's TypeSafe table is empty: a Jev call takes the judge state, the
questions and the model name. The new test puts the full never-forward bag
plus sampling keys in model.parameters and asserts the client and the Jev
request carry none of them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@apucacao

Copy link
Copy Markdown
Contributor Author

@jeffdupont all four addressed:

  1. output_config (92804ff): Claude Messages builds it with toOutputConfig and both LangChain packages with toAnthropicOutputConfig, as {effort} only, dropped when there's no string effort. The tests that asserted pass-through are flipped, and new ones check format is dropped on invoke and stream and that the default ChatAnthropic constructor gets outputConfig: {effort} only. Claude Agents outputFormat had the same problem, so it's off the query() allowlist too (4a866f3), handler and native graph, matching the feat: Report AI SDK package identity to LaunchDarkly #42 change.
  2. Missing §1.12 tests: LiteLLM Messages and LiteLLM Agents (handler and native graph) now have the list-equals-table probe, the full never-forward bag and invoke/stream agreement where there's a stream (148c3c8). TypeSafe has a test that it never reads model.parameters: the Jev request carries only model, questions and state with the full bag set (0dd95ab).
  3. Never-forward bags (76b1c53): one shared list in packages/client/src/__tests__/never-forwarded-keys.ts covering every §1.12 category in both spellings, and each package's never-forwarded.ts builds from it. Packages import it by relative path, like the sdk-usage tests already read client/src/version.ts, so nothing ships. The fuller bag caught keys a handler sets itself (system, instructions), which those call sites now pass as handler-owned, while the deep check still proves the config's value never lands.
  4. The PR description is updated against the actual diff: prompt_cache_key still forwarded for ChatOpenAI, max_tool_calls not supported in TypeScript, the real Claude Agents, Vercel and LiteLLM Agents changes, and this round's output_config and outputFormat changes.

@apucacao
apucacao requested a review from jeffdupont October 22, 2026 23:39
@jeffdupont jeffdupont changed the title fix: forward the same model.parameters keys as the Python SDK fix!: forward the same model.parameters keys as the Python SDK Oct 23, 2026
@jeffdupont
jeffdupont merged commit f7883ce into main Oct 23, 2026
10 checks passed
@jeffdupont
jeffdupont deleted the fix/forwarding-parity branch October 23, 2026 16:37
@github-actions github-actions Bot mentioned this pull request Oct 23, 2026
jeffdupont pushed a commit that referenced this pull request Oct 26, 2026
🤖 I have created a release *beep* *boop*
---


<details><summary>@launchdarkly/ai-claude-agents: 0.5.0</summary>

##
[0.5.0](https://github.com/launchdarkly/js-ai-sdk/compare/@launchdarkly/ai-claude-agents-0.4.0...@launchdarkly/ai-claude-agents-0.5.0)
(2026-10-26)


### ⚠ BREAKING CHANGES

* forward the same model.parameters keys as the Python SDK
([#118](#118))
* **claude-agents:** accept trusted cwd and settingSources options, and
load no host settings by default
([#135](#135))
* **client:** the client no longer loads .env. Add import
'dotenv/config' to your entrypoint (and install dotenv) if you relied on
it.

### Features

* **AIC-3623:** evals from code
([#143](#143))
([dc74b48](dc74b48))
* **claude-agents:** accept trusted cwd and settingSources options, and
load no host settings by default
([#135](#135))
([6acd53d](6acd53d))


### Bug Fixes

* **AIC-3571:** visit every child before its parent in reverseTraverse
([#147](#147))
([a17a2ce](a17a2ce))
* **AIC-3577:** send object tool results to the model as JSON
([#146](#146))
([be41d87](be41d87))
* **claude-agents:** fail the run when the CLI reports an API error as
success ([#138](#138))
([4637958](4637958))
* **client:** stop loading dotenv from library code
([#69](#69))
([fea34f3](fea34f3))
* forward the same model.parameters keys as the Python SDK
([#118](#118))
([f7883ce](f7883ce))
* give native graph spans their LaunchDarkly identity
([#101](#101))
([4d97cfa](4d97cfa))


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @launchdarkly/ai-server bumped from ^0.4.0 to ^0.5.0
</details>

<details><summary>@launchdarkly/ai-claude-messages: 0.5.0</summary>

##
[0.5.0](https://github.com/launchdarkly/js-ai-sdk/compare/@launchdarkly/ai-claude-messages-0.4.0...@launchdarkly/ai-claude-messages-0.5.0)
(2026-10-26)


### ⚠ BREAKING CHANGES

* forward the same model.parameters keys as the Python SDK
([#118](#118))
* **client:** the client no longer loads .env. Add import
'dotenv/config' to your entrypoint (and install dotenv) if you relied on
it.

### Features

* **AIC-3623:** evals from code
([#143](#143))
([dc74b48](dc74b48))


### Bug Fixes

* **AIC-3577:** send object tool results to the model as JSON
([#146](#146))
([be41d87](be41d87))
* **client:** stop loading dotenv from library code
([#69](#69))
([fea34f3](fea34f3))
* forward the same model.parameters keys as the Python SDK
([#118](#118))
([f7883ce](f7883ce))


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @launchdarkly/ai-server bumped from ^0.4.0 to ^0.5.0
</details>

<details><summary>@launchdarkly/ai-langchain-agents: 0.5.0</summary>

##
[0.5.0](https://github.com/launchdarkly/js-ai-sdk/compare/@launchdarkly/ai-langchain-agents-0.4.0...@launchdarkly/ai-langchain-agents-0.5.0)
(2026-10-26)


### ⚠ BREAKING CHANGES

* forward the same model.parameters keys as the Python SDK
([#118](#118))
* **client:** the client no longer loads .env. Add import
'dotenv/config' to your entrypoint (and install dotenv) if you relied on
it.

### Features

* **AIC-3623:** evals from code
([#143](#143))
([dc74b48](dc74b48))


### Bug Fixes

* **AIC-3577:** send object tool results to the model as JSON
([#146](#146))
([be41d87](be41d87))
* **client:** stop loading dotenv from library code
([#69](#69))
([fea34f3](fea34f3))
* forward the same model.parameters keys as the Python SDK
([#118](#118))
([f7883ce](f7883ce))
* give native graph spans their LaunchDarkly identity
([#101](#101))
([4d97cfa](4d97cfa))


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @launchdarkly/ai-server bumped from ^0.4.0 to ^0.5.0
</details>

<details><summary>@launchdarkly/ai-langchain-messages: 0.5.0</summary>

##
[0.5.0](https://github.com/launchdarkly/js-ai-sdk/compare/@launchdarkly/ai-langchain-messages-0.4.0...@launchdarkly/ai-langchain-messages-0.5.0)
(2026-10-26)


### ⚠ BREAKING CHANGES

* forward the same model.parameters keys as the Python SDK
([#118](#118))
* **client:** the client no longer loads .env. Add import
'dotenv/config' to your entrypoint (and install dotenv) if you relied on
it.

### Features

* **AIC-3623:** evals from code
([#143](#143))
([dc74b48](dc74b48))


### Bug Fixes

* **AIC-3577:** send object tool results to the model as JSON
([#146](#146))
([be41d87](be41d87))
* **client:** stop loading dotenv from library code
([#69](#69))
([fea34f3](fea34f3))
* forward the same model.parameters keys as the Python SDK
([#118](#118))
([f7883ce](f7883ce))


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @launchdarkly/ai-server bumped from ^0.4.0 to ^0.5.0
</details>

<details><summary>@launchdarkly/ai-litellm-agents: 0.2.0</summary>

##
[0.2.0](https://github.com/launchdarkly/js-ai-sdk/compare/@launchdarkly/ai-litellm-agents-0.1.0...@launchdarkly/ai-litellm-agents-0.2.0)
(2026-10-26)


### ⚠ BREAKING CHANGES

* forward the same model.parameters keys as the Python SDK
([#118](#118))

### Features

* add LiteLLM messages and agents integrations
([#75](#75))
([127f156](127f156))


### Bug Fixes

* forward the same model.parameters keys as the Python SDK
([#118](#118))
([f7883ce](f7883ce))


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @launchdarkly/ai-server bumped from ^0.4.0 to ^0.5.0
</details>

<details><summary>@launchdarkly/ai-litellm-messages: 0.2.0</summary>

##
[0.2.0](https://github.com/launchdarkly/js-ai-sdk/compare/@launchdarkly/ai-litellm-messages-0.1.0...@launchdarkly/ai-litellm-messages-0.2.0)
(2026-10-26)


### ⚠ BREAKING CHANGES

* forward the same model.parameters keys as the Python SDK
([#118](#118))

### Features

* add LiteLLM messages and agents integrations
([#75](#75))
([127f156](127f156))


### Bug Fixes

* forward the same model.parameters keys as the Python SDK
([#118](#118))
([f7883ce](f7883ce))


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @launchdarkly/ai-server bumped from ^0.4.0 to ^0.5.0
</details>

<details><summary>@launchdarkly/ai-node: 0.4.0</summary>

##
[0.4.0](https://github.com/launchdarkly/js-ai-sdk/compare/@launchdarkly/ai-node-0.3.0...@launchdarkly/ai-node-0.4.0)
(2026-10-26)


### ⚠ BREAKING CHANGES

* **skills:** promote Agent Skills to core
([#159](#159))
* **client:** the client no longer loads .env. Add import
'dotenv/config' to your entrypoint (and install dotenv) if you relied on
it.

### Features

* **skills:** promote Agent Skills to core
([#159](#159))
([c7135cd](c7135cd))


### Bug Fixes

* **client:** stop loading dotenv from library code
([#69](#69))
([fea34f3](fea34f3))


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @launchdarkly/ai-server bumped from ^0.4.0 to ^0.5.0
</details>

<details><summary>@launchdarkly/ai-openai-agents: 0.5.0</summary>

##
[0.5.0](https://github.com/launchdarkly/js-ai-sdk/compare/@launchdarkly/ai-openai-agents-0.4.0...@launchdarkly/ai-openai-agents-0.5.0)
(2026-10-26)


### ⚠ BREAKING CHANGES

* forward the same model.parameters keys as the Python SDK
([#118](#118))
* **client:** the client no longer loads .env. Add import
'dotenv/config' to your entrypoint (and install dotenv) if you relied on
it.

### Features

* **AIC-3623:** evals from code
([#143](#143))
([dc74b48](dc74b48))


### Bug Fixes

* **AIC-3571:** visit every child before its parent in reverseTraverse
([#147](#147))
([a17a2ce](a17a2ce))
* **AIC-3577:** send object tool results to the model as JSON
([#146](#146))
([be41d87](be41d87))
* **AIC-3586:** propagate tool handler errors instead of sending them to
the model ([#139](#139))
([1f31e85](1f31e85))
* **client:** stop loading dotenv from library code
([#69](#69))
([fea34f3](fea34f3))
* forward the same model.parameters keys as the Python SDK
([#118](#118))
([f7883ce](f7883ce))
* give native graph spans their LaunchDarkly identity
([#101](#101))
([4d97cfa](4d97cfa))


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @launchdarkly/ai-server bumped from ^0.4.0 to ^0.5.0
</details>

<details><summary>@launchdarkly/ai-openai-messages: 0.5.0</summary>

##
[0.5.0](https://github.com/launchdarkly/js-ai-sdk/compare/@launchdarkly/ai-openai-messages-0.4.0...@launchdarkly/ai-openai-messages-0.5.0)
(2026-10-26)


### ⚠ BREAKING CHANGES

* forward the same model.parameters keys as the Python SDK
([#118](#118))
* **client:** the client no longer loads .env. Add import
'dotenv/config' to your entrypoint (and install dotenv) if you relied on
it.

### Features

* **AIC-3623:** evals from code
([#143](#143))
([dc74b48](dc74b48))


### Bug Fixes

* **AIC-3577:** send object tool results to the model as JSON
([#146](#146))
([be41d87](be41d87))
* **client:** stop loading dotenv from library code
([#69](#69))
([fea34f3](fea34f3))
* forward the same model.parameters keys as the Python SDK
([#118](#118))
([f7883ce](f7883ce))


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @launchdarkly/ai-server bumped from ^0.4.0 to ^0.5.0
</details>

<details><summary>@launchdarkly/ai-otel: 0.3.0</summary>

##
[0.3.0](https://github.com/launchdarkly/js-ai-sdk/compare/@launchdarkly/ai-otel-0.2.0...@launchdarkly/ai-otel-0.3.0)
(2026-10-26)


### ⚠ BREAKING CHANGES

* **client:** the client no longer loads .env. Add import
'dotenv/config' to your entrypoint (and install dotenv) if you relied on
it.

### Bug Fixes

* **client:** stop loading dotenv from library code
([#69](#69))
([fea34f3](fea34f3))
</details>

<details><summary>@launchdarkly/ai-server: 0.5.0</summary>

##
[0.5.0](https://github.com/launchdarkly/js-ai-sdk/compare/@launchdarkly/ai-server-0.4.0...@launchdarkly/ai-server-0.5.0)
(2026-10-26)


### ⚠ BREAKING CHANGES

* **skills:** promote Agent Skills to core
([#159](#159))
* forward the same model.parameters keys as the Python SDK
([#118](#118))
* **client:** the client no longer loads .env. Add import
'dotenv/config' to your entrypoint (and install dotenv) if you relied on
it.

### Experimental

* **evaluations:** hash eventId and contentHash as RFC 8785 canonical
JSON, the same in every SDK
([c971649](c971649))
* **evaluations:** Set JSON as standard for output to pass to judge
([#152](#152))
([330da44](330da44))


### Features

* **AIC-3534:** add a TypeSafe Jev judge handler
([#122](#122))
([0c1d6b7](0c1d6b7))
* **AIC-3623:** evals from code
([#143](#143))
([dc74b48](dc74b48))
* **skills:** promote Agent Skills to core
([#159](#159))
([c7135cd](c7135cd))


### Bug Fixes

* **AIC-3541:** accept a node-server-sdk client in initClient() without
a cast ([#128](#128))
([5819449](5819449))
* **AIC-3570:** re-resolve graph flags on every invoke and stream
([#145](#145))
([ce4f72e](ce4f72e))
* **AIC-3571:** visit every child before its parent in reverseTraverse
([#147](#147))
([a17a2ce](a17a2ce))
* **AIC-3576:** record deferred judge scores under the evaluated config
([#148](#148))
([d9fbee6](d9fbee6))
* **AIC-3577:** send object tool results to the model as JSON
([#146](#146))
([be41d87](be41d87))
* **AIC-3596:** point the missing-OTel warning and docs at
@launchdarkly/ai-otel
([#144](#144))
([9b5f32e](9b5f32e))
* **client:** show a judge an output of 0, false, {} or []
([c971649](c971649))
* **client:** stop loading dotenv from library code
([#69](#69))
([fea34f3](fea34f3))
* forward the same model.parameters keys as the Python SDK
([#118](#118))
([f7883ce](f7883ce))
* give native graph spans their LaunchDarkly identity
([#101](#101))
([4d97cfa](4d97cfa))
* **judges:** a judge config's outputFormat must not reach the provider
([#56](#56))
([8c6f4d2](8c6f4d2))
* **skills:** Correct the HTTP 403 advice now that server-side FDv2 is
available to every account
([#141](#141))
([5b7b732](5b7b732))
* **skills:** default FDv2SkillStore endpoints from LD_BASE_URI and
LD_STREAM_URI
([#134](#134))
([05f77d9](05f77d9))
</details>

<details><summary>@launchdarkly/ai-typesafe: 0.2.0</summary>

##
[0.2.0](https://github.com/launchdarkly/js-ai-sdk/compare/@launchdarkly/ai-typesafe-0.1.0...@launchdarkly/ai-typesafe-0.2.0)
(2026-10-26)


### ⚠ BREAKING CHANGES

* forward the same model.parameters keys as the Python SDK
([#118](#118))

### Features

* **AIC-3534:** add a TypeSafe Jev judge handler
([#122](#122))
([0c1d6b7](0c1d6b7))
* **AIC-3623:** evals from code
([#143](#143))
([dc74b48](dc74b48))


### Bug Fixes

* forward the same model.parameters keys as the Python SDK
([#118](#118))
([f7883ce](f7883ce))


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @launchdarkly/ai-server bumped from ^0.4.0 to ^0.5.0
</details>

<details><summary>@launchdarkly/ai-vercel-agents: 0.3.0</summary>

##
[0.3.0](https://github.com/launchdarkly/js-ai-sdk/compare/@launchdarkly/ai-vercel-agents-0.2.0...@launchdarkly/ai-vercel-agents-0.3.0)
(2026-10-26)


### ⚠ BREAKING CHANGES

* forward the same model.parameters keys as the Python SDK
([#118](#118))

### Features

* **AIC-3623:** evals from code
([#143](#143))
([dc74b48](dc74b48))


### Bug Fixes

* forward the same model.parameters keys as the Python SDK
([#118](#118))
([f7883ce](f7883ce))
* give native graph spans their LaunchDarkly identity
([#101](#101))
([4d97cfa](4d97cfa))


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @launchdarkly/ai-server bumped from ^0.4.0 to ^0.5.0
</details>

<details><summary>@launchdarkly/ai-vercel-messages: 0.3.0</summary>

##
[0.3.0](https://github.com/launchdarkly/js-ai-sdk/compare/@launchdarkly/ai-vercel-messages-0.2.0...@launchdarkly/ai-vercel-messages-0.3.0)
(2026-10-26)


### ⚠ BREAKING CHANGES

* forward the same model.parameters keys as the Python SDK
([#118](#118))

### Features

* **AIC-3623:** evals from code
([#143](#143))
([dc74b48](dc74b48))


### Bug Fixes

* forward the same model.parameters keys as the Python SDK
([#118](#118))
([f7883ce](f7883ce))


### Dependencies

* The following workspace dependencies were updated
  * dependencies
    * @launchdarkly/ai-server bumped from ^0.4.0 to ^0.5.0
</details>

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Overview**
> This is a **Release Please** cut that bumps published versions across
the monorepo and records what ships in each package—there is no
application source in the diff beyond `LD_AI_PACKAGE_VERSION` strings
and dependency pins.
> 
> **@launchdarkly/ai-server** goes to **0.5.0**; provider packages move
to **0.5.0** (or **0.4.0** / **0.3.0** / **0.2.0** where applicable),
`.release-please-manifest.json` is updated, and every adapter’s
`package.json` now depends on **`@launchdarkly/ai-server` ^0.5.0**. New
**CHANGELOG** sections document the release notes already merged on
`main`.
> 
> Reviewers should treat this as publishing **breaking** behavior called
out in those changelogs: libraries no longer auto-load **`.env`** (apps
need `import 'dotenv/config'` if they relied on it),
**`model.parameters`** forwarding is aligned with the Python SDK,
**Agent Skills** are promoted from experimental to core, plus
features/fixes such as **evals from code**, TypeSafe judge handler, and
**claude-agents** defaulting to no host settings unless `cwd` /
`settingSources` are passed.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
8c6546c. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants