Skip to content

fix(skills): Correct the HTTP 403 advice now that server-side FDv2 is available to every account - #141

Merged
tracisiebel merged 1 commit into
mainfrom
devin/1792174841-fdv2-403-advice
Oct 16, 2026
Merged

tracisiebel merged 1 commit into
mainfrom
devin/1792174841-fdv2-403-advice

Conversation

@tracisiebel

@tracisiebel tracisiebel commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

Summary

From Traci:
Caseware is using skills and they mentioned that

The SDK docs say skill content is delivered only through FDv2 (FDv2SkillStore), and that we'd get a 403 if FDv2 isn't enabled for our account.

I want to clarify that it is enabled for all accounts

FDv2SkillStore's 403 message and the README's beta caveat said FDv2 is "opt-in per account" and told users to ask support to enable it. That's no longer true. In production, fdv2-protocol-control allows /sdk/poll and /sdk/stream for every account under its "Server Side SDKs (GA)" rule. A customer recently asked us to "enable FDv2" because of this wording.

  • FORBIDDEN_ADVICE now tells the user to check that the SDK key is the environment's server-side key and that no proxy in between is refusing the request, then to contact support.
  • The README caveat now says that an account without Agent Skills access gets no skill content rather than an error status. This matches gonfalon: when SkillDeliveryAllowed is false, the skill payload is left out of the assignment and no error is returned. The ld-relay caveat is unchanged.
  • The 403 test now asserts on the new wording.

How to test

npx vitest run src/__tests__/skills-fdv2.test.ts -t 403 from packages/client. Also ran make code-check.

Link to Devin session: https://app.devin.ai/sessions/86607bf5a72840ac922a278d08236eb9
Open in Devin Desktop: https://app.devin.ai/desktop/session/86607bf5a72840ac922a278d08236eb9?variant=devin
Requested by: @tracisiebel


Note

Overview
Updates FDv2 skill delivery docs and fatal HTTP 403 handling to match current LaunchDarkly behavior: SDK-facing FDv2 endpoints are no longer described as opt-in per account.

FORBIDDEN_ADVICE in skills-fdv2.ts now tells operators to verify the environment server-side SDK key and check for a proxy blocking the request before contacting support, instead of asking LaunchDarkly to enable FDv2. The README beta caveat is aligned: accounts without Agent Skills get empty skill content rather than a product error; 403 still surfaces as a fatal error with the revised guidance. The 403 integration test asserts the new proxy wording.

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

… available to every account

Co-Authored-By: traci@launchdarkly.com <traci@launchdarkly.com>
@devin-ai-integration

Copy link
Copy Markdown
Contributor

I'll fix CI failures and address comments from users with write access. I'll skip comments containing "(aside)".

  • Disable automatic comment, CI, and merge conflict monitoring

@tracisiebel
tracisiebel merged commit 5b7b732 into main Oct 16, 2026
11 checks passed
@tracisiebel
tracisiebel deleted the devin/1792174841-fdv2-403-advice branch October 16, 2026 23:02
@github-actions github-actions Bot mentioned this pull request Oct 15, 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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants