From 063879b15230cfb13724c3e61de50e1f0cc9bee4 Mon Sep 17 00:00:00 2001 From: Eric Pietrowicz Date: Wed, 22 Apr 2026 15:47:56 -0500 Subject: [PATCH 1/5] fix dependency errors by bumping @langchain/community to the latest release --- .../server-ai-langchain/package.json | 16 ++++++++-------- .../server-ai-langchain/src/LangChainProvider.ts | 6 +++++- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/packages/ai-providers/server-ai-langchain/package.json b/packages/ai-providers/server-ai-langchain/package.json index 9b55683663..5a7e319e33 100644 --- a/packages/ai-providers/server-ai-langchain/package.json +++ b/packages/ai-providers/server-ai-langchain/package.json @@ -43,11 +43,11 @@ "author": "LaunchDarkly", "license": "Apache-2.0", "devDependencies": { - "@langchain/community": "^0.3.0", - "@langchain/core": "^0.3.0", + "@langchain/community": "^1.1.27", + "@langchain/core": "^1.1.41", "@launchdarkly/server-sdk-ai": "^0.17.0", "@opentelemetry/api": "^1.9.0", - "@traceloop/instrumentation-langchain": "^0.22.0", + "@traceloop/instrumentation-langchain": "^0.26.0", "@trivago/prettier-plugin-sort-imports": "^4.1.1", "@types/jest": "^29.5.3", "@typescript-eslint/eslint-plugin": "^6.20.0", @@ -58,19 +58,19 @@ "eslint-plugin-jest": "^27.6.3", "eslint-plugin-prettier": "^5.0.0", "jest": "^29.6.1", - "langchain": "^0.3.0", + "langchain": "^1.3.4", "prettier": "^3.0.0", "ts-jest": "^29.1.1", "tsup": "^8.5.1", "typescript": "5.1.6" }, "peerDependencies": { - "@langchain/community": "^0.2.0 || ^0.3.0", - "@langchain/core": "^0.2.0 || ^0.3.0", + "@langchain/community": "^0.2.0 || ^0.3.0 || ^1.0.0", + "@langchain/core": "^0.2.0 || ^0.3.0 || ^1.0.0", "@launchdarkly/server-sdk-ai": "^0.17.0", "@opentelemetry/api": "^1.0.0", - "@traceloop/instrumentation-langchain": "^0.22.0", - "langchain": "^0.2.0 || ^0.3.0" + "@traceloop/instrumentation-langchain": "^0.22.0 || ^0.26.0", + "langchain": "^0.2.0 || ^0.3.0 || ^1.0.0" }, "peerDependenciesMeta": { "@opentelemetry/api": { diff --git a/packages/ai-providers/server-ai-langchain/src/LangChainProvider.ts b/packages/ai-providers/server-ai-langchain/src/LangChainProvider.ts index fbaa38dfa2..7d465e5b00 100644 --- a/packages/ai-providers/server-ai-langchain/src/LangChainProvider.ts +++ b/packages/ai-providers/server-ai-langchain/src/LangChainProvider.ts @@ -214,7 +214,11 @@ export class LangChainProvider extends AIProvider { // Extract token usage if available let usage: LDTokenUsage | undefined; if (response?.response_metadata?.tokenUsage) { - const { tokenUsage } = response.response_metadata; + const tokenUsage = response.response_metadata.tokenUsage as { + totalTokens?: number; + promptTokens?: number; + completionTokens?: number; + }; usage = { total: tokenUsage.totalTokens || 0, input: tokenUsage.promptTokens || 0, From 70163b62f908b1368d818f58ec57a918102842ba Mon Sep 17 00:00:00 2001 From: jsonbailey Date: Mon, 27 Apr 2026 11:46:52 -0500 Subject: [PATCH 2/5] fix: drop @langchain/community peer dep and restrict langchain to 1.x @langchain/community was added speculatively during the ESM migration but has never been imported by any source or test file. Removing it eliminates the entire transitive stagehand -> dotenv@^16 conflict chain at the root, rather than hoping an upstream fix arrives. Also restricts @langchain/core, langchain, and @traceloop/instrumentation-langchain peer deps to 1.x-only, dropping support for the 0.2/0.3 range that triggered the original issue. Co-Authored-By: Claude Sonnet 4.6 --- packages/ai-providers/server-ai-langchain/package.json | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/ai-providers/server-ai-langchain/package.json b/packages/ai-providers/server-ai-langchain/package.json index 5a7e319e33..0f8d05105b 100644 --- a/packages/ai-providers/server-ai-langchain/package.json +++ b/packages/ai-providers/server-ai-langchain/package.json @@ -43,7 +43,6 @@ "author": "LaunchDarkly", "license": "Apache-2.0", "devDependencies": { - "@langchain/community": "^1.1.27", "@langchain/core": "^1.1.41", "@launchdarkly/server-sdk-ai": "^0.17.0", "@opentelemetry/api": "^1.9.0", @@ -65,12 +64,11 @@ "typescript": "5.1.6" }, "peerDependencies": { - "@langchain/community": "^0.2.0 || ^0.3.0 || ^1.0.0", - "@langchain/core": "^0.2.0 || ^0.3.0 || ^1.0.0", + "@langchain/core": "^1.0.0", "@launchdarkly/server-sdk-ai": "^0.17.0", "@opentelemetry/api": "^1.0.0", - "@traceloop/instrumentation-langchain": "^0.22.0 || ^0.26.0", - "langchain": "^0.2.0 || ^0.3.0 || ^1.0.0" + "@traceloop/instrumentation-langchain": "^0.26.0", + "langchain": "^1.0.0" }, "peerDependenciesMeta": { "@opentelemetry/api": { From c55f06b7238340c466910fdd32f6db956f04e9a7 Mon Sep 17 00:00:00 2001 From: jsonbailey Date: Mon, 27 Apr 2026 13:07:44 -0500 Subject: [PATCH 3/5] fix: use standard usage_metadata for token extraction in 1.x response_metadata.tokenUsage is an OpenAI-specific legacy path. LangChain standardized token counts onto usage_metadata (input_tokens, output_tokens, total_tokens) as a first-class field on AIMessage. Primary path is now usage_metadata; falls back to response_metadata.tokenUsage for any providers that have not yet migrated to the standard field. Co-Authored-By: Claude Sonnet 4.6 --- .../server-ai-langchain/src/LangChainProvider.ts | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/packages/ai-providers/server-ai-langchain/src/LangChainProvider.ts b/packages/ai-providers/server-ai-langchain/src/LangChainProvider.ts index 7d465e5b00..de71f66353 100644 --- a/packages/ai-providers/server-ai-langchain/src/LangChainProvider.ts +++ b/packages/ai-providers/server-ai-langchain/src/LangChainProvider.ts @@ -213,16 +213,23 @@ export class LangChainProvider extends AIProvider { static getAIMetricsFromResponse(response: AIMessage): LDAIMetrics { // Extract token usage if available let usage: LDTokenUsage | undefined; - if (response?.response_metadata?.tokenUsage) { + if (response?.usage_metadata) { + usage = { + total: response.usage_metadata.total_tokens, + input: response.usage_metadata.input_tokens, + output: response.usage_metadata.output_tokens, + }; + } else if (response?.response_metadata?.tokenUsage) { + // Fallback for providers that still populate the legacy OpenAI-specific path const tokenUsage = response.response_metadata.tokenUsage as { totalTokens?: number; promptTokens?: number; completionTokens?: number; }; usage = { - total: tokenUsage.totalTokens || 0, - input: tokenUsage.promptTokens || 0, - output: tokenUsage.completionTokens || 0, + total: tokenUsage.totalTokens ?? 0, + input: tokenUsage.promptTokens ?? 0, + output: tokenUsage.completionTokens ?? 0, }; } From 004e9f51bef7b68273921d071637ac5b16469057 Mon Sep 17 00:00:00 2001 From: jsonbailey Date: Mon, 27 Apr 2026 13:12:39 -0500 Subject: [PATCH 4/5] fix: remove legacy tokenUsage fallback LangChain 1.x core populates response_metadata.tokenUsage FROM usage_metadata, not the other way around. Any 1.x-compatible provider will set usage_metadata, making the fallback unreachable. Co-Authored-By: Claude Sonnet 4.6 --- .../server-ai-langchain/src/LangChainProvider.ts | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/packages/ai-providers/server-ai-langchain/src/LangChainProvider.ts b/packages/ai-providers/server-ai-langchain/src/LangChainProvider.ts index de71f66353..c8ff337ff4 100644 --- a/packages/ai-providers/server-ai-langchain/src/LangChainProvider.ts +++ b/packages/ai-providers/server-ai-langchain/src/LangChainProvider.ts @@ -219,18 +219,6 @@ export class LangChainProvider extends AIProvider { input: response.usage_metadata.input_tokens, output: response.usage_metadata.output_tokens, }; - } else if (response?.response_metadata?.tokenUsage) { - // Fallback for providers that still populate the legacy OpenAI-specific path - const tokenUsage = response.response_metadata.tokenUsage as { - totalTokens?: number; - promptTokens?: number; - completionTokens?: number; - }; - usage = { - total: tokenUsage.totalTokens ?? 0, - input: tokenUsage.promptTokens ?? 0, - output: tokenUsage.completionTokens ?? 0, - }; } // LangChain responses that complete successfully are considered successful by default From 49fd2c1744f81635db04577f9b4b8568b843a471 Mon Sep 17 00:00:00 2001 From: jsonbailey Date: Mon, 27 Apr 2026 13:16:30 -0500 Subject: [PATCH 5/5] test: update token usage test to use usage_metadata Co-Authored-By: Claude Sonnet 4.6 --- .../__tests__/LangChainProvider.test.ts | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/packages/ai-providers/server-ai-langchain/__tests__/LangChainProvider.test.ts b/packages/ai-providers/server-ai-langchain/__tests__/LangChainProvider.test.ts index 7ebfb27f48..c2f284a6a5 100644 --- a/packages/ai-providers/server-ai-langchain/__tests__/LangChainProvider.test.ts +++ b/packages/ai-providers/server-ai-langchain/__tests__/LangChainProvider.test.ts @@ -76,12 +76,10 @@ describe('LangChainProvider', () => { describe('getAIMetricsFromResponse', () => { it('creates metrics with success=true and token usage', () => { const mockResponse = new AIMessage('Test response'); - mockResponse.response_metadata = { - tokenUsage: { - totalTokens: 100, - promptTokens: 50, - completionTokens: 50, - }, + mockResponse.usage_metadata = { + total_tokens: 100, + input_tokens: 50, + output_tokens: 50, }; const result = LangChainProvider.getAIMetricsFromResponse(mockResponse);