@librechat/agents 3.1.90 → 3.1.91

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 (80) 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 +46 -14
  4. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  5. package/dist/cjs/langfuse.cjs +234 -0
  6. package/dist/cjs/langfuse.cjs.map +1 -0
  7. package/dist/cjs/main.cjs +25 -0
  8. package/dist/cjs/main.cjs.map +1 -1
  9. package/dist/cjs/run.cjs +44 -27
  10. package/dist/cjs/run.cjs.map +1 -1
  11. package/dist/cjs/stream.cjs +10 -3
  12. package/dist/cjs/stream.cjs.map +1 -1
  13. package/dist/cjs/tools/cloudflare/CloudflareBridgeRuntime.cjs +380 -0
  14. package/dist/cjs/tools/cloudflare/CloudflareBridgeRuntime.cjs.map +1 -0
  15. package/dist/cjs/tools/cloudflare/CloudflareProgrammaticToolCalling.cjs +997 -0
  16. package/dist/cjs/tools/cloudflare/CloudflareProgrammaticToolCalling.cjs.map +1 -0
  17. package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs +575 -0
  18. package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs.map +1 -0
  19. package/dist/cjs/tools/cloudflare/CloudflareSandboxTools.cjs +165 -0
  20. package/dist/cjs/tools/cloudflare/CloudflareSandboxTools.cjs.map +1 -0
  21. package/dist/cjs/tools/local/LocalExecutionEngine.cjs +17 -5
  22. package/dist/cjs/tools/local/LocalExecutionEngine.cjs.map +1 -1
  23. package/dist/cjs/tools/local/resolveLocalExecutionTools.cjs +110 -6
  24. package/dist/cjs/tools/local/resolveLocalExecutionTools.cjs.map +1 -1
  25. package/dist/esm/agents/AgentContext.mjs +9 -5
  26. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  27. package/dist/esm/graphs/Graph.mjs +46 -14
  28. package/dist/esm/graphs/Graph.mjs.map +1 -1
  29. package/dist/esm/langfuse.mjs +226 -0
  30. package/dist/esm/langfuse.mjs.map +1 -0
  31. package/dist/esm/main.mjs +5 -1
  32. package/dist/esm/main.mjs.map +1 -1
  33. package/dist/esm/run.mjs +44 -27
  34. package/dist/esm/run.mjs.map +1 -1
  35. package/dist/esm/stream.mjs +10 -3
  36. package/dist/esm/stream.mjs.map +1 -1
  37. package/dist/esm/tools/cloudflare/CloudflareBridgeRuntime.mjs +378 -0
  38. package/dist/esm/tools/cloudflare/CloudflareBridgeRuntime.mjs.map +1 -0
  39. package/dist/esm/tools/cloudflare/CloudflareProgrammaticToolCalling.mjs +994 -0
  40. package/dist/esm/tools/cloudflare/CloudflareProgrammaticToolCalling.mjs.map +1 -0
  41. package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs +566 -0
  42. package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs.map +1 -0
  43. package/dist/esm/tools/cloudflare/CloudflareSandboxTools.mjs +155 -0
  44. package/dist/esm/tools/cloudflare/CloudflareSandboxTools.mjs.map +1 -0
  45. package/dist/esm/tools/local/LocalExecutionEngine.mjs +17 -6
  46. package/dist/esm/tools/local/LocalExecutionEngine.mjs.map +1 -1
  47. package/dist/esm/tools/local/resolveLocalExecutionTools.mjs +111 -7
  48. package/dist/esm/tools/local/resolveLocalExecutionTools.mjs.map +1 -1
  49. package/dist/types/agents/AgentContext.d.ts +4 -1
  50. package/dist/types/graphs/Graph.d.ts +6 -5
  51. package/dist/types/index.d.ts +1 -0
  52. package/dist/types/langfuse.d.ts +48 -0
  53. package/dist/types/tools/cloudflare/CloudflareBridgeRuntime.d.ts +23 -0
  54. package/dist/types/tools/cloudflare/CloudflareProgrammaticToolCalling.d.ts +4 -0
  55. package/dist/types/tools/cloudflare/CloudflareSandboxExecutionEngine.d.ts +21 -0
  56. package/dist/types/tools/cloudflare/CloudflareSandboxTools.d.ts +22 -0
  57. package/dist/types/tools/cloudflare/index.d.ts +4 -0
  58. package/dist/types/tools/local/LocalExecutionEngine.d.ts +1 -0
  59. package/dist/types/types/graph.d.ts +8 -0
  60. package/dist/types/types/tools.d.ts +118 -2
  61. package/package.json +4 -4
  62. package/src/__tests__/stream.eagerEventExecution.test.ts +66 -0
  63. package/src/agents/AgentContext.ts +13 -3
  64. package/src/graphs/Graph.ts +53 -16
  65. package/src/index.ts +1 -0
  66. package/src/langfuse.ts +358 -0
  67. package/src/run.ts +60 -38
  68. package/src/specs/langfuse-config.test.ts +57 -0
  69. package/src/specs/langfuse-metadata.test.ts +19 -1
  70. package/src/stream.ts +13 -3
  71. package/src/tools/__tests__/CloudflareSandboxExecution.test.ts +537 -0
  72. package/src/tools/cloudflare/CloudflareBridgeRuntime.ts +480 -0
  73. package/src/tools/cloudflare/CloudflareProgrammaticToolCalling.ts +1162 -0
  74. package/src/tools/cloudflare/CloudflareSandboxExecutionEngine.ts +744 -0
  75. package/src/tools/cloudflare/CloudflareSandboxTools.ts +225 -0
  76. package/src/tools/cloudflare/index.ts +4 -0
  77. package/src/tools/local/LocalExecutionEngine.ts +20 -4
  78. package/src/tools/local/resolveLocalExecutionTools.ts +169 -7
  79. package/src/types/graph.ts +9 -0
  80. package/src/types/tools.ts +141 -2
