@librechat/agents 3.1.90 → 3.1.92

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/dist/cjs/agents/AgentContext.cjs +9 -5
  2. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  3. package/dist/cjs/graphs/Graph.cjs +48 -14
  4. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  5. package/dist/cjs/instrumentation.cjs +2 -7
  6. package/dist/cjs/instrumentation.cjs.map +1 -1
  7. package/dist/cjs/langfuse.cjs +285 -0
  8. package/dist/cjs/langfuse.cjs.map +1 -0
  9. package/dist/cjs/main.cjs +25 -0
  10. package/dist/cjs/main.cjs.map +1 -1
  11. package/dist/cjs/run.cjs +75 -44
  12. package/dist/cjs/run.cjs.map +1 -1
  13. package/dist/cjs/stream.cjs +10 -3
  14. package/dist/cjs/stream.cjs.map +1 -1
  15. package/dist/cjs/tools/cloudflare/CloudflareBridgeRuntime.cjs +380 -0
  16. package/dist/cjs/tools/cloudflare/CloudflareBridgeRuntime.cjs.map +1 -0
  17. package/dist/cjs/tools/cloudflare/CloudflareProgrammaticToolCalling.cjs +997 -0
  18. package/dist/cjs/tools/cloudflare/CloudflareProgrammaticToolCalling.cjs.map +1 -0
  19. package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs +575 -0
  20. package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs.map +1 -0
  21. package/dist/cjs/tools/cloudflare/CloudflareSandboxTools.cjs +165 -0
  22. package/dist/cjs/tools/cloudflare/CloudflareSandboxTools.cjs.map +1 -0
  23. package/dist/cjs/tools/local/LocalExecutionEngine.cjs +17 -5
  24. package/dist/cjs/tools/local/LocalExecutionEngine.cjs.map +1 -1
  25. package/dist/cjs/tools/local/resolveLocalExecutionTools.cjs +110 -6
  26. package/dist/cjs/tools/local/resolveLocalExecutionTools.cjs.map +1 -1
  27. package/dist/cjs/utils/callbacks.cjs +27 -0
  28. package/dist/cjs/utils/callbacks.cjs.map +1 -0
  29. package/dist/esm/agents/AgentContext.mjs +9 -5
  30. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  31. package/dist/esm/graphs/Graph.mjs +48 -14
  32. package/dist/esm/graphs/Graph.mjs.map +1 -1
  33. package/dist/esm/instrumentation.mjs +2 -7
  34. package/dist/esm/instrumentation.mjs.map +1 -1
  35. package/dist/esm/langfuse.mjs +275 -0
  36. package/dist/esm/langfuse.mjs.map +1 -0
  37. package/dist/esm/main.mjs +5 -1
  38. package/dist/esm/main.mjs.map +1 -1
  39. package/dist/esm/run.mjs +75 -44
  40. package/dist/esm/run.mjs.map +1 -1
  41. package/dist/esm/stream.mjs +10 -3
  42. package/dist/esm/stream.mjs.map +1 -1
  43. package/dist/esm/tools/cloudflare/CloudflareBridgeRuntime.mjs +378 -0
  44. package/dist/esm/tools/cloudflare/CloudflareBridgeRuntime.mjs.map +1 -0
  45. package/dist/esm/tools/cloudflare/CloudflareProgrammaticToolCalling.mjs +994 -0
  46. package/dist/esm/tools/cloudflare/CloudflareProgrammaticToolCalling.mjs.map +1 -0
  47. package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs +566 -0
  48. package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs.map +1 -0
  49. package/dist/esm/tools/cloudflare/CloudflareSandboxTools.mjs +155 -0
  50. package/dist/esm/tools/cloudflare/CloudflareSandboxTools.mjs.map +1 -0
  51. package/dist/esm/tools/local/LocalExecutionEngine.mjs +17 -6
  52. package/dist/esm/tools/local/LocalExecutionEngine.mjs.map +1 -1
  53. package/dist/esm/tools/local/resolveLocalExecutionTools.mjs +111 -7
  54. package/dist/esm/tools/local/resolveLocalExecutionTools.mjs.map +1 -1
  55. package/dist/esm/utils/callbacks.mjs +24 -0
  56. package/dist/esm/utils/callbacks.mjs.map +1 -0
  57. package/dist/types/agents/AgentContext.d.ts +4 -1
  58. package/dist/types/graphs/Graph.d.ts +6 -5
  59. package/dist/types/index.d.ts +1 -0
  60. package/dist/types/langfuse.d.ts +57 -0
  61. package/dist/types/tools/cloudflare/CloudflareBridgeRuntime.d.ts +23 -0
  62. package/dist/types/tools/cloudflare/CloudflareProgrammaticToolCalling.d.ts +4 -0
  63. package/dist/types/tools/cloudflare/CloudflareSandboxExecutionEngine.d.ts +21 -0
  64. package/dist/types/tools/cloudflare/CloudflareSandboxTools.d.ts +22 -0
  65. package/dist/types/tools/cloudflare/index.d.ts +4 -0
  66. package/dist/types/tools/local/LocalExecutionEngine.d.ts +1 -0
  67. package/dist/types/types/graph.d.ts +8 -0
  68. package/dist/types/types/run.d.ts +2 -2
  69. package/dist/types/types/tools.d.ts +118 -2
  70. package/dist/types/utils/callbacks.d.ts +5 -0
  71. package/package.json +4 -4
  72. package/src/__tests__/stream.eagerEventExecution.test.ts +66 -0
  73. package/src/agents/AgentContext.ts +13 -3
  74. package/src/graphs/Graph.ts +57 -16
  75. package/src/index.ts +1 -0
  76. package/src/instrumentation.ts +2 -7
  77. package/src/langfuse.ts +441 -0
  78. package/src/run.ts +105 -59
  79. package/src/specs/langfuse-callbacks.test.ts +75 -0
  80. package/src/specs/langfuse-config.test.ts +114 -0
  81. package/src/specs/langfuse-metadata.test.ts +19 -1
  82. package/src/stream.ts +13 -3
  83. package/src/tools/__tests__/CloudflareSandboxExecution.test.ts +537 -0
  84. package/src/tools/cloudflare/CloudflareBridgeRuntime.ts +480 -0
  85. package/src/tools/cloudflare/CloudflareProgrammaticToolCalling.ts +1162 -0
  86. package/src/tools/cloudflare/CloudflareSandboxExecutionEngine.ts +744 -0
  87. package/src/tools/cloudflare/CloudflareSandboxTools.ts +225 -0
  88. package/src/tools/cloudflare/index.ts +4 -0
  89. package/src/tools/local/LocalExecutionEngine.ts +20 -4
  90. package/src/tools/local/resolveLocalExecutionTools.ts +169 -7
  91. package/src/types/graph.ts +9 -0
  92. package/src/types/run.ts +2 -7
  93. package/src/types/tools.ts +141 -2
  94. package/src/utils/callbacks.ts +39 -0
