@prefactor/langchain 0.2.4 → 0.2.6
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.
- package/dist/index.cjs +62 -19
- package/dist/index.cjs.map +4 -4
- package/dist/index.js +65 -20
- package/dist/index.js.map +4 -4
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +15 -5
- package/dist/init.js.map +1 -1
- package/dist/middleware.d.ts +4 -0
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +46 -14
- package/dist/middleware.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -82,11 +82,15 @@ function extractTokenUsage(response) {
|
|
|
82
82
|
}
|
|
83
83
|
|
|
84
84
|
// packages/langchain/src/middleware.ts
|
|
85
|
+
var toLangchainSpanType = import_core.createSpanTypePrefixer("langchain");
|
|
86
|
+
var logger = import_core.getLogger("middleware");
|
|
87
|
+
|
|
85
88
|
class PrefactorMiddleware {
|
|
86
89
|
tracer;
|
|
87
90
|
agentManager;
|
|
88
91
|
agentInfo;
|
|
89
92
|
rootSpan = null;
|
|
93
|
+
agentInstanceStarted = false;
|
|
90
94
|
constructor(tracer, agentManager, agentInfo) {
|
|
91
95
|
this.tracer = tracer;
|
|
92
96
|
this.agentManager = agentManager;
|
|
@@ -94,10 +98,10 @@ class PrefactorMiddleware {
|
|
|
94
98
|
}
|
|
95
99
|
async beforeAgent(state) {
|
|
96
100
|
const messages = state?.messages ?? [];
|
|
97
|
-
this.
|
|
101
|
+
this.ensureAgentInstanceStarted();
|
|
98
102
|
const span = this.tracer.startSpan({
|
|
99
103
|
name: "langchain:agent",
|
|
100
|
-
spanType: import_core.SpanType.AGENT,
|
|
104
|
+
spanType: toLangchainSpanType(import_core.SpanType.AGENT),
|
|
101
105
|
inputs: { messages: import_core.serializeValue(messages.slice(-3)) }
|
|
102
106
|
});
|
|
103
107
|
this.rootSpan = span;
|
|
@@ -111,24 +115,32 @@ class PrefactorMiddleware {
|
|
|
111
115
|
this.tracer.endSpan(this.rootSpan, {
|
|
112
116
|
outputs: { messages: import_core.serializeValue(messages.slice(-3)) }
|
|
113
117
|
});
|
|
114
|
-
this.agentManager.finishInstance();
|
|
115
118
|
import_core.SpanContext.exit();
|
|
116
119
|
this.rootSpan = null;
|
|
117
120
|
}
|
|
121
|
+
shutdown() {
|
|
122
|
+
if (this.rootSpan) {
|
|
123
|
+
this.tracer.endSpan(this.rootSpan, {
|
|
124
|
+
outputs: {}
|
|
125
|
+
});
|
|
126
|
+
import_core.SpanContext.exit();
|
|
127
|
+
this.rootSpan = null;
|
|
128
|
+
}
|
|
129
|
+
this.finishAgentInstance();
|
|
130
|
+
}
|
|
118
131
|
async wrapModelCall(request, handler) {
|
|
132
|
+
this.ensureAgentInstanceStarted();
|
|
119
133
|
const modelName = this.extractModelName(request);
|
|
120
134
|
const span = this.tracer.startSpan({
|
|
121
135
|
name: "langchain:llm-call",
|
|
122
|
-
spanType: import_core.SpanType.LLM,
|
|
136
|
+
spanType: toLangchainSpanType(import_core.SpanType.LLM),
|
|
123
137
|
inputs: {
|
|
124
138
|
...this.extractModelInputs(request),
|
|
125
139
|
"langchain.model.name": modelName
|
|
126
140
|
}
|
|
127
141
|
});
|
|
128
142
|
try {
|
|
129
|
-
const response = await import_core.SpanContext.runAsync(span,
|
|
130
|
-
return handler(request);
|
|
131
|
-
});
|
|
143
|
+
const response = await import_core.SpanContext.runAsync(span, () => handler(request));
|
|
132
144
|
const outputs = this.extractModelOutputs(response);
|
|
133
145
|
const tokenUsage = extractTokenUsage(response);
|
|
134
146
|
this.tracer.endSpan(span, { outputs, tokenUsage: tokenUsage ?? undefined });
|
|
@@ -139,19 +151,18 @@ class PrefactorMiddleware {
|
|
|
139
151
|
}
|
|
140
152
|
}
|
|
141
153
|
async wrapToolCall(request, handler) {
|
|
154
|
+
this.ensureAgentInstanceStarted();
|
|
142
155
|
const toolName = this.extractToolName(request);
|
|
143
156
|
const span = this.tracer.startSpan({
|
|
144
157
|
name: "langchain:tool-call",
|
|
145
|
-
spanType: import_core.SpanType.TOOL,
|
|
158
|
+
spanType: toLangchainSpanType(import_core.SpanType.TOOL),
|
|
146
159
|
inputs: {
|
|
147
160
|
...this.extractToolInputs(request),
|
|
148
161
|
"langchain.tool.name": toolName
|
|
149
162
|
}
|
|
150
163
|
});
|
|
151
164
|
try {
|
|
152
|
-
const response = await import_core.SpanContext.runAsync(span,
|
|
153
|
-
return handler(request);
|
|
154
|
-
});
|
|
165
|
+
const response = await import_core.SpanContext.runAsync(span, () => handler(request));
|
|
155
166
|
this.tracer.endSpan(span, {
|
|
156
167
|
outputs: this.extractToolOutputs(response)
|
|
157
168
|
});
|
|
@@ -197,29 +208,60 @@ class PrefactorMiddleware {
|
|
|
197
208
|
extractToolOutputs(response) {
|
|
198
209
|
return { output: response?.output ?? response };
|
|
199
210
|
}
|
|
211
|
+
ensureAgentInstanceStarted() {
|
|
212
|
+
if (this.agentInstanceStarted) {
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
try {
|
|
216
|
+
this.agentManager.startInstance(this.agentInfo);
|
|
217
|
+
this.agentInstanceStarted = true;
|
|
218
|
+
} catch (error) {
|
|
219
|
+
logger.error("Failed to start agent instance:", error);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
finishAgentInstance() {
|
|
223
|
+
if (!this.agentInstanceStarted) {
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
try {
|
|
227
|
+
this.agentManager.finishInstance();
|
|
228
|
+
this.agentInstanceStarted = false;
|
|
229
|
+
} catch (error) {
|
|
230
|
+
logger.error("Failed to finish agent instance:", error);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
200
233
|
}
|
|
201
234
|
|
|
202
235
|
// packages/langchain/src/init.ts
|
|
203
|
-
var
|
|
236
|
+
var logger2 = import_core2.getLogger("init");
|
|
204
237
|
var DEFAULT_LANGCHAIN_AGENT_SCHEMA = {
|
|
205
|
-
external_identifier: "
|
|
238
|
+
external_identifier: "langchain-schema",
|
|
206
239
|
span_schemas: {
|
|
207
|
-
agent: { type: "object", additionalProperties: true },
|
|
208
|
-
llm: { type: "object", additionalProperties: true },
|
|
209
|
-
tool: { type: "object", additionalProperties: true },
|
|
210
|
-
chain: { type: "object", additionalProperties: true }
|
|
240
|
+
"langchain:agent": { type: "object", additionalProperties: true },
|
|
241
|
+
"langchain:llm": { type: "object", additionalProperties: true },
|
|
242
|
+
"langchain:tool": { type: "object", additionalProperties: true },
|
|
243
|
+
"langchain:chain": { type: "object", additionalProperties: true }
|
|
244
|
+
},
|
|
245
|
+
span_result_schemas: {
|
|
246
|
+
"langchain:agent": { type: "object", additionalProperties: true },
|
|
247
|
+
"langchain:llm": { type: "object", additionalProperties: true },
|
|
248
|
+
"langchain:tool": { type: "object", additionalProperties: true },
|
|
249
|
+
"langchain:chain": { type: "object", additionalProperties: true }
|
|
211
250
|
}
|
|
212
251
|
};
|
|
213
252
|
var globalCore = null;
|
|
214
253
|
var globalTracer = null;
|
|
215
254
|
var globalMiddleware = null;
|
|
255
|
+
var globalPrefactorMiddleware = null;
|
|
216
256
|
import_core2.registerShutdownHandler("prefactor-langchain", () => {
|
|
257
|
+
globalPrefactorMiddleware?.shutdown();
|
|
217
258
|
if (globalCore) {
|
|
218
|
-
|
|
259
|
+
logger2.info("Shutting down Prefactor SDK");
|
|
219
260
|
}
|
|
220
261
|
globalCore = null;
|
|
221
262
|
globalTracer = null;
|
|
222
263
|
globalMiddleware = null;
|
|
264
|
+
globalPrefactorMiddleware = null;
|
|
223
265
|
});
|
|
224
266
|
function init(config) {
|
|
225
267
|
import_core2.configureLogging();
|
|
@@ -286,6 +328,7 @@ function init(config) {
|
|
|
286
328
|
}
|
|
287
329
|
});
|
|
288
330
|
globalMiddleware = middleware;
|
|
331
|
+
globalPrefactorMiddleware = prefactorMiddleware;
|
|
289
332
|
return middleware;
|
|
290
333
|
}
|
|
291
334
|
function getTracer() {
|
|
@@ -303,4 +346,4 @@ process.on("beforeExit", () => {
|
|
|
303
346
|
});
|
|
304
347
|
});
|
|
305
348
|
|
|
306
|
-
//# debugId=
|
|
349
|
+
//# debugId=CA74DCE579A6AA8664756E2164756E21
|
package/dist/index.cjs.map
CHANGED
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
"sources": ["../src/index.ts", "../src/init.ts", "../src/middleware.ts", "../src/metadata-extractor.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"// Main entry points\n\n// Convenience re-exports from core\nexport {\n type Config,\n type CoreRuntime,\n type HttpTransportConfig,\n type Span,\n SpanStatus,\n SpanType,\n shutdown,\n} from '@prefactor/core';\nexport { getTracer, init, withSpan } from './init.js';\nexport { extractTokenUsage } from './metadata-extractor.js';\n// Middleware\nexport { PrefactorMiddleware } from './middleware.js';\n",
|
|
6
|
-
"import {\n type Config,\n type CoreRuntime,\n configureLogging,\n createConfig,\n createCore,\n getLogger,\n registerShutdownHandler,\n shutdown as shutdownCore,\n type Tracer,\n withSpan as withCoreSpan,\n} from '@prefactor/core';\nimport { type AgentMiddleware, createMiddleware } from 'langchain';\nimport { PrefactorMiddleware } from './middleware.js';\n\nconst logger = getLogger('init');\n\nconst DEFAULT_LANGCHAIN_AGENT_SCHEMA = {\n external_identifier: '
|
|
7
|
-
"import {\n type AgentInstanceManager,\n SpanContext,\n SpanType,\n serializeValue,\n type Tracer,\n} from '@prefactor/core';\nimport { extractTokenUsage } from './metadata-extractor.js';\n\n/**\n * Prefactor middleware for LangChain.js agents.\n *\n * This middleware automatically traces LLM calls, tool executions, and agent workflows.\n * It integrates with LangChain.js middleware API to provide transparent instrumentation.\n *\n * Features:\n * - Automatic parent-child span relationships via context propagation\n * - Token usage extraction for LLM calls\n * - Error tracking and debugging\n * - Zero-overhead instrumentation (graceful failure)\n *\n * @example\n * ```typescript\n * import { init } from '@prefactor/langchain';\n * import { createReactAgent } from '@langchain/langgraph/prebuilt';\n *\n * const middleware = init();\n * const agent = createReactAgent({\n * llm: model,\n * tools: [myTool],\n * middleware: [middleware],\n * });\n * ```\n */\nexport class PrefactorMiddleware {\n private rootSpan: ReturnType<Tracer['startSpan']> | null = null;\n\n constructor(\n private tracer: Tracer,\n private agentManager: AgentInstanceManager,\n private agentInfo?: Parameters<AgentInstanceManager['startInstance']>[0]\n ) {}\n\n /**\n * Called before agent execution starts\n *\n * @param state - Agent state containing messages\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain state can be any structure\n async beforeAgent(state: any): Promise<void> {\n const messages = state?.messages ?? [];\n\n this.
|
|
6
|
+
"import {\n type Config,\n type CoreRuntime,\n configureLogging,\n createConfig,\n createCore,\n getLogger,\n registerShutdownHandler,\n shutdown as shutdownCore,\n type Tracer,\n withSpan as withCoreSpan,\n} from '@prefactor/core';\nimport { type AgentMiddleware, createMiddleware } from 'langchain';\nimport { PrefactorMiddleware } from './middleware.js';\n\nconst logger = getLogger('init');\n\nconst DEFAULT_LANGCHAIN_AGENT_SCHEMA = {\n external_identifier: 'langchain-schema',\n span_schemas: {\n 'langchain:agent': { type: 'object', additionalProperties: true },\n 'langchain:llm': { type: 'object', additionalProperties: true },\n 'langchain:tool': { type: 'object', additionalProperties: true },\n 'langchain:chain': { type: 'object', additionalProperties: true },\n },\n span_result_schemas: {\n 'langchain:agent': { type: 'object', additionalProperties: true },\n 'langchain:llm': { type: 'object', additionalProperties: true },\n 'langchain:tool': { type: 'object', additionalProperties: true },\n 'langchain:chain': { type: 'object', additionalProperties: true },\n },\n} as const;\n\nlet globalCore: CoreRuntime | null = null;\nlet globalTracer: Tracer | null = null;\nlet globalMiddleware: AgentMiddleware | null = null;\nlet globalPrefactorMiddleware: PrefactorMiddleware | null = null;\n\nregisterShutdownHandler('prefactor-langchain', () => {\n globalPrefactorMiddleware?.shutdown();\n\n if (globalCore) {\n logger.info('Shutting down Prefactor SDK');\n }\n\n globalCore = null;\n globalTracer = null;\n globalMiddleware = null;\n globalPrefactorMiddleware = null;\n});\n\nexport type ManualSpanOptions = {\n name: string;\n spanType: string;\n inputs: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n};\n\n/**\n * Initialize the Prefactor SDK and return middleware for LangChain.js\n *\n * This is the main entry point for the SDK. Call this function to create a middleware\n * instance that you can pass to your LangChain.js agents.\n *\n * @param config - Optional configuration object\n * @returns PrefactorMiddleware instance to use with LangChain.js agents\n *\n * @example\n * ```typescript\n * import { init } from '@prefactor/langchain';\n * import { createAgent } from 'langchain';\n *\n * // Initialize with HTTP transport\n * const middleware = init({\n * transportType: 'http',\n * httpConfig: {\n * apiUrl: 'https://api.prefactor.ai',\n * apiToken: process.env.PREFACTOR_API_TOKEN!,\n * agentIdentifier: 'my-langchain-agent',\n * },\n * });\n *\n * // Or configure HTTP transport\n * const middleware = init({\n * transportType: 'http',\n * httpConfig: {\n * apiUrl: 'https://api.prefactor.ai',\n * apiToken: process.env.PREFACTOR_API_TOKEN!,\n * agentIdentifier: 'my-langchain-agent', // Required\n * agentId: 'legacy-agent-id', // Optional legacy identifier\n * }\n * });\n *\n * const agent = createAgent({\n * model: 'claude-sonnet-4-5-20250929',\n * tools: [myTool],\n * middleware: [middleware],\n * });\n * ```\n */\nexport function init(config?: Partial<Config>): AgentMiddleware {\n configureLogging();\n\n let configWithHttp = config;\n const transportType = config?.transportType ?? process.env.PREFACTOR_TRANSPORT ?? 'http';\n\n if (transportType === 'http' && !config?.httpConfig) {\n const apiUrl = process.env.PREFACTOR_API_URL;\n const apiToken = process.env.PREFACTOR_API_TOKEN;\n\n if (!apiUrl || !apiToken) {\n throw new Error(\n 'HTTP transport requires PREFACTOR_API_URL and PREFACTOR_API_TOKEN environment variables, ' +\n 'or httpConfig to be provided in configuration'\n );\n }\n\n configWithHttp = {\n ...config,\n transportType: 'http',\n httpConfig: {\n apiUrl,\n apiToken,\n agentId: process.env.PREFACTOR_AGENT_ID,\n agentName: process.env.PREFACTOR_AGENT_NAME,\n agentIdentifier: process.env.PREFACTOR_AGENT_IDENTIFIER || '1.0.0',\n agentSchema: DEFAULT_LANGCHAIN_AGENT_SCHEMA,\n },\n };\n } else if (transportType === 'http' && config?.httpConfig && !config.httpConfig.agentSchema) {\n configWithHttp = {\n ...config,\n httpConfig: {\n ...config.httpConfig,\n agentSchema: DEFAULT_LANGCHAIN_AGENT_SCHEMA,\n },\n };\n }\n\n const finalConfig = createConfig(configWithHttp);\n\n if (globalMiddleware !== null) {\n return globalMiddleware;\n }\n\n const core = createCore(finalConfig);\n globalCore = core;\n globalTracer = core.tracer;\n\n const httpConfig = finalConfig.httpConfig;\n if (httpConfig?.agentSchema) {\n core.agentManager.registerSchema(httpConfig.agentSchema);\n }\n\n const agentInfo = finalConfig.httpConfig\n ? {\n agentId: finalConfig.httpConfig.agentId,\n agentIdentifier: finalConfig.httpConfig.agentIdentifier,\n agentName: finalConfig.httpConfig.agentName,\n agentDescription: finalConfig.httpConfig.agentDescription,\n }\n : undefined;\n\n const prefactorMiddleware = new PrefactorMiddleware(core.tracer, core.agentManager, agentInfo);\n\n const middleware = createMiddleware({\n name: 'prefactor',\n // biome-ignore lint/suspicious/noExplicitAny: LangChain middleware hooks use dynamic types\n wrapModelCall: async (request: any, handler: any) => {\n return prefactorMiddleware.wrapModelCall(request, handler);\n },\n // biome-ignore lint/suspicious/noExplicitAny: LangChain middleware hooks use dynamic types\n wrapToolCall: async (request: any, handler: any) => {\n return prefactorMiddleware.wrapToolCall(request, handler);\n },\n // biome-ignore lint/suspicious/noExplicitAny: LangChain middleware hooks use dynamic types\n beforeAgent: async (state: any) => {\n await prefactorMiddleware.beforeAgent(state);\n },\n // biome-ignore lint/suspicious/noExplicitAny: LangChain middleware hooks use dynamic types\n afterAgent: async (state: any) => {\n await prefactorMiddleware.afterAgent(state);\n },\n });\n\n globalMiddleware = middleware;\n globalPrefactorMiddleware = prefactorMiddleware;\n return middleware;\n}\n\n/**\n * Get the current tracer instance.\n *\n * If no tracer has been created yet, this will call init() with default configuration.\n *\n * @returns Tracer instance\n *\n * @example\n * ```typescript\n * import { getTracer } from '@prefactor/langchain';\n *\n * const tracer = getTracer();\n * const span = tracer.startSpan({\n * name: 'custom-operation',\n * spanType: SpanType.TOOL,\n * inputs: { data: 'example' }\n * });\n * ```\n */\nexport function getTracer(): Tracer {\n if (!globalTracer) {\n init();\n }\n // Safe because init() always sets globalTracer\n return globalTracer as Tracer;\n}\n\nexport async function withSpan<T>(\n options: ManualSpanOptions,\n fn: () => Promise<T> | T\n): Promise<T> {\n return withCoreSpan(options, fn);\n}\n\nexport { shutdownCore as shutdown };\n\n// Automatic shutdown on process exit\nprocess.on('beforeExit', () => {\n shutdownCore().catch((error) => {\n console.error('Error during Prefactor SDK shutdown:', error);\n });\n});\n",
|
|
7
|
+
"import {\n type AgentInstanceManager,\n createSpanTypePrefixer,\n getLogger,\n SpanContext,\n SpanType,\n serializeValue,\n type Tracer,\n} from '@prefactor/core';\nimport { extractTokenUsage } from './metadata-extractor.js';\n\nconst toLangchainSpanType = createSpanTypePrefixer('langchain');\nconst logger = getLogger('middleware');\n\n/**\n * Prefactor middleware for LangChain.js agents.\n *\n * This middleware automatically traces LLM calls, tool executions, and agent workflows.\n * It integrates with LangChain.js middleware API to provide transparent instrumentation.\n *\n * Features:\n * - Automatic parent-child span relationships via context propagation\n * - Token usage extraction for LLM calls\n * - Error tracking and debugging\n * - Zero-overhead instrumentation (graceful failure)\n *\n * @example\n * ```typescript\n * import { init } from '@prefactor/langchain';\n * import { createReactAgent } from '@langchain/langgraph/prebuilt';\n *\n * const middleware = init();\n * const agent = createReactAgent({\n * llm: model,\n * tools: [myTool],\n * middleware: [middleware],\n * });\n * ```\n */\nexport class PrefactorMiddleware {\n private rootSpan: ReturnType<Tracer['startSpan']> | null = null;\n private agentInstanceStarted = false;\n\n constructor(\n private tracer: Tracer,\n private agentManager: AgentInstanceManager,\n private agentInfo?: Parameters<AgentInstanceManager['startInstance']>[0]\n ) {}\n\n /**\n * Called before agent execution starts\n *\n * @param state - Agent state containing messages\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain state can be any structure\n async beforeAgent(state: any): Promise<void> {\n const messages = state?.messages ?? [];\n\n this.ensureAgentInstanceStarted();\n\n const span = this.tracer.startSpan({\n name: 'langchain:agent',\n spanType: toLangchainSpanType(SpanType.AGENT),\n inputs: { messages: serializeValue(messages.slice(-3)) },\n });\n\n this.rootSpan = span;\n SpanContext.enter(span);\n }\n\n /**\n * Called after agent execution completes\n *\n * @param state - Agent state containing messages\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain state can be any structure\n async afterAgent(state: any): Promise<void> {\n if (!this.rootSpan) {\n return;\n }\n\n const messages = state?.messages ?? [];\n this.tracer.endSpan(this.rootSpan, {\n outputs: { messages: serializeValue(messages.slice(-3)) },\n });\n\n SpanContext.exit();\n this.rootSpan = null;\n }\n\n shutdown(): void {\n if (this.rootSpan) {\n this.tracer.endSpan(this.rootSpan, {\n outputs: {},\n });\n\n SpanContext.exit();\n this.rootSpan = null;\n }\n\n this.finishAgentInstance();\n }\n\n /**\n * Wrap a model call to trace LLM invocations\n *\n * @param request - Model invocation request\n * @param handler - The actual model call function\n * @returns Promise resolving to the model response\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain request/handler types are dynamic\n async wrapModelCall<T>(request: any, handler: (req: any) => Promise<T>): Promise<T> {\n this.ensureAgentInstanceStarted();\n\n const modelName = this.extractModelName(request);\n const span = this.tracer.startSpan({\n name: 'langchain:llm-call',\n spanType: toLangchainSpanType(SpanType.LLM),\n inputs: {\n ...this.extractModelInputs(request),\n 'langchain.model.name': modelName,\n },\n });\n\n try {\n const response = await SpanContext.runAsync(span, () => handler(request));\n\n const outputs = this.extractModelOutputs(response);\n const tokenUsage = extractTokenUsage(response);\n\n this.tracer.endSpan(span, { outputs, tokenUsage: tokenUsage ?? undefined });\n return response;\n } catch (error) {\n this.tracer.endSpan(span, { error: error as Error });\n throw error;\n }\n }\n\n /**\n * Wrap a tool call to trace tool executions\n *\n * @param request - Tool invocation request\n * @param handler - The actual tool call function\n * @returns Promise resolving to the tool response\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain request/handler types are dynamic\n async wrapToolCall<T>(request: any, handler: (req: any) => Promise<T>): Promise<T> {\n this.ensureAgentInstanceStarted();\n\n const toolName = this.extractToolName(request);\n const span = this.tracer.startSpan({\n name: 'langchain:tool-call',\n spanType: toLangchainSpanType(SpanType.TOOL),\n inputs: {\n ...this.extractToolInputs(request),\n 'langchain.tool.name': toolName,\n },\n });\n\n try {\n const response = await SpanContext.runAsync(span, () => handler(request));\n\n this.tracer.endSpan(span, {\n outputs: this.extractToolOutputs(response),\n });\n return response;\n } catch (error) {\n this.tracer.endSpan(span, { error: error as Error });\n throw error;\n }\n }\n\n /**\n * Extract model name from request\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain request structure is dynamic\n private extractModelName(request: any): string {\n const candidate = request?.model ?? request?.modelName;\n\n if (typeof candidate === 'string') {\n return candidate;\n }\n\n if (candidate && typeof candidate === 'object') {\n const modelObject = candidate as Record<string, unknown>;\n if (\n Array.isArray(modelObject.id) &&\n modelObject.id.every((item) => typeof item === 'string')\n ) {\n return (modelObject.id as string[]).join('.');\n }\n\n if (typeof modelObject.modelName === 'string') {\n return modelObject.modelName;\n }\n\n if (typeof modelObject.name === 'string') {\n return modelObject.name;\n }\n }\n\n return 'unknown';\n }\n\n /**\n * Extract model inputs from request\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain request structure is dynamic\n private extractModelInputs(request: any): Record<string, unknown> {\n const messages = request?.messages ?? [];\n return { messages: serializeValue(messages.slice(-3)) };\n }\n\n /**\n * Extract model outputs from response\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain response structure is dynamic\n private extractModelOutputs(response: any): Record<string, unknown> {\n const content = response?.content ?? response?.text ?? '';\n return { content: serializeValue(content) };\n }\n\n /**\n * Extract tool name from request\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain request structure is dynamic\n private extractToolName(request: any): string {\n return request?.name ?? request?.tool ?? 'unknown';\n }\n\n /**\n * Extract tool inputs from request\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain request structure is dynamic\n private extractToolInputs(request: any): Record<string, unknown> {\n return { input: request?.input ?? request?.args ?? {} };\n }\n\n /**\n * Extract tool outputs from response\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain response structure is dynamic\n private extractToolOutputs(response: any): Record<string, unknown> {\n return { output: response?.output ?? response };\n }\n\n private ensureAgentInstanceStarted(): void {\n if (this.agentInstanceStarted) {\n return;\n }\n\n try {\n this.agentManager.startInstance(this.agentInfo);\n this.agentInstanceStarted = true;\n } catch (error) {\n logger.error('Failed to start agent instance:', error);\n }\n }\n\n private finishAgentInstance(): void {\n if (!this.agentInstanceStarted) {\n return;\n }\n\n try {\n this.agentManager.finishInstance();\n this.agentInstanceStarted = false;\n } catch (error) {\n logger.error('Failed to finish agent instance:', error);\n }\n }\n}\n",
|
|
8
8
|
"import type { TokenUsage } from '@prefactor/core';\n\n/**\n * Extract token usage information from LLM responses.\n *\n * Handles multiple response formats from different LLM providers and LangChain versions.\n *\n * @param response - The LLM response object\n * @returns TokenUsage object or null if no usage data found\n *\n * @example\n * ```typescript\n * const response = await model.invoke(messages);\n * const tokenUsage = extractTokenUsage(response);\n * if (tokenUsage) {\n * console.log(`Tokens used: ${tokenUsage.totalTokens}`);\n * }\n * ```\n */\n// biome-ignore lint/suspicious/noExplicitAny: LLM response structure varies by provider\nexport function extractTokenUsage(response: any): TokenUsage | null {\n try {\n // Try token_usage field (common format)\n const tokenUsage = response?.token_usage ?? response?.usage;\n if (tokenUsage) {\n return {\n promptTokens: tokenUsage.prompt_tokens ?? 0,\n completionTokens: tokenUsage.completion_tokens ?? 0,\n totalTokens: tokenUsage.total_tokens ?? 0,\n };\n }\n\n // Try usage_metadata field (LangChain format)\n const usageMetadata = response?.usage_metadata;\n if (usageMetadata) {\n return {\n promptTokens: usageMetadata.input_tokens ?? 0,\n completionTokens: usageMetadata.output_tokens ?? 0,\n totalTokens: usageMetadata.total_tokens ?? 0,\n };\n }\n\n // Try response_metadata.token_usage (nested format)\n const responseMetadata = response?.response_metadata;\n if (responseMetadata?.token_usage) {\n return {\n promptTokens: responseMetadata.token_usage.prompt_tokens ?? 0,\n completionTokens: responseMetadata.token_usage.completion_tokens ?? 0,\n totalTokens: responseMetadata.token_usage.total_tokens ?? 0,\n };\n }\n\n return null;\n } catch {\n return null;\n }\n}\n"
|
|
9
9
|
],
|
|
10
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWO,IARP;;;ACQO,IAXP;AAYuD,IAAvD;;;
|
|
11
|
-
"debugId": "
|
|
10
|
+
"mappings": "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",
|
|
11
|
+
"debugId": "CA74DCE579A6AA8664756E2164756E21",
|
|
12
12
|
"names": []
|
|
13
13
|
}
|
package/dist/index.js
CHANGED
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
configureLogging,
|
|
11
11
|
createConfig,
|
|
12
12
|
createCore,
|
|
13
|
-
getLogger,
|
|
13
|
+
getLogger as getLogger2,
|
|
14
14
|
registerShutdownHandler,
|
|
15
15
|
shutdown as shutdownCore,
|
|
16
16
|
withSpan as withCoreSpan
|
|
@@ -19,6 +19,8 @@ import { createMiddleware } from "langchain";
|
|
|
19
19
|
|
|
20
20
|
// packages/langchain/src/middleware.ts
|
|
21
21
|
import {
|
|
22
|
+
createSpanTypePrefixer,
|
|
23
|
+
getLogger,
|
|
22
24
|
SpanContext,
|
|
23
25
|
SpanType,
|
|
24
26
|
serializeValue
|
|
@@ -58,11 +60,15 @@ function extractTokenUsage(response) {
|
|
|
58
60
|
}
|
|
59
61
|
|
|
60
62
|
// packages/langchain/src/middleware.ts
|
|
63
|
+
var toLangchainSpanType = createSpanTypePrefixer("langchain");
|
|
64
|
+
var logger = getLogger("middleware");
|
|
65
|
+
|
|
61
66
|
class PrefactorMiddleware {
|
|
62
67
|
tracer;
|
|
63
68
|
agentManager;
|
|
64
69
|
agentInfo;
|
|
65
70
|
rootSpan = null;
|
|
71
|
+
agentInstanceStarted = false;
|
|
66
72
|
constructor(tracer, agentManager, agentInfo) {
|
|
67
73
|
this.tracer = tracer;
|
|
68
74
|
this.agentManager = agentManager;
|
|
@@ -70,10 +76,10 @@ class PrefactorMiddleware {
|
|
|
70
76
|
}
|
|
71
77
|
async beforeAgent(state) {
|
|
72
78
|
const messages = state?.messages ?? [];
|
|
73
|
-
this.
|
|
79
|
+
this.ensureAgentInstanceStarted();
|
|
74
80
|
const span = this.tracer.startSpan({
|
|
75
81
|
name: "langchain:agent",
|
|
76
|
-
spanType: SpanType.AGENT,
|
|
82
|
+
spanType: toLangchainSpanType(SpanType.AGENT),
|
|
77
83
|
inputs: { messages: serializeValue(messages.slice(-3)) }
|
|
78
84
|
});
|
|
79
85
|
this.rootSpan = span;
|
|
@@ -87,24 +93,32 @@ class PrefactorMiddleware {
|
|
|
87
93
|
this.tracer.endSpan(this.rootSpan, {
|
|
88
94
|
outputs: { messages: serializeValue(messages.slice(-3)) }
|
|
89
95
|
});
|
|
90
|
-
this.agentManager.finishInstance();
|
|
91
96
|
SpanContext.exit();
|
|
92
97
|
this.rootSpan = null;
|
|
93
98
|
}
|
|
99
|
+
shutdown() {
|
|
100
|
+
if (this.rootSpan) {
|
|
101
|
+
this.tracer.endSpan(this.rootSpan, {
|
|
102
|
+
outputs: {}
|
|
103
|
+
});
|
|
104
|
+
SpanContext.exit();
|
|
105
|
+
this.rootSpan = null;
|
|
106
|
+
}
|
|
107
|
+
this.finishAgentInstance();
|
|
108
|
+
}
|
|
94
109
|
async wrapModelCall(request, handler) {
|
|
110
|
+
this.ensureAgentInstanceStarted();
|
|
95
111
|
const modelName = this.extractModelName(request);
|
|
96
112
|
const span = this.tracer.startSpan({
|
|
97
113
|
name: "langchain:llm-call",
|
|
98
|
-
spanType: SpanType.LLM,
|
|
114
|
+
spanType: toLangchainSpanType(SpanType.LLM),
|
|
99
115
|
inputs: {
|
|
100
116
|
...this.extractModelInputs(request),
|
|
101
117
|
"langchain.model.name": modelName
|
|
102
118
|
}
|
|
103
119
|
});
|
|
104
120
|
try {
|
|
105
|
-
const response = await SpanContext.runAsync(span,
|
|
106
|
-
return handler(request);
|
|
107
|
-
});
|
|
121
|
+
const response = await SpanContext.runAsync(span, () => handler(request));
|
|
108
122
|
const outputs = this.extractModelOutputs(response);
|
|
109
123
|
const tokenUsage = extractTokenUsage(response);
|
|
110
124
|
this.tracer.endSpan(span, { outputs, tokenUsage: tokenUsage ?? undefined });
|
|
@@ -115,19 +129,18 @@ class PrefactorMiddleware {
|
|
|
115
129
|
}
|
|
116
130
|
}
|
|
117
131
|
async wrapToolCall(request, handler) {
|
|
132
|
+
this.ensureAgentInstanceStarted();
|
|
118
133
|
const toolName = this.extractToolName(request);
|
|
119
134
|
const span = this.tracer.startSpan({
|
|
120
135
|
name: "langchain:tool-call",
|
|
121
|
-
spanType: SpanType.TOOL,
|
|
136
|
+
spanType: toLangchainSpanType(SpanType.TOOL),
|
|
122
137
|
inputs: {
|
|
123
138
|
...this.extractToolInputs(request),
|
|
124
139
|
"langchain.tool.name": toolName
|
|
125
140
|
}
|
|
126
141
|
});
|
|
127
142
|
try {
|
|
128
|
-
const response = await SpanContext.runAsync(span,
|
|
129
|
-
return handler(request);
|
|
130
|
-
});
|
|
143
|
+
const response = await SpanContext.runAsync(span, () => handler(request));
|
|
131
144
|
this.tracer.endSpan(span, {
|
|
132
145
|
outputs: this.extractToolOutputs(response)
|
|
133
146
|
});
|
|
@@ -173,29 +186,60 @@ class PrefactorMiddleware {
|
|
|
173
186
|
extractToolOutputs(response) {
|
|
174
187
|
return { output: response?.output ?? response };
|
|
175
188
|
}
|
|
189
|
+
ensureAgentInstanceStarted() {
|
|
190
|
+
if (this.agentInstanceStarted) {
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
try {
|
|
194
|
+
this.agentManager.startInstance(this.agentInfo);
|
|
195
|
+
this.agentInstanceStarted = true;
|
|
196
|
+
} catch (error) {
|
|
197
|
+
logger.error("Failed to start agent instance:", error);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
finishAgentInstance() {
|
|
201
|
+
if (!this.agentInstanceStarted) {
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
try {
|
|
205
|
+
this.agentManager.finishInstance();
|
|
206
|
+
this.agentInstanceStarted = false;
|
|
207
|
+
} catch (error) {
|
|
208
|
+
logger.error("Failed to finish agent instance:", error);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
176
211
|
}
|
|
177
212
|
|
|
178
213
|
// packages/langchain/src/init.ts
|
|
179
|
-
var
|
|
214
|
+
var logger2 = getLogger2("init");
|
|
180
215
|
var DEFAULT_LANGCHAIN_AGENT_SCHEMA = {
|
|
181
|
-
external_identifier: "
|
|
216
|
+
external_identifier: "langchain-schema",
|
|
182
217
|
span_schemas: {
|
|
183
|
-
agent: { type: "object", additionalProperties: true },
|
|
184
|
-
llm: { type: "object", additionalProperties: true },
|
|
185
|
-
tool: { type: "object", additionalProperties: true },
|
|
186
|
-
chain: { type: "object", additionalProperties: true }
|
|
218
|
+
"langchain:agent": { type: "object", additionalProperties: true },
|
|
219
|
+
"langchain:llm": { type: "object", additionalProperties: true },
|
|
220
|
+
"langchain:tool": { type: "object", additionalProperties: true },
|
|
221
|
+
"langchain:chain": { type: "object", additionalProperties: true }
|
|
222
|
+
},
|
|
223
|
+
span_result_schemas: {
|
|
224
|
+
"langchain:agent": { type: "object", additionalProperties: true },
|
|
225
|
+
"langchain:llm": { type: "object", additionalProperties: true },
|
|
226
|
+
"langchain:tool": { type: "object", additionalProperties: true },
|
|
227
|
+
"langchain:chain": { type: "object", additionalProperties: true }
|
|
187
228
|
}
|
|
188
229
|
};
|
|
189
230
|
var globalCore = null;
|
|
190
231
|
var globalTracer = null;
|
|
191
232
|
var globalMiddleware = null;
|
|
233
|
+
var globalPrefactorMiddleware = null;
|
|
192
234
|
registerShutdownHandler("prefactor-langchain", () => {
|
|
235
|
+
globalPrefactorMiddleware?.shutdown();
|
|
193
236
|
if (globalCore) {
|
|
194
|
-
|
|
237
|
+
logger2.info("Shutting down Prefactor SDK");
|
|
195
238
|
}
|
|
196
239
|
globalCore = null;
|
|
197
240
|
globalTracer = null;
|
|
198
241
|
globalMiddleware = null;
|
|
242
|
+
globalPrefactorMiddleware = null;
|
|
199
243
|
});
|
|
200
244
|
function init(config) {
|
|
201
245
|
configureLogging();
|
|
@@ -262,6 +306,7 @@ function init(config) {
|
|
|
262
306
|
}
|
|
263
307
|
});
|
|
264
308
|
globalMiddleware = middleware;
|
|
309
|
+
globalPrefactorMiddleware = prefactorMiddleware;
|
|
265
310
|
return middleware;
|
|
266
311
|
}
|
|
267
312
|
function getTracer() {
|
|
@@ -289,4 +334,4 @@ export {
|
|
|
289
334
|
PrefactorMiddleware
|
|
290
335
|
};
|
|
291
336
|
|
|
292
|
-
//# debugId=
|
|
337
|
+
//# debugId=B443F3BBF4D3F81264756E2164756E21
|
package/dist/index.js.map
CHANGED
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
"sources": ["../src/index.ts", "../src/init.ts", "../src/middleware.ts", "../src/metadata-extractor.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"// Main entry points\n\n// Convenience re-exports from core\nexport {\n type Config,\n type CoreRuntime,\n type HttpTransportConfig,\n type Span,\n SpanStatus,\n SpanType,\n shutdown,\n} from '@prefactor/core';\nexport { getTracer, init, withSpan } from './init.js';\nexport { extractTokenUsage } from './metadata-extractor.js';\n// Middleware\nexport { PrefactorMiddleware } from './middleware.js';\n",
|
|
6
|
-
"import {\n type Config,\n type CoreRuntime,\n configureLogging,\n createConfig,\n createCore,\n getLogger,\n registerShutdownHandler,\n shutdown as shutdownCore,\n type Tracer,\n withSpan as withCoreSpan,\n} from '@prefactor/core';\nimport { type AgentMiddleware, createMiddleware } from 'langchain';\nimport { PrefactorMiddleware } from './middleware.js';\n\nconst logger = getLogger('init');\n\nconst DEFAULT_LANGCHAIN_AGENT_SCHEMA = {\n external_identifier: '
|
|
7
|
-
"import {\n type AgentInstanceManager,\n SpanContext,\n SpanType,\n serializeValue,\n type Tracer,\n} from '@prefactor/core';\nimport { extractTokenUsage } from './metadata-extractor.js';\n\n/**\n * Prefactor middleware for LangChain.js agents.\n *\n * This middleware automatically traces LLM calls, tool executions, and agent workflows.\n * It integrates with LangChain.js middleware API to provide transparent instrumentation.\n *\n * Features:\n * - Automatic parent-child span relationships via context propagation\n * - Token usage extraction for LLM calls\n * - Error tracking and debugging\n * - Zero-overhead instrumentation (graceful failure)\n *\n * @example\n * ```typescript\n * import { init } from '@prefactor/langchain';\n * import { createReactAgent } from '@langchain/langgraph/prebuilt';\n *\n * const middleware = init();\n * const agent = createReactAgent({\n * llm: model,\n * tools: [myTool],\n * middleware: [middleware],\n * });\n * ```\n */\nexport class PrefactorMiddleware {\n private rootSpan: ReturnType<Tracer['startSpan']> | null = null;\n\n constructor(\n private tracer: Tracer,\n private agentManager: AgentInstanceManager,\n private agentInfo?: Parameters<AgentInstanceManager['startInstance']>[0]\n ) {}\n\n /**\n * Called before agent execution starts\n *\n * @param state - Agent state containing messages\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain state can be any structure\n async beforeAgent(state: any): Promise<void> {\n const messages = state?.messages ?? [];\n\n this.
|
|
6
|
+
"import {\n type Config,\n type CoreRuntime,\n configureLogging,\n createConfig,\n createCore,\n getLogger,\n registerShutdownHandler,\n shutdown as shutdownCore,\n type Tracer,\n withSpan as withCoreSpan,\n} from '@prefactor/core';\nimport { type AgentMiddleware, createMiddleware } from 'langchain';\nimport { PrefactorMiddleware } from './middleware.js';\n\nconst logger = getLogger('init');\n\nconst DEFAULT_LANGCHAIN_AGENT_SCHEMA = {\n external_identifier: 'langchain-schema',\n span_schemas: {\n 'langchain:agent': { type: 'object', additionalProperties: true },\n 'langchain:llm': { type: 'object', additionalProperties: true },\n 'langchain:tool': { type: 'object', additionalProperties: true },\n 'langchain:chain': { type: 'object', additionalProperties: true },\n },\n span_result_schemas: {\n 'langchain:agent': { type: 'object', additionalProperties: true },\n 'langchain:llm': { type: 'object', additionalProperties: true },\n 'langchain:tool': { type: 'object', additionalProperties: true },\n 'langchain:chain': { type: 'object', additionalProperties: true },\n },\n} as const;\n\nlet globalCore: CoreRuntime | null = null;\nlet globalTracer: Tracer | null = null;\nlet globalMiddleware: AgentMiddleware | null = null;\nlet globalPrefactorMiddleware: PrefactorMiddleware | null = null;\n\nregisterShutdownHandler('prefactor-langchain', () => {\n globalPrefactorMiddleware?.shutdown();\n\n if (globalCore) {\n logger.info('Shutting down Prefactor SDK');\n }\n\n globalCore = null;\n globalTracer = null;\n globalMiddleware = null;\n globalPrefactorMiddleware = null;\n});\n\nexport type ManualSpanOptions = {\n name: string;\n spanType: string;\n inputs: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n};\n\n/**\n * Initialize the Prefactor SDK and return middleware for LangChain.js\n *\n * This is the main entry point for the SDK. Call this function to create a middleware\n * instance that you can pass to your LangChain.js agents.\n *\n * @param config - Optional configuration object\n * @returns PrefactorMiddleware instance to use with LangChain.js agents\n *\n * @example\n * ```typescript\n * import { init } from '@prefactor/langchain';\n * import { createAgent } from 'langchain';\n *\n * // Initialize with HTTP transport\n * const middleware = init({\n * transportType: 'http',\n * httpConfig: {\n * apiUrl: 'https://api.prefactor.ai',\n * apiToken: process.env.PREFACTOR_API_TOKEN!,\n * agentIdentifier: 'my-langchain-agent',\n * },\n * });\n *\n * // Or configure HTTP transport\n * const middleware = init({\n * transportType: 'http',\n * httpConfig: {\n * apiUrl: 'https://api.prefactor.ai',\n * apiToken: process.env.PREFACTOR_API_TOKEN!,\n * agentIdentifier: 'my-langchain-agent', // Required\n * agentId: 'legacy-agent-id', // Optional legacy identifier\n * }\n * });\n *\n * const agent = createAgent({\n * model: 'claude-sonnet-4-5-20250929',\n * tools: [myTool],\n * middleware: [middleware],\n * });\n * ```\n */\nexport function init(config?: Partial<Config>): AgentMiddleware {\n configureLogging();\n\n let configWithHttp = config;\n const transportType = config?.transportType ?? process.env.PREFACTOR_TRANSPORT ?? 'http';\n\n if (transportType === 'http' && !config?.httpConfig) {\n const apiUrl = process.env.PREFACTOR_API_URL;\n const apiToken = process.env.PREFACTOR_API_TOKEN;\n\n if (!apiUrl || !apiToken) {\n throw new Error(\n 'HTTP transport requires PREFACTOR_API_URL and PREFACTOR_API_TOKEN environment variables, ' +\n 'or httpConfig to be provided in configuration'\n );\n }\n\n configWithHttp = {\n ...config,\n transportType: 'http',\n httpConfig: {\n apiUrl,\n apiToken,\n agentId: process.env.PREFACTOR_AGENT_ID,\n agentName: process.env.PREFACTOR_AGENT_NAME,\n agentIdentifier: process.env.PREFACTOR_AGENT_IDENTIFIER || '1.0.0',\n agentSchema: DEFAULT_LANGCHAIN_AGENT_SCHEMA,\n },\n };\n } else if (transportType === 'http' && config?.httpConfig && !config.httpConfig.agentSchema) {\n configWithHttp = {\n ...config,\n httpConfig: {\n ...config.httpConfig,\n agentSchema: DEFAULT_LANGCHAIN_AGENT_SCHEMA,\n },\n };\n }\n\n const finalConfig = createConfig(configWithHttp);\n\n if (globalMiddleware !== null) {\n return globalMiddleware;\n }\n\n const core = createCore(finalConfig);\n globalCore = core;\n globalTracer = core.tracer;\n\n const httpConfig = finalConfig.httpConfig;\n if (httpConfig?.agentSchema) {\n core.agentManager.registerSchema(httpConfig.agentSchema);\n }\n\n const agentInfo = finalConfig.httpConfig\n ? {\n agentId: finalConfig.httpConfig.agentId,\n agentIdentifier: finalConfig.httpConfig.agentIdentifier,\n agentName: finalConfig.httpConfig.agentName,\n agentDescription: finalConfig.httpConfig.agentDescription,\n }\n : undefined;\n\n const prefactorMiddleware = new PrefactorMiddleware(core.tracer, core.agentManager, agentInfo);\n\n const middleware = createMiddleware({\n name: 'prefactor',\n // biome-ignore lint/suspicious/noExplicitAny: LangChain middleware hooks use dynamic types\n wrapModelCall: async (request: any, handler: any) => {\n return prefactorMiddleware.wrapModelCall(request, handler);\n },\n // biome-ignore lint/suspicious/noExplicitAny: LangChain middleware hooks use dynamic types\n wrapToolCall: async (request: any, handler: any) => {\n return prefactorMiddleware.wrapToolCall(request, handler);\n },\n // biome-ignore lint/suspicious/noExplicitAny: LangChain middleware hooks use dynamic types\n beforeAgent: async (state: any) => {\n await prefactorMiddleware.beforeAgent(state);\n },\n // biome-ignore lint/suspicious/noExplicitAny: LangChain middleware hooks use dynamic types\n afterAgent: async (state: any) => {\n await prefactorMiddleware.afterAgent(state);\n },\n });\n\n globalMiddleware = middleware;\n globalPrefactorMiddleware = prefactorMiddleware;\n return middleware;\n}\n\n/**\n * Get the current tracer instance.\n *\n * If no tracer has been created yet, this will call init() with default configuration.\n *\n * @returns Tracer instance\n *\n * @example\n * ```typescript\n * import { getTracer } from '@prefactor/langchain';\n *\n * const tracer = getTracer();\n * const span = tracer.startSpan({\n * name: 'custom-operation',\n * spanType: SpanType.TOOL,\n * inputs: { data: 'example' }\n * });\n * ```\n */\nexport function getTracer(): Tracer {\n if (!globalTracer) {\n init();\n }\n // Safe because init() always sets globalTracer\n return globalTracer as Tracer;\n}\n\nexport async function withSpan<T>(\n options: ManualSpanOptions,\n fn: () => Promise<T> | T\n): Promise<T> {\n return withCoreSpan(options, fn);\n}\n\nexport { shutdownCore as shutdown };\n\n// Automatic shutdown on process exit\nprocess.on('beforeExit', () => {\n shutdownCore().catch((error) => {\n console.error('Error during Prefactor SDK shutdown:', error);\n });\n});\n",
|
|
7
|
+
"import {\n type AgentInstanceManager,\n createSpanTypePrefixer,\n getLogger,\n SpanContext,\n SpanType,\n serializeValue,\n type Tracer,\n} from '@prefactor/core';\nimport { extractTokenUsage } from './metadata-extractor.js';\n\nconst toLangchainSpanType = createSpanTypePrefixer('langchain');\nconst logger = getLogger('middleware');\n\n/**\n * Prefactor middleware for LangChain.js agents.\n *\n * This middleware automatically traces LLM calls, tool executions, and agent workflows.\n * It integrates with LangChain.js middleware API to provide transparent instrumentation.\n *\n * Features:\n * - Automatic parent-child span relationships via context propagation\n * - Token usage extraction for LLM calls\n * - Error tracking and debugging\n * - Zero-overhead instrumentation (graceful failure)\n *\n * @example\n * ```typescript\n * import { init } from '@prefactor/langchain';\n * import { createReactAgent } from '@langchain/langgraph/prebuilt';\n *\n * const middleware = init();\n * const agent = createReactAgent({\n * llm: model,\n * tools: [myTool],\n * middleware: [middleware],\n * });\n * ```\n */\nexport class PrefactorMiddleware {\n private rootSpan: ReturnType<Tracer['startSpan']> | null = null;\n private agentInstanceStarted = false;\n\n constructor(\n private tracer: Tracer,\n private agentManager: AgentInstanceManager,\n private agentInfo?: Parameters<AgentInstanceManager['startInstance']>[0]\n ) {}\n\n /**\n * Called before agent execution starts\n *\n * @param state - Agent state containing messages\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain state can be any structure\n async beforeAgent(state: any): Promise<void> {\n const messages = state?.messages ?? [];\n\n this.ensureAgentInstanceStarted();\n\n const span = this.tracer.startSpan({\n name: 'langchain:agent',\n spanType: toLangchainSpanType(SpanType.AGENT),\n inputs: { messages: serializeValue(messages.slice(-3)) },\n });\n\n this.rootSpan = span;\n SpanContext.enter(span);\n }\n\n /**\n * Called after agent execution completes\n *\n * @param state - Agent state containing messages\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain state can be any structure\n async afterAgent(state: any): Promise<void> {\n if (!this.rootSpan) {\n return;\n }\n\n const messages = state?.messages ?? [];\n this.tracer.endSpan(this.rootSpan, {\n outputs: { messages: serializeValue(messages.slice(-3)) },\n });\n\n SpanContext.exit();\n this.rootSpan = null;\n }\n\n shutdown(): void {\n if (this.rootSpan) {\n this.tracer.endSpan(this.rootSpan, {\n outputs: {},\n });\n\n SpanContext.exit();\n this.rootSpan = null;\n }\n\n this.finishAgentInstance();\n }\n\n /**\n * Wrap a model call to trace LLM invocations\n *\n * @param request - Model invocation request\n * @param handler - The actual model call function\n * @returns Promise resolving to the model response\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain request/handler types are dynamic\n async wrapModelCall<T>(request: any, handler: (req: any) => Promise<T>): Promise<T> {\n this.ensureAgentInstanceStarted();\n\n const modelName = this.extractModelName(request);\n const span = this.tracer.startSpan({\n name: 'langchain:llm-call',\n spanType: toLangchainSpanType(SpanType.LLM),\n inputs: {\n ...this.extractModelInputs(request),\n 'langchain.model.name': modelName,\n },\n });\n\n try {\n const response = await SpanContext.runAsync(span, () => handler(request));\n\n const outputs = this.extractModelOutputs(response);\n const tokenUsage = extractTokenUsage(response);\n\n this.tracer.endSpan(span, { outputs, tokenUsage: tokenUsage ?? undefined });\n return response;\n } catch (error) {\n this.tracer.endSpan(span, { error: error as Error });\n throw error;\n }\n }\n\n /**\n * Wrap a tool call to trace tool executions\n *\n * @param request - Tool invocation request\n * @param handler - The actual tool call function\n * @returns Promise resolving to the tool response\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain request/handler types are dynamic\n async wrapToolCall<T>(request: any, handler: (req: any) => Promise<T>): Promise<T> {\n this.ensureAgentInstanceStarted();\n\n const toolName = this.extractToolName(request);\n const span = this.tracer.startSpan({\n name: 'langchain:tool-call',\n spanType: toLangchainSpanType(SpanType.TOOL),\n inputs: {\n ...this.extractToolInputs(request),\n 'langchain.tool.name': toolName,\n },\n });\n\n try {\n const response = await SpanContext.runAsync(span, () => handler(request));\n\n this.tracer.endSpan(span, {\n outputs: this.extractToolOutputs(response),\n });\n return response;\n } catch (error) {\n this.tracer.endSpan(span, { error: error as Error });\n throw error;\n }\n }\n\n /**\n * Extract model name from request\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain request structure is dynamic\n private extractModelName(request: any): string {\n const candidate = request?.model ?? request?.modelName;\n\n if (typeof candidate === 'string') {\n return candidate;\n }\n\n if (candidate && typeof candidate === 'object') {\n const modelObject = candidate as Record<string, unknown>;\n if (\n Array.isArray(modelObject.id) &&\n modelObject.id.every((item) => typeof item === 'string')\n ) {\n return (modelObject.id as string[]).join('.');\n }\n\n if (typeof modelObject.modelName === 'string') {\n return modelObject.modelName;\n }\n\n if (typeof modelObject.name === 'string') {\n return modelObject.name;\n }\n }\n\n return 'unknown';\n }\n\n /**\n * Extract model inputs from request\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain request structure is dynamic\n private extractModelInputs(request: any): Record<string, unknown> {\n const messages = request?.messages ?? [];\n return { messages: serializeValue(messages.slice(-3)) };\n }\n\n /**\n * Extract model outputs from response\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain response structure is dynamic\n private extractModelOutputs(response: any): Record<string, unknown> {\n const content = response?.content ?? response?.text ?? '';\n return { content: serializeValue(content) };\n }\n\n /**\n * Extract tool name from request\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain request structure is dynamic\n private extractToolName(request: any): string {\n return request?.name ?? request?.tool ?? 'unknown';\n }\n\n /**\n * Extract tool inputs from request\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain request structure is dynamic\n private extractToolInputs(request: any): Record<string, unknown> {\n return { input: request?.input ?? request?.args ?? {} };\n }\n\n /**\n * Extract tool outputs from response\n */\n // biome-ignore lint/suspicious/noExplicitAny: LangChain response structure is dynamic\n private extractToolOutputs(response: any): Record<string, unknown> {\n return { output: response?.output ?? response };\n }\n\n private ensureAgentInstanceStarted(): void {\n if (this.agentInstanceStarted) {\n return;\n }\n\n try {\n this.agentManager.startInstance(this.agentInfo);\n this.agentInstanceStarted = true;\n } catch (error) {\n logger.error('Failed to start agent instance:', error);\n }\n }\n\n private finishAgentInstance(): void {\n if (!this.agentInstanceStarted) {\n return;\n }\n\n try {\n this.agentManager.finishInstance();\n this.agentInstanceStarted = false;\n } catch (error) {\n logger.error('Failed to finish agent instance:', error);\n }\n }\n}\n",
|
|
8
8
|
"import type { TokenUsage } from '@prefactor/core';\n\n/**\n * Extract token usage information from LLM responses.\n *\n * Handles multiple response formats from different LLM providers and LangChain versions.\n *\n * @param response - The LLM response object\n * @returns TokenUsage object or null if no usage data found\n *\n * @example\n * ```typescript\n * const response = await model.invoke(messages);\n * const tokenUsage = extractTokenUsage(response);\n * if (tokenUsage) {\n * console.log(`Tokens used: ${tokenUsage.totalTokens}`);\n * }\n * ```\n */\n// biome-ignore lint/suspicious/noExplicitAny: LLM response structure varies by provider\nexport function extractTokenUsage(response: any): TokenUsage | null {\n try {\n // Try token_usage field (common format)\n const tokenUsage = response?.token_usage ?? response?.usage;\n if (tokenUsage) {\n return {\n promptTokens: tokenUsage.prompt_tokens ?? 0,\n completionTokens: tokenUsage.completion_tokens ?? 0,\n totalTokens: tokenUsage.total_tokens ?? 0,\n };\n }\n\n // Try usage_metadata field (LangChain format)\n const usageMetadata = response?.usage_metadata;\n if (usageMetadata) {\n return {\n promptTokens: usageMetadata.input_tokens ?? 0,\n completionTokens: usageMetadata.output_tokens ?? 0,\n totalTokens: usageMetadata.total_tokens ?? 0,\n };\n }\n\n // Try response_metadata.token_usage (nested format)\n const responseMetadata = response?.response_metadata;\n if (responseMetadata?.token_usage) {\n return {\n promptTokens: responseMetadata.token_usage.prompt_tokens ?? 0,\n completionTokens: responseMetadata.token_usage.completion_tokens ?? 0,\n totalTokens: responseMetadata.token_usage.total_tokens ?? 0,\n };\n }\n\n return null;\n } catch {\n return null;\n }\n}\n"
|
|
9
9
|
],
|
|
10
|
-
"mappings": ";AAGA;AAAA;AAAA,cAME;AAAA;AAAA;;;ACTF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,
|
|
11
|
-
"debugId": "
|
|
10
|
+
"mappings": "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",
|
|
11
|
+
"debugId": "B443F3BBF4D3F81264756E2164756E21",
|
|
12
12
|
"names": []
|
|
13
13
|
}
|
package/dist/init.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,MAAM,EAOX,QAAQ,IAAI,YAAY,EACxB,KAAK,MAAM,EAEZ,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,KAAK,eAAe,EAAoB,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,MAAM,EAOX,QAAQ,IAAI,YAAY,EACxB,KAAK,MAAM,EAEZ,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,KAAK,eAAe,EAAoB,MAAM,WAAW,CAAC;AAuCnE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,wBAAgB,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,eAAe,CAwF9D;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAMlC;AAED,wBAAsB,QAAQ,CAAC,CAAC,EAC9B,OAAO,EAAE,iBAAiB,EAC1B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GACvB,OAAO,CAAC,CAAC,CAAC,CAEZ;AAED,OAAO,EAAE,YAAY,IAAI,QAAQ,EAAE,CAAC"}
|
package/dist/init.js
CHANGED
|
@@ -3,24 +3,33 @@ import { createMiddleware } from 'langchain';
|
|
|
3
3
|
import { PrefactorMiddleware } from './middleware.js';
|
|
4
4
|
const logger = getLogger('init');
|
|
5
5
|
const DEFAULT_LANGCHAIN_AGENT_SCHEMA = {
|
|
6
|
-
external_identifier: '
|
|
6
|
+
external_identifier: 'langchain-schema',
|
|
7
7
|
span_schemas: {
|
|
8
|
-
agent: { type: 'object', additionalProperties: true },
|
|
9
|
-
llm: { type: 'object', additionalProperties: true },
|
|
10
|
-
tool: { type: 'object', additionalProperties: true },
|
|
11
|
-
chain: { type: 'object', additionalProperties: true },
|
|
8
|
+
'langchain:agent': { type: 'object', additionalProperties: true },
|
|
9
|
+
'langchain:llm': { type: 'object', additionalProperties: true },
|
|
10
|
+
'langchain:tool': { type: 'object', additionalProperties: true },
|
|
11
|
+
'langchain:chain': { type: 'object', additionalProperties: true },
|
|
12
|
+
},
|
|
13
|
+
span_result_schemas: {
|
|
14
|
+
'langchain:agent': { type: 'object', additionalProperties: true },
|
|
15
|
+
'langchain:llm': { type: 'object', additionalProperties: true },
|
|
16
|
+
'langchain:tool': { type: 'object', additionalProperties: true },
|
|
17
|
+
'langchain:chain': { type: 'object', additionalProperties: true },
|
|
12
18
|
},
|
|
13
19
|
};
|
|
14
20
|
let globalCore = null;
|
|
15
21
|
let globalTracer = null;
|
|
16
22
|
let globalMiddleware = null;
|
|
23
|
+
let globalPrefactorMiddleware = null;
|
|
17
24
|
registerShutdownHandler('prefactor-langchain', () => {
|
|
25
|
+
globalPrefactorMiddleware?.shutdown();
|
|
18
26
|
if (globalCore) {
|
|
19
27
|
logger.info('Shutting down Prefactor SDK');
|
|
20
28
|
}
|
|
21
29
|
globalCore = null;
|
|
22
30
|
globalTracer = null;
|
|
23
31
|
globalMiddleware = null;
|
|
32
|
+
globalPrefactorMiddleware = null;
|
|
24
33
|
});
|
|
25
34
|
/**
|
|
26
35
|
* Initialize the Prefactor SDK and return middleware for LangChain.js
|
|
@@ -137,6 +146,7 @@ export function init(config) {
|
|
|
137
146
|
},
|
|
138
147
|
});
|
|
139
148
|
globalMiddleware = middleware;
|
|
149
|
+
globalPrefactorMiddleware = prefactorMiddleware;
|
|
140
150
|
return middleware;
|
|
141
151
|
}
|
|
142
152
|
/**
|
package/dist/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,SAAS,EACT,uBAAuB,EACvB,QAAQ,IAAI,YAAY,EAExB,QAAQ,IAAI,YAAY,GACzB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAwB,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;AAEjC,MAAM,8BAA8B,GAAG;IACrC,mBAAmB,EAAE,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
|
package/dist/middleware.d.ts
CHANGED
|
@@ -29,6 +29,7 @@ export declare class PrefactorMiddleware {
|
|
|
29
29
|
private agentManager;
|
|
30
30
|
private agentInfo?;
|
|
31
31
|
private rootSpan;
|
|
32
|
+
private agentInstanceStarted;
|
|
32
33
|
constructor(tracer: Tracer, agentManager: AgentInstanceManager, agentInfo?: Parameters<AgentInstanceManager['startInstance']>[0]);
|
|
33
34
|
/**
|
|
34
35
|
* Called before agent execution starts
|
|
@@ -42,6 +43,7 @@ export declare class PrefactorMiddleware {
|
|
|
42
43
|
* @param state - Agent state containing messages
|
|
43
44
|
*/
|
|
44
45
|
afterAgent(state: any): Promise<void>;
|
|
46
|
+
shutdown(): void;
|
|
45
47
|
/**
|
|
46
48
|
* Wrap a model call to trace LLM invocations
|
|
47
49
|
*
|
|
@@ -82,5 +84,7 @@ export declare class PrefactorMiddleware {
|
|
|
82
84
|
* Extract tool outputs from response
|
|
83
85
|
*/
|
|
84
86
|
private extractToolOutputs;
|
|
87
|
+
private ensureAgentInstanceStarted;
|
|
88
|
+
private finishAgentInstance;
|
|
85
89
|
}
|
|
86
90
|
//# sourceMappingURL=middleware.d.ts.map
|
package/dist/middleware.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,oBAAoB,
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,oBAAoB,EAMzB,KAAK,MAAM,EACZ,MAAM,iBAAiB,CAAC;AAMzB;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,mBAAmB;IAK5B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,SAAS,CAAC;IANpB,OAAO,CAAC,QAAQ,CAAgD;IAChE,OAAO,CAAC,oBAAoB,CAAS;gBAG3B,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,oBAAoB,EAClC,SAAS,CAAC,EAAE,UAAU,CAAC,oBAAoB,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;IAG1E;;;;OAIG;IAEG,WAAW,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAe5C;;;;OAIG;IAEG,UAAU,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAc3C,QAAQ,IAAI,IAAI;IAahB;;;;;;OAMG;IAEG,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IA2BnF;;;;;;OAMG;IAEG,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IA0BlF;;OAEG;IAEH,OAAO,CAAC,gBAAgB;IA4BxB;;OAEG;IAEH,OAAO,CAAC,kBAAkB;IAK1B;;OAEG;IAEH,OAAO,CAAC,mBAAmB;IAK3B;;OAEG;IAEH,OAAO,CAAC,eAAe;IAIvB;;OAEG;IAEH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IAEH,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,0BAA0B;IAalC,OAAO,CAAC,mBAAmB;CAY5B"}
|
package/dist/middleware.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import { SpanContext, SpanType, serializeValue, } from '@prefactor/core';
|
|
1
|
+
import { createSpanTypePrefixer, getLogger, SpanContext, SpanType, serializeValue, } from '@prefactor/core';
|
|
2
2
|
import { extractTokenUsage } from './metadata-extractor.js';
|
|
3
|
+
const toLangchainSpanType = createSpanTypePrefixer('langchain');
|
|
4
|
+
const logger = getLogger('middleware');
|
|
3
5
|
/**
|
|
4
6
|
* Prefactor middleware for LangChain.js agents.
|
|
5
7
|
*
|
|
@@ -30,6 +32,7 @@ export class PrefactorMiddleware {
|
|
|
30
32
|
agentManager;
|
|
31
33
|
agentInfo;
|
|
32
34
|
rootSpan = null;
|
|
35
|
+
agentInstanceStarted = false;
|
|
33
36
|
constructor(tracer, agentManager, agentInfo) {
|
|
34
37
|
this.tracer = tracer;
|
|
35
38
|
this.agentManager = agentManager;
|
|
@@ -43,10 +46,10 @@ export class PrefactorMiddleware {
|
|
|
43
46
|
// biome-ignore lint/suspicious/noExplicitAny: LangChain state can be any structure
|
|
44
47
|
async beforeAgent(state) {
|
|
45
48
|
const messages = state?.messages ?? [];
|
|
46
|
-
this.
|
|
49
|
+
this.ensureAgentInstanceStarted();
|
|
47
50
|
const span = this.tracer.startSpan({
|
|
48
51
|
name: 'langchain:agent',
|
|
49
|
-
spanType: SpanType.AGENT,
|
|
52
|
+
spanType: toLangchainSpanType(SpanType.AGENT),
|
|
50
53
|
inputs: { messages: serializeValue(messages.slice(-3)) },
|
|
51
54
|
});
|
|
52
55
|
this.rootSpan = span;
|
|
@@ -66,10 +69,19 @@ export class PrefactorMiddleware {
|
|
|
66
69
|
this.tracer.endSpan(this.rootSpan, {
|
|
67
70
|
outputs: { messages: serializeValue(messages.slice(-3)) },
|
|
68
71
|
});
|
|
69
|
-
this.agentManager.finishInstance();
|
|
70
72
|
SpanContext.exit();
|
|
71
73
|
this.rootSpan = null;
|
|
72
74
|
}
|
|
75
|
+
shutdown() {
|
|
76
|
+
if (this.rootSpan) {
|
|
77
|
+
this.tracer.endSpan(this.rootSpan, {
|
|
78
|
+
outputs: {},
|
|
79
|
+
});
|
|
80
|
+
SpanContext.exit();
|
|
81
|
+
this.rootSpan = null;
|
|
82
|
+
}
|
|
83
|
+
this.finishAgentInstance();
|
|
84
|
+
}
|
|
73
85
|
/**
|
|
74
86
|
* Wrap a model call to trace LLM invocations
|
|
75
87
|
*
|
|
@@ -79,20 +91,18 @@ export class PrefactorMiddleware {
|
|
|
79
91
|
*/
|
|
80
92
|
// biome-ignore lint/suspicious/noExplicitAny: LangChain request/handler types are dynamic
|
|
81
93
|
async wrapModelCall(request, handler) {
|
|
94
|
+
this.ensureAgentInstanceStarted();
|
|
82
95
|
const modelName = this.extractModelName(request);
|
|
83
96
|
const span = this.tracer.startSpan({
|
|
84
97
|
name: 'langchain:llm-call',
|
|
85
|
-
spanType: SpanType.LLM,
|
|
98
|
+
spanType: toLangchainSpanType(SpanType.LLM),
|
|
86
99
|
inputs: {
|
|
87
100
|
...this.extractModelInputs(request),
|
|
88
101
|
'langchain.model.name': modelName,
|
|
89
102
|
},
|
|
90
103
|
});
|
|
91
104
|
try {
|
|
92
|
-
|
|
93
|
-
const response = await SpanContext.runAsync(span, async () => {
|
|
94
|
-
return handler(request);
|
|
95
|
-
});
|
|
105
|
+
const response = await SpanContext.runAsync(span, () => handler(request));
|
|
96
106
|
const outputs = this.extractModelOutputs(response);
|
|
97
107
|
const tokenUsage = extractTokenUsage(response);
|
|
98
108
|
this.tracer.endSpan(span, { outputs, tokenUsage: tokenUsage ?? undefined });
|
|
@@ -112,20 +122,18 @@ export class PrefactorMiddleware {
|
|
|
112
122
|
*/
|
|
113
123
|
// biome-ignore lint/suspicious/noExplicitAny: LangChain request/handler types are dynamic
|
|
114
124
|
async wrapToolCall(request, handler) {
|
|
125
|
+
this.ensureAgentInstanceStarted();
|
|
115
126
|
const toolName = this.extractToolName(request);
|
|
116
127
|
const span = this.tracer.startSpan({
|
|
117
128
|
name: 'langchain:tool-call',
|
|
118
|
-
spanType: SpanType.TOOL,
|
|
129
|
+
spanType: toLangchainSpanType(SpanType.TOOL),
|
|
119
130
|
inputs: {
|
|
120
131
|
...this.extractToolInputs(request),
|
|
121
132
|
'langchain.tool.name': toolName,
|
|
122
133
|
},
|
|
123
134
|
});
|
|
124
135
|
try {
|
|
125
|
-
|
|
126
|
-
const response = await SpanContext.runAsync(span, async () => {
|
|
127
|
-
return handler(request);
|
|
128
|
-
});
|
|
136
|
+
const response = await SpanContext.runAsync(span, () => handler(request));
|
|
129
137
|
this.tracer.endSpan(span, {
|
|
130
138
|
outputs: this.extractToolOutputs(response),
|
|
131
139
|
});
|
|
@@ -197,5 +205,29 @@ export class PrefactorMiddleware {
|
|
|
197
205
|
extractToolOutputs(response) {
|
|
198
206
|
return { output: response?.output ?? response };
|
|
199
207
|
}
|
|
208
|
+
ensureAgentInstanceStarted() {
|
|
209
|
+
if (this.agentInstanceStarted) {
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
try {
|
|
213
|
+
this.agentManager.startInstance(this.agentInfo);
|
|
214
|
+
this.agentInstanceStarted = true;
|
|
215
|
+
}
|
|
216
|
+
catch (error) {
|
|
217
|
+
logger.error('Failed to start agent instance:', error);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
finishAgentInstance() {
|
|
221
|
+
if (!this.agentInstanceStarted) {
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
try {
|
|
225
|
+
this.agentManager.finishInstance();
|
|
226
|
+
this.agentInstanceStarted = false;
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
logger.error('Failed to finish agent instance:', error);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
200
232
|
}
|
|
201
233
|
//# sourceMappingURL=middleware.js.map
|
package/dist/middleware.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,WAAW,EACX,QAAQ,EACR,cAAc,GAEf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,OAAO,mBAAmB;
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prefactor/langchain",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.6",
|
|
4
4
|
"description": "LangChain.js integration for Prefactor observability",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.cjs",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"author": "Prefactor",
|
|
29
29
|
"license": "MIT",
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@prefactor/core": "0.2.
|
|
31
|
+
"@prefactor/core": "0.2.6",
|
|
32
32
|
"@prefactor/pfid": "^0.1.0"
|
|
33
33
|
},
|
|
34
34
|
"peerDependencies": {
|