From be4d874cefa910b0fdf01087eab9f7400d6306d3 Mon Sep 17 00:00:00 2001 From: Ravi Kumar L Date: Mon, 22 Jun 2026 10:41:19 +0200 Subject: [PATCH] refactor: share string normalization helper --- packages/api/src/langfuse/config.ts | 3 ++- packages/api/src/langfuse/destinations.ts | 3 ++- packages/api/src/langfuse/tenantDestinations.ts | 2 +- packages/api/src/langfuse/utils.ts | 4 ---- packages/api/src/utils/text.spec.ts | 11 ++++++++++- packages/api/src/utils/text.ts | 4 ++++ 6 files changed, 19 insertions(+), 8 deletions(-) diff --git a/packages/api/src/langfuse/config.ts b/packages/api/src/langfuse/config.ts index 7fe7ebdeb2..412221be6d 100644 --- a/packages/api/src/langfuse/config.ts +++ b/packages/api/src/langfuse/config.ts @@ -1,7 +1,8 @@ import type { AppConfig } from '@librechat/data-schemas'; import type { RunConfig } from '@librechat/agents'; import { resolveLangfuseTenantDestination } from './tenantDestinations'; -import { isTrueEnv, normalizeString } from './utils'; +import { normalizeString } from '~/utils/text'; +import { isTrueEnv } from './utils'; type LangfuseRunConfig = NonNullable; type LangfuseRunConfigWithTraceAttributes = LangfuseRunConfig & { diff --git a/packages/api/src/langfuse/destinations.ts b/packages/api/src/langfuse/destinations.ts index 0cd617dfc1..a5e4e32ff8 100644 --- a/packages/api/src/langfuse/destinations.ts +++ b/packages/api/src/langfuse/destinations.ts @@ -1,6 +1,7 @@ import type { AppConfig } from '@librechat/data-schemas'; -import { isFalseEnv, isTrueEnv, normalizeString, toBasicAuthorization } from './utils'; import { resolveLangfuseTenantDestination } from './tenantDestinations'; +import { isFalseEnv, isTrueEnv, toBasicAuthorization } from './utils'; +import { normalizeString } from '~/utils/text'; const DEFAULT_BASE_URL = 'https://cloud.langfuse.com'; diff --git a/packages/api/src/langfuse/tenantDestinations.ts b/packages/api/src/langfuse/tenantDestinations.ts index 77af82a173..2a4179f0b9 100644 --- a/packages/api/src/langfuse/tenantDestinations.ts +++ b/packages/api/src/langfuse/tenantDestinations.ts @@ -1,4 +1,4 @@ -import { normalizeString } from './utils'; +import { normalizeString } from '~/utils/text'; const DEFAULT_TENANT_DESTINATIONS: Array<[string, string]> = [ ['eu', 'https://cloud.langfuse.com'], diff --git a/packages/api/src/langfuse/utils.ts b/packages/api/src/langfuse/utils.ts index 95f18fdb94..e8131d0522 100644 --- a/packages/api/src/langfuse/utils.ts +++ b/packages/api/src/langfuse/utils.ts @@ -1,7 +1,3 @@ -export function normalizeString(value: unknown): string | undefined { - return typeof value === 'string' && value.trim() !== '' ? value.trim() : undefined; -} - export function isFalseEnv(value?: string): boolean { return value != null && ['0', 'false', 'no', 'off'].includes(value.trim().toLowerCase()); } diff --git a/packages/api/src/utils/text.spec.ts b/packages/api/src/utils/text.spec.ts index cbafb25af7..5a0c21a018 100644 --- a/packages/api/src/utils/text.spec.ts +++ b/packages/api/src/utils/text.spec.ts @@ -1,4 +1,4 @@ -import { processTextWithTokenLimit, TokenCountFn } from './text'; +import { normalizeString, processTextWithTokenLimit, TokenCountFn } from './text'; import Tokenizer, { countTokens } from './tokenizer'; jest.mock('@librechat/data-schemas', () => ({ @@ -9,6 +9,15 @@ jest.mock('@librechat/data-schemas', () => ({ }, })); +describe('normalizeString', () => { + it('trims non-empty strings and treats blank or non-string values as undefined', () => { + expect(normalizeString(' value ')).toBe('value'); + expect(normalizeString(' ')).toBeUndefined(); + expect(normalizeString(null)).toBeUndefined(); + expect(normalizeString(123)).toBeUndefined(); + }); +}); + /** * OLD IMPLEMENTATION (Binary Search) - kept for comparison testing * This is the original algorithm that caused CPU spikes diff --git a/packages/api/src/utils/text.ts b/packages/api/src/utils/text.ts index 5273670e10..00e9e81d86 100644 --- a/packages/api/src/utils/text.ts +++ b/packages/api/src/utils/text.ts @@ -3,6 +3,10 @@ import { logger } from '@librechat/data-schemas'; /** Token count function that can be sync or async */ export type TokenCountFn = (text: string) => number | Promise; +export function normalizeString(value: unknown): string | undefined { + return typeof value === 'string' && value.trim() !== '' ? value.trim() : undefined; +} + /** * Safety buffer multiplier applied to character position estimates during truncation. *