@@ -1 +1 @@
1
- {"version":3,"file":"instrumentation.cjs","sources":["../../src/instrumentation.ts"],"sourcesContent":["import { NodeSDK } from '@opentelemetry/sdk-node';\nimport { LangfuseSpanProcessor } from '@langfuse/otel';\nimport { isPresent } from '@/utils/misc';\n\nif (\n isPresent(process.env.LANGFUSE_SECRET_KEY) &&\n isPresent(process.env.LANGFUSE_PUBLIC_KEY) &&\n isPresent(process.env.LANGFUSE_BASE_URL)\n) {\n const langfuseSpanProcessor = new LangfuseSpanProcessor({\n publicKey: process.env.LANGFUSE_PUBLIC_KEY,\n secretKey: process.env.LANGFUSE_SECRET_KEY,\n baseUrl: process.env.LANGFUSE_BASE_URL,\n environment: process.env.LANGFUSE_TRACING_ENVIRONMENT ?? process.env.NODE_ENV ?? 'development',\n });\n\n const sdk = new NodeSDK({\n spanProcessors: [langfuseSpanProcessor],\n });\n\n sdk.start();\n}\n"],"names":["isPresent","LangfuseSpanProcessor","NodeSDK"],"mappings":";;;;;;AAIA,IACEA,cAAS,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;AAC1C,IAAAA,cAAS,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IAC1CA,cAAS,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,EACxC;AACA,IAAA,MAAM,qBAAqB,GAAG,IAAIC,0BAAqB,CAAC;AACtD,QAAA,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB;AAC1C,QAAA,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB;AAC1C,QAAA,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;AACtC,QAAA,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa;AAC/F,KAAA,CAAC;AAEF,IAAA,MAAM,GAAG,GAAG,IAAIC,eAAO,CAAC;QACtB,cAAc,EAAE,CAAC,qBAAqB,CAAC;AACxC,KAAA,CAAC;IAEF,GAAG,CAAC,KAAK,EAAE;AACb;;"}
1
+ {"version":3,"file":"instrumentation.cjs","sources":["../../src/instrumentation.ts"],"sourcesContent":["import { NodeSDK } from '@opentelemetry/sdk-node';\nimport { LangfuseSpanProcessor } from '@langfuse/otel';\nimport { isPresent } from '@/utils/misc';\n\nif (\n isPresent(process.env.LANGFUSE_SECRET_KEY) &&\n isPresent(process.env.LANGFUSE_PUBLIC_KEY) &&\n isPresent(process.env.LANGFUSE_BASE_URL ?? process.env.LANGFUSE_BASEURL)\n) {\n const langfuseSpanProcessor = new LangfuseSpanProcessor();\n\n const sdk = new NodeSDK({\n spanProcessors: [langfuseSpanProcessor],\n });\n\n sdk.start();\n}\n"],"names":["isPresent","LangfuseSpanProcessor","NodeSDK"],"mappings":";;;;;;AAIA,IACEA,cAAS,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;AAC1C,IAAAA,cAAS,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;AAC1C,IAAAA,cAAS,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,EACxE;AACA,IAAA,MAAM,qBAAqB,GAAG,IAAIC,0BAAqB,EAAE;AAEzD,IAAA,MAAM,GAAG,GAAG,IAAIC,eAAO,CAAC;QACtB,cAAc,EAAE,CAAC,qBAAqB,CAAC;AACxC,KAAA,CAAC;IAEF,GAAG,CAAC,KAAK,EAAE;AACb;;"}
@@ -0,0 +1,285 @@
1
+ 'use strict';
2
+
3
+ var langchain = require('@langfuse/langchain');
4
+ var otel = require('@langfuse/otel');
5
+ var tracing = require('@langfuse/tracing');
6
+ var base = require('@langchain/core/callbacks/base');
7
+ var sdkTraceBase = require('@opentelemetry/sdk-trace-base');
8
+ var api = require('@opentelemetry/api');
9
+ var misc = require('./utils/misc.cjs');
10
+
11
+ const TRACE_METADATA_MAX_LENGTH = 200;
12
+ const LANGFUSE_TRACER_NAME = 'langfuse-sdk';
13
+ function getEnvLangfuseBaseUrl() {
14
+ return process.env.LANGFUSE_BASE_URL ?? process.env.LANGFUSE_BASEURL;
15
+ }
16
+ function createTraceMetadata(metadata) {
17
+ const traceMetadata = {};
18
+ for (const [key, value] of Object.entries(metadata)) {
19
+ if (value == null) {
20
+ continue;
21
+ }
22
+ const stringValue = typeof value === 'string' ? value : String(value);
23
+ if (stringValue.trim() === '' ||
24
+ stringValue.length > TRACE_METADATA_MAX_LENGTH) {
25
+ continue;
26
+ }
27
+ traceMetadata[key] = stringValue;
28
+ }
29
+ return traceMetadata;
30
+ }
31
+ function createLangfuseTraceMetadata({ messageId, parentMessageId, agentId, agentName, }) {
32
+ return createTraceMetadata({
33
+ messageId,
34
+ parentMessageId,
35
+ agentId,
36
+ agentName,
37
+ });
38
+ }
39
+ function getModelName(serialized) {
40
+ const serializedRecord = serialized;
41
+ const kwargs = serializedRecord.kwargs;
42
+ const modelName = kwargs?.model ??
43
+ kwargs?.model_name ??
44
+ kwargs?.modelName ??
45
+ kwargs?.model_id ??
46
+ kwargs?.modelId ??
47
+ serializedRecord.name;
48
+ if (typeof modelName === 'string' && modelName.trim() !== '') {
49
+ return modelName;
50
+ }
51
+ if (Array.isArray(serializedRecord.id) && serializedRecord.id.length > 0) {
52
+ return String(serializedRecord.id[serializedRecord.id.length - 1]);
53
+ }
54
+ return 'ChatModel';
55
+ }
56
+ function getModelParameters(extraParams) {
57
+ const invocationParams = extraParams?.invocation_params;
58
+ const params = invocationParams != null && typeof invocationParams === 'object'
59
+ ? invocationParams
60
+ : (extraParams ?? {});
61
+ return Object.fromEntries(Object.entries(params).filter(([, value]) => {
62
+ return typeof value === 'string' || typeof value === 'number';
63
+ }));
64
+ }
65
+ function getOutput(output) {
66
+ return output.generations.map((generation) => generation.map((item) => {
67
+ if ('message' in item && item.message != null) {
68
+ return item.message.content;
69
+ }
70
+ return item.text;
71
+ }));
72
+ }
73
+ function getUsageDetails(output) {
74
+ const llmOutput = output.llmOutput;
75
+ const usage = llmOutput?.tokenUsage ?? llmOutput?.usage;
76
+ if (usage == null || typeof usage !== 'object') {
77
+ return undefined;
78
+ }
79
+ const usageEntries = Object.entries(usage).filter(([, value]) => typeof value === 'number');
80
+ return usageEntries.length > 0
81
+ ? Object.fromEntries(usageEntries)
82
+ : undefined;
83
+ }
84
+ function getLangfuseTraceName(traceMetadata, fallback = 'LibreChat Agent') {
85
+ const agentName = traceMetadata?.agentName;
86
+ return misc.isPresent(agentName) ? `${fallback}: ${agentName}` : fallback;
87
+ }
88
+ function getTraceAttributes({ userId, sessionId, traceMetadata, tags, }) {
89
+ const attributes = {
90
+ [tracing.LangfuseOtelSpanAttributes.TRACE_NAME]: getLangfuseTraceName(traceMetadata),
91
+ };
92
+ if (misc.isPresent(userId)) {
93
+ attributes[tracing.LangfuseOtelSpanAttributes.TRACE_USER_ID] = userId;
94
+ }
95
+ if (misc.isPresent(sessionId)) {
96
+ attributes[tracing.LangfuseOtelSpanAttributes.TRACE_SESSION_ID] = sessionId;
97
+ }
98
+ if (tags != null && tags.length > 0) {
99
+ attributes[tracing.LangfuseOtelSpanAttributes.TRACE_TAGS] = tags;
100
+ }
101
+ for (const [key, value] of Object.entries(traceMetadata ?? {})) {
102
+ attributes[`${tracing.LangfuseOtelSpanAttributes.TRACE_METADATA}.${key}`] = value;
103
+ }
104
+ return attributes;
105
+ }
106
+ class LangfuseAgentCallbackHandler extends base.BaseCallbackHandler {
107
+ name = 'librechat_langfuse_agent_handler';
108
+ provider;
109
+ processor;
110
+ userId;
111
+ sessionId;
112
+ traceMetadata;
113
+ tags;
114
+ spans = new Map();
115
+ constructor({ langfuse, userId, sessionId, traceMetadata, tags, }) {
116
+ super();
117
+ this.userId = userId;
118
+ this.sessionId = sessionId;
119
+ this.traceMetadata = traceMetadata;
120
+ this.tags = tags;
121
+ this.processor = new otel.LangfuseSpanProcessor({
122
+ publicKey: langfuse.publicKey,
123
+ secretKey: langfuse.secretKey,
124
+ ...(misc.isPresent(langfuse.baseUrl) ? { baseUrl: langfuse.baseUrl } : {}),
125
+ environment: process.env.LANGFUSE_TRACING_ENVIRONMENT ??
126
+ process.env.NODE_ENV ??
127
+ 'development',
128
+ exportMode: 'immediate',
129
+ shouldExportSpan: ({ otelSpan }) => otel.isDefaultExportSpan(otelSpan) ||
130
+ otelSpan.instrumentationScope.name === LANGFUSE_TRACER_NAME,
131
+ });
132
+ this.provider = new sdkTraceBase.BasicTracerProvider({
133
+ spanProcessors: [this.processor],
134
+ });
135
+ }
136
+ startGenerationSpan({ llm, input, runId, extraParams, metadata, name, }) {
137
+ if (this.spans.has(runId)) {
138
+ return;
139
+ }
140
+ const tracer = this.provider.getTracer(LANGFUSE_TRACER_NAME);
141
+ const spanName = typeof name === 'string' && name.trim() !== '' ? name : getModelName(llm);
142
+ const span = tracer.startSpan(spanName, {
143
+ attributes: {
144
+ ...getTraceAttributes({
145
+ userId: this.userId,
146
+ sessionId: this.sessionId,
147
+ traceMetadata: this.traceMetadata,
148
+ tags: this.tags,
149
+ }),
150
+ ...tracing.createObservationAttributes('generation', {
151
+ input,
152
+ model: getModelName(llm),
153
+ modelParameters: getModelParameters(extraParams),
154
+ metadata: {
155
+ ...metadata,
156
+ ...this.traceMetadata,
157
+ },
158
+ }),
159
+ },
160
+ });
161
+ this.spans.set(runId, span);
162
+ }
163
+ async handleChatModelStart(llm, messages, runId, _parentRunId, extraParams, _tags, metadata, name) {
164
+ this.startGenerationSpan({
165
+ llm,
166
+ input: messages,
167
+ runId,
168
+ extraParams,
169
+ metadata,
170
+ name,
171
+ });
172
+ }
173
+ async handleLLMStart(llm, prompts, runId, _parentRunId, extraParams, _tags, metadata, name) {
174
+ this.startGenerationSpan({
175
+ llm,
176
+ input: prompts,
177
+ runId,
178
+ extraParams,
179
+ metadata,
180
+ name,
181
+ });
182
+ }
183
+ async handleLLMEnd(output, runId) {
184
+ const span = this.spans.get(runId);
185
+ if (!span) {
186
+ return;
187
+ }
188
+ span.setAttributes(tracing.createObservationAttributes('generation', {
189
+ output: getOutput(output),
190
+ usageDetails: getUsageDetails(output),
191
+ }));
192
+ span.end();
193
+ this.spans.delete(runId);
194
+ await this.flush();
195
+ }
196
+ async handleLLMError(err, runId) {
197
+ const span = this.spans.get(runId);
198
+ if (!span) {
199
+ return;
200
+ }
201
+ const message = err instanceof Error ? err.message : String(err);
202
+ span.setStatus({ code: api.SpanStatusCode.ERROR, message });
203
+ span.setAttributes(tracing.createObservationAttributes('generation', {
204
+ level: 'ERROR',
205
+ statusMessage: message,
206
+ }));
207
+ span.end();
208
+ this.spans.delete(runId);
209
+ await this.flush();
210
+ }
211
+ async flush() {
212
+ try {
213
+ await this.provider.forceFlush();
214
+ }
215
+ catch (error) {
216
+ process.emitWarning(`[LangfuseAgentCallbackHandler] Failed to flush Langfuse spans: ${error instanceof Error ? error.message : String(error)}`);
217
+ }
218
+ }
219
+ async dispose() {
220
+ for (const span of this.spans.values()) {
221
+ span.end();
222
+ }
223
+ this.spans.clear();
224
+ await this.flush();
225
+ try {
226
+ await this.provider.shutdown();
227
+ }
228
+ catch (error) {
229
+ process.emitWarning(`[LangfuseAgentCallbackHandler] Failed to shut down Langfuse provider: ${error instanceof Error ? error.message : String(error)}`);
230
+ }
231
+ }
232
+ }
233
+ function hasRequiredLangfuseConfig(langfuse) {
234
+ return (langfuse?.enabled === true &&
235
+ misc.isPresent(langfuse.publicKey) &&
236
+ misc.isPresent(langfuse.secretKey));
237
+ }
238
+ function createLegacyLangfuseHandler(params) {
239
+ return new langchain.CallbackHandler(params);
240
+ }
241
+ function createLangfuseHandler({ langfuse, userId, sessionId, traceMetadata, tags, }) {
242
+ if (!hasRequiredLangfuseConfig(langfuse)) {
243
+ return undefined;
244
+ }
245
+ return new LangfuseAgentCallbackHandler({
246
+ langfuse,
247
+ userId,
248
+ sessionId,
249
+ traceMetadata,
250
+ tags,
251
+ });
252
+ }
253
+ function hasExplicitLangfuseConfig(contexts) {
254
+ for (const context of contexts) {
255
+ if (context.langfuse != null) {
256
+ return true;
257
+ }
258
+ }
259
+ return false;
260
+ }
261
+ function hasLangfuseEnvConfig() {
262
+ return (misc.isPresent(process.env.LANGFUSE_SECRET_KEY) &&
263
+ misc.isPresent(process.env.LANGFUSE_PUBLIC_KEY) &&
264
+ misc.isPresent(getEnvLangfuseBaseUrl()));
265
+ }
266
+ function isLangfuseCallbackHandler(value) {
267
+ return (value instanceof langchain.CallbackHandler ||
268
+ value instanceof LangfuseAgentCallbackHandler);
269
+ }
270
+ async function disposeLangfuseHandler(value) {
271
+ if (value instanceof LangfuseAgentCallbackHandler) {
272
+ await value.dispose();
273
+ }
274
+ }
275
+
276
+ exports.LangfuseAgentCallbackHandler = LangfuseAgentCallbackHandler;
277
+ exports.createLangfuseHandler = createLangfuseHandler;
278
+ exports.createLangfuseTraceMetadata = createLangfuseTraceMetadata;
279
+ exports.createLegacyLangfuseHandler = createLegacyLangfuseHandler;
280
+ exports.disposeLangfuseHandler = disposeLangfuseHandler;
281
+ exports.getLangfuseTraceName = getLangfuseTraceName;
282
+ exports.hasExplicitLangfuseConfig = hasExplicitLangfuseConfig;
283
+ exports.hasLangfuseEnvConfig = hasLangfuseEnvConfig;
284
+ exports.isLangfuseCallbackHandler = isLangfuseCallbackHandler;
285
+ //# sourceMappingURL=langfuse.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"langfuse.cjs","sources":["../../src/langfuse.ts"],"sourcesContent":["import { CallbackHandler } from '@langfuse/langchain';\nimport { isDefaultExportSpan, LangfuseSpanProcessor } from '@langfuse/otel';\nimport {\n LangfuseOtelSpanAttributes,\n createObservationAttributes,\n} from '@langfuse/tracing';\nimport { BaseCallbackHandler } from '@langchain/core/callbacks/base';\nimport { BasicTracerProvider } from '@opentelemetry/sdk-trace-base';\nimport { SpanStatusCode } from '@opentelemetry/api';\nimport type { Serialized } from '@langchain/core/load/serializable';\nimport type { BaseMessage } from '@langchain/core/messages';\nimport type { LLMResult } from '@langchain/core/outputs';\nimport type { Attributes, Span } from '@opentelemetry/api';\nimport type * as t from '@/types';\nimport { isPresent } from '@/utils/misc';\n\nconst TRACE_METADATA_MAX_LENGTH = 200;\nconst LANGFUSE_TRACER_NAME = 'langfuse-sdk';\n\nexport type LangfuseTraceMetadata = Record<string, string>;\n\ntype LangfuseHandlerParams = {\n userId?: string;\n sessionId?: string;\n traceMetadata?: LangfuseTraceMetadata;\n tags?: string[];\n};\n\ntype AgentLangfuseHandlerParams = LangfuseHandlerParams & {\n langfuse?: t.LangfuseConfig;\n};\n\ntype ResolvedLangfuseConfig = t.LangfuseConfig & {\n enabled: true;\n publicKey: string;\n secretKey: string;\n};\n\nfunction getEnvLangfuseBaseUrl(): string | undefined {\n return process.env.LANGFUSE_BASE_URL ?? process.env.LANGFUSE_BASEURL;\n}\n\nfunction createTraceMetadata(\n metadata: Record<string, unknown>\n): LangfuseTraceMetadata {\n const traceMetadata: LangfuseTraceMetadata = {};\n for (const [key, value] of Object.entries(metadata)) {\n if (value == null) {\n continue;\n }\n const stringValue = typeof value === 'string' ? value : String(value);\n if (\n stringValue.trim() === '' ||\n stringValue.length > TRACE_METADATA_MAX_LENGTH\n ) {\n continue;\n }\n traceMetadata[key] = stringValue;\n }\n return traceMetadata;\n}\n\nexport function createLangfuseTraceMetadata({\n messageId,\n parentMessageId,\n agentId,\n agentName,\n}: {\n messageId?: unknown;\n parentMessageId?: unknown;\n agentId?: unknown;\n agentName?: unknown;\n}): LangfuseTraceMetadata {\n return createTraceMetadata({\n messageId,\n parentMessageId,\n agentId,\n agentName,\n });\n}\n\nfunction getModelName(serialized: Serialized): string {\n const serializedRecord = serialized as unknown as Record<string, unknown>;\n const kwargs = serializedRecord.kwargs as Record<string, unknown> | undefined;\n const modelName =\n kwargs?.model ??\n kwargs?.model_name ??\n kwargs?.modelName ??\n kwargs?.model_id ??\n kwargs?.modelId ??\n serializedRecord.name;\n\n if (typeof modelName === 'string' && modelName.trim() !== '') {\n return modelName;\n }\n\n if (Array.isArray(serializedRecord.id) && serializedRecord.id.length > 0) {\n return String(serializedRecord.id[serializedRecord.id.length - 1]);\n }\n\n return 'ChatModel';\n}\n\nfunction getModelParameters(\n extraParams?: Record<string, unknown>\n): Record<string, string | number> {\n const invocationParams = extraParams?.invocation_params;\n const params =\n invocationParams != null && typeof invocationParams === 'object'\n ? (invocationParams as Record<string, unknown>)\n : (extraParams ?? {});\n\n return Object.fromEntries(\n Object.entries(params).filter(([, value]) => {\n return typeof value === 'string' || typeof value === 'number';\n })\n ) as Record<string, string | number>;\n}\n\nfunction getOutput(output: LLMResult): unknown {\n return output.generations.map((generation) =>\n generation.map((item) => {\n if ('message' in item && item.message != null) {\n return (item.message as { content?: unknown }).content;\n }\n return item.text;\n })\n );\n}\n\nfunction getUsageDetails(\n output: LLMResult\n): Record<string, number> | undefined {\n const llmOutput = output.llmOutput as Record<string, unknown> | undefined;\n const usage = llmOutput?.tokenUsage ?? llmOutput?.usage;\n if (usage == null || typeof usage !== 'object') {\n return undefined;\n }\n\n const usageEntries = Object.entries(usage as Record<string, unknown>).filter(\n ([, value]) => typeof value === 'number'\n );\n\n return usageEntries.length > 0\n ? (Object.fromEntries(usageEntries) as Record<string, number>)\n : undefined;\n}\n\nexport function getLangfuseTraceName(\n traceMetadata?: LangfuseTraceMetadata,\n fallback: string = 'LibreChat Agent'\n): string {\n const agentName = traceMetadata?.agentName;\n return isPresent(agentName) ? `${fallback}: ${agentName}` : fallback;\n}\n\nfunction getTraceAttributes({\n userId,\n sessionId,\n traceMetadata,\n tags,\n}: LangfuseHandlerParams): Attributes {\n const attributes: Attributes = {\n [LangfuseOtelSpanAttributes.TRACE_NAME]:\n getLangfuseTraceName(traceMetadata),\n };\n\n if (isPresent(userId)) {\n attributes[LangfuseOtelSpanAttributes.TRACE_USER_ID] = userId;\n }\n if (isPresent(sessionId)) {\n attributes[LangfuseOtelSpanAttributes.TRACE_SESSION_ID] = sessionId;\n }\n if (tags != null && tags.length > 0) {\n attributes[LangfuseOtelSpanAttributes.TRACE_TAGS] = tags;\n }\n for (const [key, value] of Object.entries(traceMetadata ?? {})) {\n attributes[`${LangfuseOtelSpanAttributes.TRACE_METADATA}.${key}`] = value;\n }\n\n return attributes;\n}\n\nexport class LangfuseAgentCallbackHandler extends BaseCallbackHandler {\n name = 'librechat_langfuse_agent_handler';\n\n private readonly provider: BasicTracerProvider;\n private readonly processor: LangfuseSpanProcessor;\n private readonly userId?: string;\n private readonly sessionId?: string;\n private readonly traceMetadata?: LangfuseTraceMetadata;\n private readonly tags?: string[];\n private readonly spans = new Map<string, Span>();\n\n constructor({\n langfuse,\n userId,\n sessionId,\n traceMetadata,\n tags,\n }: LangfuseHandlerParams & { langfuse: ResolvedLangfuseConfig }) {\n super();\n this.userId = userId;\n this.sessionId = sessionId;\n this.traceMetadata = traceMetadata;\n this.tags = tags;\n this.processor = new LangfuseSpanProcessor({\n publicKey: langfuse.publicKey,\n secretKey: langfuse.secretKey,\n ...(isPresent(langfuse.baseUrl) ? { baseUrl: langfuse.baseUrl } : {}),\n environment:\n process.env.LANGFUSE_TRACING_ENVIRONMENT ??\n process.env.NODE_ENV ??\n 'development',\n exportMode: 'immediate',\n shouldExportSpan: ({ otelSpan }): boolean =>\n isDefaultExportSpan(otelSpan) ||\n otelSpan.instrumentationScope.name === LANGFUSE_TRACER_NAME,\n });\n this.provider = new BasicTracerProvider({\n spanProcessors: [this.processor],\n });\n }\n\n private startGenerationSpan({\n llm,\n input,\n runId,\n extraParams,\n metadata,\n name,\n }: {\n llm: Serialized;\n input: unknown;\n runId: string;\n extraParams?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n name?: string;\n }): void {\n if (this.spans.has(runId)) {\n return;\n }\n\n const tracer = this.provider.getTracer(LANGFUSE_TRACER_NAME);\n const spanName =\n typeof name === 'string' && name.trim() !== '' ? name : getModelName(llm);\n const span = tracer.startSpan(spanName, {\n attributes: {\n ...getTraceAttributes({\n userId: this.userId,\n sessionId: this.sessionId,\n traceMetadata: this.traceMetadata,\n tags: this.tags,\n }),\n ...createObservationAttributes('generation', {\n input,\n model: getModelName(llm),\n modelParameters: getModelParameters(extraParams),\n metadata: {\n ...metadata,\n ...this.traceMetadata,\n },\n }),\n },\n });\n this.spans.set(runId, span);\n }\n\n async handleChatModelStart(\n llm: Serialized,\n messages: BaseMessage[][],\n runId: string,\n _parentRunId?: string,\n extraParams?: Record<string, unknown>,\n _tags?: string[],\n metadata?: Record<string, unknown>,\n name?: string\n ): Promise<void> {\n this.startGenerationSpan({\n llm,\n input: messages,\n runId,\n extraParams,\n metadata,\n name,\n });\n }\n\n async handleLLMStart(\n llm: Serialized,\n prompts: string[],\n runId: string,\n _parentRunId?: string,\n extraParams?: Record<string, unknown>,\n _tags?: string[],\n metadata?: Record<string, unknown>,\n name?: string\n ): Promise<void> {\n this.startGenerationSpan({\n llm,\n input: prompts,\n runId,\n extraParams,\n metadata,\n name,\n });\n }\n\n async handleLLMEnd(output: LLMResult, runId: string): Promise<void> {\n const span = this.spans.get(runId);\n if (!span) {\n return;\n }\n\n span.setAttributes(\n createObservationAttributes('generation', {\n output: getOutput(output),\n usageDetails: getUsageDetails(output),\n })\n );\n span.end();\n this.spans.delete(runId);\n await this.flush();\n }\n\n async handleLLMError(err: unknown, runId: string): Promise<void> {\n const span = this.spans.get(runId);\n if (!span) {\n return;\n }\n\n const message = err instanceof Error ? err.message : String(err);\n span.setStatus({ code: SpanStatusCode.ERROR, message });\n span.setAttributes(\n createObservationAttributes('generation', {\n level: 'ERROR',\n statusMessage: message,\n })\n );\n span.end();\n this.spans.delete(runId);\n await this.flush();\n }\n\n private async flush(): Promise<void> {\n try {\n await this.provider.forceFlush();\n } catch (error) {\n process.emitWarning(\n `[LangfuseAgentCallbackHandler] Failed to flush Langfuse spans: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n async dispose(): Promise<void> {\n for (const span of this.spans.values()) {\n span.end();\n }\n this.spans.clear();\n await this.flush();\n try {\n await this.provider.shutdown();\n } catch (error) {\n process.emitWarning(\n `[LangfuseAgentCallbackHandler] Failed to shut down Langfuse provider: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n}\n\nfunction hasRequiredLangfuseConfig(\n langfuse?: t.LangfuseConfig\n): langfuse is ResolvedLangfuseConfig {\n return (\n langfuse?.enabled === true &&\n isPresent(langfuse.publicKey) &&\n isPresent(langfuse.secretKey)\n );\n}\n\nexport function createLegacyLangfuseHandler(\n params: LangfuseHandlerParams\n): CallbackHandler {\n return new CallbackHandler(params);\n}\n\nexport function createLangfuseHandler({\n langfuse,\n userId,\n sessionId,\n traceMetadata,\n tags,\n}: AgentLangfuseHandlerParams): LangfuseAgentCallbackHandler | undefined {\n if (!hasRequiredLangfuseConfig(langfuse)) {\n return undefined;\n }\n\n return new LangfuseAgentCallbackHandler({\n langfuse,\n userId,\n sessionId,\n traceMetadata,\n tags,\n });\n}\n\nexport function hasExplicitLangfuseConfig(\n contexts: Iterable<{ langfuse?: t.LangfuseConfig }>\n): boolean {\n for (const context of contexts) {\n if (context.langfuse != null) {\n return true;\n }\n }\n return false;\n}\n\nexport function hasLangfuseEnvConfig(): boolean {\n return (\n isPresent(process.env.LANGFUSE_SECRET_KEY) &&\n isPresent(process.env.LANGFUSE_PUBLIC_KEY) &&\n isPresent(getEnvLangfuseBaseUrl())\n );\n}\n\nexport function isLangfuseCallbackHandler(value: unknown): boolean {\n return (\n value instanceof CallbackHandler ||\n value instanceof LangfuseAgentCallbackHandler\n );\n}\n\nexport async function disposeLangfuseHandler(value: unknown): Promise<void> {\n if (value instanceof LangfuseAgentCallbackHandler) {\n await value.dispose();\n }\n}\n"],"names":["isPresent","LangfuseOtelSpanAttributes","BaseCallbackHandler","LangfuseSpanProcessor","isDefaultExportSpan","BasicTracerProvider","createObservationAttributes","SpanStatusCode","CallbackHandler"],"mappings":";;;;;;;;;;AAgBA,MAAM,yBAAyB,GAAG,GAAG;AACrC,MAAM,oBAAoB,GAAG,cAAc;AAqB3C,SAAS,qBAAqB,GAAA;IAC5B,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB;AACtE;AAEA,SAAS,mBAAmB,CAC1B,QAAiC,EAAA;IAEjC,MAAM,aAAa,GAA0B,EAAE;AAC/C,IAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;AACnD,QAAA,IAAI,KAAK,IAAI,IAAI,EAAE;YACjB;QACF;AACA,QAAA,MAAM,WAAW,GAAG,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;AACrE,QAAA,IACE,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE;AACzB,YAAA,WAAW,CAAC,MAAM,GAAG,yBAAyB,EAC9C;YACA;QACF;AACA,QAAA,aAAa,CAAC,GAAG,CAAC,GAAG,WAAW;IAClC;AACA,IAAA,OAAO,aAAa;AACtB;AAEM,SAAU,2BAA2B,CAAC,EAC1C,SAAS,EACT,eAAe,EACf,OAAO,EACP,SAAS,GAMV,EAAA;AACC,IAAA,OAAO,mBAAmB,CAAC;QACzB,SAAS;QACT,eAAe;QACf,OAAO;QACP,SAAS;AACV,KAAA,CAAC;AACJ;AAEA,SAAS,YAAY,CAAC,UAAsB,EAAA;IAC1C,MAAM,gBAAgB,GAAG,UAAgD;AACzE,IAAA,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAA6C;AAC7E,IAAA,MAAM,SAAS,GACb,MAAM,EAAE,KAAK;AACb,QAAA,MAAM,EAAE,UAAU;AAClB,QAAA,MAAM,EAAE,SAAS;AACjB,QAAA,MAAM,EAAE,QAAQ;AAChB,QAAA,MAAM,EAAE,OAAO;QACf,gBAAgB,CAAC,IAAI;AAEvB,IAAA,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;AAC5D,QAAA,OAAO,SAAS;IAClB;AAEA,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC,IAAI,gBAAgB,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;AACxE,QAAA,OAAO,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACpE;AAEA,IAAA,OAAO,WAAW;AACpB;AAEA,SAAS,kBAAkB,CACzB,WAAqC,EAAA;AAErC,IAAA,MAAM,gBAAgB,GAAG,WAAW,EAAE,iBAAiB;IACvD,MAAM,MAAM,GACV,gBAAgB,IAAI,IAAI,IAAI,OAAO,gBAAgB,KAAK;AACtD,UAAG;AACH,WAAG,WAAW,IAAI,EAAE,CAAC;AAEzB,IAAA,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,KAAI;QAC1C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ;IAC/D,CAAC,CAAC,CACgC;AACtC;AAEA,SAAS,SAAS,CAAC,MAAiB,EAAA;AAClC,IAAA,OAAO,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,KACvC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,KAAI;QACtB,IAAI,SAAS,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE;AAC7C,YAAA,OAAQ,IAAI,CAAC,OAAiC,CAAC,OAAO;QACxD;QACA,OAAO,IAAI,CAAC,IAAI;IAClB,CAAC,CAAC,CACH;AACH;AAEA,SAAS,eAAe,CACtB,MAAiB,EAAA;AAEjB,IAAA,MAAM,SAAS,GAAG,MAAM,CAAC,SAAgD;IACzE,MAAM,KAAK,GAAG,SAAS,EAAE,UAAU,IAAI,SAAS,EAAE,KAAK;IACvD,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC9C,QAAA,OAAO,SAAS;IAClB;IAEA,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,CAAC,MAAM,CAC1E,CAAC,GAAG,KAAK,CAAC,KAAK,OAAO,KAAK,KAAK,QAAQ,CACzC;AAED,IAAA,OAAO,YAAY,CAAC,MAAM,GAAG;AAC3B,UAAG,MAAM,CAAC,WAAW,CAAC,YAAY;UAChC,SAAS;AACf;SAEgB,oBAAoB,CAClC,aAAqC,EACrC,WAAmB,iBAAiB,EAAA;AAEpC,IAAA,MAAM,SAAS,GAAG,aAAa,EAAE,SAAS;AAC1C,IAAA,OAAOA,cAAS,CAAC,SAAS,CAAC,GAAG,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,SAAS,CAAA,CAAE,GAAG,QAAQ;AACtE;AAEA,SAAS,kBAAkB,CAAC,EAC1B,MAAM,EACN,SAAS,EACT,aAAa,EACb,IAAI,GACkB,EAAA;AACtB,IAAA,MAAM,UAAU,GAAe;QAC7B,CAACC,kCAA0B,CAAC,UAAU,GACpC,oBAAoB,CAAC,aAAa,CAAC;KACtC;AAED,IAAA,IAAID,cAAS,CAAC,MAAM,CAAC,EAAE;AACrB,QAAA,UAAU,CAACC,kCAA0B,CAAC,aAAa,CAAC,GAAG,MAAM;IAC/D;AACA,IAAA,IAAID,cAAS,CAAC,SAAS,CAAC,EAAE;AACxB,QAAA,UAAU,CAACC,kCAA0B,CAAC,gBAAgB,CAAC,GAAG,SAAS;IACrE;IACA,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;AACnC,QAAA,UAAU,CAACA,kCAA0B,CAAC,UAAU,CAAC,GAAG,IAAI;IAC1D;AACA,IAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC,EAAE;QAC9D,UAAU,CAAC,CAAA,EAAGA,kCAA0B,CAAC,cAAc,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAC,GAAG,KAAK;IAC3E;AAEA,IAAA,OAAO,UAAU;AACnB;AAEM,MAAO,4BAA6B,SAAQC,wBAAmB,CAAA;IACnE,IAAI,GAAG,kCAAkC;AAExB,IAAA,QAAQ;AACR,IAAA,SAAS;AACT,IAAA,MAAM;AACN,IAAA,SAAS;AACT,IAAA,aAAa;AACb,IAAA,IAAI;AACJ,IAAA,KAAK,GAAG,IAAI,GAAG,EAAgB;IAEhD,WAAA,CAAY,EACV,QAAQ,EACR,MAAM,EACN,SAAS,EACT,aAAa,EACb,IAAI,GACyD,EAAA;AAC7D,QAAA,KAAK,EAAE;AACP,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;AACpB,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;AAC1B,QAAA,IAAI,CAAC,aAAa,GAAG,aAAa;AAClC,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;AAChB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAIC,0BAAqB,CAAC;YACzC,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,IAAIH,cAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;AACrE,YAAA,WAAW,EACT,OAAO,CAAC,GAAG,CAAC,4BAA4B;gBACxC,OAAO,CAAC,GAAG,CAAC,QAAQ;gBACpB,aAAa;AACf,YAAA,UAAU,EAAE,WAAW;YACvB,gBAAgB,EAAE,CAAC,EAAE,QAAQ,EAAE,KAC7BI,wBAAmB,CAAC,QAAQ,CAAC;AAC7B,gBAAA,QAAQ,CAAC,oBAAoB,CAAC,IAAI,KAAK,oBAAoB;AAC9D,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAIC,gCAAmB,CAAC;AACtC,YAAA,cAAc,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC;AACjC,SAAA,CAAC;IACJ;AAEQ,IAAA,mBAAmB,CAAC,EAC1B,GAAG,EACH,KAAK,EACL,KAAK,EACL,WAAW,EACX,QAAQ,EACR,IAAI,GAQL,EAAA;QACC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YACzB;QACF;QAEA,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,oBAAoB,CAAC;QAC5D,MAAM,QAAQ,GACZ,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC;AAC3E,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE;AACtC,YAAA,UAAU,EAAE;AACV,gBAAA,GAAG,kBAAkB,CAAC;oBACpB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,aAAa,EAAE,IAAI,CAAC,aAAa;oBACjC,IAAI,EAAE,IAAI,CAAC,IAAI;iBAChB,CAAC;gBACF,GAAGC,mCAA2B,CAAC,YAAY,EAAE;oBAC3C,KAAK;AACL,oBAAA,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC;AACxB,oBAAA,eAAe,EAAE,kBAAkB,CAAC,WAAW,CAAC;AAChD,oBAAA,QAAQ,EAAE;AACR,wBAAA,GAAG,QAAQ;wBACX,GAAG,IAAI,CAAC,aAAa;AACtB,qBAAA;iBACF,CAAC;AACH,aAAA;AACF,SAAA,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC;IAC7B;AAEA,IAAA,MAAM,oBAAoB,CACxB,GAAe,EACf,QAAyB,EACzB,KAAa,EACb,YAAqB,EACrB,WAAqC,EACrC,KAAgB,EAChB,QAAkC,EAClC,IAAa,EAAA;QAEb,IAAI,CAAC,mBAAmB,CAAC;YACvB,GAAG;AACH,YAAA,KAAK,EAAE,QAAQ;YACf,KAAK;YACL,WAAW;YACX,QAAQ;YACR,IAAI;AACL,SAAA,CAAC;IACJ;AAEA,IAAA,MAAM,cAAc,CAClB,GAAe,EACf,OAAiB,EACjB,KAAa,EACb,YAAqB,EACrB,WAAqC,EACrC,KAAgB,EAChB,QAAkC,EAClC,IAAa,EAAA;QAEb,IAAI,CAAC,mBAAmB,CAAC;YACvB,GAAG;AACH,YAAA,KAAK,EAAE,OAAO;YACd,KAAK;YACL,WAAW;YACX,QAAQ;YACR,IAAI;AACL,SAAA,CAAC;IACJ;AAEA,IAAA,MAAM,YAAY,CAAC,MAAiB,EAAE,KAAa,EAAA;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;QAClC,IAAI,CAAC,IAAI,EAAE;YACT;QACF;AAEA,QAAA,IAAI,CAAC,aAAa,CAChBA,mCAA2B,CAAC,YAAY,EAAE;AACxC,YAAA,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC;AACzB,YAAA,YAAY,EAAE,eAAe,CAAC,MAAM,CAAC;AACtC,SAAA,CAAC,CACH;QACD,IAAI,CAAC,GAAG,EAAE;AACV,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;AACxB,QAAA,MAAM,IAAI,CAAC,KAAK,EAAE;IACpB;AAEA,IAAA,MAAM,cAAc,CAAC,GAAY,EAAE,KAAa,EAAA;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;QAClC,IAAI,CAAC,IAAI,EAAE;YACT;QACF;AAEA,QAAA,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,GAAG,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC;AAChE,QAAA,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAEC,kBAAc,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;AACvD,QAAA,IAAI,CAAC,aAAa,CAChBD,mCAA2B,CAAC,YAAY,EAAE;AACxC,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,aAAa,EAAE,OAAO;AACvB,SAAA,CAAC,CACH;QACD,IAAI,CAAC,GAAG,EAAE;AACV,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;AACxB,QAAA,MAAM,IAAI,CAAC,KAAK,EAAE;IACpB;AAEQ,IAAA,MAAM,KAAK,GAAA;AACjB,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;QAClC;QAAE,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,WAAW,CACjB,CAAA,+DAAA,EACE,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CACvD,CAAA,CAAE,CACH;QACH;IACF;AAEA,IAAA,MAAM,OAAO,GAAA;QACX,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE;YACtC,IAAI,CAAC,GAAG,EAAE;QACZ;AACA,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;AAClB,QAAA,MAAM,IAAI,CAAC,KAAK,EAAE;AAClB,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;QAChC;QAAE,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,WAAW,CACjB,CAAA,sEAAA,EACE,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CACvD,CAAA,CAAE,CACH;QACH;IACF;AACD;AAED,SAAS,yBAAyB,CAChC,QAA2B,EAAA;AAE3B,IAAA,QACE,QAAQ,EAAE,OAAO,KAAK,IAAI;AAC1B,QAAAN,cAAS,CAAC,QAAQ,CAAC,SAAS,CAAC;AAC7B,QAAAA,cAAS,CAAC,QAAQ,CAAC,SAAS,CAAC;AAEjC;AAEM,SAAU,2BAA2B,CACzC,MAA6B,EAAA;AAE7B,IAAA,OAAO,IAAIQ,yBAAe,CAAC,MAAM,CAAC;AACpC;AAEM,SAAU,qBAAqB,CAAC,EACpC,QAAQ,EACR,MAAM,EACN,SAAS,EACT,aAAa,EACb,IAAI,GACuB,EAAA;AAC3B,IAAA,IAAI,CAAC,yBAAyB,CAAC,QAAQ,CAAC,EAAE;AACxC,QAAA,OAAO,SAAS;IAClB;IAEA,OAAO,IAAI,4BAA4B,CAAC;QACtC,QAAQ;QACR,MAAM;QACN,SAAS;QACT,aAAa;QACb,IAAI;AACL,KAAA,CAAC;AACJ;AAEM,SAAU,yBAAyB,CACvC,QAAmD,EAAA;AAEnD,IAAA,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;AAC9B,QAAA,IAAI,OAAO,CAAC,QAAQ,IAAI,IAAI,EAAE;AAC5B,YAAA,OAAO,IAAI;QACb;IACF;AACA,IAAA,OAAO,KAAK;AACd;SAEgB,oBAAoB,GAAA;IAClC,QACER,cAAS,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;AAC1C,QAAAA,cAAS,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;AAC1C,QAAAA,cAAS,CAAC,qBAAqB,EAAE,CAAC;AAEtC;AAEM,SAAU,yBAAyB,CAAC,KAAc,EAAA;IACtD,QACE,KAAK,YAAYQ,yBAAe;QAChC,KAAK,YAAY,4BAA4B;AAEjD;AAEO,eAAe,sBAAsB,CAAC,KAAc,EAAA;AACzD,IAAA,IAAI,KAAK,YAAY,4BAA4B,EAAE;AACjD,QAAA,MAAM,KAAK,CAAC,OAAO,EAAE;IACvB;AACF;;;;;;;;;;;;"}
package/dist/cjs/main.cjs CHANGED
@@ -45,6 +45,10 @@ var bashAst = require('./tools/local/bashAst.cjs');
45
45
  var editStrategies = require('./tools/local/editStrategies.cjs');
