From eaef87fa2684025627e25d649a56f4f2a63417a7 Mon Sep 17 00:00:00 2001
From: Danny Avila
Date: Fri, 14 Aug 2026 03:24:59 -0400
Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=80=20chore:=20Prepare=20v0.8.8-rc1=20?=
=?UTF-8?q?(#14394)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* 🚀 chore: Prepare v0.8.8-rc1 release
* 📚 docs: Complete v0.8.8-rc1 operator references
* 📚 docs: Mark stateful sessions experimental
* 📚 docs: Clarify background code capability
* 📚 docs: Refresh v0.8.8-rc1 operator guidance
* 📚 docs: Highlight v0.8.8-rc1 features in README
* 📦 chore: Bump publishable packages again
* 📚 docs: Add streaming question progress
* 📦 chore: Bump publishable packages again
* 📚 docs: Refresh v0.8.8-rc1 release highlights
* 📦 chore: Bump publishable packages again
* 📚 docs: Refresh v0.8.8-rc1 release guidance
* 📦 chore: Bump publishable packages again
* 📚 docs: Highlight batched Agent questions
* 📦 chore: Bump publishable packages again
* 📦 chore: Bump publishable packages again
* 📦 chore: Bump publishable packages again
* 📦 chore: Refresh v0.8.8-rc1 package versions
* 📦 chore: Refresh v0.8.8-rc1 package versions
* 📦 chore: Refresh v0.8.8-rc1 package versions
* 📄 docs: Note PowerPoint template support
* 📦 chore: Refresh v0.8.8-rc1 package versions
* 📄 docs: Note latest provider and file support
---
.env.example | 54 +++++++++++++++++++++++++---
Dockerfile | 2 +-
Dockerfile.multi | 2 +-
README.md | 23 +++++++++++-
api/package.json | 2 +-
bun.lock | 12 +++----
client/jest.config.cjs | 2 +-
client/package.json | 2 +-
e2e/jestSetup.js | 2 +-
helm/librechat/Chart.yaml | 4 +--
librechat.example.yaml | 47 +++++++++++++++++++++---
otel/langfuse-fanout/README.md | 44 ++++++++++++++++-------
package-lock.json | 16 ++++-----
package.json | 2 +-
packages/api/package.json | 2 +-
packages/client/package.json | 2 +-
packages/data-provider/package.json | 2 +-
packages/data-provider/src/config.ts | 6 ++--
packages/data-schemas/package.json | 2 +-
19 files changed, 176 insertions(+), 52 deletions(-)
diff --git a/.env.example b/.env.example
index 9709d53079..07ff7d0a0c 100644
--- a/.env.example
+++ b/.env.example
@@ -171,15 +171,17 @@ NODE_MAX_OLD_SPACE_SIZE=6144
# Optional Langfuse fanout for tenant-scoped Langfuse projects.
# The fanout gateway is opt-in: add docker-compose.langfuse-fanout.yml,
# deploy-compose.langfuse-fanout.yml, or enable helm langfuseFanout.
-# Tenant public/secret keys and a destination key are read from LibreChat tenant
-# app configuration. Destination keys resolve against known startup URLs. Tenant
-# API keys can be added or changed at runtime through tenant app configuration.
+# Tenant public/secret keys and a destination key are managed through
+# Settings > Langfuse. Destination keys resolve against known startup URLs;
+# credentials can be added or changed at runtime without restarting the gateway.
# See otel/langfuse-fanout/README.md.
# LANGFUSE_FANOUT_ENABLED=false
# LANGFUSE_FANOUT_COLLECTOR_URL=http://langfuse-fanout-collector:4318
# App-side switch: set true to tell the Langfuse SDK not to create media uploads
# for central/fallback collector traces. Tenant-routed media uploads are unchanged.
# LANGFUSE_FANOUT_CENTRAL_MEDIA_UPLOAD_DISABLED=false
+# Gateway HTTP listen address (default: :4318).
+# LANGFUSE_FANOUT_LISTEN_ADDR=:4318
# Emergency switch: unset/false defaults enabled; set true to keep central fanout export but skip tenant trace/score export.
# LANGFUSE_FANOUT_TENANT_EXPORT_DISABLED=false
# Langfuse Cloud base URL options: https://cloud.langfuse.com (EU),
@@ -478,7 +480,7 @@ GOOGLE_KEY=user_provided
#============#
OPENAI_API_KEY=user_provided
-# OPENAI_MODELS=gpt-5,gpt-5-codex,gpt-5-mini,gpt-5-nano,o3-pro,o3,o4-mini,gpt-4.1,gpt-4.1-mini,gpt-4.1-nano,o3-mini,o1-pro,o1,gpt-4o,gpt-4o-mini
+# OPENAI_MODELS=gpt-5.6,gpt-5.6-terra,gpt-5.6-luna,gpt-5.5,gpt-5.5-pro,chat-latest,gpt-5.4,gpt-5.4-pro,gpt-5.4-mini,gpt-5.4-nano,gpt-5.3-codex,gpt-5.2,gpt-5,gpt-5-codex,gpt-5-mini,gpt-5-nano,o3-pro,o3,o4-mini,gpt-4.1,gpt-4.1-mini,gpt-4.1-nano,o3-mini,o1-pro,o1,gpt-4o,gpt-4o-mini
DEBUG_OPENAI=false
@@ -613,6 +615,19 @@ MEILI_MASTER_KEY=
STT_API_KEY=
TTS_API_KEY=
+#==================================================#
+# Code Interpreter #
+#==================================================#
+
+# LIBRECHAT_CODE_API_KEY=
+# LIBRECHAT_CODE_BASEURL=
+# Prewarm stateful per-conversation sandboxes in parallel with model generation (default: true).
+# CODE_SANDBOX_PREWARM=true
+# Time in milliseconds before LibreChat treats a tracked sandbox as cold (default: 2100000 / 35 minutes).
+# CODE_SANDBOX_COLD_AFTER_MS=2100000
+# Bytes read per sandbox image chunk; lower this if the runner has a small stdout limit (default: 32768).
+# LIBRECHAT_CODE_IMAGE_CHUNK_BYTES=32768
+
#==================================================#
# RAG #
#==================================================#
@@ -627,11 +642,18 @@ TTS_API_KEY=
# Stream upload responses with heartbeats during long-running file processing.
# FILE_UPLOAD_SSE_ENABLED=false
+# Timeout in milliseconds for server-side remote file downloads (default: 15000).
+# REMOTE_FILE_FETCH_TIMEOUT_MS=15000
+# Maximum size in bytes for server-side remote file downloads (default: 536870912 / 512 MiB).
+# REMOTE_FILE_FETCH_MAX_BYTES=536870912
#===================================================#
# User System #
#===================================================#
+# Maximum characters in one mid-run Agent steering message (default: 16000).
+# STEER_MAX_LENGTH=16000
+
#========================#
# Moderation #
#========================#
@@ -654,12 +676,32 @@ STT_VIOLATION_SCORE=0
FORK_VIOLATION_SCORE=0
IMPORT_VIOLATION_SCORE=0
FILE_UPLOAD_VIOLATION_SCORE=0
+# Per-user limiter for metadata-only /files/usage requests that renew the TTL
+# of attachments waiting in queued Agent messages (default: 120 per 15 minutes).
+# FILE_USAGE_USER_MAX=120
+# FILE_USAGE_USER_WINDOW=15
+# Password-reset and verification request/submission scores default to 1 when unset.
+# RESET_PASSWORD_VIOLATION_SCORE=1
+# VERIFY_EMAIL_VIOLATION_SCORE=1
+# RESET_PASSWORD_SUBMISSION_VIOLATION_SCORE=1
+# VERIFY_EMAIL_SUBMISSION_VIOLATION_SCORE=1
LOGIN_MAX=7
LOGIN_WINDOW=5
REGISTER_MAX=5
REGISTER_WINDOW=60
+# Password-reset email requests and token submissions are limited separately.
+# Submission values inherit the matching request value when omitted; all default to 2.
+# RESET_PASSWORD_MAX=2
+# RESET_PASSWORD_WINDOW=2
+# RESET_PASSWORD_SUBMISSION_MAX=2
+# RESET_PASSWORD_SUBMISSION_WINDOW=2
+# VERIFY_EMAIL_MAX=2
+# VERIFY_EMAIL_WINDOW=2
+# VERIFY_EMAIL_SUBMISSION_MAX=2
+# VERIFY_EMAIL_SUBMISSION_WINDOW=2
+
LIMIT_CONCURRENT_MESSAGES=true
CONCURRENT_MESSAGE_MAX=2
@@ -1072,6 +1114,10 @@ HELP_AND_FAQ_URL=https://librechat.ai
# Set to empty string to force all namespaces through Redis: FORCED_IN_MEMORY_CACHE_NAMESPACES=
# FORCED_IN_MEMORY_CACHE_NAMESPACES=CONFIG_STORE,APP_CONFIG
+# Opt-in cache for authenticated user documents during request bursts. Requires Redis and
+# the AUTH_USER_DOC namespace to remain Redis-backed (default: off; set exactly to "on").
+# AUTH_USER_CACHE_MODE=off
+
# TTL in milliseconds for cached group memberships used in ACL permission checks (default: 300000 / 5 minutes; 0 disables)
# Membership changes invalidate affected entries immediately; the TTL bounds staleness from cross-process races.
# USER_PRINCIPALS_CACHE_TTL_MS=300000
diff --git a/Dockerfile b/Dockerfile
index c135700354..416046bbfb 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-# v0.8.7
+# v0.8.8-rc1
# Base node image
FROM node:24.16.0-alpine AS node
diff --git a/Dockerfile.multi b/Dockerfile.multi
index bfa7a22091..e428ae2d27 100644
--- a/Dockerfile.multi
+++ b/Dockerfile.multi
@@ -1,5 +1,5 @@
# Dockerfile.multi
-# v0.8.7
+# v0.8.8-rc1
# Set configurable max-old-space-size with default
ARG NODE_MAX_OLD_SPACE_SIZE=6144
diff --git a/README.md b/README.md
index 5167d22e3f..f60a5e6247 100644
--- a/README.md
+++ b/README.md
@@ -51,6 +51,25 @@
+## 🚀 What's New in v0.8.8-rc1
+
+- **Agent run control:** Interrupt or steer an Agent mid-run, queue follow-up messages, and reclaim, edit, or escalate pending steers.
+- **Human-in-the-loop Agents:** Agents stream question progress, ask up to four related questions in one form, pause for input or tool approval, and resume.
+- **Unified Agent Builder:** A redesigned Tools marketplace brings together Skills, MCP, Code Interpreter, orchestration, Programmatic Tool Calling, model-spec controls, and per-tool background and intent settings.
+- **Readable Agent activity:** Generated activity-group headers, parent phase summaries, and live tool intent labels make long reasoning and tool runs easier to scan.
+- **Code Interpreter workflows:** Code and shell tools can run in the background, sandbox images return as viewable artifacts, and highly experimental stateful sessions can reuse prewarmed conversation workspaces.
+- **Agent extensibility:** Experimental Agent Plugins can bundle deployment Skills, MCP servers, and opt-in command hooks, while explicit subagents initialize only when selected.
+- **Memory, context, and identity:** Agents can manage memory with optional per-agent isolation, expose support contacts safely, and show a more faithful Context Usage gauge.
+- **Sharing and files:** Shared conversations show a badge and update at a stable URL, while signed-in viewers can continue them as personal copies.
+- **Artifact workflows:** Open previews fullscreen, work with PowerPoint `.potx` templates across upload, search, and code execution, upload shell scripts across common MIME variants, export Mermaid diagrams as SVG or PNG, and download original Office files from the artifact panel.
+- **Models and reasoning:** Added GPT-5.6 with Responses API reasoning controls, Claude Opus 5 and Sonnet 5, Gemini 3.7 and 3.6 Flash, and Gemini 3.5 Flash-Lite.
+- **Langfuse observability:** Configure encrypted Langfuse connections in-app, let authorized admins open sampled sessions directly, optionally fan out traces by tenant, and suppress central export per run.
+- **Administration and security:** Delegate config sections, encrypt registered secrets, enforce SSRF checks for speech, OCR, and web tools, and generate unique temporary credentials when secrets are blank.
+- **Messages and navigation:** Right-aligned user turns, unified multi-part editing, full-message copy, a dock-style message rail, virtualized search, smooth streaming, and faster Agent startup.
+- **Streaming and tool reliability:** Adaptive provider smoothing, Redis delta batching, dynamic MCP tool refresh, parsed MCP response media types, runtime OAuth recovery, and Agent stream circuit breakers improve long-running workflows.
+- **Deployment and reliability:** Added configurable HTTP timeouts, Amazon DocumentDB 5.0+ support, low-noise Redis and browser observability, and a rolling-upgrade-safe generation protocol.
+
+Read the [full v0.8.8-rc1 changelog](https://www.librechat.ai/changelog/v0.8.8-rc1).
# ✨ Features
@@ -76,6 +95,7 @@
- Collaborative Sharing: Share agents with specific users and groups
- Flexible & Extensible: Use MCP Servers, tools, file search, code execution, and more
- [Skills](https://www.librechat.ai/docs/features/skills): Create reusable `SKILL.md` instruction bundles for manual, automatic, or always-on agent workflows
+ - [Agent Plugins](https://www.librechat.ai/docs/features/agent_plugins): Experimentally bundle deployment Skills and MCP servers into startup-loaded packages
- [Subagents](https://www.librechat.ai/docs/features/subagents): Delegate focused work to isolated child agent runs with their own context windows
- Compatible with Custom Endpoints, OpenAI, Azure, Anthropic, AWS Bedrock, Google, Vertex AI, Responses API, and more
- [Model Context Protocol (MCP) Support](https://modelcontextprotocol.io/clients#librechat) for Tools
@@ -87,7 +107,8 @@
- **[Learn More →](https://www.librechat.ai/docs/features/web_search)**
- 🪄 **Generative UI with Code Artifacts**:
- - [Code Artifacts](https://youtu.be/GfTj7O4gmd0?si=WJbdnemZpJzBrJo3) allow creation of React, HTML, and Mermaid diagrams directly in chat
+ - [Code Artifacts](https://youtu.be/GfTj7O4gmd0?si=WJbdnemZpJzBrJo3) create React, HTML, and Mermaid content directly in chat
+ - Open previews fullscreen and export Mermaid diagrams as SVG or PNG
- 🎨 **Image Generation & Editing**
- Text-to-image and image-to-image with [GPT-Image-1](https://www.librechat.ai/docs/features/image_gen#1--openai-image-tools-recommended)
diff --git a/api/package.json b/api/package.json
index 6e1efe18de..232292a21d 100644
--- a/api/package.json
+++ b/api/package.json
@@ -1,6 +1,6 @@
{
"name": "@librechat/backend",
- "version": "v0.8.7",
+ "version": "v0.8.8-rc1",
"description": "",
"scripts": {
"start": "echo 'please run this from the root directory'",
diff --git a/bun.lock b/bun.lock
index 956b990a3a..b6288804f7 100644
--- a/bun.lock
+++ b/bun.lock
@@ -37,7 +37,7 @@
},
"api": {
"name": "@librechat/backend",
- "version": "0.8.7",
+ "version": "0.8.8-rc1",
"dependencies": {
"@anthropic-ai/vertex-sdk": "^0.16.0",
"@aws-sdk/client-bedrock-runtime": "^3.1013.0",
@@ -148,7 +148,7 @@
},
"client": {
"name": "@librechat/frontend",
- "version": "0.8.7",
+ "version": "0.8.8-rc1",
"dependencies": {
"@ariakit/react": "^0.4.29",
"@ariakit/react-components": "^0.1.2",
@@ -292,7 +292,7 @@
},
"packages/api": {
"name": "@librechat/api",
- "version": "1.7.34",
+ "version": "1.7.46",
"dependencies": {
"@langchain/langgraph-checkpoint": "^1.1.2",
"@langchain/langgraph-checkpoint-mongodb": "^1.4.0",
@@ -403,7 +403,7 @@
},
"packages/client": {
"name": "@librechat/client",
- "version": "0.4.63",
+ "version": "0.4.75",
"devDependencies": {
"@babel/core": "^7.28.5",
"@babel/preset-env": "^7.29.5",
@@ -486,7 +486,7 @@
},
"packages/data-provider": {
"name": "librechat-data-provider",
- "version": "0.8.509",
+ "version": "0.8.521",
"dependencies": {
"axios": "^1.16.0",
"dayjs": "^1.11.13",
@@ -521,7 +521,7 @@
},
"packages/data-schemas": {
"name": "@librechat/data-schemas",
- "version": "0.0.56",
+ "version": "0.0.68",
"devDependencies": {
"@types/express": "^5.0.0",
"@types/jest": "^29.5.2",
diff --git a/client/jest.config.cjs b/client/jest.config.cjs
index c12bcc1cfd..996a9fb7e6 100644
--- a/client/jest.config.cjs
+++ b/client/jest.config.cjs
@@ -1,4 +1,4 @@
-/** v0.8.7 */
+/** v0.8.8-rc1 */
module.exports = {
roots: ['/src'],
testEnvironment: 'jsdom',
diff --git a/client/package.json b/client/package.json
index 0fef2dbad3..48de22cdda 100644
--- a/client/package.json
+++ b/client/package.json
@@ -1,6 +1,6 @@
{
"name": "@librechat/frontend",
- "version": "v0.8.7",
+ "version": "v0.8.8-rc1",
"description": "",
"type": "module",
"scripts": {
diff --git a/e2e/jestSetup.js b/e2e/jestSetup.js
index 49d92eb8c8..9e74d00f07 100644
--- a/e2e/jestSetup.js
+++ b/e2e/jestSetup.js
@@ -1,3 +1,3 @@
-// v0.8.7
+// v0.8.8-rc1
// See .env.test.example for an example of the '.env.test' file.
require('dotenv').config({ path: './e2e/.env.test' });
diff --git a/helm/librechat/Chart.yaml b/helm/librechat/Chart.yaml
index e45c3d0372..6b5ba207b1 100755
--- a/helm/librechat/Chart.yaml
+++ b/helm/librechat/Chart.yaml
@@ -15,7 +15,7 @@ type: application
# This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version.
# Versions are expected to follow Semantic Versioning (https://semver.org/)
-version: 2.0.7
+version: 2.0.8
# This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application. Versions are not expected to
@@ -23,7 +23,7 @@ version: 2.0.7
# It is recommended to use it with quotes.
# renovate: image=registry.librechat.ai/danny-avila/librechat
-appVersion: "v0.8.7"
+appVersion: "v0.8.8-rc1"
home: https://www.librechat.ai
diff --git a/librechat.example.yaml b/librechat.example.yaml
index 310cd8ae43..57ecc4b715 100644
--- a/librechat.example.yaml
+++ b/librechat.example.yaml
@@ -2,11 +2,16 @@
# https://www.librechat.ai/docs/configuration/librechat_yaml
# Configuration version (required)
-version: 1.3.13
+version: 1.3.14
# Cache settings: Set to true to enable caching
cache: true
+# Langfuse connections are managed through Settings > Langfuse when available.
+# That flow verifies the credentials and stores the secret key encrypted; do not
+# place a plaintext langfuse.secretKey in this file. Environment-managed central
+# credentials and optional fanout routing are documented in .env.example.
+
# File storage configuration
# Single strategy for all file types (legacy format, still supported)
# fileStrategy: "s3"
@@ -459,6 +464,14 @@ endpoints:
# # final: defer generation until the full response completes (legacy behavior).
# # Set under `endpoints.all` instead to apply as the global default for all endpoints.
# titleTiming: immediate
+ # # (optional) Generate one-line headers for blocks of Agent reasoning and tool calls.
+ # # Header generation is a separate model call whose usage and cost are recorded.
+ # activityLabel: true
+ # activityEndpoint: openAI
+ # activityModel: gpt-4.1-nano
+ # # activityPrompt: 'Write a short activity label...'
+ # # activityMaxPerRun: 20
+ # # activityCharLimit: 600
# # (optional) Maximum total citations to include in agent responses, defaults to 30
# maxCitations: 30
# # (optional) Maximum citations per file to include in agent responses, defaults to 7
@@ -471,10 +484,24 @@ endpoints:
# skills:
# maxCatalogSkills: 20
# # (optional) Agent Capabilities available to all users. Omit the ones you wish to exclude. Defaults to list below.
- # capabilities: ["deferred_tools", "execute_code", "file_search", "actions", "tools"]
- # # Off-by-default capabilities you can add to the list above:
- # # - "run_in_background": opted-in tools gain a `run_in_background` param so the model can dispatch them detached and poll via `check_background_task`.
- # # - "tool_intents": opted-in tools (native tools by default) gain an `intent` param — one model-written sentence per call, streamed into the tool-call arguments. Backend groundwork today: the chat UI renders it as each call's live status label in an upcoming release; opt tools in per agent via `tool_options[tool].describe_intent`.
+ # capabilities: ["deferred_tools", "execute_code", "file_search", "web_search", "artifacts", "subagents", "actions", "context", "skills", "memory", "ask_user_question", "tools", "chain", "ocr"]
+ # # The following capabilities are opt-in and must be added explicitly:
+ # # "programmatic_tools", "stateful_code_sessions", "run_in_background", "tool_intents"
+ # # "stateful_code_sessions" is highly experimental and may change substantially.
+ # # "run_in_background" makes Code Interpreter tools eligible by default and enables per-tool MCP opt-in.
+ # # "tool_intents" enables live model-written labels for native tools and opted-in MCP tools.
+ # # (optional) Require user approval before matching tool calls. Disabled by default.
+ # toolApproval:
+ # enabled: true
+ # mode: default # default, dontAsk, or bypass
+ # allow: ["mcp:trusted-server:read_*"]
+ # deny: ["mcp:*:delete_*"] # Deny rules always take precedence
+ # ask: ["mcp:*:*"]
+ # reason: "Review {tool} before it runs."
+ # # (optional) Persist Agent runs paused for approval or Ask User. MongoDB is the durable default.
+ # checkpointer:
+ # type: mongo # mongo (default) or memory (single-process development only)
+ # ttl: 86400 # Approval window in seconds; defaults to 24 hours
# (optional) Custom request headers for the built-in OpenAI / Google endpoints.
# Forwarded on every request to the provider (or an AI gateway / reverse proxy
@@ -766,6 +793,7 @@ endpoints:
# description: "Most capable GPT-4 model with multimodal support"
# # default: true # Hard admin default; takes precedence over prior user choices
# # softDefault: true # First-time default only; skipped after a user selects a model/spec/agent
+# # showInMenu: false # Hide from the model selector while keeping explicit `spec` access
# group: "openAI" # String value matching the endpoint name
# preset:
# endpoint: "openAI"
@@ -831,6 +859,15 @@ endpoints:
# endpoint: "openAI"
# model: "gpt-4o-mini"
+# Automatic conversation summarization (optional)
+# summarization:
+# enabled: true
+# provider: "openAI"
+# model: "gpt-4o-mini"
+# retainRecent:
+# turns: 2 # Keep the newest complete user/assistant turns outside the summary
+# tokens: 2000 # Also preserve up to this many recent tokens
+
# fileConfig:
# endpoints:
# assistants:
diff --git a/otel/langfuse-fanout/README.md b/otel/langfuse-fanout/README.md
index f3670cff0a..3052c72670 100644
--- a/otel/langfuse-fanout/README.md
+++ b/otel/langfuse-fanout/README.md
@@ -45,17 +45,19 @@ The deployment is a hybrid:
trace suppression uses a destination-scoped gateway path that also skips
central media export for that run.
- Tenant export is conditional. LibreChat uses a destination-scoped gateway URL
- only when tenant keys are configured, the tenant base URL matches a configured
- startup destination, and `LANGFUSE_FANOUT_TENANT_EXPORT_DISABLED` is not true.
+ only when the saved connection is enabled with tenant keys, its destination
+ key matches a configured startup destination, and
+ `LANGFUSE_FANOUT_TENANT_EXPORT_DISABLED` is not true.
Other traces are still exported to central through the gateway without tenant
auth.
- User feedback scores use Langfuse's direct REST API from the LibreChat API
process. Central scores use LibreChat's normal central Langfuse env config;
tenant scores use tenant app configuration when tenant fanout is enabled.
-Tenant Langfuse keys are expected to come from LibreChat app configuration, for
-example from an admin panel or another configuration data source. They are not
-defined in this gateway config.
+Tenant Langfuse keys are expected to come from LibreChat app configuration.
+When available, an authorized administrator can configure and verify the
+connection under **Settings > Langfuse**; LibreChat encrypts the secret key at
+rest. The keys are not defined in this gateway config.
## Limitations
@@ -65,9 +67,9 @@ defined in this gateway config.
destination.
- Tenant Langfuse API keys can be added, changed, or disabled in tenant app
configuration at runtime without restarting LibreChat or the gateway.
-- Tenant app configuration must set a Langfuse base URL matching one of the
- startup destinations before tenant trace/score export is enabled; keys alone
- are treated as central-only.
+- Tenant app configuration must select a destination key from
+ `LANGFUSE_FANOUT_TENANT_DESTINATIONS` before tenant trace/score export is
+ enabled; keys alone do not enable tenant export.
- `LANGFUSE_FANOUT_TENANT_EXPORT_DISABLED=true` can be set on LibreChat as an
emergency switch to stop tenant trace and score export while keeping central
gateway export active. When omitted, false, or blank, tenant export remains
@@ -129,6 +131,7 @@ LANGFUSE_FANOUT_TENANT_EU_BASE_URL=https://cloud.langfuse.com
LANGFUSE_FANOUT_TENANT_US_BASE_URL=https://us.cloud.langfuse.com
LANGFUSE_FANOUT_TENANT_JP_BASE_URL=https://jp.cloud.langfuse.com
LANGFUSE_FANOUT_TENANT_EXPORT_DISABLED=false
+LANGFUSE_FANOUT_LISTEN_ADDR=:4318
LANGFUSE_FANOUT_UPSTREAM_TIMEOUT=30s
LANGFUSE_FANOUT_PUBLIC_URL=http://langfuse-fanout-collector:4318
LANGFUSE_FANOUT_REDIS_URI=redis://langfuse-fanout-redis:6379
@@ -170,6 +173,17 @@ The override builds the fanout gateway image, sets `LANGFUSE_FANOUT_ENABLED=true
## Helm
+The Compose overrides build the gateway image locally. For Kubernetes, build
+the same image from the repository root, push it to a registry available to
+the cluster, and set `langfuseFanout.image.repository` and `.tag` to match:
+
+```sh
+docker build \
+ -f otel/langfuse-fanout/Dockerfile \
+ -t registry.example.com/librechat-langfuse-fanout: .
+docker push registry.example.com/librechat-langfuse-fanout:
+```
+
Create a secret containing the central Langfuse Basic auth header:
```sh
@@ -186,6 +200,10 @@ redis:
langfuseFanout:
enabled: true
+ image:
+ repository: registry.example.com/librechat-langfuse-fanout
+ tag: ''
+ pullPolicy: IfNotPresent
central:
baseUrl: https://cloud.langfuse.com
authHeaderSecret:
@@ -204,14 +222,14 @@ langfuseFanout:
jp:
baseUrl: https://jp.cloud.langfuse.com
upstreamTimeout: 30s
- publicUrl: ""
+ publicUrl: ''
otelCollector:
receiverEndpoint: 127.0.0.1:4319
redis:
- uri: ""
- username: ""
+ uri: ''
+ username: ''
passwordSecret:
- name: ""
+ name: ''
key: REDIS_PASSWORD
keyPrefix: langfuse-fanout
memoryLimitMiB: 256
@@ -268,6 +286,8 @@ already uploaded.
- Tenant destinations default to the three configured Langfuse Cloud regions. Add or
override `langfuseFanout.tenant.destinations` in Helm for self-hosted or
custom destinations.
+- `LANGFUSE_FANOUT_LISTEN_ADDR` controls the gateway HTTP bind address and
+ defaults to `:4318`.
- `LANGFUSE_FANOUT_UPSTREAM_TIMEOUT` tunes the timeout for gateway calls to
Langfuse APIs and presigned media upload URLs.
- `LANGFUSE_FANOUT_PUBLIC_URL` pins the base URL returned for the SDK's
diff --git a/package-lock.json b/package-lock.json
index 2ce52af382..da3279c06e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "LibreChat",
- "version": "v0.8.7",
+ "version": "v0.8.8-rc1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "LibreChat",
- "version": "v0.8.7",
+ "version": "v0.8.8-rc1",
"license": "ISC",
"workspaces": [
"api",
@@ -48,7 +48,7 @@
},
"api": {
"name": "@librechat/backend",
- "version": "v0.8.7",
+ "version": "v0.8.8-rc1",
"license": "ISC",
"dependencies": {
"@anthropic-ai/vertex-sdk": "^0.16.0",
@@ -920,7 +920,7 @@
},
"client": {
"name": "@librechat/frontend",
- "version": "v0.8.7",
+ "version": "v0.8.8-rc1",
"license": "ISC",
"dependencies": {
"@ariakit/react": "^0.4.29",
@@ -42790,7 +42790,7 @@
},
"packages/api": {
"name": "@librechat/api",
- "version": "1.7.34",
+ "version": "1.7.46",
"license": "ISC",
"dependencies": {
"@langchain/langgraph-checkpoint": "^1.1.2",
@@ -43494,7 +43494,7 @@
},
"packages/client": {
"name": "@librechat/client",
- "version": "0.4.63",
+ "version": "0.4.75",
"devDependencies": {
"@babel/core": "^7.28.5",
"@babel/preset-env": "^7.29.5",
@@ -44628,7 +44628,7 @@
},
"packages/data-provider": {
"name": "librechat-data-provider",
- "version": "0.8.509",
+ "version": "0.8.521",
"license": "ISC",
"dependencies": {
"axios": "^1.16.0",
@@ -45236,7 +45236,7 @@
},
"packages/data-schemas": {
"name": "@librechat/data-schemas",
- "version": "0.0.56",
+ "version": "0.0.68",
"license": "MIT",
"devDependencies": {
"@types/express": "^5.0.0",
diff --git a/package.json b/package.json
index ff2d163cc0..69a88e5834 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "LibreChat",
- "version": "v0.8.7",
+ "version": "v0.8.8-rc1",
"description": "",
"packageManager": "npm@11.13.0",
"workspaces": [
diff --git a/packages/api/package.json b/packages/api/package.json
index fc1cd6c713..001047c638 100644
--- a/packages/api/package.json
+++ b/packages/api/package.json
@@ -1,6 +1,6 @@
{
"name": "@librechat/api",
- "version": "1.7.34",
+ "version": "1.7.46",
"type": "commonjs",
"description": "MCP services for LibreChat",
"main": "dist/index.cjs",
diff --git a/packages/client/package.json b/packages/client/package.json
index 13ec70bf6d..68d39a4137 100644
--- a/packages/client/package.json
+++ b/packages/client/package.json
@@ -1,6 +1,6 @@
{
"name": "@librechat/client",
- "version": "0.4.63",
+ "version": "0.4.75",
"description": "React components for LibreChat",
"repository": {
"type": "git",
diff --git a/packages/data-provider/package.json b/packages/data-provider/package.json
index ddd52b0e9a..c074c16b30 100644
--- a/packages/data-provider/package.json
+++ b/packages/data-provider/package.json
@@ -1,6 +1,6 @@
{
"name": "librechat-data-provider",
- "version": "0.8.509",
+ "version": "0.8.521",
"description": "data services for librechat apps",
"main": "dist/index.js",
"module": "dist/index.mjs",
diff --git a/packages/data-provider/src/config.ts b/packages/data-provider/src/config.ts
index 0e71a2062c..03e9c433e8 100644
--- a/packages/data-provider/src/config.ts
+++ b/packages/data-provider/src/config.ts
@@ -990,8 +990,8 @@ export const agentsEndpointSchema = baseEndpointSchema
remoteApi: remoteApiSchema.optional(),
/** Human-in-the-loop tool approval policy. Off by default. */
toolApproval: toolApprovalPolicySchema,
- /** Durable checkpointer backing HITL resume. Defaults to the app's MongoDB
- * when `toolApproval.enabled` is set; ignored otherwise. */
+ /** Durable checkpointer backing tool-approval and Ask User resume.
+ * Defaults to the app's MongoDB when either flow needs it. */
checkpointer: checkpointerSchema,
}),
)
@@ -2862,7 +2862,7 @@ export enum Constants {
*/
VERSION = '__LIBRECHAT_VERSION__',
/** Key for the Custom Config's version (librechat.yaml). */
- CONFIG_VERSION = '1.3.13',
+ CONFIG_VERSION = '1.3.14',
/** Standard value for the first message's `parentMessageId` value, to indicate no parent exists. */
NO_PARENT = '00000000-0000-0000-0000-000000000000',
/** Standard value to use whatever the submission prelim. `responseMessageId` is */
diff --git a/packages/data-schemas/package.json b/packages/data-schemas/package.json
index 30d91bf26e..ca6ee89244 100644
--- a/packages/data-schemas/package.json
+++ b/packages/data-schemas/package.json
@@ -1,6 +1,6 @@
{
"name": "@librechat/data-schemas",
- "version": "0.0.56",
+ "version": "0.0.68",
"description": "Mongoose schemas and models for LibreChat",
"type": "module",
"main": "dist/index.cjs",