Repository navigation
feat(AIC-3534): add a TypeSafe Jev judge handler - #122
Conversation
Judge variations can declare classifiers and record one score per label, with the selected label as the result reason. Co-authored-by: Cursor <cursoragent@cursor.com>
The package is registered with release-please, and this job is what builds and publishes it. Co-authored-by: Cursor <cursoragent@cursor.com>
…handler A wildcard handler registered first was taking TypeSafe judges, and the question never reached Jev's input field. Co-authored-by: Cursor <cursoragent@cursor.com>
jeffdupont
left a comment
There was a problem hiding this comment.
Reviewed together with python-ai-sdk #149 and ai-sdks-monorepo #49. The handler logic matches the spec and the Python side: question extraction, the state, the score mapping (I checked the @typesafe-ai/sdk 0.6.0 types: legend keys start at 0, so dividing by levels - 1 is right), the reason selection, and per-label tracking. typesafe 12/12 and client 450/450 pass on this head. It conflicts with main (judges.ts, the release-please files, yarn.lock).
1. Must fix: after a rebase, client CI fails on the root-exports snapshot. I merged this into current main (resolving judges.ts by adding userInput to BuildJudgeTasksArgs). src/__tests__/skills.test.ts › "the package root exports exactly the snapshotted values" then fails, with + "FORMATTING_INSTRUCTIONS": 1 failed, 1405 passed. The new root export is permanent public API once 1.0 ships. Python keeps it internal (launchdarkly_ai_server.judge_scoring). Either make it public on purpose (snapshot, the approved API list in ai-sdks-monorepo api-surface/typescript, and a matching Python root export), or keep it off the root export in both languages.
2. Should fix: createTypesafeHandler reports no helper usage. TESTING.md §3.27 makes reportUsage(...) the first statement of every public factory, and every factory has an ID in api-surface/usage-ids.txt. Every handler on main does this (for example openai-messages/src/handler.ts:451). Without it, TypeSafe judges are missing from the helper-usage data. Needs a typesafe.createTypesafeHandler ID in monorepo #49 too.
The examples/judge-worker.ts change (track each metrics entry, otherwise evaluationMetricKey) is the right pattern for deferred judges. Python #149 needs the same guidance; I left that comment there.
…-handler Co-authored-by: Cursor <cursoragent@cursor.com> # Conflicts: # .github/workflows/release-please.yml # .release-please-manifest.json # packages/client/src/judges.ts # yarn.lock
…afe helper usage Co-authored-by: Cursor <cursoragent@cursor.com>
…eateHandler Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
The typecheck compares the extractor report to the public judge types, and the report was still missing classifiers, eventKey, and per-metric results. Co-authored-by: Cursor <cursoragent@cursor.com>
jeffdupont
left a comment
There was a problem hiding this comment.
Matches the §1.12 contract and ai-typesafe.txt exports, and parity with the Python PR looks good. Same note as there: judges.ts:212/421 add input to every online judge, and TESTING.md:1476 says they get only the two vars, so that line probably needs updating in #49. Also heads up that #49 still pins typescript at 7b48c71, one behind this head.
…-handler # Conflicts: # .release-please-manifest.json # README.md # release-please-config.json # tsconfig.json
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit a0fc87b. Configure here.
Co-authored-by: Cursor <cursoragent@cursor.com>
🤖 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>

Summary
@launchdarkly/ai-typesafe, a judge handler that sends a variation'sclassifiersto Jev in one call.judgeResultsentry, tracked on that label'seventKey, with the selected label as the reason.https://launchdarkly.atlassian.net/browse/AIC-3534
Test plan
vitestfor@launchdarkly/ai-typesafeand the client judge, schema, and conversation testsresponseMade with Cursor