46
46
  var syntaxCheck = require('./tools/local/syntaxCheck.cjs');
47
47
  var textEncoding = require('./tools/local/textEncoding.cjs');
48
+ var CloudflareBridgeRuntime = require('./tools/cloudflare/CloudflareBridgeRuntime.cjs');
49
+ var CloudflareProgrammaticToolCalling = require('./tools/cloudflare/CloudflareProgrammaticToolCalling.cjs');
50
+ var CloudflareSandboxExecutionEngine = require('./tools/cloudflare/CloudflareSandboxExecutionEngine.cjs');
51
+ var CloudflareSandboxTools = require('./tools/cloudflare/CloudflareSandboxTools.cjs');
48
52
  var tool = require('./tools/search/tool.cjs');
49
53
  var schema = require('./tools/search/schema.cjs');
50
54
  var constants = require('./common/constants.cjs');
@@ -273,6 +277,7 @@ exports.createLocalGrepSearchTool = LocalCodingTools.createLocalGrepSearchTool;
273
277
  exports.createLocalListDirectoryTool = LocalCodingTools.createLocalListDirectoryTool;
274
278
  exports.createLocalReadFileTool = LocalCodingTools.createLocalReadFileTool;
275
279
  exports.createLocalWriteFileTool = LocalCodingTools.createLocalWriteFileTool;
