neatlogs 1.0.5 → 1.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.
Files changed (63) hide show
  1. package/dist/azure-openai.cjs +344 -0
  2. package/dist/azure-openai.cjs.map +1 -0
  3. package/dist/azure-openai.d.ts +30 -0
  4. package/dist/azure-openai.mjs +318 -0
  5. package/dist/azure-openai.mjs.map +1 -0
  6. package/dist/bedrock.cjs +540 -0
  7. package/dist/bedrock.cjs.map +1 -0
  8. package/dist/bedrock.d.ts +29 -0
  9. package/dist/bedrock.mjs +514 -0
  10. package/dist/bedrock.mjs.map +1 -0
  11. package/dist/browser.cjs +121 -0
  12. package/dist/browser.cjs.map +1 -0
  13. package/dist/browser.d.ts +143 -0
  14. package/dist/browser.mjs +96 -0
  15. package/dist/browser.mjs.map +1 -0
  16. package/dist/claude-agent-sdk.cjs +406 -0
  17. package/dist/claude-agent-sdk.cjs.map +1 -0
  18. package/dist/claude-agent-sdk.d.ts +49 -0
  19. package/dist/claude-agent-sdk.mjs +381 -0
  20. package/dist/claude-agent-sdk.mjs.map +1 -0
  21. package/dist/index.cjs +3263 -839
  22. package/dist/index.cjs.map +1 -1
  23. package/dist/index.d.ts +10 -2
  24. package/dist/index.mjs +3254 -838
  25. package/dist/index.mjs.map +1 -1
  26. package/dist/langchain.cjs +9 -9
  27. package/dist/langchain.cjs.map +1 -1
  28. package/dist/langchain.mjs +9 -9
  29. package/dist/langchain.mjs.map +1 -1
  30. package/dist/mastra-wrap.cjs +25 -25
  31. package/dist/mastra-wrap.cjs.map +1 -1
  32. package/dist/mastra-wrap.mjs +25 -25
  33. package/dist/mastra-wrap.mjs.map +1 -1
  34. package/dist/openai-agents.cjs +6 -6
  35. package/dist/openai-agents.cjs.map +1 -1
  36. package/dist/openai-agents.mjs +6 -6
  37. package/dist/openai-agents.mjs.map +1 -1
  38. package/dist/opencode-plugin.cjs +5879 -0
  39. package/dist/opencode-plugin.cjs.map +1 -0
  40. package/dist/opencode-plugin.d.ts +38 -0
  41. package/dist/opencode-plugin.mjs +5854 -0
  42. package/dist/opencode-plugin.mjs.map +1 -0
  43. package/dist/openrouter-agent.cjs +273 -0
  44. package/dist/openrouter-agent.cjs.map +1 -0
  45. package/dist/openrouter-agent.d.ts +34 -0
  46. package/dist/openrouter-agent.mjs +247 -0
  47. package/dist/openrouter-agent.mjs.map +1 -0
  48. package/dist/pi-agent.cjs +237 -0
  49. package/dist/pi-agent.cjs.map +1 -0
  50. package/dist/pi-agent.d.ts +31 -0
  51. package/dist/pi-agent.mjs +216 -0
  52. package/dist/pi-agent.mjs.map +1 -0
  53. package/dist/strands.cjs +125 -2
  54. package/dist/strands.cjs.map +1 -1
  55. package/dist/strands.d.ts +13 -12
  56. package/dist/strands.mjs +125 -2
  57. package/dist/strands.mjs.map +1 -1
  58. package/dist/vertex-ai.cjs +424 -0
  59. package/dist/vertex-ai.cjs.map +1 -0
  60. package/dist/vertex-ai.d.ts +39 -0
  61. package/dist/vertex-ai.mjs +397 -0
  62. package/dist/vertex-ai.mjs.map +1 -0
  63. package/package.json +88 -1
@@ -46,7 +46,7 @@ var NeatlogsCallbackHandler = class {
46
46
  "neatlogs.chain.name": name
47
47
  };
48
48
  if (this._workflowName) attrs["neatlogs.workflow.name"] = this._workflowName;
49
- if (inputs) attrs["input.value"] = safeStringify(inputs).slice(0, 1e4);
49
+ if (inputs) attrs["input.value"] = safeStringify(inputs);
50
50
  if (tags?.length) attrs["neatlogs.tags"] = tags.join(",");
51
51
  const span = tracer.startSpan(`langchain.chain.${name}`, { attributes: attrs }, parentCtx);
52
52
  this._spans.set(runId, span);
