@prefactor/langchain 0.2.0 → 0.2.2
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 +86 -32
- package/dist/index.cjs.map +5 -5
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +96 -35
- package/dist/index.js.map +5 -5
- package/dist/init.d.ts +18 -22
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +62 -47
- package/dist/init.js.map +1 -1
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +35 -10
- package/dist/middleware.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -29,7 +29,8 @@ var __export = (target, all) => {
|
|
|
29
29
|
// packages/langchain/src/index.ts
|
|
30
30
|
var exports_src = {};
|
|
31
31
|
__export(exports_src, {
|
|
32
|
-
|
|
32
|
+
withSpan: () => withSpan,
|
|
33
|
+
shutdown: () => import_core3.shutdown,
|
|
33
34
|
init: () => init,
|
|
34
35
|
getTracer: () => getTracer,
|
|
35
36
|
extractTokenUsage: () => extractTokenUsage,
|
|
@@ -97,7 +98,7 @@ class PrefactorMiddleware {
|
|
|
97
98
|
const span = this.tracer.startSpan({
|
|
98
99
|
name: "langchain:agent",
|
|
99
100
|
spanType: import_core.SpanType.AGENT,
|
|
100
|
-
inputs: { messages: messages.slice(-3)
|
|
101
|
+
inputs: { messages: import_core.serializeValue(messages.slice(-3)) }
|
|
101
102
|
});
|
|
102
103
|
this.rootSpan = span;
|
|
103
104
|
import_core.SpanContext.enter(span);
|
|
@@ -108,17 +109,21 @@ class PrefactorMiddleware {
|
|
|
108
109
|
}
|
|
109
110
|
const messages = state?.messages ?? [];
|
|
110
111
|
this.tracer.endSpan(this.rootSpan, {
|
|
111
|
-
outputs: { messages: messages.slice(-3)
|
|
112
|
+
outputs: { messages: import_core.serializeValue(messages.slice(-3)) }
|
|
112
113
|
});
|
|
113
114
|
this.agentManager.finishInstance();
|
|
114
115
|
import_core.SpanContext.exit();
|
|
115
116
|
this.rootSpan = null;
|
|
116
117
|
}
|
|
117
118
|
async wrapModelCall(request, handler) {
|
|
119
|
+
const modelName = this.extractModelName(request);
|
|
118
120
|
const span = this.tracer.startSpan({
|
|
119
|
-
name:
|
|
121
|
+
name: "langchain:llm-call",
|
|
120
122
|
spanType: import_core.SpanType.LLM,
|
|
121
|
-
inputs:
|
|
123
|
+
inputs: {
|
|
124
|
+
...this.extractModelInputs(request),
|
|
125
|
+
"langchain.model.name": modelName
|
|
126
|
+
}
|
|
122
127
|
});
|
|
123
128
|
try {
|
|
124
129
|
const response = await import_core.SpanContext.runAsync(span, async () => {
|
|
@@ -134,10 +139,14 @@ class PrefactorMiddleware {
|
|
|
134
139
|
}
|
|
135
140
|
}
|
|
136
141
|
async wrapToolCall(request, handler) {
|
|
142
|
+
const toolName = this.extractToolName(request);
|
|
137
143
|
const span = this.tracer.startSpan({
|
|
138
|
-
name:
|
|
144
|
+
name: "langchain:tool-call",
|
|
139
145
|
spanType: import_core.SpanType.TOOL,
|
|
140
|
-
inputs:
|
|
146
|
+
inputs: {
|
|
147
|
+
...this.extractToolInputs(request),
|
|
148
|
+
"langchain.tool.name": toolName
|
|
149
|
+
}
|
|
141
150
|
});
|
|
142
151
|
try {
|
|
143
152
|
const response = await import_core.SpanContext.runAsync(span, async () => {
|
|
@@ -153,15 +162,31 @@ class PrefactorMiddleware {
|
|
|
153
162
|
}
|
|
154
163
|
}
|
|
155
164
|
extractModelName(request) {
|
|
156
|
-
|
|
165
|
+
const candidate = request?.model ?? request?.modelName;
|
|
166
|
+
if (typeof candidate === "string") {
|
|
167
|
+
return candidate;
|
|
168
|
+
}
|
|
169
|
+
if (candidate && typeof candidate === "object") {
|
|
170
|
+
const modelObject = candidate;
|
|
171
|
+
if (Array.isArray(modelObject.id) && modelObject.id.every((item) => typeof item === "string")) {
|
|
172
|
+
return modelObject.id.join(".");
|
|
173
|
+
}
|
|
174
|
+
if (typeof modelObject.modelName === "string") {
|
|
175
|
+
return modelObject.modelName;
|
|
176
|
+
}
|
|
177
|
+
if (typeof modelObject.name === "string") {
|
|
178
|
+
return modelObject.name;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return "unknown";
|
|
157
182
|
}
|
|
158
183
|
extractModelInputs(request) {
|
|
159
184
|
const messages = request?.messages ?? [];
|
|
160
|
-
return { messages: messages.slice(-3)
|
|
185
|
+
return { messages: import_core.serializeValue(messages.slice(-3)) };
|
|
161
186
|
}
|
|
162
187
|
extractModelOutputs(response) {
|
|
163
188
|
const content = response?.content ?? response?.text ?? "";
|
|
164
|
-
return { content:
|
|
189
|
+
return { content: import_core.serializeValue(content) };
|
|
165
190
|
}
|
|
166
191
|
extractToolName(request) {
|
|
167
192
|
return request?.name ?? request?.tool ?? "unknown";
|
|
@@ -176,19 +201,58 @@ class PrefactorMiddleware {
|
|
|
176
201
|
|
|
177
202
|
// packages/langchain/src/init.ts
|
|
178
203
|
var logger = import_core2.getLogger("init");
|
|
204
|
+
var DEFAULT_LANGCHAIN_AGENT_SCHEMA = {
|
|
205
|
+
external_identifier: "prefactor",
|
|
206
|
+
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 }
|
|
211
|
+
}
|
|
212
|
+
};
|
|
179
213
|
var globalCore = null;
|
|
180
214
|
var globalTracer = null;
|
|
181
215
|
var globalMiddleware = null;
|
|
216
|
+
import_core2.registerShutdownHandler("prefactor-langchain", () => {
|
|
217
|
+
if (globalCore) {
|
|
218
|
+
logger.info("Shutting down Prefactor SDK");
|
|
219
|
+
}
|
|
220
|
+
globalCore = null;
|
|
221
|
+
globalTracer = null;
|
|
222
|
+
globalMiddleware = null;
|
|
223
|
+
});
|
|
182
224
|
function init(config) {
|
|
183
225
|
import_core2.configureLogging();
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
226
|
+
let configWithHttp = config;
|
|
227
|
+
const transportType = config?.transportType ?? process.env.PREFACTOR_TRANSPORT ?? "http";
|
|
228
|
+
if (transportType === "http" && !config?.httpConfig) {
|
|
229
|
+
const apiUrl = process.env.PREFACTOR_API_URL;
|
|
230
|
+
const apiToken = process.env.PREFACTOR_API_TOKEN;
|
|
231
|
+
if (!apiUrl || !apiToken) {
|
|
232
|
+
throw new Error("HTTP transport requires PREFACTOR_API_URL and PREFACTOR_API_TOKEN environment variables, " + "or httpConfig to be provided in configuration");
|
|
233
|
+
}
|
|
234
|
+
configWithHttp = {
|
|
235
|
+
...config,
|
|
236
|
+
transportType: "http",
|
|
237
|
+
httpConfig: {
|
|
238
|
+
apiUrl,
|
|
239
|
+
apiToken,
|
|
240
|
+
agentId: process.env.PREFACTOR_AGENT_ID,
|
|
241
|
+
agentName: process.env.PREFACTOR_AGENT_NAME,
|
|
242
|
+
agentIdentifier: process.env.PREFACTOR_AGENT_IDENTIFIER || "1.0.0",
|
|
243
|
+
agentSchema: DEFAULT_LANGCHAIN_AGENT_SCHEMA
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
} else if (transportType === "http" && config?.httpConfig && !config.httpConfig.agentSchema) {
|
|
247
|
+
configWithHttp = {
|
|
248
|
+
...config,
|
|
249
|
+
httpConfig: {
|
|
250
|
+
...config.httpConfig,
|
|
251
|
+
agentSchema: DEFAULT_LANGCHAIN_AGENT_SCHEMA
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
const finalConfig = import_core2.createConfig(configWithHttp);
|
|
192
256
|
if (globalMiddleware !== null) {
|
|
193
257
|
return globalMiddleware;
|
|
194
258
|
}
|
|
@@ -198,10 +262,6 @@ function init(config) {
|
|
|
198
262
|
const httpConfig = finalConfig.httpConfig;
|
|
199
263
|
if (httpConfig?.agentSchema) {
|
|
200
264
|
core.agentManager.registerSchema(httpConfig.agentSchema);
|
|
201
|
-
} else if (finalConfig.transportType === "http" && (httpConfig?.agentSchemaIdentifier || httpConfig?.skipSchema)) {
|
|
202
|
-
logger.debug("Skipping default schema registration based on httpConfig");
|
|
203
|
-
} else {
|
|
204
|
-
core.agentManager.registerSchema(import_core2.DEFAULT_AGENT_SCHEMA);
|
|
205
265
|
}
|
|
206
266
|
const agentInfo = finalConfig.httpConfig ? {
|
|
207
267
|
agentId: finalConfig.httpConfig.agentId,
|
|
@@ -234,19 +294,13 @@ function getTracer() {
|
|
|
234
294
|
}
|
|
235
295
|
return globalTracer;
|
|
236
296
|
}
|
|
237
|
-
async function
|
|
238
|
-
|
|
239
|
-
logger.info("Shutting down Prefactor SDK");
|
|
240
|
-
await globalCore.shutdown();
|
|
241
|
-
}
|
|
242
|
-
globalCore = null;
|
|
243
|
-
globalTracer = null;
|
|
244
|
-
globalMiddleware = null;
|
|
297
|
+
async function withSpan(options, fn) {
|
|
298
|
+
return import_core2.withSpan(options, fn);
|
|
245
299
|
}
|
|
246
300
|
process.on("beforeExit", () => {
|
|
247
|
-
shutdown().catch((error) => {
|
|
301
|
+
import_core2.shutdown().catch((error) => {
|
|
248
302
|
console.error("Error during Prefactor SDK shutdown:", error);
|
|
249
303
|
});
|
|
250
304
|
});
|
|
251
305
|
|
|
252
|
-
//# debugId=
|
|
306
|
+
//# debugId=FABC243F7F9B6F2B64756E2164756E21
|
package/dist/index.cjs.map
CHANGED
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts", "../src/init.ts", "../src/middleware.ts", "../src/metadata-extractor.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
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} from '@prefactor/core';\nexport { getTracer, init,
|
|
6
|
-
"import {\n type Config,\n type CoreRuntime,\n configureLogging,\n createConfig,\n createCore,\n
|
|
7
|
-
"import {
|
|
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: 'prefactor',\n span_schemas: {\n agent: { type: 'object', additionalProperties: true },\n llm: { type: 'object', additionalProperties: true },\n tool: { type: 'object', additionalProperties: true },\n 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;\n\nregisterShutdownHandler('prefactor-langchain', () => {\n if (globalCore) {\n logger.info('Shutting down Prefactor SDK');\n }\n\n globalCore = null;\n globalTracer = null;\n globalMiddleware = 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 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 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.agentManager.startInstance(this.agentInfo);\n\n const span = this.tracer.startSpan({\n name: 'langchain:agent',\n spanType: 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 this.agentManager.finishInstance();\n SpanContext.exit();\n this.rootSpan = null;\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 const modelName = this.extractModelName(request);\n const span = this.tracer.startSpan({\n name: 'langchain:llm-call',\n spanType: SpanType.LLM,\n inputs: {\n ...this.extractModelInputs(request),\n 'langchain.model.name': modelName,\n },\n });\n\n try {\n // CRITICAL: Wrap handler in context so child operations see this span\n const response = await SpanContext.runAsync(span, async () => {\n return handler(request);\n });\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 const toolName = this.extractToolName(request);\n const span = this.tracer.startSpan({\n name: 'langchain:tool-call',\n spanType: SpanType.TOOL,\n inputs: {\n ...this.extractToolInputs(request),\n 'langchain.tool.name': toolName,\n },\n });\n\n try {\n // CRITICAL: Wrap handler in context so child operations see this span\n const response = await SpanContext.runAsync(span, async () => {\n return handler(request);\n });\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",
|
|
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": "
|
|
11
|
-
"debugId": "
|
|
10
|
+
"mappings": "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",
|
|
11
|
+
"debugId": "FABC243F7F9B6F2B64756E2164756E21",
|
|
12
12
|
"names": []
|
|
13
13
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { type Config, type CoreRuntime, type HttpTransportConfig, type Span, SpanStatus, SpanType, } from '@prefactor/core';
|
|
2
|
-
export { getTracer, init,
|
|
1
|
+
export { type Config, type CoreRuntime, type HttpTransportConfig, type Span, SpanStatus, SpanType, shutdown, } from '@prefactor/core';
|
|
2
|
+
export { getTracer, init, withSpan } from './init.js';
|
|
3
3
|
export { extractTokenUsage } from './metadata-extractor.js';
|
|
4
4
|
export { PrefactorMiddleware } from './middleware.js';
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,MAAM,EACX,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,KAAK,IAAI,EACT,UAAU,EACV,QAAQ,GACT,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,MAAM,EACX,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,KAAK,IAAI,EACT,UAAU,EACV,QAAQ,EACR,QAAQ,GACT,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
// packages/langchain/src/index.ts
|
|
2
2
|
import {
|
|
3
3
|
SpanStatus,
|
|
4
|
-
SpanType as SpanType2
|
|
4
|
+
SpanType as SpanType2,
|
|
5
|
+
shutdown
|
|
5
6
|
} from "@prefactor/core";
|
|
6
7
|
|
|
7
8
|
// packages/langchain/src/init.ts
|
|
@@ -9,13 +10,19 @@ import {
|
|
|
9
10
|
configureLogging,
|
|
10
11
|
createConfig,
|
|
11
12
|
createCore,
|
|
12
|
-
|
|
13
|
-
|
|
13
|
+
getLogger,
|
|
14
|
+
registerShutdownHandler,
|
|
15
|
+
shutdown as shutdownCore,
|
|
16
|
+
withSpan as withCoreSpan
|
|
14
17
|
} from "@prefactor/core";
|
|
15
18
|
import { createMiddleware } from "langchain";
|
|
16
19
|
|
|
17
20
|
// packages/langchain/src/middleware.ts
|
|
18
|
-
import {
|
|
21
|
+
import {
|
|
22
|
+
SpanContext,
|
|
23
|
+
SpanType,
|
|
24
|
+
serializeValue
|
|
25
|
+
} from "@prefactor/core";
|
|
19
26
|
|
|
20
27
|
// packages/langchain/src/metadata-extractor.ts
|
|
21
28
|
function extractTokenUsage(response) {
|
|
@@ -67,7 +74,7 @@ class PrefactorMiddleware {
|
|
|
67
74
|
const span = this.tracer.startSpan({
|
|
68
75
|
name: "langchain:agent",
|
|
69
76
|
spanType: SpanType.AGENT,
|
|
70
|
-
inputs: { messages: messages.slice(-3)
|
|
77
|
+
inputs: { messages: serializeValue(messages.slice(-3)) }
|
|
71
78
|
});
|
|
72
79
|
this.rootSpan = span;
|
|
73
80
|
SpanContext.enter(span);
|
|
@@ -78,17 +85,21 @@ class PrefactorMiddleware {
|
|
|
78
85
|
}
|
|
79
86
|
const messages = state?.messages ?? [];
|
|
80
87
|
this.tracer.endSpan(this.rootSpan, {
|
|
81
|
-
outputs: { messages: messages.slice(-3)
|
|
88
|
+
outputs: { messages: serializeValue(messages.slice(-3)) }
|
|
82
89
|
});
|
|
83
90
|
this.agentManager.finishInstance();
|
|
84
91
|
SpanContext.exit();
|
|
85
92
|
this.rootSpan = null;
|
|
86
93
|
}
|
|
87
94
|
async wrapModelCall(request, handler) {
|
|
95
|
+
const modelName = this.extractModelName(request);
|
|
88
96
|
const span = this.tracer.startSpan({
|
|
89
|
-
name:
|
|
97
|
+
name: "langchain:llm-call",
|
|
90
98
|
spanType: SpanType.LLM,
|
|
91
|
-
inputs:
|
|
99
|
+
inputs: {
|
|
100
|
+
...this.extractModelInputs(request),
|
|
101
|
+
"langchain.model.name": modelName
|
|
102
|
+
}
|
|
92
103
|
});
|
|
93
104
|
try {
|
|
94
105
|
const response = await SpanContext.runAsync(span, async () => {
|
|
@@ -104,10 +115,14 @@ class PrefactorMiddleware {
|
|
|
104
115
|
}
|
|
105
116
|
}
|
|
106
117
|
async wrapToolCall(request, handler) {
|
|
118
|
+
const toolName = this.extractToolName(request);
|
|
107
119
|
const span = this.tracer.startSpan({
|
|
108
|
-
name:
|
|
120
|
+
name: "langchain:tool-call",
|
|
109
121
|
spanType: SpanType.TOOL,
|
|
110
|
-
inputs:
|
|
122
|
+
inputs: {
|
|
123
|
+
...this.extractToolInputs(request),
|
|
124
|
+
"langchain.tool.name": toolName
|
|
125
|
+
}
|
|
111
126
|
});
|
|
112
127
|
try {
|
|
113
128
|
const response = await SpanContext.runAsync(span, async () => {
|
|
@@ -123,15 +138,31 @@ class PrefactorMiddleware {
|
|
|
123
138
|
}
|
|
124
139
|
}
|
|
125
140
|
extractModelName(request) {
|
|
126
|
-
|
|
141
|
+
const candidate = request?.model ?? request?.modelName;
|
|
142
|
+
if (typeof candidate === "string") {
|
|
143
|
+
return candidate;
|
|
144
|
+
}
|
|
145
|
+
if (candidate && typeof candidate === "object") {
|
|
146
|
+
const modelObject = candidate;
|
|
147
|
+
if (Array.isArray(modelObject.id) && modelObject.id.every((item) => typeof item === "string")) {
|
|
148
|
+
return modelObject.id.join(".");
|
|
149
|
+
}
|
|
150
|
+
if (typeof modelObject.modelName === "string") {
|
|
151
|
+
return modelObject.modelName;
|
|
152
|
+
}
|
|
153
|
+
if (typeof modelObject.name === "string") {
|
|
154
|
+
return modelObject.name;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return "unknown";
|
|
127
158
|
}
|
|
128
159
|
extractModelInputs(request) {
|
|
129
160
|
const messages = request?.messages ?? [];
|
|
130
|
-
return { messages: messages.slice(-3)
|
|
161
|
+
return { messages: serializeValue(messages.slice(-3)) };
|
|
131
162
|
}
|
|
132
163
|
extractModelOutputs(response) {
|
|
133
164
|
const content = response?.content ?? response?.text ?? "";
|
|
134
|
-
return { content:
|
|
165
|
+
return { content: serializeValue(content) };
|
|
135
166
|
}
|
|
136
167
|
extractToolName(request) {
|
|
137
168
|
return request?.name ?? request?.tool ?? "unknown";
|
|
@@ -146,19 +177,58 @@ class PrefactorMiddleware {
|
|
|
146
177
|
|
|
147
178
|
// packages/langchain/src/init.ts
|
|
148
179
|
var logger = getLogger("init");
|
|
180
|
+
var DEFAULT_LANGCHAIN_AGENT_SCHEMA = {
|
|
181
|
+
external_identifier: "prefactor",
|
|
182
|
+
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 }
|
|
187
|
+
}
|
|
188
|
+
};
|
|
149
189
|
var globalCore = null;
|
|
150
190
|
var globalTracer = null;
|
|
151
191
|
var globalMiddleware = null;
|
|
192
|
+
registerShutdownHandler("prefactor-langchain", () => {
|
|
193
|
+
if (globalCore) {
|
|
194
|
+
logger.info("Shutting down Prefactor SDK");
|
|
195
|
+
}
|
|
196
|
+
globalCore = null;
|
|
197
|
+
globalTracer = null;
|
|
198
|
+
globalMiddleware = null;
|
|
199
|
+
});
|
|
152
200
|
function init(config) {
|
|
153
201
|
configureLogging();
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
202
|
+
let configWithHttp = config;
|
|
203
|
+
const transportType = config?.transportType ?? process.env.PREFACTOR_TRANSPORT ?? "http";
|
|
204
|
+
if (transportType === "http" && !config?.httpConfig) {
|
|
205
|
+
const apiUrl = process.env.PREFACTOR_API_URL;
|
|
206
|
+
const apiToken = process.env.PREFACTOR_API_TOKEN;
|
|
207
|
+
if (!apiUrl || !apiToken) {
|
|
208
|
+
throw new Error("HTTP transport requires PREFACTOR_API_URL and PREFACTOR_API_TOKEN environment variables, " + "or httpConfig to be provided in configuration");
|
|
209
|
+
}
|
|
210
|
+
configWithHttp = {
|
|
211
|
+
...config,
|
|
212
|
+
transportType: "http",
|
|
213
|
+
httpConfig: {
|
|
214
|
+
apiUrl,
|
|
215
|
+
apiToken,
|
|
216
|
+
agentId: process.env.PREFACTOR_AGENT_ID,
|
|
217
|
+
agentName: process.env.PREFACTOR_AGENT_NAME,
|
|
218
|
+
agentIdentifier: process.env.PREFACTOR_AGENT_IDENTIFIER || "1.0.0",
|
|
219
|
+
agentSchema: DEFAULT_LANGCHAIN_AGENT_SCHEMA
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
} else if (transportType === "http" && config?.httpConfig && !config.httpConfig.agentSchema) {
|
|
223
|
+
configWithHttp = {
|
|
224
|
+
...config,
|
|
225
|
+
httpConfig: {
|
|
226
|
+
...config.httpConfig,
|
|
227
|
+
agentSchema: DEFAULT_LANGCHAIN_AGENT_SCHEMA
|
|
228
|
+
}
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
const finalConfig = createConfig(configWithHttp);
|
|
162
232
|
if (globalMiddleware !== null) {
|
|
163
233
|
return globalMiddleware;
|
|
164
234
|
}
|
|
@@ -168,10 +238,6 @@ function init(config) {
|
|
|
168
238
|
const httpConfig = finalConfig.httpConfig;
|
|
169
239
|
if (httpConfig?.agentSchema) {
|
|
170
240
|
core.agentManager.registerSchema(httpConfig.agentSchema);
|
|
171
|
-
} else if (finalConfig.transportType === "http" && (httpConfig?.agentSchemaIdentifier || httpConfig?.skipSchema)) {
|
|
172
|
-
logger.debug("Skipping default schema registration based on httpConfig");
|
|
173
|
-
} else {
|
|
174
|
-
core.agentManager.registerSchema(DEFAULT_AGENT_SCHEMA);
|
|
175
241
|
}
|
|
176
242
|
const agentInfo = finalConfig.httpConfig ? {
|
|
177
243
|
agentId: finalConfig.httpConfig.agentId,
|
|
@@ -204,21 +270,16 @@ function getTracer() {
|
|
|
204
270
|
}
|
|
205
271
|
return globalTracer;
|
|
206
272
|
}
|
|
207
|
-
async function
|
|
208
|
-
|
|
209
|
-
logger.info("Shutting down Prefactor SDK");
|
|
210
|
-
await globalCore.shutdown();
|
|
211
|
-
}
|
|
212
|
-
globalCore = null;
|
|
213
|
-
globalTracer = null;
|
|
214
|
-
globalMiddleware = null;
|
|
273
|
+
async function withSpan(options, fn) {
|
|
274
|
+
return withCoreSpan(options, fn);
|
|
215
275
|
}
|
|
216
276
|
process.on("beforeExit", () => {
|
|
217
|
-
|
|
277
|
+
shutdownCore().catch((error) => {
|
|
218
278
|
console.error("Error during Prefactor SDK shutdown:", error);
|
|
219
279
|
});
|
|
220
280
|
});
|
|
221
281
|
export {
|
|
282
|
+
withSpan,
|
|
222
283
|
shutdown,
|
|
223
284
|
init,
|
|
224
285
|
getTracer,
|
|
@@ -228,4 +289,4 @@ export {
|
|
|
228
289
|
PrefactorMiddleware
|
|
229
290
|
};
|
|
230
291
|
|
|
231
|
-
//# debugId=
|
|
292
|
+
//# debugId=201F54E0603ABA7664756E2164756E21
|
package/dist/index.js.map
CHANGED
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts", "../src/init.ts", "../src/middleware.ts", "../src/metadata-extractor.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
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} from '@prefactor/core';\nexport { getTracer, init,
|
|
6
|
-
"import {\n type Config,\n type CoreRuntime,\n configureLogging,\n createConfig,\n createCore,\n
|
|
7
|
-
"import {
|
|
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: 'prefactor',\n span_schemas: {\n agent: { type: 'object', additionalProperties: true },\n llm: { type: 'object', additionalProperties: true },\n tool: { type: 'object', additionalProperties: true },\n 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;\n\nregisterShutdownHandler('prefactor-langchain', () => {\n if (globalCore) {\n logger.info('Shutting down Prefactor SDK');\n }\n\n globalCore = null;\n globalTracer = null;\n globalMiddleware = 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 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 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.agentManager.startInstance(this.agentInfo);\n\n const span = this.tracer.startSpan({\n name: 'langchain:agent',\n spanType: 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 this.agentManager.finishInstance();\n SpanContext.exit();\n this.rootSpan = null;\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 const modelName = this.extractModelName(request);\n const span = this.tracer.startSpan({\n name: 'langchain:llm-call',\n spanType: SpanType.LLM,\n inputs: {\n ...this.extractModelInputs(request),\n 'langchain.model.name': modelName,\n },\n });\n\n try {\n // CRITICAL: Wrap handler in context so child operations see this span\n const response = await SpanContext.runAsync(span, async () => {\n return handler(request);\n });\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 const toolName = this.extractToolName(request);\n const span = this.tracer.startSpan({\n name: 'langchain:tool-call',\n spanType: SpanType.TOOL,\n inputs: {\n ...this.extractToolInputs(request),\n 'langchain.tool.name': toolName,\n },\n });\n\n try {\n // CRITICAL: Wrap handler in context so child operations see this span\n const response = await SpanContext.runAsync(span, async () => {\n return handler(request);\n });\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",
|
|
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;;;ACTF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
11
|
-
"debugId": "
|
|
10
|
+
"mappings": "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",
|
|
11
|
+
"debugId": "201F54E0603ABA7664756E2164756E21",
|
|
12
12
|
"names": []
|
|
13
13
|
}
|
package/dist/init.d.ts
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
|
-
import { type Config, type Tracer } from '@prefactor/core';
|
|
1
|
+
import { type Config, shutdown as shutdownCore, type Tracer } from '@prefactor/core';
|
|
2
2
|
import { type AgentMiddleware } from 'langchain';
|
|
3
|
+
export type ManualSpanOptions = {
|
|
4
|
+
name: string;
|
|
5
|
+
spanType: string;
|
|
6
|
+
inputs: Record<string, unknown>;
|
|
7
|
+
metadata?: Record<string, unknown>;
|
|
8
|
+
};
|
|
3
9
|
/**
|
|
4
10
|
* Initialize the Prefactor SDK and return middleware for LangChain.js
|
|
5
11
|
*
|
|
@@ -14,8 +20,15 @@ import { type AgentMiddleware } from 'langchain';
|
|
|
14
20
|
* import { init } from '@prefactor/langchain';
|
|
15
21
|
* import { createAgent } from 'langchain';
|
|
16
22
|
*
|
|
17
|
-
* // Initialize with
|
|
18
|
-
* const middleware = init(
|
|
23
|
+
* // Initialize with HTTP transport
|
|
24
|
+
* const middleware = init({
|
|
25
|
+
* transportType: 'http',
|
|
26
|
+
* httpConfig: {
|
|
27
|
+
* apiUrl: 'https://api.prefactor.ai',
|
|
28
|
+
* apiToken: process.env.PREFACTOR_API_TOKEN!,
|
|
29
|
+
* agentIdentifier: 'my-langchain-agent',
|
|
30
|
+
* },
|
|
31
|
+
* });
|
|
19
32
|
*
|
|
20
33
|
* // Or configure HTTP transport
|
|
21
34
|
* const middleware = init({
|
|
@@ -56,23 +69,6 @@ export declare function init(config?: Partial<Config>): AgentMiddleware;
|
|
|
56
69
|
* ```
|
|
57
70
|
*/
|
|
58
71
|
export declare function getTracer(): Tracer;
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
*
|
|
62
|
-
* Call this before your application exits to ensure all spans are sent to the transport.
|
|
63
|
-
* This is especially important for HTTP transport which has a queue of pending requests.
|
|
64
|
-
*
|
|
65
|
-
* @returns Promise that resolves when shutdown is complete
|
|
66
|
-
*
|
|
67
|
-
* @example
|
|
68
|
-
* ```typescript
|
|
69
|
-
* import { shutdown } from '@prefactor/langchain';
|
|
70
|
-
*
|
|
71
|
-
* process.on('SIGTERM', async () => {
|
|
72
|
-
* await shutdown();
|
|
73
|
-
* process.exit(0);
|
|
74
|
-
* });
|
|
75
|
-
* ```
|
|
76
|
-
*/
|
|
77
|
-
export declare function shutdown(): Promise<void>;
|
|
72
|
+
export declare function withSpan<T>(options: ManualSpanOptions, fn: () => Promise<T> | T): Promise<T>;
|
|
73
|
+
export { shutdownCore as shutdown };
|
|
78
74
|
//# sourceMappingURL=init.d.ts.map
|
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,KAAK,MAAM,
|
|
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;AA6BnE,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,CAuF9D;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
|
@@ -1,10 +1,27 @@
|
|
|
1
|
-
import { configureLogging, createConfig, createCore,
|
|
1
|
+
import { configureLogging, createConfig, createCore, getLogger, registerShutdownHandler, shutdown as shutdownCore, withSpan as withCoreSpan, } from '@prefactor/core';
|
|
2
2
|
import { createMiddleware } from 'langchain';
|
|
3
3
|
import { PrefactorMiddleware } from './middleware.js';
|
|
4
4
|
const logger = getLogger('init');
|
|
5
|
+
const DEFAULT_LANGCHAIN_AGENT_SCHEMA = {
|
|
6
|
+
external_identifier: 'prefactor',
|
|
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 },
|
|
12
|
+
},
|
|
13
|
+
};
|
|
5
14
|
let globalCore = null;
|
|
6
15
|
let globalTracer = null;
|
|
7
16
|
let globalMiddleware = null;
|
|
17
|
+
registerShutdownHandler('prefactor-langchain', () => {
|
|
18
|
+
if (globalCore) {
|
|
19
|
+
logger.info('Shutting down Prefactor SDK');
|
|
20
|
+
}
|
|
21
|
+
globalCore = null;
|
|
22
|
+
globalTracer = null;
|
|
23
|
+
globalMiddleware = null;
|
|
24
|
+
});
|
|
8
25
|
/**
|
|
9
26
|
* Initialize the Prefactor SDK and return middleware for LangChain.js
|
|
10
27
|
*
|
|
@@ -19,8 +36,15 @@ let globalMiddleware = null;
|
|
|
19
36
|
* import { init } from '@prefactor/langchain';
|
|
20
37
|
* import { createAgent } from 'langchain';
|
|
21
38
|
*
|
|
22
|
-
* // Initialize with
|
|
23
|
-
* const middleware = init(
|
|
39
|
+
* // Initialize with HTTP transport
|
|
40
|
+
* const middleware = init({
|
|
41
|
+
* transportType: 'http',
|
|
42
|
+
* httpConfig: {
|
|
43
|
+
* apiUrl: 'https://api.prefactor.ai',
|
|
44
|
+
* apiToken: process.env.PREFACTOR_API_TOKEN!,
|
|
45
|
+
* agentIdentifier: 'my-langchain-agent',
|
|
46
|
+
* },
|
|
47
|
+
* });
|
|
24
48
|
*
|
|
25
49
|
* // Or configure HTTP transport
|
|
26
50
|
* const middleware = init({
|
|
@@ -42,17 +66,38 @@ let globalMiddleware = null;
|
|
|
42
66
|
*/
|
|
43
67
|
export function init(config) {
|
|
44
68
|
configureLogging();
|
|
45
|
-
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
69
|
+
let configWithHttp = config;
|
|
70
|
+
const transportType = config?.transportType ?? process.env.PREFACTOR_TRANSPORT ?? 'http';
|
|
71
|
+
if (transportType === 'http' && !config?.httpConfig) {
|
|
72
|
+
const apiUrl = process.env.PREFACTOR_API_URL;
|
|
73
|
+
const apiToken = process.env.PREFACTOR_API_TOKEN;
|
|
74
|
+
if (!apiUrl || !apiToken) {
|
|
75
|
+
throw new Error('HTTP transport requires PREFACTOR_API_URL and PREFACTOR_API_TOKEN environment variables, ' +
|
|
76
|
+
'or httpConfig to be provided in configuration');
|
|
77
|
+
}
|
|
78
|
+
configWithHttp = {
|
|
79
|
+
...config,
|
|
80
|
+
transportType: 'http',
|
|
81
|
+
httpConfig: {
|
|
82
|
+
apiUrl,
|
|
83
|
+
apiToken,
|
|
84
|
+
agentId: process.env.PREFACTOR_AGENT_ID,
|
|
85
|
+
agentName: process.env.PREFACTOR_AGENT_NAME,
|
|
86
|
+
agentIdentifier: process.env.PREFACTOR_AGENT_IDENTIFIER || '1.0.0',
|
|
87
|
+
agentSchema: DEFAULT_LANGCHAIN_AGENT_SCHEMA,
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
else if (transportType === 'http' && config?.httpConfig && !config.httpConfig.agentSchema) {
|
|
92
|
+
configWithHttp = {
|
|
93
|
+
...config,
|
|
94
|
+
httpConfig: {
|
|
51
95
|
...config.httpConfig,
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
96
|
+
agentSchema: DEFAULT_LANGCHAIN_AGENT_SCHEMA,
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
const finalConfig = createConfig(configWithHttp);
|
|
56
101
|
if (globalMiddleware !== null) {
|
|
57
102
|
return globalMiddleware;
|
|
58
103
|
}
|
|
@@ -63,13 +108,6 @@ export function init(config) {
|
|
|
63
108
|
if (httpConfig?.agentSchema) {
|
|
64
109
|
core.agentManager.registerSchema(httpConfig.agentSchema);
|
|
65
110
|
}
|
|
66
|
-
else if (finalConfig.transportType === 'http' &&
|
|
67
|
-
(httpConfig?.agentSchemaIdentifier || httpConfig?.skipSchema)) {
|
|
68
|
-
logger.debug('Skipping default schema registration based on httpConfig');
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
core.agentManager.registerSchema(DEFAULT_AGENT_SCHEMA);
|
|
72
|
-
}
|
|
73
111
|
const agentInfo = finalConfig.httpConfig
|
|
74
112
|
? {
|
|
75
113
|
agentId: finalConfig.httpConfig.agentId,
|
|
@@ -127,36 +165,13 @@ export function getTracer() {
|
|
|
127
165
|
// Safe because init() always sets globalTracer
|
|
128
166
|
return globalTracer;
|
|
129
167
|
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
*
|
|
133
|
-
* Call this before your application exits to ensure all spans are sent to the transport.
|
|
134
|
-
* This is especially important for HTTP transport which has a queue of pending requests.
|
|
135
|
-
*
|
|
136
|
-
* @returns Promise that resolves when shutdown is complete
|
|
137
|
-
*
|
|
138
|
-
* @example
|
|
139
|
-
* ```typescript
|
|
140
|
-
* import { shutdown } from '@prefactor/langchain';
|
|
141
|
-
*
|
|
142
|
-
* process.on('SIGTERM', async () => {
|
|
143
|
-
* await shutdown();
|
|
144
|
-
* process.exit(0);
|
|
145
|
-
* });
|
|
146
|
-
* ```
|
|
147
|
-
*/
|
|
148
|
-
export async function shutdown() {
|
|
149
|
-
if (globalCore) {
|
|
150
|
-
logger.info('Shutting down Prefactor SDK');
|
|
151
|
-
await globalCore.shutdown();
|
|
152
|
-
}
|
|
153
|
-
globalCore = null;
|
|
154
|
-
globalTracer = null;
|
|
155
|
-
globalMiddleware = null;
|
|
168
|
+
export async function withSpan(options, fn) {
|
|
169
|
+
return withCoreSpan(options, fn);
|
|
156
170
|
}
|
|
171
|
+
export { shutdownCore as shutdown };
|
|
157
172
|
// Automatic shutdown on process exit
|
|
158
173
|
process.on('beforeExit', () => {
|
|
159
|
-
|
|
174
|
+
shutdownCore().catch((error) => {
|
|
160
175
|
console.error('Error during Prefactor SDK shutdown:', error);
|
|
161
176
|
});
|
|
162
177
|
});
|
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,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
|
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,
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,oBAAoB,EAIzB,KAAK,MAAM,EACZ,MAAM,iBAAiB,CAAC;AAGzB;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,mBAAmB;IAI5B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,SAAS,CAAC;IALpB,OAAO,CAAC,QAAQ,CAAgD;gBAGtD,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;IAe3C;;;;;;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;IA4BnF;;;;;;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;IA2BlF;;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;CAG3B"}
|
package/dist/middleware.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { SpanContext, SpanType } from '@prefactor/core';
|
|
1
|
+
import { SpanContext, SpanType, serializeValue, } from '@prefactor/core';
|
|
2
2
|
import { extractTokenUsage } from './metadata-extractor.js';
|
|
3
3
|
/**
|
|
4
4
|
* Prefactor middleware for LangChain.js agents.
|
|
@@ -47,7 +47,7 @@ export class PrefactorMiddleware {
|
|
|
47
47
|
const span = this.tracer.startSpan({
|
|
48
48
|
name: 'langchain:agent',
|
|
49
49
|
spanType: SpanType.AGENT,
|
|
50
|
-
inputs: { messages: messages.slice(-3)
|
|
50
|
+
inputs: { messages: serializeValue(messages.slice(-3)) },
|
|
51
51
|
});
|
|
52
52
|
this.rootSpan = span;
|
|
53
53
|
SpanContext.enter(span);
|
|
@@ -64,7 +64,7 @@ export class PrefactorMiddleware {
|
|
|
64
64
|
}
|
|
65
65
|
const messages = state?.messages ?? [];
|
|
66
66
|
this.tracer.endSpan(this.rootSpan, {
|
|
67
|
-
outputs: { messages: messages.slice(-3)
|
|
67
|
+
outputs: { messages: serializeValue(messages.slice(-3)) },
|
|
68
68
|
});
|
|
69
69
|
this.agentManager.finishInstance();
|
|
70
70
|
SpanContext.exit();
|
|
@@ -79,10 +79,14 @@ export class PrefactorMiddleware {
|
|
|
79
79
|
*/
|
|
80
80
|
// biome-ignore lint/suspicious/noExplicitAny: LangChain request/handler types are dynamic
|
|
81
81
|
async wrapModelCall(request, handler) {
|
|
82
|
+
const modelName = this.extractModelName(request);
|
|
82
83
|
const span = this.tracer.startSpan({
|
|
83
|
-
name:
|
|
84
|
+
name: 'langchain:llm-call',
|
|
84
85
|
spanType: SpanType.LLM,
|
|
85
|
-
inputs:
|
|
86
|
+
inputs: {
|
|
87
|
+
...this.extractModelInputs(request),
|
|
88
|
+
'langchain.model.name': modelName,
|
|
89
|
+
},
|
|
86
90
|
});
|
|
87
91
|
try {
|
|
88
92
|
// CRITICAL: Wrap handler in context so child operations see this span
|
|
@@ -108,10 +112,14 @@ export class PrefactorMiddleware {
|
|
|
108
112
|
*/
|
|
109
113
|
// biome-ignore lint/suspicious/noExplicitAny: LangChain request/handler types are dynamic
|
|
110
114
|
async wrapToolCall(request, handler) {
|
|
115
|
+
const toolName = this.extractToolName(request);
|
|
111
116
|
const span = this.tracer.startSpan({
|
|
112
|
-
name:
|
|
117
|
+
name: 'langchain:tool-call',
|
|
113
118
|
spanType: SpanType.TOOL,
|
|
114
|
-
inputs:
|
|
119
|
+
inputs: {
|
|
120
|
+
...this.extractToolInputs(request),
|
|
121
|
+
'langchain.tool.name': toolName,
|
|
122
|
+
},
|
|
115
123
|
});
|
|
116
124
|
try {
|
|
117
125
|
// CRITICAL: Wrap handler in context so child operations see this span
|
|
@@ -133,7 +141,24 @@ export class PrefactorMiddleware {
|
|
|
133
141
|
*/
|
|
134
142
|
// biome-ignore lint/suspicious/noExplicitAny: LangChain request structure is dynamic
|
|
135
143
|
extractModelName(request) {
|
|
136
|
-
|
|
144
|
+
const candidate = request?.model ?? request?.modelName;
|
|
145
|
+
if (typeof candidate === 'string') {
|
|
146
|
+
return candidate;
|
|
147
|
+
}
|
|
148
|
+
if (candidate && typeof candidate === 'object') {
|
|
149
|
+
const modelObject = candidate;
|
|
150
|
+
if (Array.isArray(modelObject.id) &&
|
|
151
|
+
modelObject.id.every((item) => typeof item === 'string')) {
|
|
152
|
+
return modelObject.id.join('.');
|
|
153
|
+
}
|
|
154
|
+
if (typeof modelObject.modelName === 'string') {
|
|
155
|
+
return modelObject.modelName;
|
|
156
|
+
}
|
|
157
|
+
if (typeof modelObject.name === 'string') {
|
|
158
|
+
return modelObject.name;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return 'unknown';
|
|
137
162
|
}
|
|
138
163
|
/**
|
|
139
164
|
* Extract model inputs from request
|
|
@@ -141,7 +166,7 @@ export class PrefactorMiddleware {
|
|
|
141
166
|
// biome-ignore lint/suspicious/noExplicitAny: LangChain request structure is dynamic
|
|
142
167
|
extractModelInputs(request) {
|
|
143
168
|
const messages = request?.messages ?? [];
|
|
144
|
-
return { messages: messages.slice(-3)
|
|
169
|
+
return { messages: serializeValue(messages.slice(-3)) };
|
|
145
170
|
}
|
|
146
171
|
/**
|
|
147
172
|
* Extract model outputs from response
|
|
@@ -149,7 +174,7 @@ export class PrefactorMiddleware {
|
|
|
149
174
|
// biome-ignore lint/suspicious/noExplicitAny: LangChain response structure is dynamic
|
|
150
175
|
extractModelOutputs(response) {
|
|
151
176
|
const content = response?.content ?? response?.text ?? '';
|
|
152
|
-
return { content:
|
|
177
|
+
return { content: serializeValue(content) };
|
|
153
178
|
}
|
|
154
179
|
/**
|
|
155
180
|
* Extract tool name from request
|
package/dist/middleware.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"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"}
|