From d303de574270656bbb4cd037b88faac6e1e6171c Mon Sep 17 00:00:00 2001 From: Ravi Kumar L Date: Fri, 10 Jul 2026 21:34:20 +0200 Subject: [PATCH] fix(langfuse): align startup fanout gate --- api/server/routes/__tests__/config.spec.js | 19 +++++++++++++++++++ api/server/routes/config.js | 5 ++--- packages/api/src/langfuse/index.ts | 1 + 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/api/server/routes/__tests__/config.spec.js b/api/server/routes/__tests__/config.spec.js index af82399e76..592f72ab06 100644 --- a/api/server/routes/__tests__/config.spec.js +++ b/api/server/routes/__tests__/config.spec.js @@ -104,6 +104,8 @@ afterEach(() => { delete process.env.ANALYTICS_GTM_ID; delete process.env.CUSTOM_FOOTER; delete process.env.HELP_AND_FAQ_URL; + delete process.env.LANGFUSE_FANOUT_ENABLED; + delete process.env.LANGFUSE_FANOUT_COLLECTOR_URL; }); describe('GET /api/config', () => { @@ -383,6 +385,23 @@ describe('GET /api/config', () => { expect(response.body.conversationImportMaxFileSize).toBe(5000000); }); + it('should advertise Langfuse fanout only when the toggle and collector URL are configured', async () => { + mockGetAppConfig.mockResolvedValue(baseAppConfig); + process.env.LANGFUSE_FANOUT_ENABLED = 'true'; + const app = createApp(mockUser); + + let response = await request(app).get('/api/config'); + expect(response.body.langfuseFanoutEnabled).toBe(false); + + process.env.LANGFUSE_FANOUT_COLLECTOR_URL = ' '; + response = await request(app).get('/api/config'); + expect(response.body.langfuseFanoutEnabled).toBe(false); + + process.env.LANGFUSE_FANOUT_COLLECTOR_URL = 'http://langfuse-fanout:4318'; + response = await request(app).get('/api/config'); + expect(response.body.langfuseFanoutEnabled).toBe(true); + }); + it('should include post-login informational fields', async () => { process.env.ANALYTICS_GTM_ID = 'GTM-XYZ'; process.env.CUSTOM_FOOTER = 'authenticated footer text'; diff --git a/api/server/routes/config.js b/api/server/routes/config.js index 47c84f6fcd..cb6237f0c4 100644 --- a/api/server/routes/config.js +++ b/api/server/routes/config.js @@ -1,6 +1,7 @@ const express = require('express'); const { isEnabled, + isLangfuseFanoutEnabled, getBalanceConfig, getCloudFrontConfig, resolveBuildInfo, @@ -277,9 +278,7 @@ router.get('/', async function (req, res) { conversationImportMaxFileSize: process.env.CONVERSATION_IMPORT_MAX_FILE_SIZE_BYTES ? parseInt(process.env.CONVERSATION_IMPORT_MAX_FILE_SIZE_BYTES, 10) : 0, - langfuseFanoutEnabled: /^(true|1|yes|on)$/i.test( - (process.env.LANGFUSE_FANOUT_ENABLED ?? '').trim(), - ), + langfuseFanoutEnabled: isLangfuseFanoutEnabled(), ...(cloudFront ? { cloudFront } : {}), ...(rum ? { rum } : {}), }; diff --git a/packages/api/src/langfuse/index.ts b/packages/api/src/langfuse/index.ts index b22dba4698..43a5de0f83 100644 --- a/packages/api/src/langfuse/index.ts +++ b/packages/api/src/langfuse/index.ts @@ -1,2 +1,3 @@ export * from './feedback'; export * from './trace'; +export { isLangfuseFanoutEnabled } from './config';