@@ -54,7 +54,7 @@ var NeatlogsCallbackHandler = class {
54
54
  async handleChainEnd(outputs, runId) {
55
55
  const span = this._spans.get(runId);
56
56
  if (!span) return;
57
- if (outputs) span.setAttribute("output.value", safeStringify(outputs).slice(0, 1e4));
57
+ if (outputs) span.setAttribute("output.value", safeStringify(outputs));
58
58
  span.setStatus({ code: import_api.SpanStatusCode.OK });
59
59
  span.end();
60
60
  this._spans.delete(runId);
@@ -80,7 +80,7 @@ var NeatlogsCallbackHandler = class {
80
80
  };
81
81
  for (let i = 0; i < prompts.length; i++) {
82
82
  attrs[`neatlogs.llm.input_messages.${i}.role`] = "user";
83
- attrs[`neatlogs.llm.input_messages.${i}.content`] = prompts[i].slice(0, 1e4);
83
+ attrs[`neatlogs.llm.input_messages.${i}.content`] = prompts[i];
84
84
  }
85
85
  if (extraParams?.invocation_params) {
86
86
  const p = extraParams.invocation_params;
@@ -107,7 +107,7 @@ var NeatlogsCallbackHandler = class {
107
107
  const role = msg?.role ?? msg?._getType?.() ?? msg?.constructor?.name ?? "unknown";
108
108
  const content = typeof msg?.content === "string" ? msg.content : safeStringify(msg?.content);
109
109
  attrs[`neatlogs.llm.input_messages.${i}.role`] = mapRole(role);
110
- attrs[`neatlogs.llm.input_messages.${i}.content`] = content.slice(0, 1e4);
110
+ attrs[`neatlogs.llm.input_messages.${i}.content`] = content;
111
111
  }
112
112
  if (extraParams?.invocation_params) {
113
113
  const p = extraParams.invocation_params;
@@ -129,7 +129,7 @@ var NeatlogsCallbackHandler = class {
129
129
  const msg = gen[j]?.message ?? gen[j];
130
130
  const content = msg?.content ?? msg?.text ?? "";
131
131
  span.setAttribute(`neatlogs.llm.output_messages.${i}.role`, "assistant");
132
- span.setAttribute(`neatlogs.llm.output_messages.${i}.content`, String(content).slice(0, 1e4));
132
+ span.setAttribute(`neatlogs.llm.output_messages.${i}.content`, String(content));
133
133
  const toolCalls = msg?.tool_calls ?? msg?.additional_kwargs?.tool_calls;
134
134
  if (toolCalls && Array.isArray(toolCalls)) {
135
135
  for (let k = 0; k < toolCalls.length; k++) {
@@ -176,7 +176,7 @@ var NeatlogsCallbackHandler = class {
176
176
  const attrs = {
177
177
  "neatlogs.span.kind": "TOOL",
178
178
  "neatlogs.tool.name": name,
179
- "input.value": String(input).slice(0, 1e4)
179
+ "input.value": String(input)
180
180
  };
181
181
  if (toolCallId) attrs["neatlogs.tool_call.id"] = toolCallId;
182
182
  const span = tracer.startSpan(`langchain.tool.${name}`, { attributes: attrs }, parentCtx);
@@ -185,7 +185,7 @@ var NeatlogsCallbackHandler = class {
185
185
  async handleToolEnd(output, runId) {
186
186
  const span = this._spans.get(runId);
187
187
  if (!span) return;
188
- span.setAttribute("output.value", String(output).slice(0, 1e4));
188
+ span.setAttribute("output.value", String(output));
189
189
  span.setStatus({ code: import_api.SpanStatusCode.OK });
190
190
  span.end();
191
191
  this._spans.delete(runId);
@@ -207,7 +207,7 @@ var NeatlogsCallbackHandler = class {
207
207
  const attrs = {
208
208
  "neatlogs.span.kind": "RETRIEVER",
209
209
  "neatlogs.retriever.name": name,
210
- "input.value": query.slice(0, 1e4)
210
+ "input.value": query
211
211
  };
212
212
  const span = tracer.startSpan(`langchain.retriever.${name}`, { attributes: attrs }, parentCtx);
213
213
  this._spans.set(runId, span);
@@ -220,7 +220,7 @@ var NeatlogsCallbackHandler = class {
220
220
  for (let i = 0; i < Math.min(documents.length, 10); i++) {
221
221
  const doc = documents[i];
222
222
  if (doc?.pageContent) {
223
- span.setAttribute(`neatlogs.retriever.documents.${i}.content`, doc.pageContent.slice(0, 2e3));
223
+ span.setAttribute(`neatlogs.retriever.documents.${i}.content`, doc.pageContent);
224
224
  }
225
225
  }
226
226
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/langchain.ts"],"sourcesContent":["/**\n * Neatlogs LangChain/LangGraph callback handler.\n *\n * Usage:\n * import { langchainHandler } from 'neatlogs/langchain';\n * const result = await chain.invoke(input, { callbacks: [langchainHandler()] });\n *\n * Creates spans: CHAIN (chain/graph runs), LLM (model calls), TOOL (tool invocations).\n * Works with LangChain, LangGraph, and Deep Agents (same callback interface).\n */\n\nimport { trace, context as otelContext, SpanStatusCode, type Span } from '@opentelemetry/api';\n\nconst TRACER_NAME = 'neatlogs.langchain';\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport interface LangchainHandlerOptions {\n workflowName?: string;\n}\n\nexport function langchainHandler(opts?: LangchainHandlerOptions): any {\n return new NeatlogsCallbackHandler(opts);\n}\n\n// ---------------------------------------------------------------------------\n// Callback Handler\n// ---------------------------------------------------------------------------\n\nclass NeatlogsCallbackHandler {\n name = 'neatlogs';\n private _spans: Map<string, Span> = new Map();\n private _workflowName: string | undefined;\n\n constructor(opts?: LangchainHandlerOptions) {\n this._workflowName = opts?.workflowName;\n }\n\n // --- Chain/Graph callbacks ---\n\n async handleChainStart(\n serialized: Record<string, any>,\n inputs: Record<string, any>,\n runId: string,\n parentRunId?: string,\n tags?: string[],\n metadata?: Record<string, any>,\n ): Promise<void> {\n const tracer = trace.getTracer(TRACER_NAME);\n const name = serialized?.name ?? serialized?.id?.at(-1) ?? 'chain';\n\n const parentSpan = parentRunId ? this._spans.get(parentRunId) : undefined;\n const parentCtx = parentSpan\n ? trace.setSpan(otelContext.active(), parentSpan)\n : otelContext.active();\n\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'CHAIN',\n 'neatlogs.chain.name': name,\n };\n if (this._workflowName) attrs['neatlogs.workflow.name'] = this._workflowName;\n if (inputs) attrs['input.value'] = safeStringify(inputs).slice(0, 10000);\n if (tags?.length) attrs['neatlogs.tags'] = tags.join(',');\n\n const span = tracer.startSpan(`langchain.chain.${name}`, { attributes: attrs }, parentCtx);\n this._spans.set(runId, span);\n }\n\n async handleChainEnd(\n outputs: Record<string, any>,\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n if (outputs) span.setAttribute('output.value', safeStringify(outputs).slice(0, 10000));\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n this._spans.delete(runId);\n }\n\n async handleChainError(\n error: Error,\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });\n span.recordException(error);\n span.end();\n this._spans.delete(runId);\n }\n\n // --- LLM callbacks ---\n\n async handleLLMStart(\n serialized: Record<string, any>,\n prompts: string[],\n runId: string,\n parentRunId?: string,\n extraParams?: Record<string, any>,\n ): Promise<void> {\n const tracer = trace.getTracer(TRACER_NAME);\n const model = serialized?.kwargs?.model_name ?? serialized?.kwargs?.model ?? serialized?.name ?? '';\n\n const parentSpan = parentRunId ? this._spans.get(parentRunId) : undefined;\n const parentCtx = parentSpan\n ? trace.setSpan(otelContext.active(), parentSpan)\n : otelContext.active();\n\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': detectProvider(model),\n 'neatlogs.llm.model_name': model,\n };\n\n for (let i = 0; i < prompts.length; i++) {\n attrs[`neatlogs.llm.input_messages.${i}.role`] = 'user';\n attrs[`neatlogs.llm.input_messages.${i}.content`] = prompts[i].slice(0, 10000);\n }\n\n if (extraParams?.invocation_params) {\n const p = extraParams.invocation_params;\n if (p.temperature != null) attrs['neatlogs.llm.temperature'] = p.temperature;\n if (p.max_tokens != null) attrs['neatlogs.llm.max_tokens'] = p.max_tokens;\n if (p.model_name) attrs['neatlogs.llm.model_name'] = p.model_name;\n }\n\n const span = tracer.startSpan('langchain.llm', { attributes: attrs }, parentCtx);\n this._spans.set(runId, span);\n }\n\n async handleChatModelStart(\n serialized: Record<string, any>,\n messages: any[][],\n runId: string,\n parentRunId?: string,\n extraParams?: Record<string, any>,\n ): Promise<void> {\n const tracer = trace.getTracer(TRACER_NAME);\n const model = serialized?.kwargs?.model_name ?? serialized?.kwargs?.model ?? serialized?.name ?? '';\n\n const parentSpan = parentRunId ? this._spans.get(parentRunId) : undefined;\n const parentCtx = parentSpan\n ? trace.setSpan(otelContext.active(), parentSpan)\n : otelContext.active();\n\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': detectProvider(model),\n 'neatlogs.llm.model_name': model,\n };\n\n const flatMessages = messages.flat();\n for (let i = 0; i < flatMessages.length; i++) {\n const msg = flatMessages[i];\n const role = msg?.role ?? msg?._getType?.() ?? msg?.constructor?.name ?? 'unknown';\n const content = typeof msg?.content === 'string' ? msg.content : safeStringify(msg?.content);\n attrs[`neatlogs.llm.input_messages.${i}.role`] = mapRole(role);\n attrs[`neatlogs.llm.input_messages.${i}.content`] = content.slice(0, 10000);\n }\n\n if (extraParams?.invocation_params) {\n const p = extraParams.invocation_params;\n if (p.temperature != null) attrs['neatlogs.llm.temperature'] = p.temperature;\n if (p.max_tokens != null) attrs['neatlogs.llm.max_tokens'] = p.max_tokens;\n if (p.model_name) attrs['neatlogs.llm.model_name'] = p.model_name;\n }\n\n const span = tracer.startSpan('langchain.chat_model', { attributes: attrs }, parentCtx);\n this._spans.set(runId, span);\n }\n\n async handleLLMEnd(\n output: any,\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n const generations = output?.generations ?? [];\n for (let i = 0; i < generations.length; i++) {\n const gen = generations[i];\n if (!Array.isArray(gen)) continue;\n for (let j = 0; j < gen.length; j++) {\n const msg = gen[j]?.message ?? gen[j];\n const content = msg?.content ?? msg?.text ?? '';\n span.setAttribute(`neatlogs.llm.output_messages.${i}.role`, 'assistant');\n span.setAttribute(`neatlogs.llm.output_messages.${i}.content`, String(content).slice(0, 10000));\n\n const toolCalls = msg?.tool_calls ?? msg?.additional_kwargs?.tool_calls;\n if (toolCalls && Array.isArray(toolCalls)) {\n for (let k = 0; k < toolCalls.length; k++) {\n const tc = toolCalls[k];\n span.setAttribute(`neatlogs.llm.tool_calls.${k}.id`, tc.id ?? '');\n span.setAttribute(`neatlogs.llm.tool_calls.${k}.name`, tc.name ?? tc.function?.name ?? '');\n span.setAttribute(`neatlogs.llm.tool_calls.${k}.arguments`, tc.args ? safeStringify(tc.args) : (tc.function?.arguments ?? ''));\n }\n }\n }\n }\n\n const usage = output?.llmOutput?.tokenUsage ?? output?.llmOutput?.usage;\n if (usage) {\n if (usage.promptTokens != null || usage.prompt_tokens != null) {\n span.setAttribute('neatlogs.llm.token_count.prompt', usage.promptTokens ?? usage.prompt_tokens);\n }\n if (usage.completionTokens != null || usage.completion_tokens != null) {\n span.setAttribute('neatlogs.llm.token_count.completion', usage.completionTokens ?? usage.completion_tokens);\n }\n if (usage.totalTokens != null || usage.total_tokens != null) {\n span.setAttribute('neatlogs.llm.token_count.total', usage.totalTokens ?? usage.total_tokens);\n }\n }\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n this._spans.delete(runId);\n }\n\n async handleLLMNewToken(\n _token: string,\n _idx: any,\n _runId: string,\n ): Promise<void> {}\n\n async handleLLMError(\n error: Error,\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });\n span.recordException(error);\n span.end();\n this._spans.delete(runId);\n }\n\n // --- Tool callbacks ---\n\n async handleToolStart(\n serialized: Record<string, any>,\n input: string,\n runId: string,\n parentRunId?: string,\n _tags?: string[],\n _metadata?: Record<string, unknown>,\n runName?: string,\n toolCallId?: string,\n ): Promise<void> {\n const tracer = trace.getTracer(TRACER_NAME);\n // LangChain 1.x: serialized.name is absent and serialized.id is the class\n // name (e.g. \"DynamicStructuredTool\"); the real tool name arrives as `runName`.\n // Prefer serialized.name (older LC), then runName, then the class id, then 'tool'.\n const name =\n serialized?.name ||\n runName ||\n (Array.isArray(serialized?.id) ? serialized.id[serialized.id.length - 1] : undefined) ||\n 'tool';\n\n const parentSpan = parentRunId ? this._spans.get(parentRunId) : undefined;\n const parentCtx = parentSpan\n ? trace.setSpan(otelContext.active(), parentSpan)\n : otelContext.active();\n\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'TOOL',\n 'neatlogs.tool.name': name,\n 'input.value': String(input).slice(0, 10000),\n };\n if (toolCallId) attrs['neatlogs.tool_call.id'] = toolCallId;\n\n const span = tracer.startSpan(`langchain.tool.${name}`, { attributes: attrs }, parentCtx);\n this._spans.set(runId, span);\n }\n\n async handleToolEnd(\n output: string,\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n span.setAttribute('output.value', String(output).slice(0, 10000));\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n this._spans.delete(runId);\n }\n\n async handleToolError(\n error: Error,\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });\n span.recordException(error);\n span.end();\n this._spans.delete(runId);\n }\n\n // --- Retriever callbacks ---\n\n async handleRetrieverStart(\n serialized: Record<string, any>,\n query: string,\n runId: string,\n parentRunId?: string,\n ): Promise<void> {\n const tracer = trace.getTracer(TRACER_NAME);\n const name = serialized?.name ?? 'retriever';\n\n const parentSpan = parentRunId ? this._spans.get(parentRunId) : undefined;\n const parentCtx = parentSpan\n ? trace.setSpan(otelContext.active(), parentSpan)\n : otelContext.active();\n\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'RETRIEVER',\n 'neatlogs.retriever.name': name,\n 'input.value': query.slice(0, 10000),\n };\n\n const span = tracer.startSpan(`langchain.retriever.${name}`, { attributes: attrs }, parentCtx);\n this._spans.set(runId, span);\n }\n\n async handleRetrieverEnd(\n documents: any[],\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n if (documents?.length) {\n span.setAttribute('neatlogs.retriever.document_count', documents.length);\n for (let i = 0; i < Math.min(documents.length, 10); i++) {\n const doc = documents[i];\n if (doc?.pageContent) {\n span.setAttribute(`neatlogs.retriever.documents.${i}.content`, doc.pageContent.slice(0, 2000));\n }\n }\n }\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n this._spans.delete(runId);\n }\n\n async handleRetrieverError(\n error: Error,\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });\n span.recordException(error);\n span.end();\n this._spans.delete(runId);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nfunction detectProvider(model: string): string {\n const m = model.toLowerCase();\n if (m.includes('gpt') || m.includes('o1') || m.includes('o3') || m.includes('o4')) return 'openai';\n if (m.includes('claude')) return 'anthropic';\n if (m.includes('gemini')) return 'google';\n if (m.includes('command')) return 'cohere';\n if (m.includes('llama') || m.includes('mixtral')) return 'meta';\n return 'unknown';\n}\n\nfunction mapRole(role: string): string {\n const r = role.toLowerCase();\n if (r === 'human' || r === 'humanmessage') return 'user';\n if (r === 'ai' || r === 'aimessage') return 'assistant';\n if (r === 'system' || r === 'systemmessage') return 'system';\n if (r === 'function' || r === 'functionmessage') return 'function';\n if (r === 'tool' || r === 'toolmessage') return 'tool';\n return role;\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return typeof value === 'string' ? value : JSON.stringify(value);\n } catch {\n return '';\n }\n}\n"],"mappings":"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","names":["otelContext"]}
1
+ {"version":3,"sources":["../src/langchain.ts"],"sourcesContent":["/**\n * Neatlogs LangChain/LangGraph callback handler.\n *\n * Usage:\n * import { langchainHandler } from 'neatlogs/langchain';\n * const result = await chain.invoke(input, { callbacks: [langchainHandler()] });\n *\n * Creates spans: CHAIN (chain/graph runs), LLM (model calls), TOOL (tool invocations).\n * Works with LangChain, LangGraph, and Deep Agents (same callback interface).\n */\n\nimport { trace, context as otelContext, SpanStatusCode, type Span } from '@opentelemetry/api';\n\nconst TRACER_NAME = 'neatlogs.langchain';\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport interface LangchainHandlerOptions {\n workflowName?: string;\n}\n\nexport function langchainHandler(opts?: LangchainHandlerOptions): any {\n return new NeatlogsCallbackHandler(opts);\n}\n\n// ---------------------------------------------------------------------------\n// Callback Handler\n// ---------------------------------------------------------------------------\n\nclass NeatlogsCallbackHandler {\n name = 'neatlogs';\n private _spans: Map<string, Span> = new Map();\n private _workflowName: string | undefined;\n\n constructor(opts?: LangchainHandlerOptions) {\n this._workflowName = opts?.workflowName;\n }\n\n // --- Chain/Graph callbacks ---\n\n async handleChainStart(\n serialized: Record<string, any>,\n inputs: Record<string, any>,\n runId: string,\n parentRunId?: string,\n tags?: string[],\n metadata?: Record<string, any>,\n ): Promise<void> {\n const tracer = trace.getTracer(TRACER_NAME);\n const name = serialized?.name ?? serialized?.id?.at(-1) ?? 'chain';\n\n const parentSpan = parentRunId ? this._spans.get(parentRunId) : undefined;\n const parentCtx = parentSpan\n ? trace.setSpan(otelContext.active(), parentSpan)\n : otelContext.active();\n\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'CHAIN',\n 'neatlogs.chain.name': name,\n };\n if (this._workflowName) attrs['neatlogs.workflow.name'] = this._workflowName;\n if (inputs) attrs['input.value'] = safeStringify(inputs);\n if (tags?.length) attrs['neatlogs.tags'] = tags.join(',');\n\n const span = tracer.startSpan(`langchain.chain.${name}`, { attributes: attrs }, parentCtx);\n this._spans.set(runId, span);\n }\n\n async handleChainEnd(\n outputs: Record<string, any>,\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n if (outputs) span.setAttribute('output.value', safeStringify(outputs));\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n this._spans.delete(runId);\n }\n\n async handleChainError(\n error: Error,\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });\n span.recordException(error);\n span.end();\n this._spans.delete(runId);\n }\n\n // --- LLM callbacks ---\n\n async handleLLMStart(\n serialized: Record<string, any>,\n prompts: string[],\n runId: string,\n parentRunId?: string,\n extraParams?: Record<string, any>,\n ): Promise<void> {\n const tracer = trace.getTracer(TRACER_NAME);\n const model = serialized?.kwargs?.model_name ?? serialized?.kwargs?.model ?? serialized?.name ?? '';\n\n const parentSpan = parentRunId ? this._spans.get(parentRunId) : undefined;\n const parentCtx = parentSpan\n ? trace.setSpan(otelContext.active(), parentSpan)\n : otelContext.active();\n\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': detectProvider(model),\n 'neatlogs.llm.model_name': model,\n };\n\n for (let i = 0; i < prompts.length; i++) {\n attrs[`neatlogs.llm.input_messages.${i}.role`] = 'user';\n attrs[`neatlogs.llm.input_messages.${i}.content`] = prompts[i];\n }\n\n if (extraParams?.invocation_params) {\n const p = extraParams.invocation_params;\n if (p.temperature != null) attrs['neatlogs.llm.temperature'] = p.temperature;\n if (p.max_tokens != null) attrs['neatlogs.llm.max_tokens'] = p.max_tokens;\n if (p.model_name) attrs['neatlogs.llm.model_name'] = p.model_name;\n }\n\n const span = tracer.startSpan('langchain.llm', { attributes: attrs }, parentCtx);\n this._spans.set(runId, span);\n }\n\n async handleChatModelStart(\n serialized: Record<string, any>,\n messages: any[][],\n runId: string,\n parentRunId?: string,\n extraParams?: Record<string, any>,\n ): Promise<void> {\n const tracer = trace.getTracer(TRACER_NAME);\n const model = serialized?.kwargs?.model_name ?? serialized?.kwargs?.model ?? serialized?.name ?? '';\n\n const parentSpan = parentRunId ? this._spans.get(parentRunId) : undefined;\n const parentCtx = parentSpan\n ? trace.setSpan(otelContext.active(), parentSpan)\n : otelContext.active();\n\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': detectProvider(model),\n 'neatlogs.llm.model_name': model,\n };\n\n const flatMessages = messages.flat();\n for (let i = 0; i < flatMessages.length; i++) {\n const msg = flatMessages[i];\n const role = msg?.role ?? msg?._getType?.() ?? msg?.constructor?.name ?? 'unknown';\n const content = typeof msg?.content === 'string' ? msg.content : safeStringify(msg?.content);\n attrs[`neatlogs.llm.input_messages.${i}.role`] = mapRole(role);\n attrs[`neatlogs.llm.input_messages.${i}.content`] = content;\n }\n\n if (extraParams?.invocation_params) {\n const p = extraParams.invocation_params;\n if (p.temperature != null) attrs['neatlogs.llm.temperature'] = p.temperature;\n if (p.max_tokens != null) attrs['neatlogs.llm.max_tokens'] = p.max_tokens;\n if (p.model_name) attrs['neatlogs.llm.model_name'] = p.model_name;\n }\n\n const span = tracer.startSpan('langchain.chat_model', { attributes: attrs }, parentCtx);\n this._spans.set(runId, span);\n }\n\n async handleLLMEnd(\n output: any,\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n const generations = output?.generations ?? [];\n for (let i = 0; i < generations.length; i++) {\n const gen = generations[i];\n if (!Array.isArray(gen)) continue;\n for (let j = 0; j < gen.length; j++) {\n const msg = gen[j]?.message ?? gen[j];\n const content = msg?.content ?? msg?.text ?? '';\n span.setAttribute(`neatlogs.llm.output_messages.${i}.role`, 'assistant');\n span.setAttribute(`neatlogs.llm.output_messages.${i}.content`, String(content));\n\n const toolCalls = msg?.tool_calls ?? msg?.additional_kwargs?.tool_calls;\n if (toolCalls && Array.isArray(toolCalls)) {\n for (let k = 0; k < toolCalls.length; k++) {\n const tc = toolCalls[k];\n span.setAttribute(`neatlogs.llm.tool_calls.${k}.id`, tc.id ?? '');\n span.setAttribute(`neatlogs.llm.tool_calls.${k}.name`, tc.name ?? tc.function?.name ?? '');\n span.setAttribute(`neatlogs.llm.tool_calls.${k}.arguments`, tc.args ? safeStringify(tc.args) : (tc.function?.arguments ?? ''));\n }\n }\n }\n }\n\n const usage = output?.llmOutput?.tokenUsage ?? output?.llmOutput?.usage;\n if (usage) {\n if (usage.promptTokens != null || usage.prompt_tokens != null) {\n span.setAttribute('neatlogs.llm.token_count.prompt', usage.promptTokens ?? usage.prompt_tokens);\n }\n if (usage.completionTokens != null || usage.completion_tokens != null) {\n span.setAttribute('neatlogs.llm.token_count.completion', usage.completionTokens ?? usage.completion_tokens);\n }\n if (usage.totalTokens != null || usage.total_tokens != null) {\n span.setAttribute('neatlogs.llm.token_count.total', usage.totalTokens ?? usage.total_tokens);\n }\n }\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n this._spans.delete(runId);\n }\n\n async handleLLMNewToken(\n _token: string,\n _idx: any,\n _runId: string,\n ): Promise<void> {}\n\n async handleLLMError(\n error: Error,\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });\n span.recordException(error);\n span.end();\n this._spans.delete(runId);\n }\n\n // --- Tool callbacks ---\n\n async handleToolStart(\n serialized: Record<string, any>,\n input: string,\n runId: string,\n parentRunId?: string,\n _tags?: string[],\n _metadata?: Record<string, unknown>,\n runName?: string,\n toolCallId?: string,\n ): Promise<void> {\n const tracer = trace.getTracer(TRACER_NAME);\n // LangChain 1.x: serialized.name is absent and serialized.id is the class\n // name (e.g. \"DynamicStructuredTool\"); the real tool name arrives as `runName`.\n // Prefer serialized.name (older LC), then runName, then the class id, then 'tool'.\n const name =\n serialized?.name ||\n runName ||\n (Array.isArray(serialized?.id) ? serialized.id[serialized.id.length - 1] : undefined) ||\n 'tool';\n\n const parentSpan = parentRunId ? this._spans.get(parentRunId) : undefined;\n const parentCtx = parentSpan\n ? trace.setSpan(otelContext.active(), parentSpan)\n : otelContext.active();\n\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'TOOL',\n 'neatlogs.tool.name': name,\n 'input.value': String(input),\n };\n if (toolCallId) attrs['neatlogs.tool_call.id'] = toolCallId;\n\n const span = tracer.startSpan(`langchain.tool.${name}`, { attributes: attrs }, parentCtx);\n this._spans.set(runId, span);\n }\n\n async handleToolEnd(\n output: string,\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n span.setAttribute('output.value', String(output));\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n this._spans.delete(runId);\n }\n\n async handleToolError(\n error: Error,\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });\n span.recordException(error);\n span.end();\n this._spans.delete(runId);\n }\n\n // --- Retriever callbacks ---\n\n async handleRetrieverStart(\n serialized: Record<string, any>,\n query: string,\n runId: string,\n parentRunId?: string,\n ): Promise<void> {\n const tracer = trace.getTracer(TRACER_NAME);\n const name = serialized?.name ?? 'retriever';\n\n const parentSpan = parentRunId ? this._spans.get(parentRunId) : undefined;\n const parentCtx = parentSpan\n ? trace.setSpan(otelContext.active(), parentSpan)\n : otelContext.active();\n\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'RETRIEVER',\n 'neatlogs.retriever.name': name,\n 'input.value': query,\n };\n\n const span = tracer.startSpan(`langchain.retriever.${name}`, { attributes: attrs }, parentCtx);\n this._spans.set(runId, span);\n }\n\n async handleRetrieverEnd(\n documents: any[],\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n if (documents?.length) {\n span.setAttribute('neatlogs.retriever.document_count', documents.length);\n for (let i = 0; i < Math.min(documents.length, 10); i++) {\n const doc = documents[i];\n if (doc?.pageContent) {\n span.setAttribute(`neatlogs.retriever.documents.${i}.content`, doc.pageContent);\n }\n }\n }\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n this._spans.delete(runId);\n }\n\n async handleRetrieverError(\n error: Error,\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });\n span.recordException(error);\n span.end();\n this._spans.delete(runId);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nfunction detectProvider(model: string): string {\n const m = model.toLowerCase();\n if (m.includes('gpt') || m.includes('o1') || m.includes('o3') || m.includes('o4')) return 'openai';\n if (m.includes('claude')) return 'anthropic';\n if (m.includes('gemini')) return 'google';\n if (m.includes('command')) return 'cohere';\n if (m.includes('llama') || m.includes('mixtral')) return 'meta';\n return 'unknown';\n}\n\nfunction mapRole(role: string): string {\n const r = role.toLowerCase();\n if (r === 'human' || r === 'humanmessage') return 'user';\n if (r === 'ai' || r === 'aimessage') return 'assistant';\n if (r === 'system' || r === 'systemmessage') return 'system';\n if (r === 'function' || r === 'functionmessage') return 'function';\n if (r === 'tool' || r === 'toolmessage') return 'tool';\n return role;\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return typeof value === 'string' ? value : JSON.stringify(value);\n } catch {\n return '';\n }\n}\n"],"mappings":"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","names":["otelContext"]}
@@ -22,7 +22,7 @@ var NeatlogsCallbackHandler = class {
22
22
  "neatlogs.chain.name": name
23
23
  };
24
24
  if (this._workflowName) attrs["neatlogs.workflow.name"] = this._workflowName;
25
- if (inputs) attrs["input.value"] = safeStringify(inputs).slice(0, 1e4);
25
+ if (inputs) attrs["input.value"] = safeStringify(inputs);
26
26
  if (tags?.length) attrs["neatlogs.tags"] = tags.join(",");
27
27
  const span = tracer.startSpan(`langchain.chain.${name}`, { attributes: attrs }, parentCtx);
28
28
  this._spans.set(runId, span);
@@ -30,7 +30,7 @@ var NeatlogsCallbackHandler = class {
30
30
  async handleChainEnd(outputs, runId) {
31
31
  const span = this._spans.get(runId);
32
32
  if (!span) return;
33
- if (outputs) span.setAttribute("output.value", safeStringify(outputs).slice(0, 1e4));
33
+ if (outputs) span.setAttribute("output.value", safeStringify(outputs));
34
34
  span.setStatus({ code: SpanStatusCode.OK });
35
35
  span.end();
36
36
  this._spans.delete(runId);
@@ -56,7 +56,7 @@ var NeatlogsCallbackHandler = class {
56
56
  };
57
57
  for (let i = 0; i < prompts.length; i++) {
58
58
  attrs[`neatlogs.llm.input_messages.${i}.role`] = "user";
59
- attrs[`neatlogs.llm.input_messages.${i}.content`] = prompts[i].slice(0, 1e4);
59
+ attrs[`neatlogs.llm.input_messages.${i}.content`] = prompts[i];
60
60
  }
61
61
  if (extraParams?.invocation_params) {
62
62
  const p = extraParams.invocation_params;
@@ -83,7 +83,7 @@ var NeatlogsCallbackHandler = class {
83
83
  const role = msg?.role ?? msg?._getType?.() ?? msg?.constructor?.name ?? "unknown";
84
84
  const content = typeof msg?.content === "string" ? msg.content : safeStringify(msg?.content);
85
85
  attrs[`neatlogs.llm.input_messages.${i}.role`] = mapRole(role);
86
- attrs[`neatlogs.llm.input_messages.${i}.content`] = content.slice(0, 1e4);
86
+ attrs[`neatlogs.llm.input_messages.${i}.content`] = content;
87
87
  }
88
88
  if (extraParams?.invocation_params) {
89
89
  const p = extraParams.invocation_params;
@@ -105,7 +105,7 @@ var NeatlogsCallbackHandler = class {
105
105
  const msg = gen[j]?.message ?? gen[j];
106
106
  const content = msg?.content ?? msg?.text ?? "";
107
107
  span.setAttribute(`neatlogs.llm.output_messages.${i}.role`, "assistant");
108
- span.setAttribute(`neatlogs.llm.output_messages.${i}.content`, String(content).slice(0, 1e4));
108
+ span.setAttribute(`neatlogs.llm.output_messages.${i}.content`, String(content));
109
109
  const toolCalls = msg?.tool_calls ?? msg?.additional_kwargs?.tool_calls;
110
110
  if (toolCalls && Array.isArray(toolCalls)) {
111
111
  for (let k = 0; k < toolCalls.length; k++) {
@@ -152,7 +152,7 @@ var NeatlogsCallbackHandler = class {
152
152
  const attrs = {
153
153
  "neatlogs.span.kind": "TOOL",
154
154
  "neatlogs.tool.name": name,
155
- "input.value": String(input).slice(0, 1e4)
155
+ "input.value": String(input)
156
156
  };
157
157
  if (toolCallId) attrs["neatlogs.tool_call.id"] = toolCallId;
158
158
  const span = tracer.startSpan(`langchain.tool.${name}`, { attributes: attrs }, parentCtx);
@@ -161,7 +161,7 @@ var NeatlogsCallbackHandler = class {
161
161
  async handleToolEnd(output, runId) {
162
162
  const span = this._spans.get(runId);
163
163
  if (!span) return;
164
- span.setAttribute("output.value", String(output).slice(0, 1e4));
164
+ span.setAttribute("output.value", String(output));
165
165
  span.setStatus({ code: SpanStatusCode.OK });
166
166
  span.end();
167
167
  this._spans.delete(runId);
@@ -183,7 +183,7 @@ var NeatlogsCallbackHandler = class {
183
183
  const attrs = {
184
184
  "neatlogs.span.kind": "RETRIEVER",
185
185
  "neatlogs.retriever.name": name,
186
- "input.value": query.slice(0, 1e4)
186
+ "input.value": query
187
187
  };
188
188
  const span = tracer.startSpan(`langchain.retriever.${name}`, { attributes: attrs }, parentCtx);
189
189
  this._spans.set(runId, span);
@@ -196,7 +196,7 @@ var NeatlogsCallbackHandler = class {
196
196
  for (let i = 0; i < Math.min(documents.length, 10); i++) {
197
197
  const doc = documents[i];
198
198
  if (doc?.pageContent) {
199
- span.setAttribute(`neatlogs.retriever.documents.${i}.content`, doc.pageContent.slice(0, 2e3));
199
+ span.setAttribute(`neatlogs.retriever.documents.${i}.content`, doc.pageContent);
200
200
  }
201
201
  }
202
202
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/langchain.ts"],"sourcesContent":["/**\n * Neatlogs LangChain/LangGraph callback handler.\n *\n * Usage:\n * import { langchainHandler } from 'neatlogs/langchain';\n * const result = await chain.invoke(input, { callbacks: [langchainHandler()] });\n *\n * Creates spans: CHAIN (chain/graph runs), LLM (model calls), TOOL (tool invocations).\n * Works with LangChain, LangGraph, and Deep Agents (same callback interface).\n */\n\nimport { trace, context as otelContext, SpanStatusCode, type Span } from '@opentelemetry/api';\n\nconst TRACER_NAME = 'neatlogs.langchain';\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport interface LangchainHandlerOptions {\n workflowName?: string;\n}\n\nexport function langchainHandler(opts?: LangchainHandlerOptions): any {\n return new NeatlogsCallbackHandler(opts);\n}\n\n// ---------------------------------------------------------------------------\n// Callback Handler\n// ---------------------------------------------------------------------------\n\nclass NeatlogsCallbackHandler {\n name = 'neatlogs';\n private _spans: Map<string, Span> = new Map();\n private _workflowName: string | undefined;\n\n constructor(opts?: LangchainHandlerOptions) {\n this._workflowName = opts?.workflowName;\n }\n\n // --- Chain/Graph callbacks ---\n\n async handleChainStart(\n serialized: Record<string, any>,\n inputs: Record<string, any>,\n runId: string,\n parentRunId?: string,\n tags?: string[],\n metadata?: Record<string, any>,\n ): Promise<void> {\n const tracer = trace.getTracer(TRACER_NAME);\n const name = serialized?.name ?? serialized?.id?.at(-1) ?? 'chain';\n\n const parentSpan = parentRunId ? this._spans.get(parentRunId) : undefined;\n const parentCtx = parentSpan\n ? trace.setSpan(otelContext.active(), parentSpan)\n : otelContext.active();\n\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'CHAIN',\n 'neatlogs.chain.name': name,\n };\n if (this._workflowName) attrs['neatlogs.workflow.name'] = this._workflowName;\n if (inputs) attrs['input.value'] = safeStringify(inputs).slice(0, 10000);\n if (tags?.length) attrs['neatlogs.tags'] = tags.join(',');\n\n const span = tracer.startSpan(`langchain.chain.${name}`, { attributes: attrs }, parentCtx);\n this._spans.set(runId, span);\n }\n\n async handleChainEnd(\n outputs: Record<string, any>,\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n if (outputs) span.setAttribute('output.value', safeStringify(outputs).slice(0, 10000));\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n this._spans.delete(runId);\n }\n\n async handleChainError(\n error: Error,\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });\n span.recordException(error);\n span.end();\n this._spans.delete(runId);\n }\n\n // --- LLM callbacks ---\n\n async handleLLMStart(\n serialized: Record<string, any>,\n prompts: string[],\n runId: string,\n parentRunId?: string,\n extraParams?: Record<string, any>,\n ): Promise<void> {\n const tracer = trace.getTracer(TRACER_NAME);\n const model = serialized?.kwargs?.model_name ?? serialized?.kwargs?.model ?? serialized?.name ?? '';\n\n const parentSpan = parentRunId ? this._spans.get(parentRunId) : undefined;\n const parentCtx = parentSpan\n ? trace.setSpan(otelContext.active(), parentSpan)\n : otelContext.active();\n\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': detectProvider(model),\n 'neatlogs.llm.model_name': model,\n };\n\n for (let i = 0; i < prompts.length; i++) {\n attrs[`neatlogs.llm.input_messages.${i}.role`] = 'user';\n attrs[`neatlogs.llm.input_messages.${i}.content`] = prompts[i].slice(0, 10000);\n }\n\n if (extraParams?.invocation_params) {\n const p = extraParams.invocation_params;\n if (p.temperature != null) attrs['neatlogs.llm.temperature'] = p.temperature;\n if (p.max_tokens != null) attrs['neatlogs.llm.max_tokens'] = p.max_tokens;\n if (p.model_name) attrs['neatlogs.llm.model_name'] = p.model_name;\n }\n\n const span = tracer.startSpan('langchain.llm', { attributes: attrs }, parentCtx);\n this._spans.set(runId, span);\n }\n\n async handleChatModelStart(\n serialized: Record<string, any>,\n messages: any[][],\n runId: string,\n parentRunId?: string,\n extraParams?: Record<string, any>,\n ): Promise<void> {\n const tracer = trace.getTracer(TRACER_NAME);\n const model = serialized?.kwargs?.model_name ?? serialized?.kwargs?.model ?? serialized?.name ?? '';\n\n const parentSpan = parentRunId ? this._spans.get(parentRunId) : undefined;\n const parentCtx = parentSpan\n ? trace.setSpan(otelContext.active(), parentSpan)\n : otelContext.active();\n\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': detectProvider(model),\n 'neatlogs.llm.model_name': model,\n };\n\n const flatMessages = messages.flat();\n for (let i = 0; i < flatMessages.length; i++) {\n const msg = flatMessages[i];\n const role = msg?.role ?? msg?._getType?.() ?? msg?.constructor?.name ?? 'unknown';\n const content = typeof msg?.content === 'string' ? msg.content : safeStringify(msg?.content);\n attrs[`neatlogs.llm.input_messages.${i}.role`] = mapRole(role);\n attrs[`neatlogs.llm.input_messages.${i}.content`] = content.slice(0, 10000);\n }\n\n if (extraParams?.invocation_params) {\n const p = extraParams.invocation_params;\n if (p.temperature != null) attrs['neatlogs.llm.temperature'] = p.temperature;\n if (p.max_tokens != null) attrs['neatlogs.llm.max_tokens'] = p.max_tokens;\n if (p.model_name) attrs['neatlogs.llm.model_name'] = p.model_name;\n }\n\n const span = tracer.startSpan('langchain.chat_model', { attributes: attrs }, parentCtx);\n this._spans.set(runId, span);\n }\n\n async handleLLMEnd(\n output: any,\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n const generations = output?.generations ?? [];\n for (let i = 0; i < generations.length; i++) {\n const gen = generations[i];\n if (!Array.isArray(gen)) continue;\n for (let j = 0; j < gen.length; j++) {\n const msg = gen[j]?.message ?? gen[j];\n const content = msg?.content ?? msg?.text ?? '';\n span.setAttribute(`neatlogs.llm.output_messages.${i}.role`, 'assistant');\n span.setAttribute(`neatlogs.llm.output_messages.${i}.content`, String(content).slice(0, 10000));\n\n const toolCalls = msg?.tool_calls ?? msg?.additional_kwargs?.tool_calls;\n if (toolCalls && Array.isArray(toolCalls)) {\n for (let k = 0; k < toolCalls.length; k++) {\n const tc = toolCalls[k];\n span.setAttribute(`neatlogs.llm.tool_calls.${k}.id`, tc.id ?? '');\n span.setAttribute(`neatlogs.llm.tool_calls.${k}.name`, tc.name ?? tc.function?.name ?? '');\n span.setAttribute(`neatlogs.llm.tool_calls.${k}.arguments`, tc.args ? safeStringify(tc.args) : (tc.function?.arguments ?? ''));\n }\n }\n }\n }\n\n const usage = output?.llmOutput?.tokenUsage ?? output?.llmOutput?.usage;\n if (usage) {\n if (usage.promptTokens != null || usage.prompt_tokens != null) {\n span.setAttribute('neatlogs.llm.token_count.prompt', usage.promptTokens ?? usage.prompt_tokens);\n }\n if (usage.completionTokens != null || usage.completion_tokens != null) {\n span.setAttribute('neatlogs.llm.token_count.completion', usage.completionTokens ?? usage.completion_tokens);\n }\n if (usage.totalTokens != null || usage.total_tokens != null) {\n span.setAttribute('neatlogs.llm.token_count.total', usage.totalTokens ?? usage.total_tokens);\n }\n }\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n this._spans.delete(runId);\n }\n\n async handleLLMNewToken(\n _token: string,\n _idx: any,\n _runId: string,\n ): Promise<void> {}\n\n async handleLLMError(\n error: Error,\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });\n span.recordException(error);\n span.end();\n this._spans.delete(runId);\n }\n\n // --- Tool callbacks ---\n\n async handleToolStart(\n serialized: Record<string, any>,\n input: string,\n runId: string,\n parentRunId?: string,\n _tags?: string[],\n _metadata?: Record<string, unknown>,\n runName?: string,\n toolCallId?: string,\n ): Promise<void> {\n const tracer = trace.getTracer(TRACER_NAME);\n // LangChain 1.x: serialized.name is absent and serialized.id is the class\n // name (e.g. \"DynamicStructuredTool\"); the real tool name arrives as `runName`.\n // Prefer serialized.name (older LC), then runName, then the class id, then 'tool'.\n const name =\n serialized?.name ||\n runName ||\n (Array.isArray(serialized?.id) ? serialized.id[serialized.id.length - 1] : undefined) ||\n 'tool';\n\n const parentSpan = parentRunId ? this._spans.get(parentRunId) : undefined;\n const parentCtx = parentSpan\n ? trace.setSpan(otelContext.active(), parentSpan)\n : otelContext.active();\n\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'TOOL',\n 'neatlogs.tool.name': name,\n 'input.value': String(input).slice(0, 10000),\n };\n if (toolCallId) attrs['neatlogs.tool_call.id'] = toolCallId;\n\n const span = tracer.startSpan(`langchain.tool.${name}`, { attributes: attrs }, parentCtx);\n this._spans.set(runId, span);\n }\n\n async handleToolEnd(\n output: string,\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n span.setAttribute('output.value', String(output).slice(0, 10000));\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n this._spans.delete(runId);\n }\n\n async handleToolError(\n error: Error,\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });\n span.recordException(error);\n span.end();\n this._spans.delete(runId);\n }\n\n // --- Retriever callbacks ---\n\n async handleRetrieverStart(\n serialized: Record<string, any>,\n query: string,\n runId: string,\n parentRunId?: string,\n ): Promise<void> {\n const tracer = trace.getTracer(TRACER_NAME);\n const name = serialized?.name ?? 'retriever';\n\n const parentSpan = parentRunId ? this._spans.get(parentRunId) : undefined;\n const parentCtx = parentSpan\n ? trace.setSpan(otelContext.active(), parentSpan)\n : otelContext.active();\n\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'RETRIEVER',\n 'neatlogs.retriever.name': name,\n 'input.value': query.slice(0, 10000),\n };\n\n const span = tracer.startSpan(`langchain.retriever.${name}`, { attributes: attrs }, parentCtx);\n this._spans.set(runId, span);\n }\n\n async handleRetrieverEnd(\n documents: any[],\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n if (documents?.length) {\n span.setAttribute('neatlogs.retriever.document_count', documents.length);\n for (let i = 0; i < Math.min(documents.length, 10); i++) {\n const doc = documents[i];\n if (doc?.pageContent) {\n span.setAttribute(`neatlogs.retriever.documents.${i}.content`, doc.pageContent.slice(0, 2000));\n }\n }\n }\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n this._spans.delete(runId);\n }\n\n async handleRetrieverError(\n error: Error,\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });\n span.recordException(error);\n span.end();\n this._spans.delete(runId);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nfunction detectProvider(model: string): string {\n const m = model.toLowerCase();\n if (m.includes('gpt') || m.includes('o1') || m.includes('o3') || m.includes('o4')) return 'openai';\n if (m.includes('claude')) return 'anthropic';\n if (m.includes('gemini')) return 'google';\n if (m.includes('command')) return 'cohere';\n if (m.includes('llama') || m.includes('mixtral')) return 'meta';\n return 'unknown';\n}\n\nfunction mapRole(role: string): string {\n const r = role.toLowerCase();\n if (r === 'human' || r === 'humanmessage') return 'user';\n if (r === 'ai' || r === 'aimessage') return 'assistant';\n if (r === 'system' || r === 'systemmessage') return 'system';\n if (r === 'function' || r === 'functionmessage') return 'function';\n if (r === 'tool' || r === 'toolmessage') return 'tool';\n return role;\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return typeof value === 'string' ? value : JSON.stringify(value);\n } catch {\n return '';\n }\n}\n"],"mappings":";AAWA,SAAS,OAAO,WAAW,aAAa,sBAAiC;AAEzE,IAAM,cAAc;AAUb,SAAS,iBAAiB,MAAqC;AACpE,SAAO,IAAI,wBAAwB,IAAI;AACzC;AAMA,IAAM,0BAAN,MAA8B;AAAA,EAC5B,OAAO;AAAA,EACC,SAA4B,oBAAI,IAAI;AAAA,EACpC;AAAA,EAER,YAAY,MAAgC;AAC1C,SAAK,gBAAgB,MAAM;AAAA,EAC7B;AAAA;AAAA,EAIA,MAAM,iBACJ,YACA,QACA,OACA,aACA,MACA,UACe;AACf,UAAM,SAAS,MAAM,UAAU,WAAW;AAC1C,UAAM,OAAO,YAAY,QAAQ,YAAY,IAAI,GAAG,EAAE,KAAK;AAE3D,UAAM,aAAa,cAAc,KAAK,OAAO,IAAI,WAAW,IAAI;AAChE,UAAM,YAAY,aACd,MAAM,QAAQ,YAAY,OAAO,GAAG,UAAU,IAC9C,YAAY,OAAO;AAEvB,UAAM,QAA6B;AAAA,MACjC,sBAAsB;AAAA,MACtB,uBAAuB;AAAA,IACzB;AACA,QAAI,KAAK,cAAe,OAAM,wBAAwB,IAAI,KAAK;AAC/D,QAAI,OAAQ,OAAM,aAAa,IAAI,cAAc,MAAM,EAAE,MAAM,GAAG,GAAK;AACvE,QAAI,MAAM,OAAQ,OAAM,eAAe,IAAI,KAAK,KAAK,GAAG;AAExD,UAAM,OAAO,OAAO,UAAU,mBAAmB,IAAI,IAAI,EAAE,YAAY,MAAM,GAAG,SAAS;AACzF,SAAK,OAAO,IAAI,OAAO,IAAI;AAAA,EAC7B;AAAA,EAEA,MAAM,eACJ,SACA,OACe;AACf,UAAM,OAAO,KAAK,OAAO,IAAI,KAAK;AAClC,QAAI,CAAC,KAAM;AAEX,QAAI,QAAS,MAAK,aAAa,gBAAgB,cAAc,OAAO,EAAE,MAAM,GAAG,GAAK,CAAC;AACrF,SAAK,UAAU,EAAE,MAAM,eAAe,GAAG,CAAC;AAC1C,SAAK,IAAI;AACT,SAAK,OAAO,OAAO,KAAK;AAAA,EAC1B;AAAA,EAEA,MAAM,iBACJ,OACA,OACe;AACf,UAAM,OAAO,KAAK,OAAO,IAAI,KAAK;AAClC,QAAI,CAAC,KAAM;AAEX,SAAK,UAAU,EAAE,MAAM,eAAe,OAAO,SAAS,MAAM,QAAQ,CAAC;AACrE,SAAK,gBAAgB,KAAK;AAC1B,SAAK,IAAI;AACT,SAAK,OAAO,OAAO,KAAK;AAAA,EAC1B;AAAA;AAAA,EAIA,MAAM,eACJ,YACA,SACA,OACA,aACA,aACe;AACf,UAAM,SAAS,MAAM,UAAU,WAAW;AAC1C,UAAM,QAAQ,YAAY,QAAQ,cAAc,YAAY,QAAQ,SAAS,YAAY,QAAQ;AAEjG,UAAM,aAAa,cAAc,KAAK,OAAO,IAAI,WAAW,IAAI;AAChE,UAAM,YAAY,aACd,MAAM,QAAQ,YAAY,OAAO,GAAG,UAAU,IAC9C,YAAY,OAAO;AAEvB,UAAM,QAA6B;AAAA,MACjC,sBAAsB;AAAA,MACtB,yBAAyB,eAAe,KAAK;AAAA,MAC7C,2BAA2B;AAAA,IAC7B;AAEA,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,YAAM,+BAA+B,CAAC,OAAO,IAAI;AACjD,YAAM,+BAA+B,CAAC,UAAU,IAAI,QAAQ,CAAC,EAAE,MAAM,GAAG,GAAK;AAAA,IAC/E;AAEA,QAAI,aAAa,mBAAmB;AAClC,YAAM,IAAI,YAAY;AACtB,UAAI,EAAE,eAAe,KAAM,OAAM,0BAA0B,IAAI,EAAE;AACjE,UAAI,EAAE,cAAc,KAAM,OAAM,yBAAyB,IAAI,EAAE;AAC/D,UAAI,EAAE,WAAY,OAAM,yBAAyB,IAAI,EAAE;AAAA,IACzD;AAEA,UAAM,OAAO,OAAO,UAAU,iBAAiB,EAAE,YAAY,MAAM,GAAG,SAAS;AAC/E,SAAK,OAAO,IAAI,OAAO,IAAI;AAAA,EAC7B;AAAA,EAEA,MAAM,qBACJ,YACA,UACA,OACA,aACA,aACe;AACf,UAAM,SAAS,MAAM,UAAU,WAAW;AAC1C,UAAM,QAAQ,YAAY,QAAQ,cAAc,YAAY,QAAQ,SAAS,YAAY,QAAQ;AAEjG,UAAM,aAAa,cAAc,KAAK,OAAO,IAAI,WAAW,IAAI;AAChE,UAAM,YAAY,aACd,MAAM,QAAQ,YAAY,OAAO,GAAG,UAAU,IAC9C,YAAY,OAAO;AAEvB,UAAM,QAA6B;AAAA,MACjC,sBAAsB;AAAA,MACtB,yBAAyB,eAAe,KAAK;AAAA,MAC7C,2BAA2B;AAAA,IAC7B;AAEA,UAAM,eAAe,SAAS,KAAK;AACnC,aAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC5C,YAAM,MAAM,aAAa,CAAC;AAC1B,YAAM,OAAO,KAAK,QAAQ,KAAK,WAAW,KAAK,KAAK,aAAa,QAAQ;AACzE,YAAM,UAAU,OAAO,KAAK,YAAY,WAAW,IAAI,UAAU,cAAc,KAAK,OAAO;AAC3F,YAAM,+BAA+B,CAAC,OAAO,IAAI,QAAQ,IAAI;AAC7D,YAAM,+BAA+B,CAAC,UAAU,IAAI,QAAQ,MAAM,GAAG,GAAK;AAAA,IAC5E;AAEA,QAAI,aAAa,mBAAmB;AAClC,YAAM,IAAI,YAAY;AACtB,UAAI,EAAE,eAAe,KAAM,OAAM,0BAA0B,IAAI,EAAE;AACjE,UAAI,EAAE,cAAc,KAAM,OAAM,yBAAyB,IAAI,EAAE;AAC/D,UAAI,EAAE,WAAY,OAAM,yBAAyB,IAAI,EAAE;AAAA,IACzD;AAEA,UAAM,OAAO,OAAO,UAAU,wBAAwB,EAAE,YAAY,MAAM,GAAG,SAAS;AACtF,SAAK,OAAO,IAAI,OAAO,IAAI;AAAA,EAC7B;AAAA,EAEA,MAAM,aACJ,QACA,OACe;AACf,UAAM,OAAO,KAAK,OAAO,IAAI,KAAK;AAClC,QAAI,CAAC,KAAM;AAEX,UAAM,cAAc,QAAQ,eAAe,CAAC;AAC5C,aAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AAC3C,YAAM,MAAM,YAAY,CAAC;AACzB,UAAI,CAAC,MAAM,QAAQ,GAAG,EAAG;AACzB,eAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,cAAM,MAAM,IAAI,CAAC,GAAG,WAAW,IAAI,CAAC;AACpC,cAAM,UAAU,KAAK,WAAW,KAAK,QAAQ;AAC7C,aAAK,aAAa,gCAAgC,CAAC,SAAS,WAAW;AACvE,aAAK,aAAa,gCAAgC,CAAC,YAAY,OAAO,OAAO,EAAE,MAAM,GAAG,GAAK,CAAC;AAE9F,cAAM,YAAY,KAAK,cAAc,KAAK,mBAAmB;AAC7D,YAAI,aAAa,MAAM,QAAQ,SAAS,GAAG;AACzC,mBAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,kBAAM,KAAK,UAAU,CAAC;AACtB,iBAAK,aAAa,2BAA2B,CAAC,OAAO,GAAG,MAAM,EAAE;AAChE,iBAAK,aAAa,2BAA2B,CAAC,SAAS,GAAG,QAAQ,GAAG,UAAU,QAAQ,EAAE;AACzF,iBAAK,aAAa,2BAA2B,CAAC,cAAc,GAAG,OAAO,cAAc,GAAG,IAAI,IAAK,GAAG,UAAU,aAAa,EAAG;AAAA,UAC/H;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,QAAQ,QAAQ,WAAW,cAAc,QAAQ,WAAW;AAClE,QAAI,OAAO;AACT,UAAI,MAAM,gBAAgB,QAAQ,MAAM,iBAAiB,MAAM;AAC7D,aAAK,aAAa,mCAAmC,MAAM,gBAAgB,MAAM,aAAa;AAAA,MAChG;AACA,UAAI,MAAM,oBAAoB,QAAQ,MAAM,qBAAqB,MAAM;AACrE,aAAK,aAAa,uCAAuC,MAAM,oBAAoB,MAAM,iBAAiB;AAAA,MAC5G;AACA,UAAI,MAAM,eAAe,QAAQ,MAAM,gBAAgB,MAAM;AAC3D,aAAK,aAAa,kCAAkC,MAAM,eAAe,MAAM,YAAY;AAAA,MAC7F;AAAA,IACF;AAEA,SAAK,UAAU,EAAE,MAAM,eAAe,GAAG,CAAC;AAC1C,SAAK,IAAI;AACT,SAAK,OAAO,OAAO,KAAK;AAAA,EAC1B;AAAA,EAEA,MAAM,kBACJ,QACA,MACA,QACe;AAAA,EAAC;AAAA,EAElB,MAAM,eACJ,OACA,OACe;AACf,UAAM,OAAO,KAAK,OAAO,IAAI,KAAK;AAClC,QAAI,CAAC,KAAM;AAEX,SAAK,UAAU,EAAE,MAAM,eAAe,OAAO,SAAS,MAAM,QAAQ,CAAC;AACrE,SAAK,gBAAgB,KAAK;AAC1B,SAAK,IAAI;AACT,SAAK,OAAO,OAAO,KAAK;AAAA,EAC1B;AAAA;AAAA,EAIA,MAAM,gBACJ,YACA,OACA,OACA,aACA,OACA,WACA,SACA,YACe;AACf,UAAM,SAAS,MAAM,UAAU,WAAW;AAI1C,UAAM,OACJ,YAAY,QACZ,YACC,MAAM,QAAQ,YAAY,EAAE,IAAI,WAAW,GAAG,WAAW,GAAG,SAAS,CAAC,IAAI,WAC3E;AAEF,UAAM,aAAa,cAAc,KAAK,OAAO,IAAI,WAAW,IAAI;AAChE,UAAM,YAAY,aACd,MAAM,QAAQ,YAAY,OAAO,GAAG,UAAU,IAC9C,YAAY,OAAO;AAEvB,UAAM,QAA6B;AAAA,MACjC,sBAAsB;AAAA,MACtB,sBAAsB;AAAA,MACtB,eAAe,OAAO,KAAK,EAAE,MAAM,GAAG,GAAK;AAAA,IAC7C;AACA,QAAI,WAAY,OAAM,uBAAuB,IAAI;AAEjD,UAAM,OAAO,OAAO,UAAU,kBAAkB,IAAI,IAAI,EAAE,YAAY,MAAM,GAAG,SAAS;AACxF,SAAK,OAAO,IAAI,OAAO,IAAI;AAAA,EAC7B;AAAA,EAEA,MAAM,cACJ,QACA,OACe;AACf,UAAM,OAAO,KAAK,OAAO,IAAI,KAAK;AAClC,QAAI,CAAC,KAAM;AAEX,SAAK,aAAa,gBAAgB,OAAO,MAAM,EAAE,MAAM,GAAG,GAAK,CAAC;AAChE,SAAK,UAAU,EAAE,MAAM,eAAe,GAAG,CAAC;AAC1C,SAAK,IAAI;AACT,SAAK,OAAO,OAAO,KAAK;AAAA,EAC1B;AAAA,EAEA,MAAM,gBACJ,OACA,OACe;AACf,UAAM,OAAO,KAAK,OAAO,IAAI,KAAK;AAClC,QAAI,CAAC,KAAM;AAEX,SAAK,UAAU,EAAE,MAAM,eAAe,OAAO,SAAS,MAAM,QAAQ,CAAC;AACrE,SAAK,gBAAgB,KAAK;AAC1B,SAAK,IAAI;AACT,SAAK,OAAO,OAAO,KAAK;AAAA,EAC1B;AAAA;AAAA,EAIA,MAAM,qBACJ,YACA,OACA,OACA,aACe;AACf,UAAM,SAAS,MAAM,UAAU,WAAW;AAC1C,UAAM,OAAO,YAAY,QAAQ;AAEjC,UAAM,aAAa,cAAc,KAAK,OAAO,IAAI,WAAW,IAAI;AAChE,UAAM,YAAY,aACd,MAAM,QAAQ,YAAY,OAAO,GAAG,UAAU,IAC9C,YAAY,OAAO;AAEvB,UAAM,QAA6B;AAAA,MACjC,sBAAsB;AAAA,MACtB,2BAA2B;AAAA,MAC3B,eAAe,MAAM,MAAM,GAAG,GAAK;AAAA,IACrC;AAEA,UAAM,OAAO,OAAO,UAAU,uBAAuB,IAAI,IAAI,EAAE,YAAY,MAAM,GAAG,SAAS;AAC7F,SAAK,OAAO,IAAI,OAAO,IAAI;AAAA,EAC7B;AAAA,EAEA,MAAM,mBACJ,WACA,OACe;AACf,UAAM,OAAO,KAAK,OAAO,IAAI,KAAK;AAClC,QAAI,CAAC,KAAM;AAEX,QAAI,WAAW,QAAQ;AACrB,WAAK,aAAa,qCAAqC,UAAU,MAAM;AACvE,eAAS,IAAI,GAAG,IAAI,KAAK,IAAI,UAAU,QAAQ,EAAE,GAAG,KAAK;AACvD,cAAM,MAAM,UAAU,CAAC;AACvB,YAAI,KAAK,aAAa;AACpB,eAAK,aAAa,gCAAgC,CAAC,YAAY,IAAI,YAAY,MAAM,GAAG,GAAI,CAAC;AAAA,QAC/F;AAAA,MACF;AAAA,IACF;AAEA,SAAK,UAAU,EAAE,MAAM,eAAe,GAAG,CAAC;AAC1C,SAAK,IAAI;AACT,SAAK,OAAO,OAAO,KAAK;AAAA,EAC1B;AAAA,EAEA,MAAM,qBACJ,OACA,OACe;AACf,UAAM,OAAO,KAAK,OAAO,IAAI,KAAK;AAClC,QAAI,CAAC,KAAM;AAEX,SAAK,UAAU,EAAE,MAAM,eAAe,OAAO,SAAS,MAAM,QAAQ,CAAC;AACrE,SAAK,gBAAgB,KAAK;AAC1B,SAAK,IAAI;AACT,SAAK,OAAO,OAAO,KAAK;AAAA,EAC1B;AACF;AAMA,SAAS,eAAe,OAAuB;AAC7C,QAAM,IAAI,MAAM,YAAY;AAC5B,MAAI,EAAE,SAAS,KAAK,KAAK,EAAE,SAAS,IAAI,KAAK,EAAE,SAAS,IAAI,KAAK,EAAE,SAAS,IAAI,EAAG,QAAO;AAC1F,MAAI,EAAE,SAAS,QAAQ,EAAG,QAAO;AACjC,MAAI,EAAE,SAAS,QAAQ,EAAG,QAAO;AACjC,MAAI,EAAE,SAAS,SAAS,EAAG,QAAO;AAClC,MAAI,EAAE,SAAS,OAAO,KAAK,EAAE,SAAS,SAAS,EAAG,QAAO;AACzD,SAAO;AACT;AAEA,SAAS,QAAQ,MAAsB;AACrC,QAAM,IAAI,KAAK,YAAY;AAC3B,MAAI,MAAM,WAAW,MAAM,eAAgB,QAAO;AAClD,MAAI,MAAM,QAAQ,MAAM,YAAa,QAAO;AAC5C,MAAI,MAAM,YAAY,MAAM,gBAAiB,QAAO;AACpD,MAAI,MAAM,cAAc,MAAM,kBAAmB,QAAO;AACxD,MAAI,MAAM,UAAU,MAAM,cAAe,QAAO;AAChD,SAAO;AACT;AAEA,SAAS,cAAc,OAAwB;AAC7C,MAAI;AACF,WAAO,OAAO,UAAU,WAAW,QAAQ,KAAK,UAAU,KAAK;AAAA,EACjE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/langchain.ts"],"sourcesContent":["/**\n * Neatlogs LangChain/LangGraph callback handler.\n *\n * Usage:\n * import { langchainHandler } from 'neatlogs/langchain';\n * const result = await chain.invoke(input, { callbacks: [langchainHandler()] });\n *\n * Creates spans: CHAIN (chain/graph runs), LLM (model calls), TOOL (tool invocations).\n * Works with LangChain, LangGraph, and Deep Agents (same callback interface).\n */\n\nimport { trace, context as otelContext, SpanStatusCode, type Span } from '@opentelemetry/api';\n\nconst TRACER_NAME = 'neatlogs.langchain';\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport interface LangchainHandlerOptions {\n workflowName?: string;\n}\n\nexport function langchainHandler(opts?: LangchainHandlerOptions): any {\n return new NeatlogsCallbackHandler(opts);\n}\n\n// ---------------------------------------------------------------------------\n// Callback Handler\n// ---------------------------------------------------------------------------\n\nclass NeatlogsCallbackHandler {\n name = 'neatlogs';\n private _spans: Map<string, Span> = new Map();\n private _workflowName: string | undefined;\n\n constructor(opts?: LangchainHandlerOptions) {\n this._workflowName = opts?.workflowName;\n }\n\n // --- Chain/Graph callbacks ---\n\n async handleChainStart(\n serialized: Record<string, any>,\n inputs: Record<string, any>,\n runId: string,\n parentRunId?: string,\n tags?: string[],\n metadata?: Record<string, any>,\n ): Promise<void> {\n const tracer = trace.getTracer(TRACER_NAME);\n const name = serialized?.name ?? serialized?.id?.at(-1) ?? 'chain';\n\n const parentSpan = parentRunId ? this._spans.get(parentRunId) : undefined;\n const parentCtx = parentSpan\n ? trace.setSpan(otelContext.active(), parentSpan)\n : otelContext.active();\n\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'CHAIN',\n 'neatlogs.chain.name': name,\n };\n if (this._workflowName) attrs['neatlogs.workflow.name'] = this._workflowName;\n if (inputs) attrs['input.value'] = safeStringify(inputs);\n if (tags?.length) attrs['neatlogs.tags'] = tags.join(',');\n\n const span = tracer.startSpan(`langchain.chain.${name}`, { attributes: attrs }, parentCtx);\n this._spans.set(runId, span);\n }\n\n async handleChainEnd(\n outputs: Record<string, any>,\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n if (outputs) span.setAttribute('output.value', safeStringify(outputs));\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n this._spans.delete(runId);\n }\n\n async handleChainError(\n error: Error,\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });\n span.recordException(error);\n span.end();\n this._spans.delete(runId);\n }\n\n // --- LLM callbacks ---\n\n async handleLLMStart(\n serialized: Record<string, any>,\n prompts: string[],\n runId: string,\n parentRunId?: string,\n extraParams?: Record<string, any>,\n ): Promise<void> {\n const tracer = trace.getTracer(TRACER_NAME);\n const model = serialized?.kwargs?.model_name ?? serialized?.kwargs?.model ?? serialized?.name ?? '';\n\n const parentSpan = parentRunId ? this._spans.get(parentRunId) : undefined;\n const parentCtx = parentSpan\n ? trace.setSpan(otelContext.active(), parentSpan)\n : otelContext.active();\n\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': detectProvider(model),\n 'neatlogs.llm.model_name': model,\n };\n\n for (let i = 0; i < prompts.length; i++) {\n attrs[`neatlogs.llm.input_messages.${i}.role`] = 'user';\n attrs[`neatlogs.llm.input_messages.${i}.content`] = prompts[i];\n }\n\n if (extraParams?.invocation_params) {\n const p = extraParams.invocation_params;\n if (p.temperature != null) attrs['neatlogs.llm.temperature'] = p.temperature;\n if (p.max_tokens != null) attrs['neatlogs.llm.max_tokens'] = p.max_tokens;\n if (p.model_name) attrs['neatlogs.llm.model_name'] = p.model_name;\n }\n\n const span = tracer.startSpan('langchain.llm', { attributes: attrs }, parentCtx);\n this._spans.set(runId, span);\n }\n\n async handleChatModelStart(\n serialized: Record<string, any>,\n messages: any[][],\n runId: string,\n parentRunId?: string,\n extraParams?: Record<string, any>,\n ): Promise<void> {\n const tracer = trace.getTracer(TRACER_NAME);\n const model = serialized?.kwargs?.model_name ?? serialized?.kwargs?.model ?? serialized?.name ?? '';\n\n const parentSpan = parentRunId ? this._spans.get(parentRunId) : undefined;\n const parentCtx = parentSpan\n ? trace.setSpan(otelContext.active(), parentSpan)\n : otelContext.active();\n\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'LLM',\n 'neatlogs.llm.provider': detectProvider(model),\n 'neatlogs.llm.model_name': model,\n };\n\n const flatMessages = messages.flat();\n for (let i = 0; i < flatMessages.length; i++) {\n const msg = flatMessages[i];\n const role = msg?.role ?? msg?._getType?.() ?? msg?.constructor?.name ?? 'unknown';\n const content = typeof msg?.content === 'string' ? msg.content : safeStringify(msg?.content);\n attrs[`neatlogs.llm.input_messages.${i}.role`] = mapRole(role);\n attrs[`neatlogs.llm.input_messages.${i}.content`] = content;\n }\n\n if (extraParams?.invocation_params) {\n const p = extraParams.invocation_params;\n if (p.temperature != null) attrs['neatlogs.llm.temperature'] = p.temperature;\n if (p.max_tokens != null) attrs['neatlogs.llm.max_tokens'] = p.max_tokens;\n if (p.model_name) attrs['neatlogs.llm.model_name'] = p.model_name;\n }\n\n const span = tracer.startSpan('langchain.chat_model', { attributes: attrs }, parentCtx);\n this._spans.set(runId, span);\n }\n\n async handleLLMEnd(\n output: any,\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n const generations = output?.generations ?? [];\n for (let i = 0; i < generations.length; i++) {\n const gen = generations[i];\n if (!Array.isArray(gen)) continue;\n for (let j = 0; j < gen.length; j++) {\n const msg = gen[j]?.message ?? gen[j];\n const content = msg?.content ?? msg?.text ?? '';\n span.setAttribute(`neatlogs.llm.output_messages.${i}.role`, 'assistant');\n span.setAttribute(`neatlogs.llm.output_messages.${i}.content`, String(content));\n\n const toolCalls = msg?.tool_calls ?? msg?.additional_kwargs?.tool_calls;\n if (toolCalls && Array.isArray(toolCalls)) {\n for (let k = 0; k < toolCalls.length; k++) {\n const tc = toolCalls[k];\n span.setAttribute(`neatlogs.llm.tool_calls.${k}.id`, tc.id ?? '');\n span.setAttribute(`neatlogs.llm.tool_calls.${k}.name`, tc.name ?? tc.function?.name ?? '');\n span.setAttribute(`neatlogs.llm.tool_calls.${k}.arguments`, tc.args ? safeStringify(tc.args) : (tc.function?.arguments ?? ''));\n }\n }\n }\n }\n\n const usage = output?.llmOutput?.tokenUsage ?? output?.llmOutput?.usage;\n if (usage) {\n if (usage.promptTokens != null || usage.prompt_tokens != null) {\n span.setAttribute('neatlogs.llm.token_count.prompt', usage.promptTokens ?? usage.prompt_tokens);\n }\n if (usage.completionTokens != null || usage.completion_tokens != null) {\n span.setAttribute('neatlogs.llm.token_count.completion', usage.completionTokens ?? usage.completion_tokens);\n }\n if (usage.totalTokens != null || usage.total_tokens != null) {\n span.setAttribute('neatlogs.llm.token_count.total', usage.totalTokens ?? usage.total_tokens);\n }\n }\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n this._spans.delete(runId);\n }\n\n async handleLLMNewToken(\n _token: string,\n _idx: any,\n _runId: string,\n ): Promise<void> {}\n\n async handleLLMError(\n error: Error,\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });\n span.recordException(error);\n span.end();\n this._spans.delete(runId);\n }\n\n // --- Tool callbacks ---\n\n async handleToolStart(\n serialized: Record<string, any>,\n input: string,\n runId: string,\n parentRunId?: string,\n _tags?: string[],\n _metadata?: Record<string, unknown>,\n runName?: string,\n toolCallId?: string,\n ): Promise<void> {\n const tracer = trace.getTracer(TRACER_NAME);\n // LangChain 1.x: serialized.name is absent and serialized.id is the class\n // name (e.g. \"DynamicStructuredTool\"); the real tool name arrives as `runName`.\n // Prefer serialized.name (older LC), then runName, then the class id, then 'tool'.\n const name =\n serialized?.name ||\n runName ||\n (Array.isArray(serialized?.id) ? serialized.id[serialized.id.length - 1] : undefined) ||\n 'tool';\n\n const parentSpan = parentRunId ? this._spans.get(parentRunId) : undefined;\n const parentCtx = parentSpan\n ? trace.setSpan(otelContext.active(), parentSpan)\n : otelContext.active();\n\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'TOOL',\n 'neatlogs.tool.name': name,\n 'input.value': String(input),\n };\n if (toolCallId) attrs['neatlogs.tool_call.id'] = toolCallId;\n\n const span = tracer.startSpan(`langchain.tool.${name}`, { attributes: attrs }, parentCtx);\n this._spans.set(runId, span);\n }\n\n async handleToolEnd(\n output: string,\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n span.setAttribute('output.value', String(output));\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n this._spans.delete(runId);\n }\n\n async handleToolError(\n error: Error,\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });\n span.recordException(error);\n span.end();\n this._spans.delete(runId);\n }\n\n // --- Retriever callbacks ---\n\n async handleRetrieverStart(\n serialized: Record<string, any>,\n query: string,\n runId: string,\n parentRunId?: string,\n ): Promise<void> {\n const tracer = trace.getTracer(TRACER_NAME);\n const name = serialized?.name ?? 'retriever';\n\n const parentSpan = parentRunId ? this._spans.get(parentRunId) : undefined;\n const parentCtx = parentSpan\n ? trace.setSpan(otelContext.active(), parentSpan)\n : otelContext.active();\n\n const attrs: Record<string, any> = {\n 'neatlogs.span.kind': 'RETRIEVER',\n 'neatlogs.retriever.name': name,\n 'input.value': query,\n };\n\n const span = tracer.startSpan(`langchain.retriever.${name}`, { attributes: attrs }, parentCtx);\n this._spans.set(runId, span);\n }\n\n async handleRetrieverEnd(\n documents: any[],\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n if (documents?.length) {\n span.setAttribute('neatlogs.retriever.document_count', documents.length);\n for (let i = 0; i < Math.min(documents.length, 10); i++) {\n const doc = documents[i];\n if (doc?.pageContent) {\n span.setAttribute(`neatlogs.retriever.documents.${i}.content`, doc.pageContent);\n }\n }\n }\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n this._spans.delete(runId);\n }\n\n async handleRetrieverError(\n error: Error,\n runId: string,\n ): Promise<void> {\n const span = this._spans.get(runId);\n if (!span) return;\n\n span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });\n span.recordException(error);\n span.end();\n this._spans.delete(runId);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nfunction detectProvider(model: string): string {\n const m = model.toLowerCase();\n if (m.includes('gpt') || m.includes('o1') || m.includes('o3') || m.includes('o4')) return 'openai';\n if (m.includes('claude')) return 'anthropic';\n if (m.includes('gemini')) return 'google';\n if (m.includes('command')) return 'cohere';\n if (m.includes('llama') || m.includes('mixtral')) return 'meta';\n return 'unknown';\n}\n\nfunction mapRole(role: string): string {\n const r = role.toLowerCase();\n if (r === 'human' || r === 'humanmessage') return 'user';\n if (r === 'ai' || r === 'aimessage') return 'assistant';\n if (r === 'system' || r === 'systemmessage') return 'system';\n if (r === 'function' || r === 'functionmessage') return 'function';\n if (r === 'tool' || r === 'toolmessage') return 'tool';\n return role;\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return typeof value === 'string' ? value : JSON.stringify(value);\n } catch {\n return '';\n }\n}\n"],"mappings":";AAWA,SAAS,OAAO,WAAW,aAAa,sBAAiC;AAEzE,IAAM,cAAc;AAUb,SAAS,iBAAiB,MAAqC;AACpE,SAAO,IAAI,wBAAwB,IAAI;AACzC;AAMA,IAAM,0BAAN,MAA8B;AAAA,EAC5B,OAAO;AAAA,EACC,SAA4B,oBAAI,IAAI;AAAA,EACpC;AAAA,EAER,YAAY,MAAgC;AAC1C,SAAK,gBAAgB,MAAM;AAAA,EAC7B;AAAA;AAAA,EAIA,MAAM,iBACJ,YACA,QACA,OACA,aACA,MACA,UACe;AACf,UAAM,SAAS,MAAM,UAAU,WAAW;AAC1C,UAAM,OAAO,YAAY,QAAQ,YAAY,IAAI,GAAG,EAAE,KAAK;AAE3D,UAAM,aAAa,cAAc,KAAK,OAAO,IAAI,WAAW,IAAI;AAChE,UAAM,YAAY,aACd,MAAM,QAAQ,YAAY,OAAO,GAAG,UAAU,IAC9C,YAAY,OAAO;AAEvB,UAAM,QAA6B;AAAA,MACjC,sBAAsB;AAAA,MACtB,uBAAuB;AAAA,IACzB;AACA,QAAI,KAAK,cAAe,OAAM,wBAAwB,IAAI,KAAK;AAC/D,QAAI,OAAQ,OAAM,aAAa,IAAI,cAAc,MAAM;AACvD,QAAI,MAAM,OAAQ,OAAM,eAAe,IAAI,KAAK,KAAK,GAAG;AAExD,UAAM,OAAO,OAAO,UAAU,mBAAmB,IAAI,IAAI,EAAE,YAAY,MAAM,GAAG,SAAS;AACzF,SAAK,OAAO,IAAI,OAAO,IAAI;AAAA,EAC7B;AAAA,EAEA,MAAM,eACJ,SACA,OACe;AACf,UAAM,OAAO,KAAK,OAAO,IAAI,KAAK;AAClC,QAAI,CAAC,KAAM;AAEX,QAAI,QAAS,MAAK,aAAa,gBAAgB,cAAc,OAAO,CAAC;AACrE,SAAK,UAAU,EAAE,MAAM,eAAe,GAAG,CAAC;AAC1C,SAAK,IAAI;AACT,SAAK,OAAO,OAAO,KAAK;AAAA,EAC1B;AAAA,EAEA,MAAM,iBACJ,OACA,OACe;AACf,UAAM,OAAO,KAAK,OAAO,IAAI,KAAK;AAClC,QAAI,CAAC,KAAM;AAEX,SAAK,UAAU,EAAE,MAAM,eAAe,OAAO,SAAS,MAAM,QAAQ,CAAC;AACrE,SAAK,gBAAgB,KAAK;AAC1B,SAAK,IAAI;AACT,SAAK,OAAO,OAAO,KAAK;AAAA,EAC1B;AAAA;AAAA,EAIA,MAAM,eACJ,YACA,SACA,OACA,aACA,aACe;AACf,UAAM,SAAS,MAAM,UAAU,WAAW;AAC1C,UAAM,QAAQ,YAAY,QAAQ,cAAc,YAAY,QAAQ,SAAS,YAAY,QAAQ;AAEjG,UAAM,aAAa,cAAc,KAAK,OAAO,IAAI,WAAW,IAAI;AAChE,UAAM,YAAY,aACd,MAAM,QAAQ,YAAY,OAAO,GAAG,UAAU,IAC9C,YAAY,OAAO;AAEvB,UAAM,QAA6B;AAAA,MACjC,sBAAsB;AAAA,MACtB,yBAAyB,eAAe,KAAK;AAAA,MAC7C,2BAA2B;AAAA,IAC7B;AAEA,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,YAAM,+BAA+B,CAAC,OAAO,IAAI;AACjD,YAAM,+BAA+B,CAAC,UAAU,IAAI,QAAQ,CAAC;AAAA,IAC/D;AAEA,QAAI,aAAa,mBAAmB;AAClC,YAAM,IAAI,YAAY;AACtB,UAAI,EAAE,eAAe,KAAM,OAAM,0BAA0B,IAAI,EAAE;AACjE,UAAI,EAAE,cAAc,KAAM,OAAM,yBAAyB,IAAI,EAAE;AAC/D,UAAI,EAAE,WAAY,OAAM,yBAAyB,IAAI,EAAE;AAAA,IACzD;AAEA,UAAM,OAAO,OAAO,UAAU,iBAAiB,EAAE,YAAY,MAAM,GAAG,SAAS;AAC/E,SAAK,OAAO,IAAI,OAAO,IAAI;AAAA,EAC7B;AAAA,EAEA,MAAM,qBACJ,YACA,UACA,OACA,aACA,aACe;AACf,UAAM,SAAS,MAAM,UAAU,WAAW;AAC1C,UAAM,QAAQ,YAAY,QAAQ,cAAc,YAAY,QAAQ,SAAS,YAAY,QAAQ;AAEjG,UAAM,aAAa,cAAc,KAAK,OAAO,IAAI,WAAW,IAAI;AAChE,UAAM,YAAY,aACd,MAAM,QAAQ,YAAY,OAAO,GAAG,UAAU,IAC9C,YAAY,OAAO;AAEvB,UAAM,QAA6B;AAAA,MACjC,sBAAsB;AAAA,MACtB,yBAAyB,eAAe,KAAK;AAAA,MAC7C,2BAA2B;AAAA,IAC7B;AAEA,UAAM,eAAe,SAAS,KAAK;AACnC,aAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC5C,YAAM,MAAM,aAAa,CAAC;AAC1B,YAAM,OAAO,KAAK,QAAQ,KAAK,WAAW,KAAK,KAAK,aAAa,QAAQ;AACzE,YAAM,UAAU,OAAO,KAAK,YAAY,WAAW,IAAI,UAAU,cAAc,KAAK,OAAO;AAC3F,YAAM,+BAA+B,CAAC,OAAO,IAAI,QAAQ,IAAI;AAC7D,YAAM,+BAA+B,CAAC,UAAU,IAAI;AAAA,IACtD;AAEA,QAAI,aAAa,mBAAmB;AAClC,YAAM,IAAI,YAAY;AACtB,UAAI,EAAE,eAAe,KAAM,OAAM,0BAA0B,IAAI,EAAE;AACjE,UAAI,EAAE,cAAc,KAAM,OAAM,yBAAyB,IAAI,EAAE;AAC/D,UAAI,EAAE,WAAY,OAAM,yBAAyB,IAAI,EAAE;AAAA,IACzD;AAEA,UAAM,OAAO,OAAO,UAAU,wBAAwB,EAAE,YAAY,MAAM,GAAG,SAAS;AACtF,SAAK,OAAO,IAAI,OAAO,IAAI;AAAA,EAC7B;AAAA,EAEA,MAAM,aACJ,QACA,OACe;AACf,UAAM,OAAO,KAAK,OAAO,IAAI,KAAK;AAClC,QAAI,CAAC,KAAM;AAEX,UAAM,cAAc,QAAQ,eAAe,CAAC;AAC5C,aAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AAC3C,YAAM,MAAM,YAAY,CAAC;AACzB,UAAI,CAAC,MAAM,QAAQ,GAAG,EAAG;AACzB,eAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,cAAM,MAAM,IAAI,CAAC,GAAG,WAAW,IAAI,CAAC;AACpC,cAAM,UAAU,KAAK,WAAW,KAAK,QAAQ;AAC7C,aAAK,aAAa,gCAAgC,CAAC,SAAS,WAAW;AACvE,aAAK,aAAa,gCAAgC,CAAC,YAAY,OAAO,OAAO,CAAC;AAE9E,cAAM,YAAY,KAAK,cAAc,KAAK,mBAAmB;AAC7D,YAAI,aAAa,MAAM,QAAQ,SAAS,GAAG;AACzC,mBAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,kBAAM,KAAK,UAAU,CAAC;AACtB,iBAAK,aAAa,2BAA2B,CAAC,OAAO,GAAG,MAAM,EAAE;AAChE,iBAAK,aAAa,2BAA2B,CAAC,SAAS,GAAG,QAAQ,GAAG,UAAU,QAAQ,EAAE;AACzF,iBAAK,aAAa,2BAA2B,CAAC,cAAc,GAAG,OAAO,cAAc,GAAG,IAAI,IAAK,GAAG,UAAU,aAAa,EAAG;AAAA,UAC/H;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,QAAQ,QAAQ,WAAW,cAAc,QAAQ,WAAW;AAClE,QAAI,OAAO;AACT,UAAI,MAAM,gBAAgB,QAAQ,MAAM,iBAAiB,MAAM;AAC7D,aAAK,aAAa,mCAAmC,MAAM,gBAAgB,MAAM,aAAa;AAAA,MAChG;AACA,UAAI,MAAM,oBAAoB,QAAQ,MAAM,qBAAqB,MAAM;AACrE,aAAK,aAAa,uCAAuC,MAAM,oBAAoB,MAAM,iBAAiB;AAAA,MAC5G;AACA,UAAI,MAAM,eAAe,QAAQ,MAAM,gBAAgB,MAAM;AAC3D,aAAK,aAAa,kCAAkC,MAAM,eAAe,MAAM,YAAY;AAAA,MAC7F;AAAA,IACF;AAEA,SAAK,UAAU,EAAE,MAAM,eAAe,GAAG,CAAC;AAC1C,SAAK,IAAI;AACT,SAAK,OAAO,OAAO,KAAK;AAAA,EAC1B;AAAA,EAEA,MAAM,kBACJ,QACA,MACA,QACe;AAAA,EAAC;AAAA,EAElB,MAAM,eACJ,OACA,OACe;AACf,UAAM,OAAO,KAAK,OAAO,IAAI,KAAK;AAClC,QAAI,CAAC,KAAM;AAEX,SAAK,UAAU,EAAE,MAAM,eAAe,OAAO,SAAS,MAAM,QAAQ,CAAC;AACrE,SAAK,gBAAgB,KAAK;AAC1B,SAAK,IAAI;AACT,SAAK,OAAO,OAAO,KAAK;AAAA,EAC1B;AAAA;AAAA,EAIA,MAAM,gBACJ,YACA,OACA,OACA,aACA,OACA,WACA,SACA,YACe;AACf,UAAM,SAAS,MAAM,UAAU,WAAW;AAI1C,UAAM,OACJ,YAAY,QACZ,YACC,MAAM,QAAQ,YAAY,EAAE,IAAI,WAAW,GAAG,WAAW,GAAG,SAAS,CAAC,IAAI,WAC3E;AAEF,UAAM,aAAa,cAAc,KAAK,OAAO,IAAI,WAAW,IAAI;AAChE,UAAM,YAAY,aACd,MAAM,QAAQ,YAAY,OAAO,GAAG,UAAU,IAC9C,YAAY,OAAO;AAEvB,UAAM,QAA6B;AAAA,MACjC,sBAAsB;AAAA,MACtB,sBAAsB;AAAA,MACtB,eAAe,OAAO,KAAK;AAAA,IAC7B;AACA,QAAI,WAAY,OAAM,uBAAuB,IAAI;AAEjD,UAAM,OAAO,OAAO,UAAU,kBAAkB,IAAI,IAAI,EAAE,YAAY,MAAM,GAAG,SAAS;AACxF,SAAK,OAAO,IAAI,OAAO,IAAI;AAAA,EAC7B;AAAA,EAEA,MAAM,cACJ,QACA,OACe;AACf,UAAM,OAAO,KAAK,OAAO,IAAI,KAAK;AAClC,QAAI,CAAC,KAAM;AAEX,SAAK,aAAa,gBAAgB,OAAO,MAAM,CAAC;AAChD,SAAK,UAAU,EAAE,MAAM,eAAe,GAAG,CAAC;AAC1C,SAAK,IAAI;AACT,SAAK,OAAO,OAAO,KAAK;AAAA,EAC1B;AAAA,EAEA,MAAM,gBACJ,OACA,OACe;AACf,UAAM,OAAO,KAAK,OAAO,IAAI,KAAK;AAClC,QAAI,CAAC,KAAM;AAEX,SAAK,UAAU,EAAE,MAAM,eAAe,OAAO,SAAS,MAAM,QAAQ,CAAC;AACrE,SAAK,gBAAgB,KAAK;AAC1B,SAAK,IAAI;AACT,SAAK,OAAO,OAAO,KAAK;AAAA,EAC1B;AAAA;AAAA,EAIA,MAAM,qBACJ,YACA,OACA,OACA,aACe;AACf,UAAM,SAAS,MAAM,UAAU,WAAW;AAC1C,UAAM,OAAO,YAAY,QAAQ;AAEjC,UAAM,aAAa,cAAc,KAAK,OAAO,IAAI,WAAW,IAAI;AAChE,UAAM,YAAY,aACd,MAAM,QAAQ,YAAY,OAAO,GAAG,UAAU,IAC9C,YAAY,OAAO;AAEvB,UAAM,QAA6B;AAAA,MACjC,sBAAsB;AAAA,MACtB,2BAA2B;AAAA,MAC3B,eAAe;AAAA,IACjB;AAEA,UAAM,OAAO,OAAO,UAAU,uBAAuB,IAAI,IAAI,EAAE,YAAY,MAAM,GAAG,SAAS;AAC7F,SAAK,OAAO,IAAI,OAAO,IAAI;AAAA,EAC7B;AAAA,EAEA,MAAM,mBACJ,WACA,OACe;AACf,UAAM,OAAO,KAAK,OAAO,IAAI,KAAK;AAClC,QAAI,CAAC,KAAM;AAEX,QAAI,WAAW,QAAQ;AACrB,WAAK,aAAa,qCAAqC,UAAU,MAAM;AACvE,eAAS,IAAI,GAAG,IAAI,KAAK,IAAI,UAAU,QAAQ,EAAE,GAAG,KAAK;AACvD,cAAM,MAAM,UAAU,CAAC;AACvB,YAAI,KAAK,aAAa;AACpB,eAAK,aAAa,gCAAgC,CAAC,YAAY,IAAI,WAAW;AAAA,QAChF;AAAA,MACF;AAAA,IACF;AAEA,SAAK,UAAU,EAAE,MAAM,eAAe,GAAG,CAAC;AAC1C,SAAK,IAAI;AACT,SAAK,OAAO,OAAO,KAAK;AAAA,EAC1B;AAAA,EAEA,MAAM,qBACJ,OACA,OACe;AACf,UAAM,OAAO,KAAK,OAAO,IAAI,KAAK;AAClC,QAAI,CAAC,KAAM;AAEX,SAAK,UAAU,EAAE,MAAM,eAAe,OAAO,SAAS,MAAM,QAAQ,CAAC;AACrE,SAAK,gBAAgB,KAAK;AAC1B,SAAK,IAAI;AACT,SAAK,OAAO,OAAO,KAAK;AAAA,EAC1B;AACF;AAMA,SAAS,eAAe,OAAuB;AAC7C,QAAM,IAAI,MAAM,YAAY;AAC5B,MAAI,EAAE,SAAS,KAAK,KAAK,EAAE,SAAS,IAAI,KAAK,EAAE,SAAS,IAAI,KAAK,EAAE,SAAS,IAAI,EAAG,QAAO;AAC1F,MAAI,EAAE,SAAS,QAAQ,EAAG,QAAO;AACjC,MAAI,EAAE,SAAS,QAAQ,EAAG,QAAO;AACjC,MAAI,EAAE,SAAS,SAAS,EAAG,QAAO;AAClC,MAAI,EAAE,SAAS,OAAO,KAAK,EAAE,SAAS,SAAS,EAAG,QAAO;AACzD,SAAO;AACT;AAEA,SAAS,QAAQ,MAAsB;AACrC,QAAM,IAAI,KAAK,YAAY;AAC3B,MAAI,MAAM,WAAW,MAAM,eAAgB,QAAO;AAClD,MAAI,MAAM,QAAQ,MAAM,YAAa,QAAO;AAC5C,MAAI,MAAM,YAAY,MAAM,gBAAiB,QAAO;AACpD,MAAI,MAAM,cAAc,MAAM,kBAAmB,QAAO;AACxD,MAAI,MAAM,UAAU,MAAM,cAAe,QAAO;AAChD,SAAO;AACT;AAEA,SAAS,cAAc,OAAwB;AAC7C,MAAI;AACF,WAAO,OAAO,UAAU,WAAW,QAAQ,KAAK,UAAU,KAAK;AAAA,EACjE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;","names":[]}
@@ -57,14 +57,14 @@ function wrapMastraRerank(rerankFn) {
57
57
  const query = args?.[1];
58
58
  const options = args?.[3];
59
59
  if (typeof query === "string") {
60
- span.setAttribute("neatlogs.reranker.query", query.slice(0, 1e4));
61
- span.setAttribute("input.value", query.slice(0, 1e4));
60
+ span.setAttribute("neatlogs.reranker.query", query);
61
+ span.setAttribute("input.value", query);
62
62
  }
63
- if (Array.isArray(results)) span.setAttribute("neatlogs.reranker.input_documents", safeStringify(results).slice(0, 1e4));
63
+ if (Array.isArray(results)) span.setAttribute("neatlogs.reranker.input_documents", safeStringify(results));
64
64
  if (options?.topK != null) span.setAttribute("neatlogs.reranker.top_k", options.topK);
65
65
  return Promise.resolve(rerankFn(...args)).then((result) => {
66
- span.setAttribute("neatlogs.reranker.output_documents", safeStringify(result).slice(0, 1e4));
67
- span.setAttribute("output.value", safeStringify(result).slice(0, 1e4));
66
+ span.setAttribute("neatlogs.reranker.output_documents", safeStringify(result));
67
+ span.setAttribute("output.value", safeStringify(result));
68
68
  return result;
69
69
  });
70
70
  });
@@ -107,7 +107,7 @@ function patchAgentMethod(agent, method, streaming) {
107
107
  };
108
108
  if (model) attrs["neatlogs.llm.model_name"] = model;
109
109
  if (agent.instructions && typeof agent.instructions === "string") {
110
- attrs["neatlogs.llm.system_prompt"] = agent.instructions.slice(0, 5e3);
110
+ attrs["neatlogs.llm.system_prompt"] = agent.instructions;
111
111
  }
112
112
  if (streaming) attrs["neatlogs.llm.is_streaming"] = true;
113
113
  if (streaming) {
@@ -161,7 +161,7 @@ function patchModelInPlace(model) {
161
161
  if (provider) attrs["neatlogs.llm.provider"] = provider;
162
162
  if (isStream) attrs["neatlogs.llm.is_streaming"] = true;
163
163
  const promptInput = callOpts?.prompt ?? callOpts?.messages;
164
- if (promptInput !== void 0) attrs["input.value"] = safeStringify(promptInput).slice(0, 1e4);
164
+ if (promptInput !== void 0) attrs["input.value"] = safeStringify(promptInput);
165
165
  captureInvocationParams(attrs, callOpts);
166
166
  return withActiveSpan(`mastra.llm.${modelId || "model"}.${fn}`, attrs, async (span) => {
167
167
  const result = await orig(callOpts);
@@ -195,12 +195,12 @@ function patchToolExecute(tool, key) {
195
195
  const attrs = {
196
196
  "neatlogs.span.kind": "TOOL",
197
197
  "neatlogs.tool.name": toolName,
198
- "input.value": safeStringify(params).slice(0, 1e4)
198
+ "input.value": safeStringify(params)
199
199
  };
200
- if (tool.description) attrs["neatlogs.tool.description"] = String(tool.description).slice(0, 2e3);
200
+ if (tool.description) attrs["neatlogs.tool.description"] = String(tool.description);
201
201
  return withActiveSpan(`mastra.tool.${toolName}`, attrs, async (span) => {
202
202
  const result = await orig(params, options);
203
- span.setAttribute("output.value", safeStringify(result).slice(0, 1e4));
203
+ span.setAttribute("output.value", safeStringify(result));
204
204
  return result;
205
205
  });
206
206
  };
@@ -226,13 +226,13 @@ function patchRunMethod(run, method, workflowName) {
226
226
  "neatlogs.workflow.name": workflowName
227
227
  };
228
228
  if (startOpts?.inputData !== void 0) {
229
- attrs["input.value"] = safeStringify(startOpts.inputData).slice(0, 1e4);
229
+ attrs["input.value"] = safeStringify(startOpts.inputData);
230
230
  }
231
231
  return withActiveSpan(`mastra.workflow.${workflowName}`, attrs, async (span) => {
232
232
  const result = await orig(startOpts);
233
233
  if (result?.status) span.setAttribute("neatlogs.metadata", safeStringify({ status: result.status }));
234
234
  if (result?.result !== void 0) {
235
- span.setAttribute("output.value", safeStringify(result.result).slice(0, 1e4));
235
+ span.setAttribute("output.value", safeStringify(result.result));
236
236
  }
237
237
  return result;
238
238
  });
@@ -253,14 +253,14 @@ function patchVectorOp(vector, op, kind) {
253
253
  "neatlogs.span.kind": kind,
254
254
  "neatlogs.db.system": dbName,
255
255
  "neatlogs.db.operation": op,
256
- "input.value": safeStringify(params).slice(0, 1e4)
256
+ "input.value": safeStringify(params)
257
257
  };
258
258
  const indexName = params?.indexName;
259
259
  if (indexName) attrs["neatlogs.vectordb.index_name"] = String(indexName);
260
260
  if (kind === "RETRIEVER" && params?.topK != null) attrs["neatlogs.retriever.top_k"] = params.topK;
261
261
  return withActiveSpan(`mastra.vector.${op}`, attrs, async (span) => {
262
262
  const result = await orig(params);
263
- span.setAttribute("output.value", safeStringify(result).slice(0, 1e4));
263
+ span.setAttribute("output.value", safeStringify(result));
264
264
  return result;
265
265
  });
266
266
  };
@@ -274,11 +274,11 @@ function patchMemory(memory) {
274
274
  const attrs = {
275
275
  "neatlogs.span.kind": "CHAIN",
276
276
  "neatlogs.db.operation": op,
277
- "input.value": safeStringify(args?.[0]).slice(0, 1e4)
277
+ "input.value": safeStringify(args?.[0])
278
278
  };
279
279
  return withActiveSpan(`mastra.memory.${op}`, attrs, async (span) => {
280
280
  const result = await orig(...args);
281
- span.setAttribute("output.value", safeStringify(result).slice(0, 8e3));
281
+ span.setAttribute("output.value", safeStringify(result));
282
282
  return result;
283
283
  });
284
284
  };
@@ -341,7 +341,7 @@ function wrapStreamingOutput(output, span, ctx) {
341
341
  ]);
342
342
  if (typeof text === "string" && text) {
343
343
  span.setAttribute("neatlogs.llm.output_messages.0.role", "assistant");
344
- span.setAttribute("neatlogs.llm.output_messages.0.content", text.slice(0, 1e4));
344
+ span.setAttribute("neatlogs.llm.output_messages.0.content", text);
345
345
  }
346
346
  if (usage) recordUsage(span, usage);
347
347
  if (finishReason) span.setAttribute("neatlogs.llm.stop_reason", normalizeFinishReason(finishReason));
@@ -363,7 +363,7 @@ function wrapStreamingOutput(output, span, ctx) {
363
363
  const finish = () => {
364
364
  if (textParts.length) {
365
365
  span.setAttribute("neatlogs.llm.output_messages.0.role", "assistant");
366
- span.setAttribute("neatlogs.llm.output_messages.0.content", textParts.join("").slice(0, 1e4));
366
+ span.setAttribute("neatlogs.llm.output_messages.0.content", textParts.join(""));
367
367
  }
368
368
  endOnce();
369
369
  };
@@ -432,7 +432,7 @@ function finalizeAgentResult(span, result) {
432
432
  if (!result) return;
433
433
  if (result.text) {
434
434
  span.setAttribute("neatlogs.llm.output_messages.0.role", "assistant");
435
- span.setAttribute("neatlogs.llm.output_messages.0.content", String(result.text).slice(0, 1e4));
435
+ span.setAttribute("neatlogs.llm.output_messages.0.content", String(result.text));
436
436
  }
437
437
  if (Array.isArray(result.toolCalls)) {
438
438
  for (let i = 0; i < result.toolCalls.length; i++) {
@@ -449,19 +449,19 @@ function finalizeModelResult(span, result) {
449
449
  if (!result) return;
450
450
  if (typeof result.text === "string" && result.text) {
451
451
  span.setAttribute("neatlogs.llm.output_messages.0.role", "assistant");
452
- span.setAttribute("neatlogs.llm.output_messages.0.content", result.text.slice(0, 1e4));
452
+ span.setAttribute("neatlogs.llm.output_messages.0.content", result.text);
453
453
  } else if (Array.isArray(result.content)) {
454
454
  const text = result.content.filter((p) => p?.type === "text" && typeof p.text === "string").map((p) => p.text).join("");
455
455
  if (text) {
456
456
  span.setAttribute("neatlogs.llm.output_messages.0.role", "assistant");
457
- span.setAttribute("neatlogs.llm.output_messages.0.content", text.slice(0, 1e4));
457
+ span.setAttribute("neatlogs.llm.output_messages.0.content", text);
458
458
  }
459
459
  const toolCalls = result.content.filter((p) => p?.type === "tool-call");
460
460
  for (let i = 0; i < toolCalls.length; i++) {
461
461
  const tc = toolCalls[i];
462
462
  setToolCall(span, i, tc.toolName, tc.input ?? tc.args, tc.toolCallId);
463
463
  }
464
- span.setAttribute("output.value", safeStringify(result.content).slice(0, 1e4));
464
+ span.setAttribute("output.value", safeStringify(result.content));
465
465
  }
466
466
  if (result.usage) recordUsage(span, result.usage);
467
467
  span.setAttribute("neatlogs.llm.stop_reason", normalizeFinishReason(result.finishReason));
@@ -503,12 +503,12 @@ function captureInvocationParams(attrs, callOpts) {
503
503
  }
504
504
  if (Array.isArray(callOpts.tools)) {
505
505
  for (let i = 0; i < callOpts.tools.length; i++) {
506
- attrs[`neatlogs.llm.tools.${i}`] = safeStringify(callOpts.tools[i]).slice(0, 4e3);
506
+ attrs[`neatlogs.llm.tools.${i}`] = safeStringify(callOpts.tools[i]);
507
507
  }
508
508
  invocation.toolChoice = callOpts.toolChoice;
509
509
  }
510
510
  if (Object.keys(invocation).length) {
511
- attrs["neatlogs.llm.invocation_parameters"] = safeStringify(invocation).slice(0, 4e3);
511
+ attrs["neatlogs.llm.invocation_parameters"] = safeStringify(invocation);
512
512
  }
513
513
  }
514
514
  function setToolCall(span, i, name, args, id) {
@@ -571,7 +571,7 @@ function extractModelId(model) {
571
571
  return model.modelId ?? model.name ?? "";
572
572
  }
573
573
  function toInputValue(input) {
574
- return (typeof input === "string" ? input : safeStringify(input)).slice(0, 1e4);
574
+ return typeof input === "string" ? input : safeStringify(input);
575
575
  }
576
576
  function safeStringify(value) {
577
577
  if (typeof value === "string") return value;