280
+ exports.LOCAL_SPAWN_TIMEOUT_MS = LocalExecutionEngine.LOCAL_SPAWN_TIMEOUT_MS;
276
281
  exports._resetLocalEngineWarningsForTests = LocalExecutionEngine._resetLocalEngineWarningsForTests;
277
282
  exports.buildSandboxRuntimeConfig = LocalExecutionEngine.buildSandboxRuntimeConfig;
278
283
  exports.executeLocalBash = LocalExecutionEngine.executeLocalBash;
@@ -313,6 +318,26 @@ exports._resetSyntaxCheckProbeCacheForTests = syntaxCheck._resetSyntaxCheckProbe
313
318
  exports.runPostEditSyntaxCheck = syntaxCheck.runPostEditSyntaxCheck;
314
319
  exports.decodeFile = textEncoding.decodeFile;
315
320
  exports.encodeFile = textEncoding.encodeFile;
321
+ exports.createCloudflareBridgeRuntime = CloudflareBridgeRuntime.createCloudflareBridgeRuntime;
322
+ exports.createCloudflareBashProgrammaticToolCallingTool = CloudflareProgrammaticToolCalling.createCloudflareBashProgrammaticToolCallingTool;
323
+ exports.createCloudflareProgrammaticToolCallingTool = CloudflareProgrammaticToolCalling.createCloudflareProgrammaticToolCallingTool;
324
+ exports.createCloudflareLocalExecutionConfig = CloudflareSandboxExecutionEngine.createCloudflareLocalExecutionConfig;
325
+ exports.createCloudflareWorkspaceFS = CloudflareSandboxExecutionEngine.createCloudflareWorkspaceFS;
326
+ exports.executeCloudflareBash = CloudflareSandboxExecutionEngine.executeCloudflareBash;
327
+ exports.executeCloudflareCode = CloudflareSandboxExecutionEngine.executeCloudflareCode;
328
+ exports.formatCloudflareOutput = CloudflareSandboxExecutionEngine.formatCloudflareOutput;
329
+ exports.getCloudflareWorkspaceRoot = CloudflareSandboxExecutionEngine.getCloudflareWorkspaceRoot;
330
+ exports.resolveCloudflareSandbox = CloudflareSandboxExecutionEngine.resolveCloudflareSandbox;
331
+ exports.validateCloudflareBashCommand = CloudflareSandboxExecutionEngine.validateCloudflareBashCommand;
332
+ exports.CLOUDFLARE_BASH_CODING_TOOL_NAMES = CloudflareSandboxTools.CLOUDFLARE_BASH_CODING_TOOL_NAMES;
333
+ exports.CLOUDFLARE_CODING_TOOL_NAMES = CloudflareSandboxTools.CLOUDFLARE_CODING_TOOL_NAMES;
334
+ exports.CloudflareBashExecutionToolDescription = CloudflareSandboxTools.CloudflareBashExecutionToolDescription;
335
+ exports.CloudflareCodeExecutionToolDescription = CloudflareSandboxTools.CloudflareCodeExecutionToolDescription;
336
+ exports.createCloudflareBashExecutionTool = CloudflareSandboxTools.createCloudflareBashExecutionTool;
337
+ exports.createCloudflareCodeExecutionTool = CloudflareSandboxTools.createCloudflareCodeExecutionTool;
338
+ exports.createCloudflareCodingToolBundle = CloudflareSandboxTools.createCloudflareCodingToolBundle;
339
+ exports.createCloudflareCodingTools = CloudflareSandboxTools.createCloudflareCodingTools;
340
+ exports.createCloudflareExecutionTool = CloudflareSandboxTools.createCloudflareExecutionTool;
316
341
  exports.createSearchTool = tool.createSearchTool;
