@elasticdash/langchain 0.0.6 → 0.0.8
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 +17 -17
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +17 -17
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
- package/dist/index.d.cts +0 -69
- package/dist/index.d.ts +0 -69
package/dist/index.cjs
CHANGED
|
@@ -34,7 +34,7 @@ var CallbackHandler = class extends import_base.BaseCallbackHandler {
|
|
|
34
34
|
constructor(params) {
|
|
35
35
|
var _a;
|
|
36
36
|
super();
|
|
37
|
-
this.name = "
|
|
37
|
+
this.name = "ElasticDashCallbackHandler";
|
|
38
38
|
this.completionStartTimes = {};
|
|
39
39
|
this.runMap = /* @__PURE__ */ new Map();
|
|
40
40
|
this.last_trace_id = null;
|
|
@@ -59,7 +59,7 @@ var CallbackHandler = class extends import_base.BaseCallbackHandler {
|
|
|
59
59
|
try {
|
|
60
60
|
this.logger.debug(`Chain start with Id: ${runId}`);
|
|
61
61
|
const runName = (_b = name != null ? name : (_a = chain.id.at(-1)) == null ? void 0 : _a.toString()) != null ? _b : "Langchain Run";
|
|
62
|
-
this.
|
|
62
|
+
this.registerElasticDashPrompt(parentRunId, metadata);
|
|
63
63
|
let finalInput = inputs;
|
|
64
64
|
if (typeof inputs === "object" && "input" in inputs && Array.isArray(inputs["input"]) && inputs["input"].every((m) => m instanceof import_messages.BaseMessage)) {
|
|
65
65
|
finalInput = inputs["input"].map(
|
|
@@ -86,8 +86,8 @@ var CallbackHandler = class extends import_base.BaseCallbackHandler {
|
|
|
86
86
|
if (!parentRunId) {
|
|
87
87
|
span.updateTrace({
|
|
88
88
|
tags: traceTags,
|
|
89
|
-
userId: metadata && "
|
|
90
|
-
sessionId: metadata && "
|
|
89
|
+
userId: metadata && "elasticDashUserId" in metadata && typeof metadata["elasticDashUserId"] === "string" ? metadata["elasticDashUserId"] : this.userId,
|
|
90
|
+
sessionId: metadata && "elasticDashSessionId" in metadata && typeof metadata["elasticDashSessionId"] === "string" ? metadata["elasticDashSessionId"] : this.sessionId,
|
|
91
91
|
metadata: this.traceMetadata,
|
|
92
92
|
version: this.version
|
|
93
93
|
});
|
|
@@ -167,7 +167,7 @@ var CallbackHandler = class extends import_base.BaseCallbackHandler {
|
|
|
167
167
|
parentRunId != null ? parentRunId : "root"
|
|
168
168
|
);
|
|
169
169
|
if (registeredPrompt && parentRunId) {
|
|
170
|
-
this.
|
|
170
|
+
this.deregisterElasticDashPrompt(parentRunId);
|
|
171
171
|
}
|
|
172
172
|
this.startAndRegisterOtelSpan({
|
|
173
173
|
type: "generation",
|
|
@@ -223,7 +223,7 @@ var CallbackHandler = class extends import_base.BaseCallbackHandler {
|
|
|
223
223
|
output: finalOutput
|
|
224
224
|
}
|
|
225
225
|
});
|
|
226
|
-
this.
|
|
226
|
+
this.deregisterElasticDashPrompt(runId);
|
|
227
227
|
} catch (e) {
|
|
228
228
|
this.logger.debug(e instanceof Error ? e.message : String(e));
|
|
229
229
|
}
|
|
@@ -400,15 +400,15 @@ var CallbackHandler = class extends import_base.BaseCallbackHandler {
|
|
|
400
400
|
this.logger.debug(e instanceof Error ? e.message : String(e));
|
|
401
401
|
}
|
|
402
402
|
}
|
|
403
|
-
|
|
404
|
-
if (metadata && "
|
|
403
|
+
registerElasticDashPrompt(parentRunId, metadata) {
|
|
404
|
+
if (metadata && "elasticDashPrompt" in metadata && parentRunId) {
|
|
405
405
|
this.promptToParentRunMap.set(
|
|
406
406
|
parentRunId,
|
|
407
|
-
metadata.
|
|
407
|
+
metadata.elasticDashPrompt
|
|
408
408
|
);
|
|
409
409
|
}
|
|
410
410
|
}
|
|
411
|
-
|
|
411
|
+
deregisterElasticDashPrompt(runId) {
|
|
412
412
|
this.promptToParentRunMap.delete(runId);
|
|
413
413
|
}
|
|
414
414
|
startAndRegisterOtelSpan(params) {
|
|
@@ -473,20 +473,20 @@ var CallbackHandler = class extends import_base.BaseCallbackHandler {
|
|
|
473
473
|
if (metadata2) {
|
|
474
474
|
Object.assign(finalDict, metadata2);
|
|
475
475
|
}
|
|
476
|
-
return this.
|
|
476
|
+
return this.stripElasticDashKeysFromMetadata(finalDict);
|
|
477
477
|
}
|
|
478
|
-
|
|
478
|
+
stripElasticDashKeysFromMetadata(metadata) {
|
|
479
479
|
if (!metadata) {
|
|
480
480
|
return;
|
|
481
481
|
}
|
|
482
|
-
const
|
|
483
|
-
"
|
|
484
|
-
"
|
|
485
|
-
"
|
|
482
|
+
const elasticDashKeys = [
|
|
483
|
+
"elasticDashPrompt",
|
|
484
|
+
"elasticDashUserId",
|
|
485
|
+
"elasticDashSessionId"
|
|
486
486
|
];
|
|
487
487
|
return Object.fromEntries(
|
|
488
488
|
Object.entries(metadata).filter(
|
|
489
|
-
([key, _]) => !
|
|
489
|
+
([key, _]) => !elasticDashKeys.includes(key)
|
|
490
490
|
)
|
|
491
491
|
);
|
|
492
492
|
}
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/CallbackHandler.ts"],"sourcesContent":["export { CallbackHandler } from \"./CallbackHandler.js\";\n","import { getGlobalLogger } from \"@elasticdash/core\";\nimport {\n startObservation,\n LangfuseGeneration,\n LangfuseSpan,\n LangfuseGenerationAttributes,\n LangfuseSpanAttributes,\n} from \"@elasticdash/tracing\";\nimport type { AgentAction, AgentFinish } from \"@langchain/core/agents\";\nimport { BaseCallbackHandler } from \"@langchain/core/callbacks/base\";\nimport type { Document } from \"@langchain/core/documents\";\nimport type { Serialized } from \"@langchain/core/load/serializable\";\nimport {\n AIMessage,\n AIMessageChunk,\n BaseMessage,\n type UsageMetadata,\n type BaseMessageFields,\n type MessageContent,\n} from \"@langchain/core/messages\";\nimport type { Generation, LLMResult } from \"@langchain/core/outputs\";\nimport type { ChainValues } from \"@langchain/core/utils/types\";\n\nconst LANGSMITH_HIDDEN_TAG = \"langsmith:hidden\";\n\ntype LangfusePrompt = {\n name: string;\n version: number;\n isFallback: boolean;\n};\n\nexport type LlmMessage = {\n role: string;\n content: BaseMessageFields[\"content\"];\n additional_kwargs?: BaseMessageFields[\"additional_kwargs\"];\n};\n\nexport type AnonymousLlmMessage = {\n content: BaseMessageFields[\"content\"];\n additional_kwargs?: BaseMessageFields[\"additional_kwargs\"];\n};\n\ntype ConstructorParams = {\n userId?: string;\n sessionId?: string;\n tags?: string[];\n version?: string; // added to all traces and observations\n traceMetadata?: Record<string, unknown>; // added to all traces\n};\n\nexport class CallbackHandler extends BaseCallbackHandler {\n name = \"LangfuseCallbackHandler\";\n\n private userId?: string;\n private version?: string;\n private sessionId?: string;\n private tags: string[];\n private traceMetadata?: Record<string, unknown>;\n\n private completionStartTimes: Record<string, Date> = {};\n private promptToParentRunMap;\n private runMap: Map<string, LangfuseSpan | LangfuseGeneration> = new Map();\n\n public last_trace_id: string | null = null;\n\n constructor(params?: ConstructorParams) {\n super();\n\n this.sessionId = params?.sessionId;\n this.userId = params?.userId;\n this.tags = params?.tags ?? [];\n this.traceMetadata = params?.traceMetadata;\n this.version = params?.version;\n\n this.promptToParentRunMap = new Map<string, LangfusePrompt>();\n }\n\n get logger() {\n return getGlobalLogger();\n }\n\n async handleLLMNewToken(\n token: string,\n _idx: any,\n runId: string,\n _parentRunId?: string,\n _tags?: string[],\n _fields?: any,\n ): Promise<void> {\n // if this is the first token, add it to completionStartTimes\n if (runId && !(runId in this.completionStartTimes)) {\n this.logger.debug(`LLM first streaming token: ${runId}`);\n this.completionStartTimes[runId] = new Date();\n }\n }\n\n async handleChainStart(\n chain: Serialized,\n inputs: ChainValues,\n runId: string,\n parentRunId?: string | undefined,\n tags?: string[] | undefined,\n metadata?: Record<string, unknown> | undefined,\n runType?: string,\n name?: string,\n ): Promise<void> {\n try {\n this.logger.debug(`Chain start with Id: ${runId}`);\n\n const runName = name ?? chain.id.at(-1)?.toString() ?? \"Langchain Run\";\n\n this.registerLangfusePrompt(parentRunId, metadata);\n\n // In chains, inputs can be a string or an array of BaseMessage\n let finalInput: string | ChainValues = inputs;\n if (\n typeof inputs === \"object\" &&\n \"input\" in inputs &&\n Array.isArray(inputs[\"input\"]) &&\n inputs[\"input\"].every((m: unknown) => m instanceof BaseMessage)\n ) {\n finalInput = inputs[\"input\"].map((m: BaseMessage) =>\n this.extractChatMessageContent(m),\n );\n } else if (\n typeof inputs === \"object\" &&\n \"messages\" in inputs &&\n Array.isArray(inputs[\"messages\"]) &&\n inputs[\"messages\"].every((m: unknown) => m instanceof BaseMessage)\n ) {\n finalInput = inputs[\"messages\"].map((m: BaseMessage) =>\n this.extractChatMessageContent(m),\n );\n } else if (\n typeof inputs === \"object\" &&\n \"content\" in inputs &&\n typeof inputs[\"content\"] === \"string\"\n ) {\n finalInput = inputs[\"content\"];\n }\n\n const span = this.startAndRegisterOtelSpan({\n runName,\n parentRunId,\n runId,\n tags,\n metadata,\n attributes: {\n input: finalInput,\n },\n });\n\n // If there's no parent run, this is a top-level chain execution\n // and we need to store trace attributes on the span\n const traceTags = [...new Set([...(tags ?? []), ...this.tags])];\n\n if (!parentRunId) {\n span.updateTrace({\n tags: traceTags,\n userId:\n metadata &&\n \"langfuseUserId\" in metadata &&\n typeof metadata[\"langfuseUserId\"] === \"string\"\n ? metadata[\"langfuseUserId\"]\n : this.userId,\n sessionId:\n metadata &&\n \"langfuseSessionId\" in metadata &&\n typeof metadata[\"langfuseSessionId\"] === \"string\"\n ? metadata[\"langfuseSessionId\"]\n : this.sessionId,\n metadata: this.traceMetadata,\n version: this.version,\n });\n }\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleAgentAction(\n action: AgentAction,\n runId: string,\n parentRunId?: string,\n ): Promise<void> {\n try {\n this.logger.debug(`Agent action ${action.tool} with ID: ${runId}`);\n this.startAndRegisterOtelSpan({\n runId,\n parentRunId,\n runName: action.tool,\n attributes: {\n input: action,\n },\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleAgentEnd?(\n action: AgentFinish,\n runId: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n parentRunId?: string,\n ): Promise<void> {\n try {\n this.logger.debug(`Agent finish with ID: ${runId}`);\n\n this.handleOtelSpanEnd({\n runId,\n attributes: { output: action },\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleChainError(\n err: any,\n runId: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n parentRunId?: string | undefined,\n ): Promise<void> {\n try {\n this.logger.debug(`Chain error: ${err} with ID: ${runId}`);\n\n const azureRefusalError = this.parseAzureRefusalError(err);\n\n this.handleOtelSpanEnd({\n runId,\n attributes: {\n level: \"ERROR\",\n statusMessage: err.toString() + azureRefusalError,\n },\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleGenerationStart(\n llm: Serialized,\n messages: (LlmMessage | MessageContent | AnonymousLlmMessage)[],\n runId: string,\n parentRunId?: string | undefined,\n extraParams?: Record<string, unknown> | undefined,\n tags?: string[] | undefined,\n metadata?: Record<string, unknown> | undefined,\n name?: string,\n ): Promise<void> {\n this.logger.debug(\n `Generation start with ID: ${runId} and parentRunId ${parentRunId}`,\n );\n\n const runName = name ?? llm.id.at(-1)?.toString() ?? \"Langchain Generation\";\n\n const modelParameters: Record<string, any> = {};\n const invocationParams = extraParams?.[\"invocation_params\"];\n\n for (const [key, value] of Object.entries({\n temperature: (invocationParams as any)?.temperature,\n max_tokens: (invocationParams as any)?.max_tokens,\n top_p: (invocationParams as any)?.top_p,\n frequency_penalty: (invocationParams as any)?.frequency_penalty,\n presence_penalty: (invocationParams as any)?.presence_penalty,\n request_timeout: (invocationParams as any)?.request_timeout,\n })) {\n if (value !== undefined && value !== null) {\n modelParameters[key] = value;\n }\n }\n\n interface InvocationParams {\n _type?: string;\n model?: string;\n model_name?: string;\n repo_id?: string;\n }\n\n let extractedModelName: string | undefined;\n if (extraParams) {\n const invocationParamsModelName = (\n extraParams.invocation_params as InvocationParams\n ).model;\n const metadataModelName =\n metadata && \"ls_model_name\" in metadata\n ? (metadata[\"ls_model_name\"] as string)\n : undefined;\n\n extractedModelName = invocationParamsModelName ?? metadataModelName;\n }\n\n const registeredPrompt = this.promptToParentRunMap.get(\n parentRunId ?? \"root\",\n );\n if (registeredPrompt && parentRunId) {\n this.deregisterLangfusePrompt(parentRunId);\n }\n\n this.startAndRegisterOtelSpan({\n type: \"generation\",\n runId,\n parentRunId,\n metadata,\n tags,\n runName,\n attributes: {\n input: messages,\n model: extractedModelName,\n modelParameters: modelParameters,\n prompt: registeredPrompt,\n },\n });\n }\n\n async handleChatModelStart(\n llm: Serialized,\n messages: BaseMessage[][],\n runId: string,\n parentRunId?: string | undefined,\n extraParams?: Record<string, unknown> | undefined,\n tags?: string[] | undefined,\n metadata?: Record<string, unknown> | undefined,\n name?: string,\n ): Promise<void> {\n try {\n this.logger.debug(`Chat model start with ID: ${runId}`);\n\n const prompts = messages.flatMap((message) =>\n message.map((m) => this.extractChatMessageContent(m)),\n );\n\n this.handleGenerationStart(\n llm,\n prompts,\n runId,\n parentRunId,\n extraParams,\n tags,\n metadata,\n name,\n );\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleChainEnd(\n outputs: ChainValues,\n runId: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n parentRunId?: string | undefined,\n ): Promise<void> {\n try {\n this.logger.debug(`Chain end with ID: ${runId}`);\n\n let finalOutput: ChainValues | string = outputs;\n if (\n typeof outputs === \"object\" &&\n \"output\" in outputs &&\n typeof outputs[\"output\"] === \"string\"\n ) {\n finalOutput = outputs[\"output\"];\n } else if (\n typeof outputs === \"object\" &&\n \"messages\" in outputs &&\n Array.isArray(outputs[\"messages\"]) &&\n outputs[\"messages\"].every((m: unknown) => m instanceof BaseMessage)\n ) {\n finalOutput = {\n messages: outputs.messages.map((message: BaseMessage) =>\n this.extractChatMessageContent(message),\n ),\n };\n }\n\n this.handleOtelSpanEnd({\n runId,\n attributes: {\n output: finalOutput,\n },\n });\n this.deregisterLangfusePrompt(runId);\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleLLMStart(\n llm: Serialized,\n prompts: string[],\n runId: string,\n parentRunId?: string | undefined,\n extraParams?: Record<string, unknown> | undefined,\n tags?: string[] | undefined,\n metadata?: Record<string, unknown> | undefined,\n name?: string,\n ): Promise<void> {\n try {\n this.logger.debug(`LLM start with ID: ${runId}`);\n\n this.handleGenerationStart(\n llm,\n prompts,\n runId,\n parentRunId,\n extraParams,\n tags,\n metadata,\n name,\n );\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleToolStart(\n tool: Serialized,\n input: string,\n runId: string,\n parentRunId?: string | undefined,\n tags?: string[] | undefined,\n metadata?: Record<string, unknown> | undefined,\n name?: string,\n ): Promise<void> {\n try {\n this.logger.debug(`Tool start with ID: ${runId}`);\n\n this.startAndRegisterOtelSpan({\n runId,\n parentRunId,\n runName: name ?? tool.id.at(-1)?.toString() ?? \"Tool execution\",\n attributes: {\n input,\n },\n metadata,\n tags,\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleRetrieverStart(\n retriever: Serialized,\n query: string,\n runId: string,\n parentRunId?: string | undefined,\n tags?: string[] | undefined,\n metadata?: Record<string, unknown> | undefined,\n name?: string,\n ): Promise<void> {\n try {\n this.logger.debug(`Retriever start with ID: ${runId}`);\n\n this.startAndRegisterOtelSpan({\n runId,\n parentRunId,\n runName: name ?? retriever.id.at(-1)?.toString() ?? \"Retriever\",\n attributes: {\n input: query,\n },\n tags,\n metadata,\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleRetrieverEnd(\n documents: Document<Record<string, any>>[],\n runId: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n parentRunId?: string | undefined,\n ): Promise<void> {\n try {\n this.logger.debug(`Retriever end with ID: ${runId}`);\n\n this.handleOtelSpanEnd({\n runId,\n attributes: {\n output: documents,\n },\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleRetrieverError(\n err: any,\n runId: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n parentRunId?: string | undefined,\n ): Promise<void> {\n try {\n this.logger.debug(`Retriever error: ${err} with ID: ${runId}`);\n this.handleOtelSpanEnd({\n runId,\n attributes: {\n level: \"ERROR\",\n statusMessage: err.toString(),\n },\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n async handleToolEnd(\n output: string,\n runId: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n parentRunId?: string | undefined,\n ): Promise<void> {\n try {\n this.logger.debug(`Tool end with ID: ${runId}`);\n\n this.handleOtelSpanEnd({\n runId,\n attributes: { output },\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleToolError(\n err: any,\n runId: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n parentRunId?: string | undefined,\n ): Promise<void> {\n try {\n this.logger.debug(`Tool error ${err} with ID: ${runId}`);\n\n this.handleOtelSpanEnd({\n runId,\n attributes: {\n level: \"ERROR\",\n statusMessage: err.toString(),\n },\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleLLMEnd(\n output: LLMResult,\n runId: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n parentRunId?: string | undefined,\n ): Promise<void> {\n try {\n this.logger.debug(`LLM end with ID: ${runId}`);\n\n const lastResponse =\n output.generations[output.generations.length - 1][\n output.generations[output.generations.length - 1].length - 1\n ];\n const llmUsage =\n this.extractUsageMetadata(lastResponse) ??\n output.llmOutput?.[\"tokenUsage\"];\n const modelName = this.extractModelNameFromMetadata(lastResponse);\n\n const usageDetails: Record<string, any> = {\n input:\n llmUsage?.input_tokens ??\n (\"promptTokens\" in llmUsage ? llmUsage?.promptTokens : undefined),\n output:\n llmUsage?.output_tokens ??\n (\"completionTokens\" in llmUsage\n ? llmUsage?.completionTokens\n : undefined),\n total:\n llmUsage?.total_tokens ??\n (\"totalTokens\" in llmUsage ? llmUsage?.totalTokens : undefined),\n };\n\n if (llmUsage && \"input_token_details\" in llmUsage) {\n for (const [key, val] of Object.entries(\n llmUsage[\"input_token_details\"] ?? {},\n )) {\n usageDetails[`input_${key}`] = val;\n\n if (\"input\" in usageDetails && typeof val === \"number\") {\n usageDetails[\"input\"] = Math.max(0, usageDetails[\"input\"] - val);\n }\n }\n }\n\n if (llmUsage && \"output_token_details\" in llmUsage) {\n for (const [key, val] of Object.entries(\n llmUsage[\"output_token_details\"] ?? {},\n )) {\n usageDetails[`output_${key}`] = val;\n\n if (\"output\" in usageDetails && typeof val === \"number\") {\n usageDetails[\"output\"] = Math.max(0, usageDetails[\"output\"] - val);\n }\n }\n }\n\n const extractedOutput =\n \"message\" in lastResponse\n ? this.extractChatMessageContent(\n lastResponse[\"message\"] as BaseMessage,\n )\n : lastResponse.text;\n\n this.handleOtelSpanEnd({\n runId,\n type: \"generation\",\n attributes: {\n model: modelName,\n output: extractedOutput,\n completionStartTime:\n runId in this.completionStartTimes\n ? this.completionStartTimes[runId]\n : undefined,\n usageDetails: usageDetails,\n },\n });\n\n if (runId in this.completionStartTimes) {\n delete this.completionStartTimes[runId];\n }\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleLLMError(\n err: any,\n runId: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n parentRunId?: string | undefined,\n ): Promise<void> {\n try {\n this.logger.debug(`LLM error ${err} with ID: ${runId}`);\n\n // Azure has the refusal status for harmful messages in the error property\n // This would not be logged as the error message is only a generic message\n // that there has been a refusal\n const azureRefusalError = this.parseAzureRefusalError(err);\n\n this.handleOtelSpanEnd({\n runId,\n attributes: {\n level: \"ERROR\",\n statusMessage: err.toString() + azureRefusalError,\n },\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n private registerLangfusePrompt(\n parentRunId?: string,\n metadata?: Record<string, unknown>,\n ): void {\n /*\n Register a prompt for linking to a generation with the same parentRunId.\n\n `parentRunId` must exist when we want to do any prompt linking to a generation. If it does not exist, it means the execution is solely a Prompt template formatting without any following LLM invocation, so no generation will be created to link to.\n For the simplest chain, a parent run is always created to wrap the individual runs consisting of prompt template formatting and LLM invocation.\n So, we do not need to register any prompt for linking if parentRunId is missing.\n */\n if (metadata && \"langfusePrompt\" in metadata && parentRunId) {\n this.promptToParentRunMap.set(\n parentRunId,\n metadata.langfusePrompt as LangfusePrompt,\n );\n }\n }\n\n private deregisterLangfusePrompt(runId: string): void {\n this.promptToParentRunMap.delete(runId);\n }\n\n private startAndRegisterOtelSpan(params: {\n type?: \"span\";\n runName: string;\n runId: string;\n parentRunId?: string;\n attributes: LangfuseGenerationAttributes;\n metadata?: Record<string, unknown>;\n tags?: string[];\n }): LangfuseSpan;\n private startAndRegisterOtelSpan(params: {\n type: \"generation\";\n runName: string;\n runId: string;\n parentRunId?: string;\n attributes: LangfuseGenerationAttributes;\n metadata?: Record<string, unknown>;\n tags?: string[];\n }): LangfuseGeneration;\n private startAndRegisterOtelSpan(params: {\n type?: \"span\" | \"generation\";\n runName: string;\n runId: string;\n parentRunId?: string;\n attributes: LangfuseGenerationAttributes;\n metadata?: Record<string, unknown>;\n tags?: string[];\n }): LangfuseSpan | LangfuseGeneration {\n const { type, runName, runId, parentRunId, attributes, metadata, tags } =\n params;\n\n const observation =\n type === \"generation\"\n ? startObservation(\n runName,\n {\n version: this.version,\n metadata: this.joinTagsAndMetaData(tags, metadata),\n level:\n tags && tags.includes(LANGSMITH_HIDDEN_TAG)\n ? \"DEBUG\"\n : undefined,\n ...attributes,\n },\n {\n asType: \"generation\",\n parentSpanContext: parentRunId\n ? this.runMap.get(parentRunId)?.otelSpan.spanContext()\n : undefined,\n },\n )\n : startObservation(\n runName,\n {\n version: this.version,\n metadata: this.joinTagsAndMetaData(tags, metadata),\n level:\n tags && tags.includes(LANGSMITH_HIDDEN_TAG)\n ? \"DEBUG\"\n : undefined,\n ...attributes,\n },\n {\n parentSpanContext: parentRunId\n ? this.runMap.get(parentRunId)?.otelSpan.spanContext()\n : undefined,\n },\n );\n this.runMap.set(runId, observation);\n\n return observation;\n }\n\n private handleOtelSpanEnd(params: {\n runId: string;\n attributes?: LangfuseSpanAttributes;\n type?: \"span\";\n }): void;\n private handleOtelSpanEnd(params: {\n runId: string;\n attributes?: LangfuseGenerationAttributes;\n type: \"generation\";\n }): void;\n private handleOtelSpanEnd(params: {\n runId: string;\n attributes?: LangfuseGenerationAttributes | LangfuseSpanAttributes;\n type?: \"span\" | \"generation\";\n }) {\n const { runId, attributes = {} } = params;\n\n const span = this.runMap.get(runId);\n if (!span) {\n this.logger.warn(\"Span not found in runMap. Skipping operation\");\n\n return;\n }\n\n span.update(attributes).end();\n\n this.last_trace_id = span.traceId;\n this.runMap.delete(runId);\n }\n private parseAzureRefusalError(err: any): string {\n // Azure has the refusal status for harmful messages in the error property\n // This would not be logged as the error message is only a generic message\n // that there has been a refusal\n let azureRefusalError = \"\";\n if (typeof err == \"object\" && \"error\" in err) {\n try {\n azureRefusalError =\n \"\\n\\nError details:\\n\" + JSON.stringify(err[\"error\"], null, 2);\n } catch {}\n }\n\n return azureRefusalError;\n }\n\n private joinTagsAndMetaData(\n tags?: string[] | undefined,\n metadata1?: Record<string, unknown> | undefined,\n metadata2?: Record<string, unknown> | undefined,\n ): Record<string, unknown> | undefined {\n const finalDict: Record<string, unknown> = {};\n if (tags && tags.length > 0) {\n finalDict.tags = tags;\n }\n if (metadata1) {\n Object.assign(finalDict, metadata1);\n }\n if (metadata2) {\n Object.assign(finalDict, metadata2);\n }\n return this.stripLangfuseKeysFromMetadata(finalDict);\n }\n\n private stripLangfuseKeysFromMetadata(\n metadata?: Record<string, unknown>,\n ): Record<string, unknown> | undefined {\n if (!metadata) {\n return;\n }\n\n const langfuseKeys = [\n \"langfusePrompt\",\n \"langfuseUserId\",\n \"langfuseSessionId\",\n ];\n\n return Object.fromEntries(\n Object.entries(metadata).filter(\n ([key, _]) => !langfuseKeys.includes(key),\n ),\n );\n }\n\n /** Not all models supports tokenUsage in llmOutput, can use AIMessage.usage_metadata instead */\n private extractUsageMetadata(\n generation: Generation,\n ): UsageMetadata | undefined {\n try {\n const usageMetadata =\n \"message\" in generation &&\n (generation[\"message\"] instanceof AIMessage ||\n generation[\"message\"] instanceof AIMessageChunk)\n ? generation[\"message\"].usage_metadata\n : undefined;\n\n return usageMetadata;\n } catch (err) {\n this.logger.debug(`Error extracting usage metadata: ${err}`);\n\n return;\n }\n }\n\n private extractModelNameFromMetadata(generation: any): string | undefined {\n try {\n return \"message\" in generation &&\n (generation[\"message\"] instanceof AIMessage ||\n generation[\"message\"] instanceof AIMessageChunk)\n ? generation[\"message\"].response_metadata.model_name\n : undefined;\n } catch {}\n }\n\n private extractChatMessageContent(\n message: BaseMessage,\n ): LlmMessage | AnonymousLlmMessage | MessageContent {\n let response = undefined;\n\n if (message.getType() === \"human\") {\n response = { content: message.content, role: \"user\" };\n } else if (message.getType() === \"generic\") {\n response = {\n content: message.content,\n role: \"human\",\n };\n } else if (message.getType() === \"ai\") {\n response = { content: message.content, role: \"assistant\" };\n\n if (\n \"tool_calls\" in message &&\n Array.isArray(message.tool_calls) &&\n (message.tool_calls?.length ?? 0) > 0\n ) {\n (response as any)[\"tool_calls\"] = message[\"tool_calls\"];\n }\n if (\n \"additional_kwargs\" in message &&\n \"tool_calls\" in message[\"additional_kwargs\"]\n ) {\n (response as any)[\"tool_calls\"] =\n message[\"additional_kwargs\"][\"tool_calls\"];\n }\n } else if (message.getType() === \"system\") {\n response = { content: message.content, role: \"system\" };\n } else if (message.getType() === \"function\") {\n response = {\n content: message.content,\n additional_kwargs: message.additional_kwargs,\n role: message.name,\n };\n } else if (message.getType() === \"tool\") {\n response = {\n content: message.content,\n additional_kwargs: message.additional_kwargs,\n role: message.name,\n };\n } else if (!message.name) {\n response = { content: message.content };\n } else {\n response = {\n role: message.name,\n content: message.content,\n };\n }\n\n if (\n (message.additional_kwargs.function_call ||\n message.additional_kwargs.tool_calls) &&\n (response as any)[\"tool_calls\"] === undefined\n ) {\n return { ...response, additional_kwargs: message.additional_kwargs };\n }\n\n return response;\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/CallbackHandler.ts"],"sourcesContent":["export { CallbackHandler } from \"./CallbackHandler.js\";\n","import { getGlobalLogger } from \"@elasticdash/core\";\nimport {\n startObservation,\n ElasticDashGeneration,\n ElasticDashSpan,\n ElasticDashGenerationAttributes,\n ElasticDashSpanAttributes,\n} from \"@elasticdash/tracing\";\nimport type { AgentAction, AgentFinish } from \"@langchain/core/agents\";\nimport { BaseCallbackHandler } from \"@langchain/core/callbacks/base\";\nimport type { Document } from \"@langchain/core/documents\";\nimport type { Serialized } from \"@langchain/core/load/serializable\";\nimport {\n AIMessage,\n AIMessageChunk,\n BaseMessage,\n type UsageMetadata,\n type BaseMessageFields,\n type MessageContent,\n} from \"@langchain/core/messages\";\nimport type { Generation, LLMResult } from \"@langchain/core/outputs\";\nimport type { ChainValues } from \"@langchain/core/utils/types\";\n\nconst LANGSMITH_HIDDEN_TAG = \"langsmith:hidden\";\n\ntype ElasticDashPrompt = {\n name: string;\n version: number;\n isFallback: boolean;\n};\n\nexport type LlmMessage = {\n role: string;\n content: BaseMessageFields[\"content\"];\n additional_kwargs?: BaseMessageFields[\"additional_kwargs\"];\n};\n\nexport type AnonymousLlmMessage = {\n content: BaseMessageFields[\"content\"];\n additional_kwargs?: BaseMessageFields[\"additional_kwargs\"];\n};\n\ntype ConstructorParams = {\n userId?: string;\n sessionId?: string;\n tags?: string[];\n version?: string; // added to all traces and observations\n traceMetadata?: Record<string, unknown>; // added to all traces\n};\n\nexport class CallbackHandler extends BaseCallbackHandler {\n name = \"ElasticDashCallbackHandler\";\n\n private userId?: string;\n private version?: string;\n private sessionId?: string;\n private tags: string[];\n private traceMetadata?: Record<string, unknown>;\n\n private completionStartTimes: Record<string, Date> = {};\n private promptToParentRunMap;\n private runMap: Map<string, ElasticDashSpan | ElasticDashGeneration> =\n new Map();\n\n public last_trace_id: string | null = null;\n\n constructor(params?: ConstructorParams) {\n super();\n\n this.sessionId = params?.sessionId;\n this.userId = params?.userId;\n this.tags = params?.tags ?? [];\n this.traceMetadata = params?.traceMetadata;\n this.version = params?.version;\n\n this.promptToParentRunMap = new Map<string, ElasticDashPrompt>();\n }\n\n get logger() {\n return getGlobalLogger();\n }\n\n async handleLLMNewToken(\n token: string,\n _idx: any,\n runId: string,\n _parentRunId?: string,\n _tags?: string[],\n _fields?: any,\n ): Promise<void> {\n // if this is the first token, add it to completionStartTimes\n if (runId && !(runId in this.completionStartTimes)) {\n this.logger.debug(`LLM first streaming token: ${runId}`);\n this.completionStartTimes[runId] = new Date();\n }\n }\n\n async handleChainStart(\n chain: Serialized,\n inputs: ChainValues,\n runId: string,\n parentRunId?: string | undefined,\n tags?: string[] | undefined,\n metadata?: Record<string, unknown> | undefined,\n runType?: string,\n name?: string,\n ): Promise<void> {\n try {\n this.logger.debug(`Chain start with Id: ${runId}`);\n\n const runName = name ?? chain.id.at(-1)?.toString() ?? \"Langchain Run\";\n\n this.registerElasticDashPrompt(parentRunId, metadata);\n\n // In chains, inputs can be a string or an array of BaseMessage\n let finalInput: string | ChainValues = inputs;\n if (\n typeof inputs === \"object\" &&\n \"input\" in inputs &&\n Array.isArray(inputs[\"input\"]) &&\n inputs[\"input\"].every((m: unknown) => m instanceof BaseMessage)\n ) {\n finalInput = inputs[\"input\"].map((m: BaseMessage) =>\n this.extractChatMessageContent(m),\n );\n } else if (\n typeof inputs === \"object\" &&\n \"messages\" in inputs &&\n Array.isArray(inputs[\"messages\"]) &&\n inputs[\"messages\"].every((m: unknown) => m instanceof BaseMessage)\n ) {\n finalInput = inputs[\"messages\"].map((m: BaseMessage) =>\n this.extractChatMessageContent(m),\n );\n } else if (\n typeof inputs === \"object\" &&\n \"content\" in inputs &&\n typeof inputs[\"content\"] === \"string\"\n ) {\n finalInput = inputs[\"content\"];\n }\n\n const span = this.startAndRegisterOtelSpan({\n runName,\n parentRunId,\n runId,\n tags,\n metadata,\n attributes: {\n input: finalInput,\n },\n });\n\n // If there's no parent run, this is a top-level chain execution\n // and we need to store trace attributes on the span\n const traceTags = [...new Set([...(tags ?? []), ...this.tags])];\n\n if (!parentRunId) {\n span.updateTrace({\n tags: traceTags,\n userId:\n metadata &&\n \"elasticDashUserId\" in metadata &&\n typeof metadata[\"elasticDashUserId\"] === \"string\"\n ? metadata[\"elasticDashUserId\"]\n : this.userId,\n sessionId:\n metadata &&\n \"elasticDashSessionId\" in metadata &&\n typeof metadata[\"elasticDashSessionId\"] === \"string\"\n ? metadata[\"elasticDashSessionId\"]\n : this.sessionId,\n metadata: this.traceMetadata,\n version: this.version,\n });\n }\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleAgentAction(\n action: AgentAction,\n runId: string,\n parentRunId?: string,\n ): Promise<void> {\n try {\n this.logger.debug(`Agent action ${action.tool} with ID: ${runId}`);\n this.startAndRegisterOtelSpan({\n runId,\n parentRunId,\n runName: action.tool,\n attributes: {\n input: action,\n },\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleAgentEnd?(\n action: AgentFinish,\n runId: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n parentRunId?: string,\n ): Promise<void> {\n try {\n this.logger.debug(`Agent finish with ID: ${runId}`);\n\n this.handleOtelSpanEnd({\n runId,\n attributes: { output: action },\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleChainError(\n err: any,\n runId: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n parentRunId?: string | undefined,\n ): Promise<void> {\n try {\n this.logger.debug(`Chain error: ${err} with ID: ${runId}`);\n\n const azureRefusalError = this.parseAzureRefusalError(err);\n\n this.handleOtelSpanEnd({\n runId,\n attributes: {\n level: \"ERROR\",\n statusMessage: err.toString() + azureRefusalError,\n },\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleGenerationStart(\n llm: Serialized,\n messages: (LlmMessage | MessageContent | AnonymousLlmMessage)[],\n runId: string,\n parentRunId?: string | undefined,\n extraParams?: Record<string, unknown> | undefined,\n tags?: string[] | undefined,\n metadata?: Record<string, unknown> | undefined,\n name?: string,\n ): Promise<void> {\n this.logger.debug(\n `Generation start with ID: ${runId} and parentRunId ${parentRunId}`,\n );\n\n const runName = name ?? llm.id.at(-1)?.toString() ?? \"Langchain Generation\";\n\n const modelParameters: Record<string, any> = {};\n const invocationParams = extraParams?.[\"invocation_params\"];\n\n for (const [key, value] of Object.entries({\n temperature: (invocationParams as any)?.temperature,\n max_tokens: (invocationParams as any)?.max_tokens,\n top_p: (invocationParams as any)?.top_p,\n frequency_penalty: (invocationParams as any)?.frequency_penalty,\n presence_penalty: (invocationParams as any)?.presence_penalty,\n request_timeout: (invocationParams as any)?.request_timeout,\n })) {\n if (value !== undefined && value !== null) {\n modelParameters[key] = value;\n }\n }\n\n interface InvocationParams {\n _type?: string;\n model?: string;\n model_name?: string;\n repo_id?: string;\n }\n\n let extractedModelName: string | undefined;\n if (extraParams) {\n const invocationParamsModelName = (\n extraParams.invocation_params as InvocationParams\n ).model;\n const metadataModelName =\n metadata && \"ls_model_name\" in metadata\n ? (metadata[\"ls_model_name\"] as string)\n : undefined;\n\n extractedModelName = invocationParamsModelName ?? metadataModelName;\n }\n\n const registeredPrompt = this.promptToParentRunMap.get(\n parentRunId ?? \"root\",\n );\n if (registeredPrompt && parentRunId) {\n this.deregisterElasticDashPrompt(parentRunId);\n }\n\n this.startAndRegisterOtelSpan({\n type: \"generation\",\n runId,\n parentRunId,\n metadata,\n tags,\n runName,\n attributes: {\n input: messages,\n model: extractedModelName,\n modelParameters: modelParameters,\n prompt: registeredPrompt,\n },\n });\n }\n\n async handleChatModelStart(\n llm: Serialized,\n messages: BaseMessage[][],\n runId: string,\n parentRunId?: string | undefined,\n extraParams?: Record<string, unknown> | undefined,\n tags?: string[] | undefined,\n metadata?: Record<string, unknown> | undefined,\n name?: string,\n ): Promise<void> {\n try {\n this.logger.debug(`Chat model start with ID: ${runId}`);\n\n const prompts = messages.flatMap((message) =>\n message.map((m) => this.extractChatMessageContent(m)),\n );\n\n this.handleGenerationStart(\n llm,\n prompts,\n runId,\n parentRunId,\n extraParams,\n tags,\n metadata,\n name,\n );\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleChainEnd(\n outputs: ChainValues,\n runId: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n parentRunId?: string | undefined,\n ): Promise<void> {\n try {\n this.logger.debug(`Chain end with ID: ${runId}`);\n\n let finalOutput: ChainValues | string = outputs;\n if (\n typeof outputs === \"object\" &&\n \"output\" in outputs &&\n typeof outputs[\"output\"] === \"string\"\n ) {\n finalOutput = outputs[\"output\"];\n } else if (\n typeof outputs === \"object\" &&\n \"messages\" in outputs &&\n Array.isArray(outputs[\"messages\"]) &&\n outputs[\"messages\"].every((m: unknown) => m instanceof BaseMessage)\n ) {\n finalOutput = {\n messages: outputs.messages.map((message: BaseMessage) =>\n this.extractChatMessageContent(message),\n ),\n };\n }\n\n this.handleOtelSpanEnd({\n runId,\n attributes: {\n output: finalOutput,\n },\n });\n this.deregisterElasticDashPrompt(runId);\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleLLMStart(\n llm: Serialized,\n prompts: string[],\n runId: string,\n parentRunId?: string | undefined,\n extraParams?: Record<string, unknown> | undefined,\n tags?: string[] | undefined,\n metadata?: Record<string, unknown> | undefined,\n name?: string,\n ): Promise<void> {\n try {\n this.logger.debug(`LLM start with ID: ${runId}`);\n\n this.handleGenerationStart(\n llm,\n prompts,\n runId,\n parentRunId,\n extraParams,\n tags,\n metadata,\n name,\n );\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleToolStart(\n tool: Serialized,\n input: string,\n runId: string,\n parentRunId?: string | undefined,\n tags?: string[] | undefined,\n metadata?: Record<string, unknown> | undefined,\n name?: string,\n ): Promise<void> {\n try {\n this.logger.debug(`Tool start with ID: ${runId}`);\n\n this.startAndRegisterOtelSpan({\n runId,\n parentRunId,\n runName: name ?? tool.id.at(-1)?.toString() ?? \"Tool execution\",\n attributes: {\n input,\n },\n metadata,\n tags,\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleRetrieverStart(\n retriever: Serialized,\n query: string,\n runId: string,\n parentRunId?: string | undefined,\n tags?: string[] | undefined,\n metadata?: Record<string, unknown> | undefined,\n name?: string,\n ): Promise<void> {\n try {\n this.logger.debug(`Retriever start with ID: ${runId}`);\n\n this.startAndRegisterOtelSpan({\n runId,\n parentRunId,\n runName: name ?? retriever.id.at(-1)?.toString() ?? \"Retriever\",\n attributes: {\n input: query,\n },\n tags,\n metadata,\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleRetrieverEnd(\n documents: Document<Record<string, any>>[],\n runId: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n parentRunId?: string | undefined,\n ): Promise<void> {\n try {\n this.logger.debug(`Retriever end with ID: ${runId}`);\n\n this.handleOtelSpanEnd({\n runId,\n attributes: {\n output: documents,\n },\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleRetrieverError(\n err: any,\n runId: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n parentRunId?: string | undefined,\n ): Promise<void> {\n try {\n this.logger.debug(`Retriever error: ${err} with ID: ${runId}`);\n this.handleOtelSpanEnd({\n runId,\n attributes: {\n level: \"ERROR\",\n statusMessage: err.toString(),\n },\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n async handleToolEnd(\n output: string,\n runId: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n parentRunId?: string | undefined,\n ): Promise<void> {\n try {\n this.logger.debug(`Tool end with ID: ${runId}`);\n\n this.handleOtelSpanEnd({\n runId,\n attributes: { output },\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleToolError(\n err: any,\n runId: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n parentRunId?: string | undefined,\n ): Promise<void> {\n try {\n this.logger.debug(`Tool error ${err} with ID: ${runId}`);\n\n this.handleOtelSpanEnd({\n runId,\n attributes: {\n level: \"ERROR\",\n statusMessage: err.toString(),\n },\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleLLMEnd(\n output: LLMResult,\n runId: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n parentRunId?: string | undefined,\n ): Promise<void> {\n try {\n this.logger.debug(`LLM end with ID: ${runId}`);\n\n const lastResponse =\n output.generations[output.generations.length - 1][\n output.generations[output.generations.length - 1].length - 1\n ];\n const llmUsage =\n this.extractUsageMetadata(lastResponse) ??\n output.llmOutput?.[\"tokenUsage\"];\n const modelName = this.extractModelNameFromMetadata(lastResponse);\n\n const usageDetails: Record<string, any> = {\n input:\n llmUsage?.input_tokens ??\n (\"promptTokens\" in llmUsage ? llmUsage?.promptTokens : undefined),\n output:\n llmUsage?.output_tokens ??\n (\"completionTokens\" in llmUsage\n ? llmUsage?.completionTokens\n : undefined),\n total:\n llmUsage?.total_tokens ??\n (\"totalTokens\" in llmUsage ? llmUsage?.totalTokens : undefined),\n };\n\n if (llmUsage && \"input_token_details\" in llmUsage) {\n for (const [key, val] of Object.entries(\n llmUsage[\"input_token_details\"] ?? {},\n )) {\n usageDetails[`input_${key}`] = val;\n\n if (\"input\" in usageDetails && typeof val === \"number\") {\n usageDetails[\"input\"] = Math.max(0, usageDetails[\"input\"] - val);\n }\n }\n }\n\n if (llmUsage && \"output_token_details\" in llmUsage) {\n for (const [key, val] of Object.entries(\n llmUsage[\"output_token_details\"] ?? {},\n )) {\n usageDetails[`output_${key}`] = val;\n\n if (\"output\" in usageDetails && typeof val === \"number\") {\n usageDetails[\"output\"] = Math.max(0, usageDetails[\"output\"] - val);\n }\n }\n }\n\n const extractedOutput =\n \"message\" in lastResponse\n ? this.extractChatMessageContent(\n lastResponse[\"message\"] as BaseMessage,\n )\n : lastResponse.text;\n\n this.handleOtelSpanEnd({\n runId,\n type: \"generation\",\n attributes: {\n model: modelName,\n output: extractedOutput,\n completionStartTime:\n runId in this.completionStartTimes\n ? this.completionStartTimes[runId]\n : undefined,\n usageDetails: usageDetails,\n },\n });\n\n if (runId in this.completionStartTimes) {\n delete this.completionStartTimes[runId];\n }\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleLLMError(\n err: any,\n runId: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n parentRunId?: string | undefined,\n ): Promise<void> {\n try {\n this.logger.debug(`LLM error ${err} with ID: ${runId}`);\n\n // Azure has the refusal status for harmful messages in the error property\n // This would not be logged as the error message is only a generic message\n // that there has been a refusal\n const azureRefusalError = this.parseAzureRefusalError(err);\n\n this.handleOtelSpanEnd({\n runId,\n attributes: {\n level: \"ERROR\",\n statusMessage: err.toString() + azureRefusalError,\n },\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n private registerElasticDashPrompt(\n parentRunId?: string,\n metadata?: Record<string, unknown>,\n ): void {\n /*\n Register a prompt for linking to a generation with the same parentRunId.\n\n `parentRunId` must exist when we want to do any prompt linking to a generation. If it does not exist, it means the execution is solely a Prompt template formatting without any following LLM invocation, so no generation will be created to link to.\n For the simplest chain, a parent run is always created to wrap the individual runs consisting of prompt template formatting and LLM invocation.\n So, we do not need to register any prompt for linking if parentRunId is missing.\n */\n if (metadata && \"elasticDashPrompt\" in metadata && parentRunId) {\n this.promptToParentRunMap.set(\n parentRunId,\n metadata.elasticDashPrompt as ElasticDashPrompt,\n );\n }\n }\n\n private deregisterElasticDashPrompt(runId: string): void {\n this.promptToParentRunMap.delete(runId);\n }\n\n private startAndRegisterOtelSpan(params: {\n type?: \"span\";\n runName: string;\n runId: string;\n parentRunId?: string;\n attributes: ElasticDashGenerationAttributes;\n metadata?: Record<string, unknown>;\n tags?: string[];\n }): ElasticDashSpan;\n private startAndRegisterOtelSpan(params: {\n type: \"generation\";\n runName: string;\n runId: string;\n parentRunId?: string;\n attributes: ElasticDashGenerationAttributes;\n metadata?: Record<string, unknown>;\n tags?: string[];\n }): ElasticDashGeneration;\n private startAndRegisterOtelSpan(params: {\n type?: \"span\" | \"generation\";\n runName: string;\n runId: string;\n parentRunId?: string;\n attributes: ElasticDashGenerationAttributes;\n metadata?: Record<string, unknown>;\n tags?: string[];\n }): ElasticDashSpan | ElasticDashGeneration {\n const { type, runName, runId, parentRunId, attributes, metadata, tags } =\n params;\n\n const observation =\n type === \"generation\"\n ? startObservation(\n runName,\n {\n version: this.version,\n metadata: this.joinTagsAndMetaData(tags, metadata),\n level:\n tags && tags.includes(LANGSMITH_HIDDEN_TAG)\n ? \"DEBUG\"\n : undefined,\n ...attributes,\n },\n {\n asType: \"generation\",\n parentSpanContext: parentRunId\n ? this.runMap.get(parentRunId)?.otelSpan.spanContext()\n : undefined,\n },\n )\n : startObservation(\n runName,\n {\n version: this.version,\n metadata: this.joinTagsAndMetaData(tags, metadata),\n level:\n tags && tags.includes(LANGSMITH_HIDDEN_TAG)\n ? \"DEBUG\"\n : undefined,\n ...attributes,\n },\n {\n parentSpanContext: parentRunId\n ? this.runMap.get(parentRunId)?.otelSpan.spanContext()\n : undefined,\n },\n );\n this.runMap.set(runId, observation);\n\n return observation;\n }\n\n private handleOtelSpanEnd(params: {\n runId: string;\n attributes?: ElasticDashSpanAttributes;\n type?: \"span\";\n }): void;\n private handleOtelSpanEnd(params: {\n runId: string;\n attributes?: ElasticDashGenerationAttributes;\n type: \"generation\";\n }): void;\n private handleOtelSpanEnd(params: {\n runId: string;\n attributes?: ElasticDashGenerationAttributes | ElasticDashSpanAttributes;\n type?: \"span\" | \"generation\";\n }) {\n const { runId, attributes = {} } = params;\n\n const span = this.runMap.get(runId);\n if (!span) {\n this.logger.warn(\"Span not found in runMap. Skipping operation\");\n\n return;\n }\n\n span.update(attributes).end();\n\n this.last_trace_id = span.traceId;\n this.runMap.delete(runId);\n }\n private parseAzureRefusalError(err: any): string {\n // Azure has the refusal status for harmful messages in the error property\n // This would not be logged as the error message is only a generic message\n // that there has been a refusal\n let azureRefusalError = \"\";\n if (typeof err == \"object\" && \"error\" in err) {\n try {\n azureRefusalError =\n \"\\n\\nError details:\\n\" + JSON.stringify(err[\"error\"], null, 2);\n } catch {}\n }\n\n return azureRefusalError;\n }\n\n private joinTagsAndMetaData(\n tags?: string[] | undefined,\n metadata1?: Record<string, unknown> | undefined,\n metadata2?: Record<string, unknown> | undefined,\n ): Record<string, unknown> | undefined {\n const finalDict: Record<string, unknown> = {};\n if (tags && tags.length > 0) {\n finalDict.tags = tags;\n }\n if (metadata1) {\n Object.assign(finalDict, metadata1);\n }\n if (metadata2) {\n Object.assign(finalDict, metadata2);\n }\n return this.stripElasticDashKeysFromMetadata(finalDict);\n }\n\n private stripElasticDashKeysFromMetadata(\n metadata?: Record<string, unknown>,\n ): Record<string, unknown> | undefined {\n if (!metadata) {\n return;\n }\n\n const elasticDashKeys = [\n \"elasticDashPrompt\",\n \"elasticDashUserId\",\n \"elasticDashSessionId\",\n ];\n\n return Object.fromEntries(\n Object.entries(metadata).filter(\n ([key, _]) => !elasticDashKeys.includes(key),\n ),\n );\n }\n\n /** Not all models supports tokenUsage in llmOutput, can use AIMessage.usage_metadata instead */\n private extractUsageMetadata(\n generation: Generation,\n ): UsageMetadata | undefined {\n try {\n const usageMetadata =\n \"message\" in generation &&\n (generation[\"message\"] instanceof AIMessage ||\n generation[\"message\"] instanceof AIMessageChunk)\n ? generation[\"message\"].usage_metadata\n : undefined;\n\n return usageMetadata;\n } catch (err) {\n this.logger.debug(`Error extracting usage metadata: ${err}`);\n\n return;\n }\n }\n\n private extractModelNameFromMetadata(generation: any): string | undefined {\n try {\n return \"message\" in generation &&\n (generation[\"message\"] instanceof AIMessage ||\n generation[\"message\"] instanceof AIMessageChunk)\n ? generation[\"message\"].response_metadata.model_name\n : undefined;\n } catch {}\n }\n\n private extractChatMessageContent(\n message: BaseMessage,\n ): LlmMessage | AnonymousLlmMessage | MessageContent {\n let response = undefined;\n\n if (message.getType() === \"human\") {\n response = { content: message.content, role: \"user\" };\n } else if (message.getType() === \"generic\") {\n response = {\n content: message.content,\n role: \"human\",\n };\n } else if (message.getType() === \"ai\") {\n response = { content: message.content, role: \"assistant\" };\n\n if (\n \"tool_calls\" in message &&\n Array.isArray(message.tool_calls) &&\n (message.tool_calls?.length ?? 0) > 0\n ) {\n (response as any)[\"tool_calls\"] = message[\"tool_calls\"];\n }\n if (\n \"additional_kwargs\" in message &&\n \"tool_calls\" in message[\"additional_kwargs\"]\n ) {\n (response as any)[\"tool_calls\"] =\n message[\"additional_kwargs\"][\"tool_calls\"];\n }\n } else if (message.getType() === \"system\") {\n response = { content: message.content, role: \"system\" };\n } else if (message.getType() === \"function\") {\n response = {\n content: message.content,\n additional_kwargs: message.additional_kwargs,\n role: message.name,\n };\n } else if (message.getType() === \"tool\") {\n response = {\n content: message.content,\n additional_kwargs: message.additional_kwargs,\n role: message.name,\n };\n } else if (!message.name) {\n response = { content: message.content };\n } else {\n response = {\n role: message.name,\n content: message.content,\n };\n }\n\n if (\n (message.additional_kwargs.function_call ||\n message.additional_kwargs.tool_calls) &&\n (response as any)[\"tool_calls\"] === undefined\n ) {\n return { ...response, additional_kwargs: message.additional_kwargs };\n }\n\n return response;\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.mjs
CHANGED
|
@@ -14,7 +14,7 @@ var CallbackHandler = class extends BaseCallbackHandler {
|
|
|
14
14
|
constructor(params) {
|
|
15
15
|
var _a;
|
|
16
16
|
super();
|
|
17
|
-
this.name = "
|
|
17
|
+
this.name = "ElasticDashCallbackHandler";
|
|
18
18
|
this.completionStartTimes = {};
|
|
19
19
|
this.runMap = /* @__PURE__ */ new Map();
|
|
20
20
|
this.last_trace_id = null;
|
|
@@ -39,7 +39,7 @@ var CallbackHandler = class extends BaseCallbackHandler {
|
|
|
39
39
|
try {
|
|
40
40
|
this.logger.debug(`Chain start with Id: ${runId}`);
|
|
41
41
|
const runName = (_b = name != null ? name : (_a = chain.id.at(-1)) == null ? void 0 : _a.toString()) != null ? _b : "Langchain Run";
|
|
42
|
-
this.
|
|
42
|
+
this.registerElasticDashPrompt(parentRunId, metadata);
|
|
43
43
|
let finalInput = inputs;
|
|
44
44
|
if (typeof inputs === "object" && "input" in inputs && Array.isArray(inputs["input"]) && inputs["input"].every((m) => m instanceof BaseMessage)) {
|
|
45
45
|
finalInput = inputs["input"].map(
|
|
@@ -66,8 +66,8 @@ var CallbackHandler = class extends BaseCallbackHandler {
|
|
|
66
66
|
if (!parentRunId) {
|
|
67
67
|
span.updateTrace({
|
|
68
68
|
tags: traceTags,
|
|
69
|
-
userId: metadata && "
|
|
70
|
-
sessionId: metadata && "
|
|
69
|
+
userId: metadata && "elasticDashUserId" in metadata && typeof metadata["elasticDashUserId"] === "string" ? metadata["elasticDashUserId"] : this.userId,
|
|
70
|
+
sessionId: metadata && "elasticDashSessionId" in metadata && typeof metadata["elasticDashSessionId"] === "string" ? metadata["elasticDashSessionId"] : this.sessionId,
|
|
71
71
|
metadata: this.traceMetadata,
|
|
72
72
|
version: this.version
|
|
73
73
|
});
|
|
@@ -147,7 +147,7 @@ var CallbackHandler = class extends BaseCallbackHandler {
|
|
|
147
147
|
parentRunId != null ? parentRunId : "root"
|
|
148
148
|
);
|
|
149
149
|
if (registeredPrompt && parentRunId) {
|
|
150
|
-
this.
|
|
150
|
+
this.deregisterElasticDashPrompt(parentRunId);
|
|
151
151
|
}
|
|
152
152
|
this.startAndRegisterOtelSpan({
|
|
153
153
|
type: "generation",
|
|
@@ -203,7 +203,7 @@ var CallbackHandler = class extends BaseCallbackHandler {
|
|
|
203
203
|
output: finalOutput
|
|
204
204
|
}
|
|
205
205
|
});
|
|
206
|
-
this.
|
|
206
|
+
this.deregisterElasticDashPrompt(runId);
|
|
207
207
|
} catch (e) {
|
|
208
208
|
this.logger.debug(e instanceof Error ? e.message : String(e));
|
|
209
209
|
}
|
|
@@ -380,15 +380,15 @@ var CallbackHandler = class extends BaseCallbackHandler {
|
|
|
380
380
|
this.logger.debug(e instanceof Error ? e.message : String(e));
|
|
381
381
|
}
|
|
382
382
|
}
|
|
383
|
-
|
|
384
|
-
if (metadata && "
|
|
383
|
+
registerElasticDashPrompt(parentRunId, metadata) {
|
|
384
|
+
if (metadata && "elasticDashPrompt" in metadata && parentRunId) {
|
|
385
385
|
this.promptToParentRunMap.set(
|
|
386
386
|
parentRunId,
|
|
387
|
-
metadata.
|
|
387
|
+
metadata.elasticDashPrompt
|
|
388
388
|
);
|
|
389
389
|
}
|
|
390
390
|
}
|
|
391
|
-
|
|
391
|
+
deregisterElasticDashPrompt(runId) {
|
|
392
392
|
this.promptToParentRunMap.delete(runId);
|
|
393
393
|
}
|
|
394
394
|
startAndRegisterOtelSpan(params) {
|
|
@@ -453,20 +453,20 @@ var CallbackHandler = class extends BaseCallbackHandler {
|
|
|
453
453
|
if (metadata2) {
|
|
454
454
|
Object.assign(finalDict, metadata2);
|
|
455
455
|
}
|
|
456
|
-
return this.
|
|
456
|
+
return this.stripElasticDashKeysFromMetadata(finalDict);
|
|
457
457
|
}
|
|
458
|
-
|
|
458
|
+
stripElasticDashKeysFromMetadata(metadata) {
|
|
459
459
|
if (!metadata) {
|
|
460
460
|
return;
|
|
461
461
|
}
|
|
462
|
-
const
|
|
463
|
-
"
|
|
464
|
-
"
|
|
465
|
-
"
|
|
462
|
+
const elasticDashKeys = [
|
|
463
|
+
"elasticDashPrompt",
|
|
464
|
+
"elasticDashUserId",
|
|
465
|
+
"elasticDashSessionId"
|
|
466
466
|
];
|
|
467
467
|
return Object.fromEntries(
|
|
468
468
|
Object.entries(metadata).filter(
|
|
469
|
-
([key, _]) => !
|
|
469
|
+
([key, _]) => !elasticDashKeys.includes(key)
|
|
470
470
|
)
|
|
471
471
|
);
|
|
472
472
|
}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/CallbackHandler.ts"],"sourcesContent":["import { getGlobalLogger } from \"@elasticdash/core\";\nimport {\n startObservation,\n LangfuseGeneration,\n LangfuseSpan,\n LangfuseGenerationAttributes,\n LangfuseSpanAttributes,\n} from \"@elasticdash/tracing\";\nimport type { AgentAction, AgentFinish } from \"@langchain/core/agents\";\nimport { BaseCallbackHandler } from \"@langchain/core/callbacks/base\";\nimport type { Document } from \"@langchain/core/documents\";\nimport type { Serialized } from \"@langchain/core/load/serializable\";\nimport {\n AIMessage,\n AIMessageChunk,\n BaseMessage,\n type UsageMetadata,\n type BaseMessageFields,\n type MessageContent,\n} from \"@langchain/core/messages\";\nimport type { Generation, LLMResult } from \"@langchain/core/outputs\";\nimport type { ChainValues } from \"@langchain/core/utils/types\";\n\nconst LANGSMITH_HIDDEN_TAG = \"langsmith:hidden\";\n\ntype LangfusePrompt = {\n name: string;\n version: number;\n isFallback: boolean;\n};\n\nexport type LlmMessage = {\n role: string;\n content: BaseMessageFields[\"content\"];\n additional_kwargs?: BaseMessageFields[\"additional_kwargs\"];\n};\n\nexport type AnonymousLlmMessage = {\n content: BaseMessageFields[\"content\"];\n additional_kwargs?: BaseMessageFields[\"additional_kwargs\"];\n};\n\ntype ConstructorParams = {\n userId?: string;\n sessionId?: string;\n tags?: string[];\n version?: string; // added to all traces and observations\n traceMetadata?: Record<string, unknown>; // added to all traces\n};\n\nexport class CallbackHandler extends BaseCallbackHandler {\n name = \"LangfuseCallbackHandler\";\n\n private userId?: string;\n private version?: string;\n private sessionId?: string;\n private tags: string[];\n private traceMetadata?: Record<string, unknown>;\n\n private completionStartTimes: Record<string, Date> = {};\n private promptToParentRunMap;\n private runMap: Map<string, LangfuseSpan | LangfuseGeneration> = new Map();\n\n public last_trace_id: string | null = null;\n\n constructor(params?: ConstructorParams) {\n super();\n\n this.sessionId = params?.sessionId;\n this.userId = params?.userId;\n this.tags = params?.tags ?? [];\n this.traceMetadata = params?.traceMetadata;\n this.version = params?.version;\n\n this.promptToParentRunMap = new Map<string, LangfusePrompt>();\n }\n\n get logger() {\n return getGlobalLogger();\n }\n\n async handleLLMNewToken(\n token: string,\n _idx: any,\n runId: string,\n _parentRunId?: string,\n _tags?: string[],\n _fields?: any,\n ): Promise<void> {\n // if this is the first token, add it to completionStartTimes\n if (runId && !(runId in this.completionStartTimes)) {\n this.logger.debug(`LLM first streaming token: ${runId}`);\n this.completionStartTimes[runId] = new Date();\n }\n }\n\n async handleChainStart(\n chain: Serialized,\n inputs: ChainValues,\n runId: string,\n parentRunId?: string | undefined,\n tags?: string[] | undefined,\n metadata?: Record<string, unknown> | undefined,\n runType?: string,\n name?: string,\n ): Promise<void> {\n try {\n this.logger.debug(`Chain start with Id: ${runId}`);\n\n const runName = name ?? chain.id.at(-1)?.toString() ?? \"Langchain Run\";\n\n this.registerLangfusePrompt(parentRunId, metadata);\n\n // In chains, inputs can be a string or an array of BaseMessage\n let finalInput: string | ChainValues = inputs;\n if (\n typeof inputs === \"object\" &&\n \"input\" in inputs &&\n Array.isArray(inputs[\"input\"]) &&\n inputs[\"input\"].every((m: unknown) => m instanceof BaseMessage)\n ) {\n finalInput = inputs[\"input\"].map((m: BaseMessage) =>\n this.extractChatMessageContent(m),\n );\n } else if (\n typeof inputs === \"object\" &&\n \"messages\" in inputs &&\n Array.isArray(inputs[\"messages\"]) &&\n inputs[\"messages\"].every((m: unknown) => m instanceof BaseMessage)\n ) {\n finalInput = inputs[\"messages\"].map((m: BaseMessage) =>\n this.extractChatMessageContent(m),\n );\n } else if (\n typeof inputs === \"object\" &&\n \"content\" in inputs &&\n typeof inputs[\"content\"] === \"string\"\n ) {\n finalInput = inputs[\"content\"];\n }\n\n const span = this.startAndRegisterOtelSpan({\n runName,\n parentRunId,\n runId,\n tags,\n metadata,\n attributes: {\n input: finalInput,\n },\n });\n\n // If there's no parent run, this is a top-level chain execution\n // and we need to store trace attributes on the span\n const traceTags = [...new Set([...(tags ?? []), ...this.tags])];\n\n if (!parentRunId) {\n span.updateTrace({\n tags: traceTags,\n userId:\n metadata &&\n \"langfuseUserId\" in metadata &&\n typeof metadata[\"langfuseUserId\"] === \"string\"\n ? metadata[\"langfuseUserId\"]\n : this.userId,\n sessionId:\n metadata &&\n \"langfuseSessionId\" in metadata &&\n typeof metadata[\"langfuseSessionId\"] === \"string\"\n ? metadata[\"langfuseSessionId\"]\n : this.sessionId,\n metadata: this.traceMetadata,\n version: this.version,\n });\n }\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleAgentAction(\n action: AgentAction,\n runId: string,\n parentRunId?: string,\n ): Promise<void> {\n try {\n this.logger.debug(`Agent action ${action.tool} with ID: ${runId}`);\n this.startAndRegisterOtelSpan({\n runId,\n parentRunId,\n runName: action.tool,\n attributes: {\n input: action,\n },\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleAgentEnd?(\n action: AgentFinish,\n runId: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n parentRunId?: string,\n ): Promise<void> {\n try {\n this.logger.debug(`Agent finish with ID: ${runId}`);\n\n this.handleOtelSpanEnd({\n runId,\n attributes: { output: action },\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleChainError(\n err: any,\n runId: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n parentRunId?: string | undefined,\n ): Promise<void> {\n try {\n this.logger.debug(`Chain error: ${err} with ID: ${runId}`);\n\n const azureRefusalError = this.parseAzureRefusalError(err);\n\n this.handleOtelSpanEnd({\n runId,\n attributes: {\n level: \"ERROR\",\n statusMessage: err.toString() + azureRefusalError,\n },\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleGenerationStart(\n llm: Serialized,\n messages: (LlmMessage | MessageContent | AnonymousLlmMessage)[],\n runId: string,\n parentRunId?: string | undefined,\n extraParams?: Record<string, unknown> | undefined,\n tags?: string[] | undefined,\n metadata?: Record<string, unknown> | undefined,\n name?: string,\n ): Promise<void> {\n this.logger.debug(\n `Generation start with ID: ${runId} and parentRunId ${parentRunId}`,\n );\n\n const runName = name ?? llm.id.at(-1)?.toString() ?? \"Langchain Generation\";\n\n const modelParameters: Record<string, any> = {};\n const invocationParams = extraParams?.[\"invocation_params\"];\n\n for (const [key, value] of Object.entries({\n temperature: (invocationParams as any)?.temperature,\n max_tokens: (invocationParams as any)?.max_tokens,\n top_p: (invocationParams as any)?.top_p,\n frequency_penalty: (invocationParams as any)?.frequency_penalty,\n presence_penalty: (invocationParams as any)?.presence_penalty,\n request_timeout: (invocationParams as any)?.request_timeout,\n })) {\n if (value !== undefined && value !== null) {\n modelParameters[key] = value;\n }\n }\n\n interface InvocationParams {\n _type?: string;\n model?: string;\n model_name?: string;\n repo_id?: string;\n }\n\n let extractedModelName: string | undefined;\n if (extraParams) {\n const invocationParamsModelName = (\n extraParams.invocation_params as InvocationParams\n ).model;\n const metadataModelName =\n metadata && \"ls_model_name\" in metadata\n ? (metadata[\"ls_model_name\"] as string)\n : undefined;\n\n extractedModelName = invocationParamsModelName ?? metadataModelName;\n }\n\n const registeredPrompt = this.promptToParentRunMap.get(\n parentRunId ?? \"root\",\n );\n if (registeredPrompt && parentRunId) {\n this.deregisterLangfusePrompt(parentRunId);\n }\n\n this.startAndRegisterOtelSpan({\n type: \"generation\",\n runId,\n parentRunId,\n metadata,\n tags,\n runName,\n attributes: {\n input: messages,\n model: extractedModelName,\n modelParameters: modelParameters,\n prompt: registeredPrompt,\n },\n });\n }\n\n async handleChatModelStart(\n llm: Serialized,\n messages: BaseMessage[][],\n runId: string,\n parentRunId?: string | undefined,\n extraParams?: Record<string, unknown> | undefined,\n tags?: string[] | undefined,\n metadata?: Record<string, unknown> | undefined,\n name?: string,\n ): Promise<void> {\n try {\n this.logger.debug(`Chat model start with ID: ${runId}`);\n\n const prompts = messages.flatMap((message) =>\n message.map((m) => this.extractChatMessageContent(m)),\n );\n\n this.handleGenerationStart(\n llm,\n prompts,\n runId,\n parentRunId,\n extraParams,\n tags,\n metadata,\n name,\n );\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleChainEnd(\n outputs: ChainValues,\n runId: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n parentRunId?: string | undefined,\n ): Promise<void> {\n try {\n this.logger.debug(`Chain end with ID: ${runId}`);\n\n let finalOutput: ChainValues | string = outputs;\n if (\n typeof outputs === \"object\" &&\n \"output\" in outputs &&\n typeof outputs[\"output\"] === \"string\"\n ) {\n finalOutput = outputs[\"output\"];\n } else if (\n typeof outputs === \"object\" &&\n \"messages\" in outputs &&\n Array.isArray(outputs[\"messages\"]) &&\n outputs[\"messages\"].every((m: unknown) => m instanceof BaseMessage)\n ) {\n finalOutput = {\n messages: outputs.messages.map((message: BaseMessage) =>\n this.extractChatMessageContent(message),\n ),\n };\n }\n\n this.handleOtelSpanEnd({\n runId,\n attributes: {\n output: finalOutput,\n },\n });\n this.deregisterLangfusePrompt(runId);\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleLLMStart(\n llm: Serialized,\n prompts: string[],\n runId: string,\n parentRunId?: string | undefined,\n extraParams?: Record<string, unknown> | undefined,\n tags?: string[] | undefined,\n metadata?: Record<string, unknown> | undefined,\n name?: string,\n ): Promise<void> {\n try {\n this.logger.debug(`LLM start with ID: ${runId}`);\n\n this.handleGenerationStart(\n llm,\n prompts,\n runId,\n parentRunId,\n extraParams,\n tags,\n metadata,\n name,\n );\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleToolStart(\n tool: Serialized,\n input: string,\n runId: string,\n parentRunId?: string | undefined,\n tags?: string[] | undefined,\n metadata?: Record<string, unknown> | undefined,\n name?: string,\n ): Promise<void> {\n try {\n this.logger.debug(`Tool start with ID: ${runId}`);\n\n this.startAndRegisterOtelSpan({\n runId,\n parentRunId,\n runName: name ?? tool.id.at(-1)?.toString() ?? \"Tool execution\",\n attributes: {\n input,\n },\n metadata,\n tags,\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleRetrieverStart(\n retriever: Serialized,\n query: string,\n runId: string,\n parentRunId?: string | undefined,\n tags?: string[] | undefined,\n metadata?: Record<string, unknown> | undefined,\n name?: string,\n ): Promise<void> {\n try {\n this.logger.debug(`Retriever start with ID: ${runId}`);\n\n this.startAndRegisterOtelSpan({\n runId,\n parentRunId,\n runName: name ?? retriever.id.at(-1)?.toString() ?? \"Retriever\",\n attributes: {\n input: query,\n },\n tags,\n metadata,\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleRetrieverEnd(\n documents: Document<Record<string, any>>[],\n runId: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n parentRunId?: string | undefined,\n ): Promise<void> {\n try {\n this.logger.debug(`Retriever end with ID: ${runId}`);\n\n this.handleOtelSpanEnd({\n runId,\n attributes: {\n output: documents,\n },\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleRetrieverError(\n err: any,\n runId: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n parentRunId?: string | undefined,\n ): Promise<void> {\n try {\n this.logger.debug(`Retriever error: ${err} with ID: ${runId}`);\n this.handleOtelSpanEnd({\n runId,\n attributes: {\n level: \"ERROR\",\n statusMessage: err.toString(),\n },\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n async handleToolEnd(\n output: string,\n runId: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n parentRunId?: string | undefined,\n ): Promise<void> {\n try {\n this.logger.debug(`Tool end with ID: ${runId}`);\n\n this.handleOtelSpanEnd({\n runId,\n attributes: { output },\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleToolError(\n err: any,\n runId: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n parentRunId?: string | undefined,\n ): Promise<void> {\n try {\n this.logger.debug(`Tool error ${err} with ID: ${runId}`);\n\n this.handleOtelSpanEnd({\n runId,\n attributes: {\n level: \"ERROR\",\n statusMessage: err.toString(),\n },\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleLLMEnd(\n output: LLMResult,\n runId: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n parentRunId?: string | undefined,\n ): Promise<void> {\n try {\n this.logger.debug(`LLM end with ID: ${runId}`);\n\n const lastResponse =\n output.generations[output.generations.length - 1][\n output.generations[output.generations.length - 1].length - 1\n ];\n const llmUsage =\n this.extractUsageMetadata(lastResponse) ??\n output.llmOutput?.[\"tokenUsage\"];\n const modelName = this.extractModelNameFromMetadata(lastResponse);\n\n const usageDetails: Record<string, any> = {\n input:\n llmUsage?.input_tokens ??\n (\"promptTokens\" in llmUsage ? llmUsage?.promptTokens : undefined),\n output:\n llmUsage?.output_tokens ??\n (\"completionTokens\" in llmUsage\n ? llmUsage?.completionTokens\n : undefined),\n total:\n llmUsage?.total_tokens ??\n (\"totalTokens\" in llmUsage ? llmUsage?.totalTokens : undefined),\n };\n\n if (llmUsage && \"input_token_details\" in llmUsage) {\n for (const [key, val] of Object.entries(\n llmUsage[\"input_token_details\"] ?? {},\n )) {\n usageDetails[`input_${key}`] = val;\n\n if (\"input\" in usageDetails && typeof val === \"number\") {\n usageDetails[\"input\"] = Math.max(0, usageDetails[\"input\"] - val);\n }\n }\n }\n\n if (llmUsage && \"output_token_details\" in llmUsage) {\n for (const [key, val] of Object.entries(\n llmUsage[\"output_token_details\"] ?? {},\n )) {\n usageDetails[`output_${key}`] = val;\n\n if (\"output\" in usageDetails && typeof val === \"number\") {\n usageDetails[\"output\"] = Math.max(0, usageDetails[\"output\"] - val);\n }\n }\n }\n\n const extractedOutput =\n \"message\" in lastResponse\n ? this.extractChatMessageContent(\n lastResponse[\"message\"] as BaseMessage,\n )\n : lastResponse.text;\n\n this.handleOtelSpanEnd({\n runId,\n type: \"generation\",\n attributes: {\n model: modelName,\n output: extractedOutput,\n completionStartTime:\n runId in this.completionStartTimes\n ? this.completionStartTimes[runId]\n : undefined,\n usageDetails: usageDetails,\n },\n });\n\n if (runId in this.completionStartTimes) {\n delete this.completionStartTimes[runId];\n }\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleLLMError(\n err: any,\n runId: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n parentRunId?: string | undefined,\n ): Promise<void> {\n try {\n this.logger.debug(`LLM error ${err} with ID: ${runId}`);\n\n // Azure has the refusal status for harmful messages in the error property\n // This would not be logged as the error message is only a generic message\n // that there has been a refusal\n const azureRefusalError = this.parseAzureRefusalError(err);\n\n this.handleOtelSpanEnd({\n runId,\n attributes: {\n level: \"ERROR\",\n statusMessage: err.toString() + azureRefusalError,\n },\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n private registerLangfusePrompt(\n parentRunId?: string,\n metadata?: Record<string, unknown>,\n ): void {\n /*\n Register a prompt for linking to a generation with the same parentRunId.\n\n `parentRunId` must exist when we want to do any prompt linking to a generation. If it does not exist, it means the execution is solely a Prompt template formatting without any following LLM invocation, so no generation will be created to link to.\n For the simplest chain, a parent run is always created to wrap the individual runs consisting of prompt template formatting and LLM invocation.\n So, we do not need to register any prompt for linking if parentRunId is missing.\n */\n if (metadata && \"langfusePrompt\" in metadata && parentRunId) {\n this.promptToParentRunMap.set(\n parentRunId,\n metadata.langfusePrompt as LangfusePrompt,\n );\n }\n }\n\n private deregisterLangfusePrompt(runId: string): void {\n this.promptToParentRunMap.delete(runId);\n }\n\n private startAndRegisterOtelSpan(params: {\n type?: \"span\";\n runName: string;\n runId: string;\n parentRunId?: string;\n attributes: LangfuseGenerationAttributes;\n metadata?: Record<string, unknown>;\n tags?: string[];\n }): LangfuseSpan;\n private startAndRegisterOtelSpan(params: {\n type: \"generation\";\n runName: string;\n runId: string;\n parentRunId?: string;\n attributes: LangfuseGenerationAttributes;\n metadata?: Record<string, unknown>;\n tags?: string[];\n }): LangfuseGeneration;\n private startAndRegisterOtelSpan(params: {\n type?: \"span\" | \"generation\";\n runName: string;\n runId: string;\n parentRunId?: string;\n attributes: LangfuseGenerationAttributes;\n metadata?: Record<string, unknown>;\n tags?: string[];\n }): LangfuseSpan | LangfuseGeneration {\n const { type, runName, runId, parentRunId, attributes, metadata, tags } =\n params;\n\n const observation =\n type === \"generation\"\n ? startObservation(\n runName,\n {\n version: this.version,\n metadata: this.joinTagsAndMetaData(tags, metadata),\n level:\n tags && tags.includes(LANGSMITH_HIDDEN_TAG)\n ? \"DEBUG\"\n : undefined,\n ...attributes,\n },\n {\n asType: \"generation\",\n parentSpanContext: parentRunId\n ? this.runMap.get(parentRunId)?.otelSpan.spanContext()\n : undefined,\n },\n )\n : startObservation(\n runName,\n {\n version: this.version,\n metadata: this.joinTagsAndMetaData(tags, metadata),\n level:\n tags && tags.includes(LANGSMITH_HIDDEN_TAG)\n ? \"DEBUG\"\n : undefined,\n ...attributes,\n },\n {\n parentSpanContext: parentRunId\n ? this.runMap.get(parentRunId)?.otelSpan.spanContext()\n : undefined,\n },\n );\n this.runMap.set(runId, observation);\n\n return observation;\n }\n\n private handleOtelSpanEnd(params: {\n runId: string;\n attributes?: LangfuseSpanAttributes;\n type?: \"span\";\n }): void;\n private handleOtelSpanEnd(params: {\n runId: string;\n attributes?: LangfuseGenerationAttributes;\n type: \"generation\";\n }): void;\n private handleOtelSpanEnd(params: {\n runId: string;\n attributes?: LangfuseGenerationAttributes | LangfuseSpanAttributes;\n type?: \"span\" | \"generation\";\n }) {\n const { runId, attributes = {} } = params;\n\n const span = this.runMap.get(runId);\n if (!span) {\n this.logger.warn(\"Span not found in runMap. Skipping operation\");\n\n return;\n }\n\n span.update(attributes).end();\n\n this.last_trace_id = span.traceId;\n this.runMap.delete(runId);\n }\n private parseAzureRefusalError(err: any): string {\n // Azure has the refusal status for harmful messages in the error property\n // This would not be logged as the error message is only a generic message\n // that there has been a refusal\n let azureRefusalError = \"\";\n if (typeof err == \"object\" && \"error\" in err) {\n try {\n azureRefusalError =\n \"\\n\\nError details:\\n\" + JSON.stringify(err[\"error\"], null, 2);\n } catch {}\n }\n\n return azureRefusalError;\n }\n\n private joinTagsAndMetaData(\n tags?: string[] | undefined,\n metadata1?: Record<string, unknown> | undefined,\n metadata2?: Record<string, unknown> | undefined,\n ): Record<string, unknown> | undefined {\n const finalDict: Record<string, unknown> = {};\n if (tags && tags.length > 0) {\n finalDict.tags = tags;\n }\n if (metadata1) {\n Object.assign(finalDict, metadata1);\n }\n if (metadata2) {\n Object.assign(finalDict, metadata2);\n }\n return this.stripLangfuseKeysFromMetadata(finalDict);\n }\n\n private stripLangfuseKeysFromMetadata(\n metadata?: Record<string, unknown>,\n ): Record<string, unknown> | undefined {\n if (!metadata) {\n return;\n }\n\n const langfuseKeys = [\n \"langfusePrompt\",\n \"langfuseUserId\",\n \"langfuseSessionId\",\n ];\n\n return Object.fromEntries(\n Object.entries(metadata).filter(\n ([key, _]) => !langfuseKeys.includes(key),\n ),\n );\n }\n\n /** Not all models supports tokenUsage in llmOutput, can use AIMessage.usage_metadata instead */\n private extractUsageMetadata(\n generation: Generation,\n ): UsageMetadata | undefined {\n try {\n const usageMetadata =\n \"message\" in generation &&\n (generation[\"message\"] instanceof AIMessage ||\n generation[\"message\"] instanceof AIMessageChunk)\n ? generation[\"message\"].usage_metadata\n : undefined;\n\n return usageMetadata;\n } catch (err) {\n this.logger.debug(`Error extracting usage metadata: ${err}`);\n\n return;\n }\n }\n\n private extractModelNameFromMetadata(generation: any): string | undefined {\n try {\n return \"message\" in generation &&\n (generation[\"message\"] instanceof AIMessage ||\n generation[\"message\"] instanceof AIMessageChunk)\n ? generation[\"message\"].response_metadata.model_name\n : undefined;\n } catch {}\n }\n\n private extractChatMessageContent(\n message: BaseMessage,\n ): LlmMessage | AnonymousLlmMessage | MessageContent {\n let response = undefined;\n\n if (message.getType() === \"human\") {\n response = { content: message.content, role: \"user\" };\n } else if (message.getType() === \"generic\") {\n response = {\n content: message.content,\n role: \"human\",\n };\n } else if (message.getType() === \"ai\") {\n response = { content: message.content, role: \"assistant\" };\n\n if (\n \"tool_calls\" in message &&\n Array.isArray(message.tool_calls) &&\n (message.tool_calls?.length ?? 0) > 0\n ) {\n (response as any)[\"tool_calls\"] = message[\"tool_calls\"];\n }\n if (\n \"additional_kwargs\" in message &&\n \"tool_calls\" in message[\"additional_kwargs\"]\n ) {\n (response as any)[\"tool_calls\"] =\n message[\"additional_kwargs\"][\"tool_calls\"];\n }\n } else if (message.getType() === \"system\") {\n response = { content: message.content, role: \"system\" };\n } else if (message.getType() === \"function\") {\n response = {\n content: message.content,\n additional_kwargs: message.additional_kwargs,\n role: message.name,\n };\n } else if (message.getType() === \"tool\") {\n response = {\n content: message.content,\n additional_kwargs: message.additional_kwargs,\n role: message.name,\n };\n } else if (!message.name) {\n response = { content: message.content };\n } else {\n response = {\n role: message.name,\n content: message.content,\n };\n }\n\n if (\n (message.additional_kwargs.function_call ||\n message.additional_kwargs.tool_calls) &&\n (response as any)[\"tool_calls\"] === undefined\n ) {\n return { ...response, additional_kwargs: message.additional_kwargs };\n }\n\n return response;\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/CallbackHandler.ts"],"sourcesContent":["import { getGlobalLogger } from \"@elasticdash/core\";\nimport {\n startObservation,\n ElasticDashGeneration,\n ElasticDashSpan,\n ElasticDashGenerationAttributes,\n ElasticDashSpanAttributes,\n} from \"@elasticdash/tracing\";\nimport type { AgentAction, AgentFinish } from \"@langchain/core/agents\";\nimport { BaseCallbackHandler } from \"@langchain/core/callbacks/base\";\nimport type { Document } from \"@langchain/core/documents\";\nimport type { Serialized } from \"@langchain/core/load/serializable\";\nimport {\n AIMessage,\n AIMessageChunk,\n BaseMessage,\n type UsageMetadata,\n type BaseMessageFields,\n type MessageContent,\n} from \"@langchain/core/messages\";\nimport type { Generation, LLMResult } from \"@langchain/core/outputs\";\nimport type { ChainValues } from \"@langchain/core/utils/types\";\n\nconst LANGSMITH_HIDDEN_TAG = \"langsmith:hidden\";\n\ntype ElasticDashPrompt = {\n name: string;\n version: number;\n isFallback: boolean;\n};\n\nexport type LlmMessage = {\n role: string;\n content: BaseMessageFields[\"content\"];\n additional_kwargs?: BaseMessageFields[\"additional_kwargs\"];\n};\n\nexport type AnonymousLlmMessage = {\n content: BaseMessageFields[\"content\"];\n additional_kwargs?: BaseMessageFields[\"additional_kwargs\"];\n};\n\ntype ConstructorParams = {\n userId?: string;\n sessionId?: string;\n tags?: string[];\n version?: string; // added to all traces and observations\n traceMetadata?: Record<string, unknown>; // added to all traces\n};\n\nexport class CallbackHandler extends BaseCallbackHandler {\n name = \"ElasticDashCallbackHandler\";\n\n private userId?: string;\n private version?: string;\n private sessionId?: string;\n private tags: string[];\n private traceMetadata?: Record<string, unknown>;\n\n private completionStartTimes: Record<string, Date> = {};\n private promptToParentRunMap;\n private runMap: Map<string, ElasticDashSpan | ElasticDashGeneration> =\n new Map();\n\n public last_trace_id: string | null = null;\n\n constructor(params?: ConstructorParams) {\n super();\n\n this.sessionId = params?.sessionId;\n this.userId = params?.userId;\n this.tags = params?.tags ?? [];\n this.traceMetadata = params?.traceMetadata;\n this.version = params?.version;\n\n this.promptToParentRunMap = new Map<string, ElasticDashPrompt>();\n }\n\n get logger() {\n return getGlobalLogger();\n }\n\n async handleLLMNewToken(\n token: string,\n _idx: any,\n runId: string,\n _parentRunId?: string,\n _tags?: string[],\n _fields?: any,\n ): Promise<void> {\n // if this is the first token, add it to completionStartTimes\n if (runId && !(runId in this.completionStartTimes)) {\n this.logger.debug(`LLM first streaming token: ${runId}`);\n this.completionStartTimes[runId] = new Date();\n }\n }\n\n async handleChainStart(\n chain: Serialized,\n inputs: ChainValues,\n runId: string,\n parentRunId?: string | undefined,\n tags?: string[] | undefined,\n metadata?: Record<string, unknown> | undefined,\n runType?: string,\n name?: string,\n ): Promise<void> {\n try {\n this.logger.debug(`Chain start with Id: ${runId}`);\n\n const runName = name ?? chain.id.at(-1)?.toString() ?? \"Langchain Run\";\n\n this.registerElasticDashPrompt(parentRunId, metadata);\n\n // In chains, inputs can be a string or an array of BaseMessage\n let finalInput: string | ChainValues = inputs;\n if (\n typeof inputs === \"object\" &&\n \"input\" in inputs &&\n Array.isArray(inputs[\"input\"]) &&\n inputs[\"input\"].every((m: unknown) => m instanceof BaseMessage)\n ) {\n finalInput = inputs[\"input\"].map((m: BaseMessage) =>\n this.extractChatMessageContent(m),\n );\n } else if (\n typeof inputs === \"object\" &&\n \"messages\" in inputs &&\n Array.isArray(inputs[\"messages\"]) &&\n inputs[\"messages\"].every((m: unknown) => m instanceof BaseMessage)\n ) {\n finalInput = inputs[\"messages\"].map((m: BaseMessage) =>\n this.extractChatMessageContent(m),\n );\n } else if (\n typeof inputs === \"object\" &&\n \"content\" in inputs &&\n typeof inputs[\"content\"] === \"string\"\n ) {\n finalInput = inputs[\"content\"];\n }\n\n const span = this.startAndRegisterOtelSpan({\n runName,\n parentRunId,\n runId,\n tags,\n metadata,\n attributes: {\n input: finalInput,\n },\n });\n\n // If there's no parent run, this is a top-level chain execution\n // and we need to store trace attributes on the span\n const traceTags = [...new Set([...(tags ?? []), ...this.tags])];\n\n if (!parentRunId) {\n span.updateTrace({\n tags: traceTags,\n userId:\n metadata &&\n \"elasticDashUserId\" in metadata &&\n typeof metadata[\"elasticDashUserId\"] === \"string\"\n ? metadata[\"elasticDashUserId\"]\n : this.userId,\n sessionId:\n metadata &&\n \"elasticDashSessionId\" in metadata &&\n typeof metadata[\"elasticDashSessionId\"] === \"string\"\n ? metadata[\"elasticDashSessionId\"]\n : this.sessionId,\n metadata: this.traceMetadata,\n version: this.version,\n });\n }\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleAgentAction(\n action: AgentAction,\n runId: string,\n parentRunId?: string,\n ): Promise<void> {\n try {\n this.logger.debug(`Agent action ${action.tool} with ID: ${runId}`);\n this.startAndRegisterOtelSpan({\n runId,\n parentRunId,\n runName: action.tool,\n attributes: {\n input: action,\n },\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleAgentEnd?(\n action: AgentFinish,\n runId: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n parentRunId?: string,\n ): Promise<void> {\n try {\n this.logger.debug(`Agent finish with ID: ${runId}`);\n\n this.handleOtelSpanEnd({\n runId,\n attributes: { output: action },\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleChainError(\n err: any,\n runId: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n parentRunId?: string | undefined,\n ): Promise<void> {\n try {\n this.logger.debug(`Chain error: ${err} with ID: ${runId}`);\n\n const azureRefusalError = this.parseAzureRefusalError(err);\n\n this.handleOtelSpanEnd({\n runId,\n attributes: {\n level: \"ERROR\",\n statusMessage: err.toString() + azureRefusalError,\n },\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleGenerationStart(\n llm: Serialized,\n messages: (LlmMessage | MessageContent | AnonymousLlmMessage)[],\n runId: string,\n parentRunId?: string | undefined,\n extraParams?: Record<string, unknown> | undefined,\n tags?: string[] | undefined,\n metadata?: Record<string, unknown> | undefined,\n name?: string,\n ): Promise<void> {\n this.logger.debug(\n `Generation start with ID: ${runId} and parentRunId ${parentRunId}`,\n );\n\n const runName = name ?? llm.id.at(-1)?.toString() ?? \"Langchain Generation\";\n\n const modelParameters: Record<string, any> = {};\n const invocationParams = extraParams?.[\"invocation_params\"];\n\n for (const [key, value] of Object.entries({\n temperature: (invocationParams as any)?.temperature,\n max_tokens: (invocationParams as any)?.max_tokens,\n top_p: (invocationParams as any)?.top_p,\n frequency_penalty: (invocationParams as any)?.frequency_penalty,\n presence_penalty: (invocationParams as any)?.presence_penalty,\n request_timeout: (invocationParams as any)?.request_timeout,\n })) {\n if (value !== undefined && value !== null) {\n modelParameters[key] = value;\n }\n }\n\n interface InvocationParams {\n _type?: string;\n model?: string;\n model_name?: string;\n repo_id?: string;\n }\n\n let extractedModelName: string | undefined;\n if (extraParams) {\n const invocationParamsModelName = (\n extraParams.invocation_params as InvocationParams\n ).model;\n const metadataModelName =\n metadata && \"ls_model_name\" in metadata\n ? (metadata[\"ls_model_name\"] as string)\n : undefined;\n\n extractedModelName = invocationParamsModelName ?? metadataModelName;\n }\n\n const registeredPrompt = this.promptToParentRunMap.get(\n parentRunId ?? \"root\",\n );\n if (registeredPrompt && parentRunId) {\n this.deregisterElasticDashPrompt(parentRunId);\n }\n\n this.startAndRegisterOtelSpan({\n type: \"generation\",\n runId,\n parentRunId,\n metadata,\n tags,\n runName,\n attributes: {\n input: messages,\n model: extractedModelName,\n modelParameters: modelParameters,\n prompt: registeredPrompt,\n },\n });\n }\n\n async handleChatModelStart(\n llm: Serialized,\n messages: BaseMessage[][],\n runId: string,\n parentRunId?: string | undefined,\n extraParams?: Record<string, unknown> | undefined,\n tags?: string[] | undefined,\n metadata?: Record<string, unknown> | undefined,\n name?: string,\n ): Promise<void> {\n try {\n this.logger.debug(`Chat model start with ID: ${runId}`);\n\n const prompts = messages.flatMap((message) =>\n message.map((m) => this.extractChatMessageContent(m)),\n );\n\n this.handleGenerationStart(\n llm,\n prompts,\n runId,\n parentRunId,\n extraParams,\n tags,\n metadata,\n name,\n );\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleChainEnd(\n outputs: ChainValues,\n runId: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n parentRunId?: string | undefined,\n ): Promise<void> {\n try {\n this.logger.debug(`Chain end with ID: ${runId}`);\n\n let finalOutput: ChainValues | string = outputs;\n if (\n typeof outputs === \"object\" &&\n \"output\" in outputs &&\n typeof outputs[\"output\"] === \"string\"\n ) {\n finalOutput = outputs[\"output\"];\n } else if (\n typeof outputs === \"object\" &&\n \"messages\" in outputs &&\n Array.isArray(outputs[\"messages\"]) &&\n outputs[\"messages\"].every((m: unknown) => m instanceof BaseMessage)\n ) {\n finalOutput = {\n messages: outputs.messages.map((message: BaseMessage) =>\n this.extractChatMessageContent(message),\n ),\n };\n }\n\n this.handleOtelSpanEnd({\n runId,\n attributes: {\n output: finalOutput,\n },\n });\n this.deregisterElasticDashPrompt(runId);\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleLLMStart(\n llm: Serialized,\n prompts: string[],\n runId: string,\n parentRunId?: string | undefined,\n extraParams?: Record<string, unknown> | undefined,\n tags?: string[] | undefined,\n metadata?: Record<string, unknown> | undefined,\n name?: string,\n ): Promise<void> {\n try {\n this.logger.debug(`LLM start with ID: ${runId}`);\n\n this.handleGenerationStart(\n llm,\n prompts,\n runId,\n parentRunId,\n extraParams,\n tags,\n metadata,\n name,\n );\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleToolStart(\n tool: Serialized,\n input: string,\n runId: string,\n parentRunId?: string | undefined,\n tags?: string[] | undefined,\n metadata?: Record<string, unknown> | undefined,\n name?: string,\n ): Promise<void> {\n try {\n this.logger.debug(`Tool start with ID: ${runId}`);\n\n this.startAndRegisterOtelSpan({\n runId,\n parentRunId,\n runName: name ?? tool.id.at(-1)?.toString() ?? \"Tool execution\",\n attributes: {\n input,\n },\n metadata,\n tags,\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleRetrieverStart(\n retriever: Serialized,\n query: string,\n runId: string,\n parentRunId?: string | undefined,\n tags?: string[] | undefined,\n metadata?: Record<string, unknown> | undefined,\n name?: string,\n ): Promise<void> {\n try {\n this.logger.debug(`Retriever start with ID: ${runId}`);\n\n this.startAndRegisterOtelSpan({\n runId,\n parentRunId,\n runName: name ?? retriever.id.at(-1)?.toString() ?? \"Retriever\",\n attributes: {\n input: query,\n },\n tags,\n metadata,\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleRetrieverEnd(\n documents: Document<Record<string, any>>[],\n runId: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n parentRunId?: string | undefined,\n ): Promise<void> {\n try {\n this.logger.debug(`Retriever end with ID: ${runId}`);\n\n this.handleOtelSpanEnd({\n runId,\n attributes: {\n output: documents,\n },\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleRetrieverError(\n err: any,\n runId: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n parentRunId?: string | undefined,\n ): Promise<void> {\n try {\n this.logger.debug(`Retriever error: ${err} with ID: ${runId}`);\n this.handleOtelSpanEnd({\n runId,\n attributes: {\n level: \"ERROR\",\n statusMessage: err.toString(),\n },\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n async handleToolEnd(\n output: string,\n runId: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n parentRunId?: string | undefined,\n ): Promise<void> {\n try {\n this.logger.debug(`Tool end with ID: ${runId}`);\n\n this.handleOtelSpanEnd({\n runId,\n attributes: { output },\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleToolError(\n err: any,\n runId: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n parentRunId?: string | undefined,\n ): Promise<void> {\n try {\n this.logger.debug(`Tool error ${err} with ID: ${runId}`);\n\n this.handleOtelSpanEnd({\n runId,\n attributes: {\n level: \"ERROR\",\n statusMessage: err.toString(),\n },\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleLLMEnd(\n output: LLMResult,\n runId: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n parentRunId?: string | undefined,\n ): Promise<void> {\n try {\n this.logger.debug(`LLM end with ID: ${runId}`);\n\n const lastResponse =\n output.generations[output.generations.length - 1][\n output.generations[output.generations.length - 1].length - 1\n ];\n const llmUsage =\n this.extractUsageMetadata(lastResponse) ??\n output.llmOutput?.[\"tokenUsage\"];\n const modelName = this.extractModelNameFromMetadata(lastResponse);\n\n const usageDetails: Record<string, any> = {\n input:\n llmUsage?.input_tokens ??\n (\"promptTokens\" in llmUsage ? llmUsage?.promptTokens : undefined),\n output:\n llmUsage?.output_tokens ??\n (\"completionTokens\" in llmUsage\n ? llmUsage?.completionTokens\n : undefined),\n total:\n llmUsage?.total_tokens ??\n (\"totalTokens\" in llmUsage ? llmUsage?.totalTokens : undefined),\n };\n\n if (llmUsage && \"input_token_details\" in llmUsage) {\n for (const [key, val] of Object.entries(\n llmUsage[\"input_token_details\"] ?? {},\n )) {\n usageDetails[`input_${key}`] = val;\n\n if (\"input\" in usageDetails && typeof val === \"number\") {\n usageDetails[\"input\"] = Math.max(0, usageDetails[\"input\"] - val);\n }\n }\n }\n\n if (llmUsage && \"output_token_details\" in llmUsage) {\n for (const [key, val] of Object.entries(\n llmUsage[\"output_token_details\"] ?? {},\n )) {\n usageDetails[`output_${key}`] = val;\n\n if (\"output\" in usageDetails && typeof val === \"number\") {\n usageDetails[\"output\"] = Math.max(0, usageDetails[\"output\"] - val);\n }\n }\n }\n\n const extractedOutput =\n \"message\" in lastResponse\n ? this.extractChatMessageContent(\n lastResponse[\"message\"] as BaseMessage,\n )\n : lastResponse.text;\n\n this.handleOtelSpanEnd({\n runId,\n type: \"generation\",\n attributes: {\n model: modelName,\n output: extractedOutput,\n completionStartTime:\n runId in this.completionStartTimes\n ? this.completionStartTimes[runId]\n : undefined,\n usageDetails: usageDetails,\n },\n });\n\n if (runId in this.completionStartTimes) {\n delete this.completionStartTimes[runId];\n }\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n async handleLLMError(\n err: any,\n runId: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n parentRunId?: string | undefined,\n ): Promise<void> {\n try {\n this.logger.debug(`LLM error ${err} with ID: ${runId}`);\n\n // Azure has the refusal status for harmful messages in the error property\n // This would not be logged as the error message is only a generic message\n // that there has been a refusal\n const azureRefusalError = this.parseAzureRefusalError(err);\n\n this.handleOtelSpanEnd({\n runId,\n attributes: {\n level: \"ERROR\",\n statusMessage: err.toString() + azureRefusalError,\n },\n });\n } catch (e) {\n this.logger.debug(e instanceof Error ? e.message : String(e));\n }\n }\n\n private registerElasticDashPrompt(\n parentRunId?: string,\n metadata?: Record<string, unknown>,\n ): void {\n /*\n Register a prompt for linking to a generation with the same parentRunId.\n\n `parentRunId` must exist when we want to do any prompt linking to a generation. If it does not exist, it means the execution is solely a Prompt template formatting without any following LLM invocation, so no generation will be created to link to.\n For the simplest chain, a parent run is always created to wrap the individual runs consisting of prompt template formatting and LLM invocation.\n So, we do not need to register any prompt for linking if parentRunId is missing.\n */\n if (metadata && \"elasticDashPrompt\" in metadata && parentRunId) {\n this.promptToParentRunMap.set(\n parentRunId,\n metadata.elasticDashPrompt as ElasticDashPrompt,\n );\n }\n }\n\n private deregisterElasticDashPrompt(runId: string): void {\n this.promptToParentRunMap.delete(runId);\n }\n\n private startAndRegisterOtelSpan(params: {\n type?: \"span\";\n runName: string;\n runId: string;\n parentRunId?: string;\n attributes: ElasticDashGenerationAttributes;\n metadata?: Record<string, unknown>;\n tags?: string[];\n }): ElasticDashSpan;\n private startAndRegisterOtelSpan(params: {\n type: \"generation\";\n runName: string;\n runId: string;\n parentRunId?: string;\n attributes: ElasticDashGenerationAttributes;\n metadata?: Record<string, unknown>;\n tags?: string[];\n }): ElasticDashGeneration;\n private startAndRegisterOtelSpan(params: {\n type?: \"span\" | \"generation\";\n runName: string;\n runId: string;\n parentRunId?: string;\n attributes: ElasticDashGenerationAttributes;\n metadata?: Record<string, unknown>;\n tags?: string[];\n }): ElasticDashSpan | ElasticDashGeneration {\n const { type, runName, runId, parentRunId, attributes, metadata, tags } =\n params;\n\n const observation =\n type === \"generation\"\n ? startObservation(\n runName,\n {\n version: this.version,\n metadata: this.joinTagsAndMetaData(tags, metadata),\n level:\n tags && tags.includes(LANGSMITH_HIDDEN_TAG)\n ? \"DEBUG\"\n : undefined,\n ...attributes,\n },\n {\n asType: \"generation\",\n parentSpanContext: parentRunId\n ? this.runMap.get(parentRunId)?.otelSpan.spanContext()\n : undefined,\n },\n )\n : startObservation(\n runName,\n {\n version: this.version,\n metadata: this.joinTagsAndMetaData(tags, metadata),\n level:\n tags && tags.includes(LANGSMITH_HIDDEN_TAG)\n ? \"DEBUG\"\n : undefined,\n ...attributes,\n },\n {\n parentSpanContext: parentRunId\n ? this.runMap.get(parentRunId)?.otelSpan.spanContext()\n : undefined,\n },\n );\n this.runMap.set(runId, observation);\n\n return observation;\n }\n\n private handleOtelSpanEnd(params: {\n runId: string;\n attributes?: ElasticDashSpanAttributes;\n type?: \"span\";\n }): void;\n private handleOtelSpanEnd(params: {\n runId: string;\n attributes?: ElasticDashGenerationAttributes;\n type: \"generation\";\n }): void;\n private handleOtelSpanEnd(params: {\n runId: string;\n attributes?: ElasticDashGenerationAttributes | ElasticDashSpanAttributes;\n type?: \"span\" | \"generation\";\n }) {\n const { runId, attributes = {} } = params;\n\n const span = this.runMap.get(runId);\n if (!span) {\n this.logger.warn(\"Span not found in runMap. Skipping operation\");\n\n return;\n }\n\n span.update(attributes).end();\n\n this.last_trace_id = span.traceId;\n this.runMap.delete(runId);\n }\n private parseAzureRefusalError(err: any): string {\n // Azure has the refusal status for harmful messages in the error property\n // This would not be logged as the error message is only a generic message\n // that there has been a refusal\n let azureRefusalError = \"\";\n if (typeof err == \"object\" && \"error\" in err) {\n try {\n azureRefusalError =\n \"\\n\\nError details:\\n\" + JSON.stringify(err[\"error\"], null, 2);\n } catch {}\n }\n\n return azureRefusalError;\n }\n\n private joinTagsAndMetaData(\n tags?: string[] | undefined,\n metadata1?: Record<string, unknown> | undefined,\n metadata2?: Record<string, unknown> | undefined,\n ): Record<string, unknown> | undefined {\n const finalDict: Record<string, unknown> = {};\n if (tags && tags.length > 0) {\n finalDict.tags = tags;\n }\n if (metadata1) {\n Object.assign(finalDict, metadata1);\n }\n if (metadata2) {\n Object.assign(finalDict, metadata2);\n }\n return this.stripElasticDashKeysFromMetadata(finalDict);\n }\n\n private stripElasticDashKeysFromMetadata(\n metadata?: Record<string, unknown>,\n ): Record<string, unknown> | undefined {\n if (!metadata) {\n return;\n }\n\n const elasticDashKeys = [\n \"elasticDashPrompt\",\n \"elasticDashUserId\",\n \"elasticDashSessionId\",\n ];\n\n return Object.fromEntries(\n Object.entries(metadata).filter(\n ([key, _]) => !elasticDashKeys.includes(key),\n ),\n );\n }\n\n /** Not all models supports tokenUsage in llmOutput, can use AIMessage.usage_metadata instead */\n private extractUsageMetadata(\n generation: Generation,\n ): UsageMetadata | undefined {\n try {\n const usageMetadata =\n \"message\" in generation &&\n (generation[\"message\"] instanceof AIMessage ||\n generation[\"message\"] instanceof AIMessageChunk)\n ? generation[\"message\"].usage_metadata\n : undefined;\n\n return usageMetadata;\n } catch (err) {\n this.logger.debug(`Error extracting usage metadata: ${err}`);\n\n return;\n }\n }\n\n private extractModelNameFromMetadata(generation: any): string | undefined {\n try {\n return \"message\" in generation &&\n (generation[\"message\"] instanceof AIMessage ||\n generation[\"message\"] instanceof AIMessageChunk)\n ? generation[\"message\"].response_metadata.model_name\n : undefined;\n } catch {}\n }\n\n private extractChatMessageContent(\n message: BaseMessage,\n ): LlmMessage | AnonymousLlmMessage | MessageContent {\n let response = undefined;\n\n if (message.getType() === \"human\") {\n response = { content: message.content, role: \"user\" };\n } else if (message.getType() === \"generic\") {\n response = {\n content: message.content,\n role: \"human\",\n };\n } else if (message.getType() === \"ai\") {\n response = { content: message.content, role: \"assistant\" };\n\n if (\n \"tool_calls\" in message &&\n Array.isArray(message.tool_calls) &&\n (message.tool_calls?.length ?? 0) > 0\n ) {\n (response as any)[\"tool_calls\"] = message[\"tool_calls\"];\n }\n if (\n \"additional_kwargs\" in message &&\n \"tool_calls\" in message[\"additional_kwargs\"]\n ) {\n (response as any)[\"tool_calls\"] =\n message[\"additional_kwargs\"][\"tool_calls\"];\n }\n } else if (message.getType() === \"system\") {\n response = { content: message.content, role: \"system\" };\n } else if (message.getType() === \"function\") {\n response = {\n content: message.content,\n additional_kwargs: message.additional_kwargs,\n role: message.name,\n };\n } else if (message.getType() === \"tool\") {\n response = {\n content: message.content,\n additional_kwargs: message.additional_kwargs,\n role: message.name,\n };\n } else if (!message.name) {\n response = { content: message.content };\n } else {\n response = {\n role: message.name,\n content: message.content,\n };\n }\n\n if (\n (message.additional_kwargs.function_call ||\n message.additional_kwargs.tool_calls) &&\n (response as any)[\"tool_calls\"] === undefined\n ) {\n return { ...response, additional_kwargs: message.additional_kwargs };\n }\n\n return response;\n }\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elasticdash/langchain",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.8",
|
|
4
4
|
"description": "ElasticDash integration for LangChain",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -25,8 +25,8 @@
|
|
|
25
25
|
"dist"
|
|
26
26
|
],
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@elasticdash/core": "^0.0.
|
|
29
|
-
"@elasticdash/tracing": "^0.0.
|
|
28
|
+
"@elasticdash/core": "^0.0.8",
|
|
29
|
+
"@elasticdash/tracing": "^0.0.8"
|
|
30
30
|
},
|
|
31
31
|
"peerDependencies": {
|
|
32
32
|
"@langchain/core": ">=0.3.8",
|
package/dist/index.d.cts
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import * as _elasticdash_core from '@elasticdash/core';
|
|
2
|
-
import { AgentAction, AgentFinish } from '@langchain/core/agents';
|
|
3
|
-
import { BaseCallbackHandler } from '@langchain/core/callbacks/base';
|
|
4
|
-
import { Document } from '@langchain/core/documents';
|
|
5
|
-
import { Serialized } from '@langchain/core/load/serializable';
|
|
6
|
-
import { BaseMessageFields, MessageContent, BaseMessage } from '@langchain/core/messages';
|
|
7
|
-
import { LLMResult } from '@langchain/core/outputs';
|
|
8
|
-
import { ChainValues } from '@langchain/core/utils/types';
|
|
9
|
-
|
|
10
|
-
type LlmMessage = {
|
|
11
|
-
role: string;
|
|
12
|
-
content: BaseMessageFields["content"];
|
|
13
|
-
additional_kwargs?: BaseMessageFields["additional_kwargs"];
|
|
14
|
-
};
|
|
15
|
-
type AnonymousLlmMessage = {
|
|
16
|
-
content: BaseMessageFields["content"];
|
|
17
|
-
additional_kwargs?: BaseMessageFields["additional_kwargs"];
|
|
18
|
-
};
|
|
19
|
-
type ConstructorParams = {
|
|
20
|
-
userId?: string;
|
|
21
|
-
sessionId?: string;
|
|
22
|
-
tags?: string[];
|
|
23
|
-
version?: string;
|
|
24
|
-
traceMetadata?: Record<string, unknown>;
|
|
25
|
-
};
|
|
26
|
-
declare class CallbackHandler extends BaseCallbackHandler {
|
|
27
|
-
name: string;
|
|
28
|
-
private userId?;
|
|
29
|
-
private version?;
|
|
30
|
-
private sessionId?;
|
|
31
|
-
private tags;
|
|
32
|
-
private traceMetadata?;
|
|
33
|
-
private completionStartTimes;
|
|
34
|
-
private promptToParentRunMap;
|
|
35
|
-
private runMap;
|
|
36
|
-
last_trace_id: string | null;
|
|
37
|
-
constructor(params?: ConstructorParams);
|
|
38
|
-
get logger(): _elasticdash_core.Logger;
|
|
39
|
-
handleLLMNewToken(token: string, _idx: any, runId: string, _parentRunId?: string, _tags?: string[], _fields?: any): Promise<void>;
|
|
40
|
-
handleChainStart(chain: Serialized, inputs: ChainValues, runId: string, parentRunId?: string | undefined, tags?: string[] | undefined, metadata?: Record<string, unknown> | undefined, runType?: string, name?: string): Promise<void>;
|
|
41
|
-
handleAgentAction(action: AgentAction, runId: string, parentRunId?: string): Promise<void>;
|
|
42
|
-
handleAgentEnd?(action: AgentFinish, runId: string, parentRunId?: string): Promise<void>;
|
|
43
|
-
handleChainError(err: any, runId: string, parentRunId?: string | undefined): Promise<void>;
|
|
44
|
-
handleGenerationStart(llm: Serialized, messages: (LlmMessage | MessageContent | AnonymousLlmMessage)[], runId: string, parentRunId?: string | undefined, extraParams?: Record<string, unknown> | undefined, tags?: string[] | undefined, metadata?: Record<string, unknown> | undefined, name?: string): Promise<void>;
|
|
45
|
-
handleChatModelStart(llm: Serialized, messages: BaseMessage[][], runId: string, parentRunId?: string | undefined, extraParams?: Record<string, unknown> | undefined, tags?: string[] | undefined, metadata?: Record<string, unknown> | undefined, name?: string): Promise<void>;
|
|
46
|
-
handleChainEnd(outputs: ChainValues, runId: string, parentRunId?: string | undefined): Promise<void>;
|
|
47
|
-
handleLLMStart(llm: Serialized, prompts: string[], runId: string, parentRunId?: string | undefined, extraParams?: Record<string, unknown> | undefined, tags?: string[] | undefined, metadata?: Record<string, unknown> | undefined, name?: string): Promise<void>;
|
|
48
|
-
handleToolStart(tool: Serialized, input: string, runId: string, parentRunId?: string | undefined, tags?: string[] | undefined, metadata?: Record<string, unknown> | undefined, name?: string): Promise<void>;
|
|
49
|
-
handleRetrieverStart(retriever: Serialized, query: string, runId: string, parentRunId?: string | undefined, tags?: string[] | undefined, metadata?: Record<string, unknown> | undefined, name?: string): Promise<void>;
|
|
50
|
-
handleRetrieverEnd(documents: Document<Record<string, any>>[], runId: string, parentRunId?: string | undefined): Promise<void>;
|
|
51
|
-
handleRetrieverError(err: any, runId: string, parentRunId?: string | undefined): Promise<void>;
|
|
52
|
-
handleToolEnd(output: string, runId: string, parentRunId?: string | undefined): Promise<void>;
|
|
53
|
-
handleToolError(err: any, runId: string, parentRunId?: string | undefined): Promise<void>;
|
|
54
|
-
handleLLMEnd(output: LLMResult, runId: string, parentRunId?: string | undefined): Promise<void>;
|
|
55
|
-
handleLLMError(err: any, runId: string, parentRunId?: string | undefined): Promise<void>;
|
|
56
|
-
private registerLangfusePrompt;
|
|
57
|
-
private deregisterLangfusePrompt;
|
|
58
|
-
private startAndRegisterOtelSpan;
|
|
59
|
-
private handleOtelSpanEnd;
|
|
60
|
-
private parseAzureRefusalError;
|
|
61
|
-
private joinTagsAndMetaData;
|
|
62
|
-
private stripLangfuseKeysFromMetadata;
|
|
63
|
-
/** Not all models supports tokenUsage in llmOutput, can use AIMessage.usage_metadata instead */
|
|
64
|
-
private extractUsageMetadata;
|
|
65
|
-
private extractModelNameFromMetadata;
|
|
66
|
-
private extractChatMessageContent;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
export { CallbackHandler };
|
package/dist/index.d.ts
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import * as _elasticdash_core from '@elasticdash/core';
|
|
2
|
-
import { AgentAction, AgentFinish } from '@langchain/core/agents';
|
|
3
|
-
import { BaseCallbackHandler } from '@langchain/core/callbacks/base';
|
|
4
|
-
import { Document } from '@langchain/core/documents';
|
|
5
|
-
import { Serialized } from '@langchain/core/load/serializable';
|
|
6
|
-
import { BaseMessageFields, MessageContent, BaseMessage } from '@langchain/core/messages';
|
|
7
|
-
import { LLMResult } from '@langchain/core/outputs';
|
|
8
|
-
import { ChainValues } from '@langchain/core/utils/types';
|
|
9
|
-
|
|
10
|
-
type LlmMessage = {
|
|
11
|
-
role: string;
|
|
12
|
-
content: BaseMessageFields["content"];
|
|
13
|
-
additional_kwargs?: BaseMessageFields["additional_kwargs"];
|
|
14
|
-
};
|
|
15
|
-
type AnonymousLlmMessage = {
|
|
16
|
-
content: BaseMessageFields["content"];
|
|
17
|
-
additional_kwargs?: BaseMessageFields["additional_kwargs"];
|
|
18
|
-
};
|
|
19
|
-
type ConstructorParams = {
|
|
20
|
-
userId?: string;
|
|
21
|
-
sessionId?: string;
|
|
22
|
-
tags?: string[];
|
|
23
|
-
version?: string;
|
|
24
|
-
traceMetadata?: Record<string, unknown>;
|
|
25
|
-
};
|
|
26
|
-
declare class CallbackHandler extends BaseCallbackHandler {
|
|
27
|
-
name: string;
|
|
28
|
-
private userId?;
|
|
29
|
-
private version?;
|
|
30
|
-
private sessionId?;
|
|
31
|
-
private tags;
|
|
32
|
-
private traceMetadata?;
|
|
33
|
-
private completionStartTimes;
|
|
34
|
-
private promptToParentRunMap;
|
|
35
|
-
private runMap;
|
|
36
|
-
last_trace_id: string | null;
|
|
37
|
-
constructor(params?: ConstructorParams);
|
|
38
|
-
get logger(): _elasticdash_core.Logger;
|
|
39
|
-
handleLLMNewToken(token: string, _idx: any, runId: string, _parentRunId?: string, _tags?: string[], _fields?: any): Promise<void>;
|
|
40
|
-
handleChainStart(chain: Serialized, inputs: ChainValues, runId: string, parentRunId?: string | undefined, tags?: string[] | undefined, metadata?: Record<string, unknown> | undefined, runType?: string, name?: string): Promise<void>;
|
|
41
|
-
handleAgentAction(action: AgentAction, runId: string, parentRunId?: string): Promise<void>;
|
|
42
|
-
handleAgentEnd?(action: AgentFinish, runId: string, parentRunId?: string): Promise<void>;
|
|
43
|
-
handleChainError(err: any, runId: string, parentRunId?: string | undefined): Promise<void>;
|
|
44
|
-
handleGenerationStart(llm: Serialized, messages: (LlmMessage | MessageContent | AnonymousLlmMessage)[], runId: string, parentRunId?: string | undefined, extraParams?: Record<string, unknown> | undefined, tags?: string[] | undefined, metadata?: Record<string, unknown> | undefined, name?: string): Promise<void>;
|
|
45
|
-
handleChatModelStart(llm: Serialized, messages: BaseMessage[][], runId: string, parentRunId?: string | undefined, extraParams?: Record<string, unknown> | undefined, tags?: string[] | undefined, metadata?: Record<string, unknown> | undefined, name?: string): Promise<void>;
|
|
46
|
-
handleChainEnd(outputs: ChainValues, runId: string, parentRunId?: string | undefined): Promise<void>;
|
|
47
|
-
handleLLMStart(llm: Serialized, prompts: string[], runId: string, parentRunId?: string | undefined, extraParams?: Record<string, unknown> | undefined, tags?: string[] | undefined, metadata?: Record<string, unknown> | undefined, name?: string): Promise<void>;
|
|
48
|
-
handleToolStart(tool: Serialized, input: string, runId: string, parentRunId?: string | undefined, tags?: string[] | undefined, metadata?: Record<string, unknown> | undefined, name?: string): Promise<void>;
|
|
49
|
-
handleRetrieverStart(retriever: Serialized, query: string, runId: string, parentRunId?: string | undefined, tags?: string[] | undefined, metadata?: Record<string, unknown> | undefined, name?: string): Promise<void>;
|
|
50
|
-
handleRetrieverEnd(documents: Document<Record<string, any>>[], runId: string, parentRunId?: string | undefined): Promise<void>;
|
|
51
|
-
handleRetrieverError(err: any, runId: string, parentRunId?: string | undefined): Promise<void>;
|
|
52
|
-
handleToolEnd(output: string, runId: string, parentRunId?: string | undefined): Promise<void>;
|
|
53
|
-
handleToolError(err: any, runId: string, parentRunId?: string | undefined): Promise<void>;
|
|
54
|
-
handleLLMEnd(output: LLMResult, runId: string, parentRunId?: string | undefined): Promise<void>;
|
|
55
|
-
handleLLMError(err: any, runId: string, parentRunId?: string | undefined): Promise<void>;
|
|
56
|
-
private registerLangfusePrompt;
|
|
57
|
-
private deregisterLangfusePrompt;
|
|
58
|
-
private startAndRegisterOtelSpan;
|
|
59
|
-
private handleOtelSpanEnd;
|
|
60
|
-
private parseAzureRefusalError;
|
|
61
|
-
private joinTagsAndMetaData;
|
|
62
|
-
private stripLangfuseKeysFromMetadata;
|
|
63
|
-
/** Not all models supports tokenUsage in llmOutput, can use AIMessage.usage_metadata instead */
|
|
64
|
-
private extractUsageMetadata;
|
|
65
|
-
private extractModelNameFromMetadata;
|
|
66
|
-
private extractChatMessageContent;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
export { CallbackHandler };
|