@@ -0,0 +1,226 @@
1
+ import { CallbackHandler } from '@langfuse/langchain';
2
+ import { LangfuseSpanProcessor } from '@langfuse/otel';
3
+ import { createObservationAttributes, createTraceAttributes } from '@langfuse/tracing';
4
+ import { BaseCallbackHandler } from '@langchain/core/callbacks/base';
5
+ import { BasicTracerProvider } from '@opentelemetry/sdk-trace-base';
6
+ import { SpanStatusCode } from '@opentelemetry/api';
7
+ import { isPresent } from './utils/misc.mjs';
8
+
9
+ function getModelName(serialized) {
10
+ const serializedRecord = serialized;
11
+ const kwargs = serializedRecord.kwargs;
12
+ const modelName = kwargs?.model ??
13
+ kwargs?.model_name ??
14
+ kwargs?.modelName ??
15
+ kwargs?.model_id ??
16
+ kwargs?.modelId ??
17
+ serializedRecord.name;
18
+ if (typeof modelName === 'string' && modelName.trim() !== '') {
19
+ return modelName;
20
+ }
21
+ if (Array.isArray(serializedRecord.id) && serializedRecord.id.length > 0) {
22
+ return String(serializedRecord.id[serializedRecord.id.length - 1]);
23
+ }
24
+ return 'ChatModel';
25
+ }
26
+ function getModelParameters(extraParams) {
27
+ const invocationParams = extraParams?.invocation_params;
28
+ const params = invocationParams != null && typeof invocationParams === 'object'
29
+ ? invocationParams
30
+ : (extraParams ?? {});
31
+ return Object.fromEntries(Object.entries(params).filter(([, value]) => {
32
+ return typeof value === 'string' || typeof value === 'number';
33
+ }));
34
+ }
35
+ function getOutput(output) {
36
+ return output.generations.map((generation) => generation.map((item) => {
37
+ if ('message' in item && item.message != null) {
38
+ return item.message.content;
39
+ }
40
+ return item.text;
41
+ }));
42
+ }
43
+ function getUsageDetails(output) {
44
+ const llmOutput = output.llmOutput;
45
+ const usage = llmOutput?.tokenUsage ?? llmOutput?.usage;
46
+ if (usage == null || typeof usage !== 'object') {
47
+ return undefined;
48
+ }
49
+ const usageEntries = Object.entries(usage).filter(([, value]) => typeof value === 'number');
50
+ return usageEntries.length > 0
51
+ ? Object.fromEntries(usageEntries)
52
+ : undefined;
53
+ }
54
+ function getTraceName(traceMetadata) {
55
+ const agentName = traceMetadata?.agentName;
56
+ return typeof agentName === 'string' && agentName.trim() !== ''
57
+ ? `LibreChat Agent: ${agentName}`
58
+ : 'LibreChat Agent';
59
+ }
60
+ class LangfuseAgentCallbackHandler extends BaseCallbackHandler {
61
+ name = 'librechat_langfuse_agent_handler';
62
+ provider;
63
+ processor;
64
+ userId;
65
+ sessionId;
66
+ traceMetadata;
67
+ spans = new Map();
68
+ constructor({ langfuse, userId, sessionId, traceMetadata, }) {
69
+ super();
70
+ this.userId = userId;
71
+ this.sessionId = sessionId;
72
+ this.traceMetadata = traceMetadata;
73
+ this.processor = new LangfuseSpanProcessor({
74
+ publicKey: langfuse.publicKey,
75
+ secretKey: langfuse.secretKey,
76
+ ...(isPresent(langfuse.baseUrl) ? { baseUrl: langfuse.baseUrl } : {}),
77
+ environment: process.env.LANGFUSE_TRACING_ENVIRONMENT ??
78
+ process.env.NODE_ENV ??
79
+ 'development',
80
+ exportMode: 'immediate',
81
+ });
82
+ this.provider = new BasicTracerProvider({
83
+ spanProcessors: [this.processor],
84
+ });
85
+ }
86
+ startGenerationSpan({ llm, input, runId, extraParams, metadata, name, }) {
87
+ if (this.spans.has(runId)) {
88
+ return;
89
+ }
90
+ const tracer = this.provider.getTracer('librechat-agents-langfuse');
91
+ const spanName = typeof name === 'string' && name.trim() !== '' ? name : getModelName(llm);
92
+ const span = tracer.startSpan(spanName, {
93
+ attributes: {
94
+ ...createTraceAttributes({
95
+ name: getTraceName(this.traceMetadata),
96
+ userId: this.userId,
97
+ sessionId: this.sessionId,
98
+ metadata: this.traceMetadata,
99
+ }),
100
+ ...createObservationAttributes('generation', {
101
+ input,
102
+ model: getModelName(llm),
103
+ modelParameters: getModelParameters(extraParams),
104
+ metadata: {
105
+ ...metadata,
106
+ ...this.traceMetadata,
107
+ },
108
+ }),
109
+ },
110
+ });
111
+ this.spans.set(runId, span);
112
+ }
113
+ async handleChatModelStart(llm, messages, runId, _parentRunId, extraParams, _tags, metadata, name) {
114
+ this.startGenerationSpan({
115
+ llm,
116
+ input: messages,
117
+ runId,
118
+ extraParams,
119
+ metadata,
120
+ name,
121
+ });
122
+ }
123
+ async handleLLMStart(llm, prompts, runId, _parentRunId, extraParams, _tags, metadata, name) {
124
+ this.startGenerationSpan({
125
+ llm,
126
+ input: prompts,
127
+ runId,
128
+ extraParams,
129
+ metadata,
130
+ name,
131
+ });
132
+ }
133
+ async handleLLMEnd(output, runId) {
134
+ const span = this.spans.get(runId);
135
+ if (!span) {
136
+ return;
137
+ }
138
+ span.setAttributes(createObservationAttributes('generation', {
139
+ output: getOutput(output),
140
+ usageDetails: getUsageDetails(output),
141
+ }));
142
+ span.end();
143
+ this.spans.delete(runId);
144
+ await this.flush();
145
+ }
146
+ async handleLLMError(err, runId) {
147
+ const span = this.spans.get(runId);
148
+ if (!span) {
149
+ return;
150
+ }
151
+ const message = err instanceof Error ? err.message : String(err);
152
+ span.setStatus({ code: SpanStatusCode.ERROR, message });
153
+ span.setAttributes(createObservationAttributes('generation', {
154
+ level: 'ERROR',
155
+ statusMessage: message,
156
+ }));
157
+ span.end();
158
+ this.spans.delete(runId);
159
+ await this.flush();
160
+ }
161
+ async flush() {
162
+ try {
163
+ await this.provider.forceFlush();
164
+ }
165
+ catch (error) {
166
+ process.emitWarning(`[LangfuseAgentCallbackHandler] Failed to flush Langfuse spans: ${error instanceof Error ? error.message : String(error)}`);
167
+ }
168
+ }
169
+ async dispose() {
170
+ for (const span of this.spans.values()) {
171
+ span.end();
172
+ }
173
+ this.spans.clear();
174
+ await this.flush();
175
+ try {
176
+ await this.provider.shutdown();
177
+ }
178
+ catch (error) {
179
+ process.emitWarning(`[LangfuseAgentCallbackHandler] Failed to shut down Langfuse provider: ${error instanceof Error ? error.message : String(error)}`);
180
+ }
181
+ }
182
+ }
183
+ function hasRequiredLangfuseConfig(langfuse) {
184
+ return (langfuse?.enabled === true &&
185
+ isPresent(langfuse.publicKey) &&
186
+ isPresent(langfuse.secretKey));
187
+ }
188
+ function createLegacyLangfuseHandler(params) {
189
+ return new CallbackHandler(params);
190
+ }
191
+ function createLangfuseHandler({ langfuse, userId, sessionId, traceMetadata, }) {
192
+ if (!hasRequiredLangfuseConfig(langfuse)) {
193
+ return undefined;
194
+ }
195
+ return new LangfuseAgentCallbackHandler({
196
+ langfuse,
197
+ userId,
198
+ sessionId,
199
+ traceMetadata,
200
+ });
201
+ }
202
+ function hasExplicitLangfuseConfig(contexts) {
203
+ for (const context of contexts) {
204
+ if (context.langfuse != null) {
205
+ return true;
206
+ }
207
+ }
208
+ return false;
209
+ }
210
+ function hasLangfuseEnvConfig() {
211
+ return (isPresent(process.env.LANGFUSE_SECRET_KEY) &&
212
+ isPresent(process.env.LANGFUSE_PUBLIC_KEY) &&
213
+ isPresent(process.env.LANGFUSE_BASE_URL));
214
+ }
215
+ function isLangfuseCallbackHandler(value) {
216
+ return (value instanceof CallbackHandler ||
217
+ value instanceof LangfuseAgentCallbackHandler);
218
+ }
219
+ async function disposeLangfuseHandler(value) {
220
+ if (value instanceof LangfuseAgentCallbackHandler) {
221
+ await value.dispose();
222
+ }
223
+ }
224
+
225
+ export { LangfuseAgentCallbackHandler, createLangfuseHandler, createLegacyLangfuseHandler, disposeLangfuseHandler, hasExplicitLangfuseConfig, hasLangfuseEnvConfig, isLangfuseCallbackHandler };
226
+ //# sourceMappingURL=langfuse.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"langfuse.mjs","sources":["../../src/langfuse.ts"],"sourcesContent":["import { CallbackHandler } from '@langfuse/langchain';\nimport { LangfuseSpanProcessor } from '@langfuse/otel';\nimport {\n createObservationAttributes,\n createTraceAttributes,\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 { Span } from '@opentelemetry/api';\nimport type * as t from '@/types';\nimport { isPresent } from '@/utils/misc';\n\ntype TraceMetadata = Record<string, unknown>;\n\ntype LangfuseHandlerParams = {\n userId?: string;\n sessionId?: string;\n traceMetadata?: TraceMetadata;\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 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\nfunction getTraceName(traceMetadata?: TraceMetadata): string {\n const agentName = traceMetadata?.agentName;\n return typeof agentName === 'string' && agentName.trim() !== ''\n ? `LibreChat Agent: ${agentName}`\n : 'LibreChat Agent';\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?: TraceMetadata;\n private readonly spans = new Map<string, Span>();\n\n constructor({\n langfuse,\n userId,\n sessionId,\n traceMetadata,\n }: LangfuseHandlerParams & { langfuse: ResolvedLangfuseConfig }) {\n super();\n this.userId = userId;\n this.sessionId = sessionId;\n this.traceMetadata = traceMetadata;\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 });\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('librechat-agents-langfuse');\n const spanName =\n typeof name === 'string' && name.trim() !== '' ? name : getModelName(llm);\n const span = tracer.startSpan(spanName, {\n attributes: {\n ...createTraceAttributes({\n name: getTraceName(this.traceMetadata),\n userId: this.userId,\n sessionId: this.sessionId,\n metadata: this.traceMetadata,\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}: 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 });\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(process.env.LANGFUSE_BASE_URL)\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":[],"mappings":";;;;;;;;AAkCA,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;AAEA,SAAS,YAAY,CAAC,aAA6B,EAAA;AACjD,IAAA,MAAM,SAAS,GAAG,aAAa,EAAE,SAAS;IAC1C,OAAO,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,IAAI,EAAE,KAAK;UACzD,CAAA,iBAAA,EAAoB,SAAS,CAAA;UAC7B,iBAAiB;AACvB;AAEM,MAAO,4BAA6B,SAAQ,mBAAmB,CAAA;IACnE,IAAI,GAAG,kCAAkC;AAExB,IAAA,QAAQ;AACR,IAAA,SAAS;AACT,IAAA,MAAM;AACN,IAAA,SAAS;AACT,IAAA,aAAa;AACb,IAAA,KAAK,GAAG,IAAI,GAAG,EAAgB;IAEhD,WAAA,CAAY,EACV,QAAQ,EACR,MAAM,EACN,SAAS,EACT,aAAa,GACgD,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,SAAS,GAAG,IAAI,qBAAqB,CAAC;YACzC,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,IAAI,SAAS,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;AACxB,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,mBAAmB,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,2BAA2B,CAAC;QACnE,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,qBAAqB,CAAC;AACvB,oBAAA,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC;oBACtC,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,QAAQ,EAAE,IAAI,CAAC,aAAa;iBAC7B,CAAC;gBACF,GAAG,2BAA2B,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,CAChB,2BAA2B,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,EAAE,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;AACvD,QAAA,IAAI,CAAC,aAAa,CAChB,2BAA2B,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,QAAA,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC;AAC7B,QAAA,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC;AAEjC;AAEM,SAAU,2BAA2B,CACzC,MAA6B,EAAA;AAE7B,IAAA,OAAO,IAAI,eAAe,CAAC,MAAM,CAAC;AACpC;AAEM,SAAU,qBAAqB,CAAC,EACpC,QAAQ,EACR,MAAM,EACN,SAAS,EACT,aAAa,GACc,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;AACd,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,QACE,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;AAC1C,QAAA,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;QAC1C,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;AAE5C;AAEM,SAAU,yBAAyB,CAAC,KAAc,EAAA;IACtD,QACE,KAAK,YAAY,eAAe;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/esm/main.mjs CHANGED
@@ -34,7 +34,7 @@ export { handleServerToolResult, handleToolCallChunks, handleToolCalls, toolResu
34
34
  export { CompileCheckToolName, createCompileCheckTool, createCompileCheckToolDefinition } from './tools/local/CompileCheckTool.mjs';
35
35
  export { LocalFileCheckpointerImpl, createLocalFileCheckpointer } from './tools/local/FileCheckpointer.mjs';
36
36
  export { LocalEditFileToolName, LocalEditFileToolSchema, LocalGlobSearchToolName, LocalGlobSearchToolSchema, LocalGrepSearchToolName, LocalGrepSearchToolSchema, LocalListDirectoryToolName, LocalListDirectoryToolSchema, LocalReadFileToolSchema, LocalWriteFileToolName, LocalWriteFileToolSchema, _resetRipgrepCacheForTests, createLocalCodingToolBundle, createLocalCodingToolDefinitions, createLocalCodingToolRegistry, createLocalCodingTools, createLocalEditFileTool, createLocalGlobSearchTool, createLocalGrepSearchTool, createLocalListDirectoryTool, createLocalReadFileTool, createLocalWriteFileTool } from './tools/local/LocalCodingTools.mjs';
37
- export { _resetLocalEngineWarningsForTests, buildSandboxRuntimeConfig, executeLocalBash, executeLocalBashWithArgs, executeLocalCode, getLocalCwd, getLocalSessionId, getReadRoots, getSpawn, getWorkspaceFS, getWorkspaceRoots, getWriteRoots, resolveLocalExecutionConfig, resolveWorkspacePath, resolveWorkspacePathSafe, shellQuote, spawnLocalProcess, truncateLocalOutput, validateBashCommand } from './tools/local/LocalExecutionEngine.mjs';
37
+ export { LOCAL_SPAWN_TIMEOUT_MS, _resetLocalEngineWarningsForTests, buildSandboxRuntimeConfig, executeLocalBash, executeLocalBashWithArgs, executeLocalCode, getLocalCwd, getLocalSessionId, getReadRoots, getSpawn, getWorkspaceFS, getWorkspaceRoots, getWriteRoots, resolveLocalExecutionConfig, resolveWorkspacePath, resolveWorkspacePathSafe, shellQuote, spawnLocalProcess, truncateLocalOutput, validateBashCommand } from './tools/local/LocalExecutionEngine.mjs';
38
38
  export { LocalBashExecutionToolDescription, LocalCodeExecutionToolDescription, createLocalBashExecutionTool, createLocalCodeExecutionTool } from './tools/local/LocalExecutionTools.mjs';
39
39
  export { _createBashProgramForTests, applyPreToolUseHooksForBridge, createLocalBashProgrammaticToolCallingTool, createLocalProgrammaticToolCallingTool } from './tools/local/LocalProgrammaticToolCalling.mjs';
40
40
  export { resolveLocalExecutionTools, resolveLocalToolRegistry, resolveLocalToolsForBinding } from './tools/local/resolveLocalExecutionTools.mjs';
@@ -43,6 +43,10 @@ export { bashAstFindingsToErrors, runBashAstChecks } from './tools/local/bashAst
43
43
  export { applyEdit, locateEdit } from './tools/local/editStrategies.mjs';
44
44
  export { _resetSyntaxCheckProbeCacheForTests, runPostEditSyntaxCheck } from './tools/local/syntaxCheck.mjs';
45
45
  export { decodeFile, encodeFile } from './tools/local/textEncoding.mjs';
46
+ export { createCloudflareBridgeRuntime } from './tools/cloudflare/CloudflareBridgeRuntime.mjs';
47
+ export { createCloudflareBashProgrammaticToolCallingTool, createCloudflareProgrammaticToolCallingTool } from './tools/cloudflare/CloudflareProgrammaticToolCalling.mjs';
48
+ export { createCloudflareLocalExecutionConfig, createCloudflareWorkspaceFS, executeCloudflareBash, executeCloudflareCode, formatCloudflareOutput, getCloudflareWorkspaceRoot, resolveCloudflareSandbox, validateCloudflareBashCommand } from './tools/cloudflare/CloudflareSandboxExecutionEngine.mjs';
49
+ export { CLOUDFLARE_BASH_CODING_TOOL_NAMES, CLOUDFLARE_CODING_TOOL_NAMES, CloudflareBashExecutionToolDescription, CloudflareCodeExecutionToolDescription, createCloudflareBashExecutionTool, createCloudflareCodeExecutionTool, createCloudflareCodingToolBundle, createCloudflareCodingTools, createCloudflareExecutionTool } from './tools/cloudflare/CloudflareSandboxTools.mjs';
46
50
  export { createSearchTool } from './tools/search/tool.mjs';
47
51
  export { DATE_RANGE, DEFAULT_COUNTRY_DESCRIPTION, DEFAULT_QUERY_DESCRIPTION, WebSearchToolDefinition, WebSearchToolDescription, WebSearchToolName, WebSearchToolSchema, countrySchema, dateSchema, imagesSchema, newsSchema, querySchema, videosSchema } from './tools/search/schema.mjs';
48
52
  export { ANTHROPIC_TOOL_TOKEN_MULTIPLIER, DEFAULT_TOOL_TOKEN_MULTIPLIER } from './common/constants.mjs';
@@ -1 +1 @@
1
- {"version":3,"file":"main.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"main.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/esm/run.mjs CHANGED
@@ -1,5 +1,4 @@
1
1
  import './instrumentation.mjs';
2
- import { CallbackHandler } from '@langfuse/langchain';
3
2
  import { PromptTemplate } from '@langchain/core/prompts';
4
3
  import { RunnableLambda } from '@langchain/core/runnables';
5
4
  import { ChatOpenAI as ChatOpenAI$1, AzureChatOpenAI as AzureChatOpenAI$1 } from '@langchain/openai';
@@ -16,7 +15,7 @@ import { HandlerRegistry } from './events.mjs';
16
15
  import { executeHooks } from './hooks/executeHooks.mjs';
17
16
  import './hooks/createWorkspacePolicyHook.mjs';
18
17
  import { isOpenAILike } from './utils/llm.mjs';
19
- import { isPresent } from './utils/misc.mjs';
18
+ import { hasLangfuseEnvConfig, hasExplicitLangfuseConfig, createLegacyLangfuseHandler, createLangfuseHandler, isLangfuseCallbackHandler, disposeLangfuseHandler } from './langfuse.mjs';
20
19
 
21
20
  // src/run.ts
22
21
  const defaultOmitOptions = new Set([
@@ -472,9 +471,8 @@ class Run {
472
471
  config.callbacks = baseCallbacks
473
472
  .concat(streamCallbacks)
474
473
  .concat(customHandler);
475
- if (isPresent(process.env.LANGFUSE_SECRET_KEY) &&
476
- isPresent(process.env.LANGFUSE_PUBLIC_KEY) &&
477
- isPresent(process.env.LANGFUSE_BASE_URL)) {
474
+ if (hasLangfuseEnvConfig() &&
475
+ !hasExplicitLangfuseConfig(this.Graph.agentContexts.values())) {
478
476
  const userId = config.configurable?.user_id;
479
477
  const sessionId = config.configurable?.thread_id;
480
478
  const primaryContext = this.Graph.agentContexts.get(this.Graph.defaultAgentId);
@@ -483,7 +481,7 @@ class Run {
483
481
  parentMessageId: config.configurable?.requestBody?.parentMessageId,
484
482
  agentName: primaryContext?.name,
485
483
  };
486
- const handler = new CallbackHandler({
484
+ const handler = createLegacyLangfuseHandler({
487
485
  userId,
488
486
  sessionId,
489
487
  traceMetadata,
@@ -887,10 +885,8 @@ class Run {
887
885
  };
888
886
  }
889
887
  async generateTitle({ provider, inputText, contentParts, titlePrompt, clientOptions, chainOptions, skipLanguage, titleMethod = TitleMethod.COMPLETION, titlePromptTemplate, }) {
890
- if (chainOptions != null &&
891
- isPresent(process.env.LANGFUSE_SECRET_KEY) &&
892
- isPresent(process.env.LANGFUSE_PUBLIC_KEY) &&
893
- isPresent(process.env.LANGFUSE_BASE_URL)) {
888
+ let titleLangfuseHandler;
889
+ if (chainOptions != null) {
894
890
  const userId = chainOptions.configurable?.user_id;
895
891
  const sessionId = chainOptions.configurable?.thread_id;
896
892
  const titleContext = this.Graph?.agentContexts.get(this.Graph.defaultAgentId);
@@ -898,12 +894,28 @@ class Run {
898
894
  messageId: 'title-' + this.id,
899
895
  agentName: titleContext?.name,
900
896
  };
901
- const handler = new CallbackHandler({
902
- userId,
903
- sessionId,
904
- traceMetadata,
905
- });
906
- chainOptions.callbacks = (chainOptions.callbacks ?? []).concat([handler]);
897
+ const hasExplicitLangfuse = this.Graph != null &&
898
+ hasExplicitLangfuseConfig(this.Graph.agentContexts.values());
899
+ if (titleContext?.langfuse != null) {
900
+ titleLangfuseHandler = createLangfuseHandler({
901
+ langfuse: titleContext.langfuse,
902
+ userId,
903
+ sessionId,
904
+ traceMetadata,
905
+ });
906
+ }
907
+ else if (hasLangfuseEnvConfig() && !hasExplicitLangfuse) {
908
+ titleLangfuseHandler = createLegacyLangfuseHandler({
909
+ userId,
910
+ sessionId,
911
+ traceMetadata,
912
+ });
913
+ }
914
+ if (titleLangfuseHandler != null) {
915
+ chainOptions.callbacks = (chainOptions.callbacks ?? []).concat([
916
+ titleLangfuseHandler,
917
+ ]);
918
+ }
907
919
  }
908
920
  const convoTemplate = PromptTemplate.fromTemplate(titlePromptTemplate ?? 'User: {input}\nAI: {output}');
909
921
  const response = contentParts
@@ -949,17 +961,22 @@ class Run {
949
961
  runId: this.id,
950
962
  });
951
963
  try {
952
- return await fullChain.invoke({ input: inputText, output: response }, invokeConfig);
953
- }
954
- catch (_e) {
955
- // Fallback: strip callbacks to avoid EventStream tracer errors in certain environments
956
- // But preserve langfuse handler if it exists
957
- const langfuseHandler = invokeConfig.callbacks?.find((cb) => cb instanceof CallbackHandler);
958
- const { callbacks: _cb, ...rest } = invokeConfig;
959
- const safeConfig = Object.assign({}, rest, {
960
- callbacks: langfuseHandler ? [langfuseHandler] : [],
961
- });
962
- return await fullChain.invoke({ input: inputText, output: response }, safeConfig);
964
+ try {
965
+ return await fullChain.invoke({ input: inputText, output: response }, invokeConfig);
966
+ }
967
+ catch (_e) {
968
+ // Fallback: strip callbacks to avoid EventStream tracer errors in certain environments
969
+ // but preserve Langfuse tracing if it exists.
970
+ const langfuseHandler = invokeConfig.callbacks?.find(isLangfuseCallbackHandler);
971
+ const { callbacks: _cb, ...rest } = invokeConfig;
972
+ const safeConfig = Object.assign({}, rest, {
973
+ callbacks: langfuseHandler ? [langfuseHandler] : [],
974
+ });
975
+ return await fullChain.invoke({ input: inputText, output: response }, safeConfig);
976
+ }
977
+ }
978
+ finally {
979
+ await disposeLangfuseHandler(titleLangfuseHandler);
963
980
  }
964
981
  }
965
982
  }