317
342
  Object.defineProperty(exports, "DATE_RANGE", {
318
343
  enumerable: true,
@@ -1 +1 @@
1
- {"version":3,"file":"main.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"main.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/cjs/run.cjs CHANGED
@@ -1,7 +1,6 @@
1
1
  'use strict';
2
2
 
3
3
  require('./instrumentation.cjs');
4
- var langchain = require('@langfuse/langchain');
5
4
  var prompts = require('@langchain/core/prompts');
6
5
  var runnables = require('@langchain/core/runnables');
7
6
  var openai = require('@langchain/openai');
@@ -18,7 +17,8 @@ var events = require('./events.cjs');
18
17
  var executeHooks = require('./hooks/executeHooks.cjs');
19
18
  require('./hooks/createWorkspacePolicyHook.cjs');
20
19
  var llm = require('./utils/llm.cjs');
21
- var misc = require('./utils/misc.cjs');
20
+ var callbacks = require('./utils/callbacks.cjs');
21
+ var langfuse = require('./langfuse.cjs');
22
22
 
23
23
  // src/run.ts
24
24
  const defaultOmitOptions = new Set([
@@ -463,34 +463,36 @@ class Run {
463
463
  this.hookRegistry?.clearHaltSignal(this.id);
464
464
  /** Custom event callback to intercept and handle custom events */
465
465
  const customEventCallback = this.createCustomEventCallback();
466
- const baseCallbacks = config.callbacks ?? [];
467
466
  const streamCallbacks = streamOptions?.callbacks
468
467
  ? this.getCallbacks(streamOptions.callbacks)
469
- : [];
468
+ : undefined;
470
469
  const customHandler = base.BaseCallbackHandler.fromMethods({
471
470
  [_enum.Callback.CUSTOM_EVENT]: customEventCallback,
472
471
  });
473
472
  customHandler.awaitHandlers = true;
474
- config.callbacks = baseCallbacks
475
- .concat(streamCallbacks)
476
- .concat(customHandler);
477
- if (misc.isPresent(process.env.LANGFUSE_SECRET_KEY) &&
478
- misc.isPresent(process.env.LANGFUSE_PUBLIC_KEY) &&
479
- misc.isPresent(process.env.LANGFUSE_BASE_URL)) {
480
- const userId = config.configurable?.user_id;
481
- const sessionId = config.configurable?.thread_id;
473
+ config.callbacks = callbacks.appendCallbacks(config.callbacks, streamCallbacks ? [streamCallbacks, customHandler] : [customHandler]);
474
+ if (langfuse.hasLangfuseEnvConfig() &&
475
+ !langfuse.hasExplicitLangfuseConfig(this.Graph.agentContexts.values())) {
476
+ const userId = typeof config.configurable?.user_id === 'string'
477
+ ? config.configurable.user_id
478
+ : undefined;
479
+ const sessionId = typeof config.configurable?.thread_id === 'string'
480
+ ? config.configurable.thread_id
481
+ : undefined;
482
482
  const primaryContext = this.Graph.agentContexts.get(this.Graph.defaultAgentId);
483
- const traceMetadata = {
483
+ const traceMetadata = langfuse.createLangfuseTraceMetadata({
484
484
  messageId: this.id,
485
485
  parentMessageId: config.configurable?.requestBody?.parentMessageId,
486
486
  agentName: primaryContext?.name,
487
- };
488
- const handler = new langchain.CallbackHandler({
487
+ });
488
+ const handler = langfuse.createLegacyLangfuseHandler({
489
489
  userId,
490
490
  sessionId,
491
491
  traceMetadata,
492
+ tags: ['librechat', 'agent'],
492
493
  });
493
- config.callbacks = (config.callbacks ?? []).concat([handler]);
494
+ config.runName = config.runName ?? langfuse.getLangfuseTraceName(traceMetadata);
495
+ config.callbacks = callbacks.appendCallbacks(config.callbacks, [handler]);
494
496
  }
495
497
  if (!this.id) {
496
498
  throw new Error('Run ID not provided');
@@ -889,23 +891,46 @@ class Run {
889
891
  };
890
892
  }
891
893
  async generateTitle({ provider, inputText, contentParts, titlePrompt, clientOptions, chainOptions, skipLanguage, titleMethod = _enum.TitleMethod.COMPLETION, titlePromptTemplate, }) {
892
- if (chainOptions != null &&
893
- misc.isPresent(process.env.LANGFUSE_SECRET_KEY) &&
894
- misc.isPresent(process.env.LANGFUSE_PUBLIC_KEY) &&
895
- misc.isPresent(process.env.LANGFUSE_BASE_URL)) {
896
- const userId = chainOptions.configurable?.user_id;
897
- const sessionId = chainOptions.configurable?.thread_id;
898
- const titleContext = this.Graph?.agentContexts.get(this.Graph.defaultAgentId);
899
- const traceMetadata = {
900
- messageId: 'title-' + this.id,
901
- agentName: titleContext?.name,
902
- };
903
- const handler = new langchain.CallbackHandler({
904
- userId,
905
- sessionId,
906
- traceMetadata,
907
- });
908
- chainOptions.callbacks = (chainOptions.callbacks ?? []).concat([handler]);
894
+ let titleLangfuseHandler;
895
+ const titleContext = this.Graph == null
896
+ ? undefined
897
+ : this.Graph.agentContexts.get(this.Graph.defaultAgentId);
898
+ const traceMetadata = langfuse.createLangfuseTraceMetadata({
899
+ messageId: 'title-' + this.id,
900
+ agentName: titleContext?.name,
901
+ });
902
+ const titleRunName = langfuse.getLangfuseTraceName(traceMetadata, 'LibreChat Title');
903
+ if (chainOptions != null) {
904
+ const userId = typeof chainOptions.configurable?.user_id === 'string'
905
+ ? chainOptions.configurable.user_id
906
+ : undefined;
907
+ const sessionId = typeof chainOptions.configurable?.thread_id === 'string'
908
+ ? chainOptions.configurable.thread_id
909
+ : undefined;
910
+ const hasExplicitLangfuse = this.Graph != null &&
911
+ langfuse.hasExplicitLangfuseConfig(this.Graph.agentContexts.values());
912
+ if (titleContext?.langfuse != null) {
913
+ titleLangfuseHandler = langfuse.createLangfuseHandler({
914
+ langfuse: titleContext.langfuse,
915
+ userId,
916
+ sessionId,
917
+ traceMetadata,
918
+ tags: ['librechat', 'title'],
919
+ });
920
+ }
921
+ else if (langfuse.hasLangfuseEnvConfig() && !hasExplicitLangfuse) {
922
+ titleLangfuseHandler = langfuse.createLegacyLangfuseHandler({
923
+ userId,
924
+ sessionId,
925
+ traceMetadata,
926
+ tags: ['librechat', 'title'],
927
+ });
928
+ }
929
+ if (titleLangfuseHandler != null) {
930
+ chainOptions.callbacks = callbacks.appendCallbacks(chainOptions.callbacks, [
931
+ titleLangfuseHandler,
932
+ ]);
933
+ }
909
934
  }
910
935
  const convoTemplate = prompts.PromptTemplate.fromTemplate(titlePromptTemplate ?? 'User: {input}\nAI: {output}');
911
936
  const response = contentParts
@@ -949,19 +974,25 @@ class Run {
949
974
  const invokeConfig = Object.assign({}, chainOptions, {
950
975
  run_id: this.id,
951
976
  runId: this.id,
977
+ runName: chainOptions?.runName ?? titleRunName,
952
978
  });
953
979
  try {
954
- return await fullChain.invoke({ input: inputText, output: response }, invokeConfig);
955
- }
956
- catch (_e) {
957
- // Fallback: strip callbacks to avoid EventStream tracer errors in certain environments
958
- // But preserve langfuse handler if it exists
959
- const langfuseHandler = invokeConfig.callbacks?.find((cb) => cb instanceof langchain.CallbackHandler);
960
- const { callbacks: _cb, ...rest } = invokeConfig;
961
- const safeConfig = Object.assign({}, rest, {
962
- callbacks: langfuseHandler ? [langfuseHandler] : [],
963
- });
964
- return await fullChain.invoke({ input: inputText, output: response }, safeConfig);
980
+ try {
981
+ return await fullChain.invoke({ input: inputText, output: response }, invokeConfig);
982
+ }
983
+ catch (_e) {
984
+ // Fallback: strip callbacks to avoid EventStream tracer errors in certain environments
985
+ // but preserve Langfuse tracing if it exists.
986
+ const langfuseHandler = callbacks.findCallback(invokeConfig.callbacks, langfuse.isLangfuseCallbackHandler);
987
+ const { callbacks: _cb, ...rest } = invokeConfig;
988
+ const safeConfig = Object.assign({}, rest, {
989
+ callbacks: langfuseHandler ? [langfuseHandler] : [],
990
+ });
991
+ return await fullChain.invoke({ input: inputText, output: response }, safeConfig);
992
+ }
993
+ }
994
+ finally {
995
+ await langfuse.disposeLangfuseHandler(titleLangfuseHandler);
965
996
  }
966
997
  }
967
998
  }