{"version":3,"sources":["../../../../src/observability-sdk/instrumentation/langchain/index.ts"],"sourcesContent":["import type { AgentAction, AgentFinish } from \"@langchain/core/agents\";\nimport { BaseCallbackHandler } from \"@langchain/core/callbacks/base\";\nimport { type DocumentInterface } from \"@langchain/core/documents\";\nimport type { Serialized } from \"@langchain/core/load/serializable\";\nimport { type BaseMessage } from \"@langchain/core/messages\";\nimport type { ChatGeneration, LLMResult } from \"@langchain/core/outputs\";\nimport {\n  chatMessageSchema,\n  type ChatMessage,\n  type ChatRichContent,\n} from \"../../../internal/generated/types/tracer\";\nimport type { ChainValues } from \"@langchain/core/utils/types\";\nimport { getLangWatchTracer } from \"../../tracer\";\nimport type { LangWatchSpan } from \"../../span\";\nimport {\n  context,\n  trace,\n  SpanStatusCode,\n  type Attributes,\n} from \"@opentelemetry/api\";\nimport { shouldCaptureInput, shouldCaptureOutput } from \"../../config\";\n\ntype RunKind = \"llm\" | \"chat\" | \"chain\" | \"tool\" | \"retriever\";\n\ntype StartArgs = {\n  kind: RunKind;\n  runId: string;\n  parentRunId?: string;\n  serialized?: Serialized;\n  metadata?: Record<string, unknown>;\n  tags?: string[];\n  name?: string;\n  extraParams?: Record<string, unknown>;\n  input?: unknown; // already prepared for setInput()\n};\n\nconst LANGGRAPH_METADATA_KEYS = new Set<string>([\n  \"thread_id\",\n  \"langgraph_step\",\n  \"langgraph_node\",\n  \"langgraph_triggers\",\n  \"langgraph_path\",\n  \"langgraph_checkpoint_ns\",\n  \"__pregel_task_id\",\n  \"checkpoint_ns\",\n]);\n\nexport class LangWatchCallbackHandler extends BaseCallbackHandler {\n  name = \"LangWatchCallbackHandler\";\n  tracer = getLangWatchTracer(\"langwatch.instrumentation.langchain\");\n\n  private spans: Record<string, LangWatchSpan | undefined> = {};\n  private parentOf: Record<string, string | undefined> = {};\n  private skipped: Record<string, true | undefined> = {};\n  private seenStarts = new Set<string>();\n\n  private startRunSpan(args: StartArgs) {\n    const { runId, parentRunId, serialized, tags } = args;\n    this.parentOf[runId] = parentRunId;\n\n    // if we want to skip, we record as such as we cn do context matching latet\n    if (ctxSkip(serialized, tags)) {\n      this.skipped[runId] = true;\n      return;\n    }\n    if (this.seenStarts.has(runId)) return;\n    this.seenStarts.add(runId);\n\n    const parentCtx = getResolvedParentContext(\n      parentRunId,\n      this.spans,\n      this.parentOf\n    );\n    const parentSpan = parentRunId ? this.spans[parentRunId] : void 0;\n    const links = parentSpan\n      ? [{ context: parentSpan.spanContext() }]\n      : void 0;\n\n    const { name, type } = deriveNameAndType({\n      runType: args.kind,\n      name: args.name,\n      serialized: args.serialized,\n      metadata: args.metadata,\n      tags: args.tags,\n      inputs: args.input,\n    });\n\n    const span = this.tracer.startSpan(name, { links }, parentCtx);\n    span.setType(type);\n\n    if (args.tags?.length)\n      span.setAttribute(\"langwatch.langchain.run.tags\", args.tags.slice(0, 50));\n\n    if (shouldCaptureInput() && args.input !== void 0) {\n      const i: any = args.input as any;\n      if (i && typeof i === \"object\" && \"type\" in i && \"value\" in i) {\n        span.setInput(i.type, i.value);\n      } else {\n        span.setInput(i);\n      }\n    }\n\n    if (args.extraParams) {\n      span.setAttributes(\n        Object.fromEntries(\n          Object.entries(args.extraParams).map(([k, v]) => [\n            `langwatch.langchain.run.extra_params.${k}`,\n            wrapNonScalarValues(v),\n          ])\n        )\n      );\n    }\n\n    if (args.metadata) {\n      applyGenAIAttrs(span, args.metadata, args.extraParams);\n      setLangGraphAttributes(span, args.metadata);\n      span.setAttributes(buildLangChainMetadataAttributes(args.metadata));\n    }\n\n    this.spans[runId] = span;\n  }\n\n  private finishRun(\n    runId: string,\n    end: {\n      output?: unknown;\n      err?: Error;\n      event: string;\n      parentRunId?: string;\n      extra?: Attributes;\n      tags?: string[];\n      md?: Record<string, unknown>;\n    }\n  ) {\n    const span = this.spans[runId];\n    if (!span) return;\n\n    addLangChainEvent(\n      span,\n      end.event,\n      runId,\n      end.parentRunId,\n      end.tags,\n      end.md,\n      end.extra\n    );\n\n    if (end.err) {\n      span.recordException(end.err);\n      span.setStatus({ code: SpanStatusCode.ERROR, message: end.err.message });\n    } else if (shouldCaptureOutput() && end.output !== undefined) {\n      span.setOutput(end.output as any);\n    }\n\n    span.end();\n\n    delete this.spans[runId];\n    delete this.parentOf[runId];\n    delete this.skipped[runId];\n    this.seenStarts.delete(runId);\n  }\n\n  async handleLLMStart(\n    llm: Serialized,\n    prompts: string[],\n    runId: string,\n    parentRunId?: string,\n    extraParams?: Record<string, unknown>,\n    tags?: string[],\n    metadata?: Record<string, unknown>,\n    name?: string\n  ): Promise<void> {\n    const input = shouldCaptureInput() && prompts\n      ? {\n          type: \"list\",\n          value: prompts.map((p) => ({ type: \"text\", value: p })),\n        }\n      : void 0;\n\n    this.startRunSpan({\n      kind: \"llm\",\n      runId,\n      parentRunId,\n      serialized: llm,\n      metadata,\n      tags,\n      name,\n      extraParams,\n      input,\n    });\n  }\n\n  async handleChatModelStart(\n    llm: Serialized,\n    messages: BaseMessage[][],\n    runId: string,\n    parentRunId?: string,\n    extraParams?: Record<string, unknown>,\n    tags?: string[],\n    metadata?: Record<string, unknown>,\n    name?: string\n  ): Promise<void> {\n    const input = shouldCaptureInput()\n      ? {\n          type: \"chat_messages\",\n          value: messages.flatMap(convertFromLangChainMessages),\n        }\n      : void 0;\n\n    this.startRunSpan({\n      kind: \"chat\",\n      runId,\n      parentRunId,\n      serialized: llm,\n      metadata,\n      tags,\n      name,\n      extraParams,\n      input,\n    });\n  }\n\n  async handleLLMEnd(\n    response: LLMResult,\n    runId: string,\n    parentRunId?: string\n  ): Promise<void> {\n    const span = this.spans[runId];\n    const tu = (response.llmOutput as any)?.tokenUsage as\n      | {\n          promptTokens?: number;\n          completionTokens?: number;\n          totalTokens?: number;\n        }\n      | undefined;\n    if (span && tu) {\n      span.setAttributes({\n        \"gen_ai.usage.prompt_tokens\": tu.promptTokens ?? 0,\n        \"gen_ai.usage.completion_tokens\": tu.completionTokens ?? 0,\n        \"gen_ai.usage.total_tokens\": tu.totalTokens ?? 0,\n      });\n    }\n\n    const outputs = shouldCaptureOutput()\n      ? response.generations.flat().map((g) => {\n          if (\"message\" in g && g.message) {\n            return convertFromLangChainMessages([\n              (g as ChatGeneration).message,\n            ]);\n          } else if (\"text\" in g && g.text) {\n            return g.text;\n          }\n          return g;\n        })\n      : undefined;\n\n    this.finishRun(runId, {\n      output: outputs,\n      event: \"handleLLMEnd\",\n      parentRunId,\n    });\n  }\n\n  async handleLLMError(\n    err: Error,\n    runId: string,\n    parentRunId?: string\n  ): Promise<void> {\n    this.finishRun(runId, { err, event: \"handleLLMError\", parentRunId });\n  }\n\n  async handleChainStart(\n    chain: Serialized,\n    inputs: ChainValues,\n    runId: string,\n    parentRunId?: string,\n    tags?: string[],\n    metadata?: Record<string, unknown>,\n    _runType?: string,\n    name?: string\n  ): Promise<void> {\n    this.startRunSpan({\n      kind: \"chain\",\n      runId,\n      parentRunId,\n      serialized: chain,\n      metadata,\n      tags,\n      name,\n      input: shouldCaptureInput() ? inputs : void 0,\n    });\n\n    if (_runType) {\n      const span = this.spans[runId];\n      if (span) span.setAttribute(\"langwatch.langchain.run.type\", _runType);\n    }\n  }\n\n  async handleChainEnd(\n    output: ChainValues,\n    runId: string,\n    parentRunId?: string\n  ): Promise<void> {\n    this.finishRun(runId, { output, event: \"handleChainEnd\", parentRunId });\n  }\n\n  async handleChainError(\n    err: Error,\n    runId: string,\n    parentRunId?: string,\n    tags?: string[],\n    kwargs?: { inputs?: Record<string, unknown> | undefined }\n  ): Promise<void> {\n    this.finishRun(runId, {\n      err,\n      event: \"handleChainError\",\n      parentRunId,\n      tags,\n      md: kwargs,\n    });\n  }\n\n  async handleToolStart(\n    tool: Serialized,\n    input: string,\n    runId: string,\n    parentRunId?: string,\n    tags?: string[],\n    metadata?: Record<string, unknown>,\n    name?: string\n  ): Promise<void> {\n    this.startRunSpan({\n      kind: \"tool\",\n      runId,\n      parentRunId,\n      serialized: tool,\n      metadata,\n      tags,\n      name,\n      input: shouldCaptureInput() ? { type: \"text\", value: input } : void 0,\n    });\n\n    const span = this.spans[runId];\n    if (span) {\n      span.setAttributes({\n        \"langwatch.langchain.run.id\": runId,\n        \"langwatch.langchain.run.parent_id\": parentRunId,\n      });\n    }\n  }\n\n  async handleToolEnd(\n    output: string,\n    runId: string,\n    parentRunId?: string\n  ): Promise<void> {\n    this.finishRun(runId, {\n      output: shouldCaptureOutput()\n        ? { type: \"text\", value: output }\n        : void 0,\n      event: \"handleToolEnd\",\n      parentRunId,\n    });\n  }\n\n  async handleToolError(\n    err: Error,\n    runId: string,\n    parentRunId?: string,\n    tags?: string[]\n  ): Promise<void> {\n    this.finishRun(runId, { err, event: \"handleToolError\", parentRunId, tags });\n  }\n\n  async handleRetrieverStart(\n    retriever: Serialized,\n    query: string,\n    runId: string,\n    parentRunId?: string,\n    tags?: string[],\n    metadata?: Record<string, unknown>,\n    name?: string\n  ) {\n    this.startRunSpan({\n      kind: \"retriever\",\n      runId,\n      parentRunId,\n      serialized: retriever,\n      metadata,\n      tags,\n      name,\n      input: shouldCaptureInput() ? { type: \"text\", value: query } : void 0,\n    });\n\n    const span = this.spans[runId];\n    if (span) {\n      span.setAttributes({\n        \"langwatch.langchain.run.id\": runId,\n        \"langwatch.langchain.run.parent_id\": parentRunId,\n      });\n    }\n  }\n\n  async handleRetrieverEnd(\n    documents: DocumentInterface<Record<string, any>>[],\n    runId: string,\n    parentRunId?: string,\n    tags?: string[]\n  ) {\n    const span = this.spans[runId];\n\n    if (span && shouldCaptureOutput()) {\n      span.setOutput(documents);\n    }\n\n    if (span && shouldCaptureInput()) {\n      span.setRAGContexts(\n        documents.map((document) => ({\n          document_id: document.metadata.id,\n          chunk_id: document.metadata.chunk_id,\n          content: document.pageContent,\n        }))\n      );\n    }\n\n    this.finishRun(runId, { event: \"handleRetrieverEnd\", parentRunId, tags });\n  }\n\n  async handleRetrieverError(\n    err: Error,\n    runId: string,\n    parentRunId?: string,\n    tags?: string[]\n  ) {\n    this.finishRun(runId, {\n      err,\n      event: \"handleRetrieverError\",\n      parentRunId,\n      tags,\n    });\n  }\n\n  async handleAgentAction(\n    _action: AgentAction,\n    runId: string,\n    parentRunId?: string,\n    tags?: string[]\n  ): Promise<void> {\n    const span = this.spans[runId];\n    if (span) {\n      addLangChainEvent(span, \"handleAgentAction\", runId, parentRunId, tags);\n      span.setType(\"agent\");\n    }\n  }\n\n  async handleAgentEnd(\n    action: AgentFinish,\n    runId: string,\n    parentRunId?: string,\n    tags?: string[]\n  ): Promise<void> {\n    this.finishRun(runId, {\n      output: shouldCaptureOutput()\n        ? { type: \"json\", value: action.returnValues }\n        : void 0,\n      event: \"handleAgentEnd\",\n      parentRunId,\n      tags,\n    });\n  }\n}\n\nexport function convertFromLangChainMessages(\n  messages: BaseMessage[]\n): ChatMessage[] {\n  const out: ChatMessage[] = [];\n  for (const message of messages) {\n    out.push(\n      convertFromLangChainMessage(message as BaseMessage & { id?: string[] })\n    );\n  }\n  return out;\n}\n\nfunction convertFromLangChainMessage(\n  message: BaseMessage & { id?: string[] }\n): ChatMessage {\n  let role: ChatMessage[\"role\"] = \"user\";\n\n  const msgType = (message as any).type as string | undefined;\n  if (msgType === \"human\") role = \"user\";\n  else if (msgType === \"ai\") role = \"assistant\";\n  else if (msgType === \"system\") role = \"system\";\n  else if (msgType === \"function\") role = \"function\";\n  else if (msgType === \"tool\") role = \"tool\";\n  else {\n    if (\n      (message as any)?._getType?.() === \"human\" ||\n      message.id?.[message.id.length - 1] === \"HumanMessage\"\n    ) {\n      role = \"user\";\n    } else if (\n      (message as any)?._getType?.() === \"ai\" ||\n      message.id?.[message.id.length - 1] === \"AIMessage\"\n    ) {\n      role = \"assistant\";\n    } else if (\n      (message as any)?._getType?.() === \"system\" ||\n      message.id?.[message.id.length - 1] === \"SystemMessage\"\n    ) {\n      role = \"system\";\n    } else if (\n      (message as any)?._getType?.() === \"function\" ||\n      message.id?.[message.id.length - 1] === \"FunctionMessage\"\n    ) {\n      role = \"function\";\n    } else if (\n      (message as any)?._getType?.() === \"tool\" ||\n      message.id?.[message.id.length - 1] === \"ToolMessage\"\n    ) {\n      role = \"tool\";\n    }\n  }\n\n  const content: ChatMessage[\"content\"] =\n    typeof (message as any).content === \"string\"\n      ? ((message as any).content as string)\n      : (message as any).content == null\n      ? null\n      : Array.isArray((message as any).content)\n      ? (message as any).content.map(\n          (c: any): ChatRichContent =>\n            c?.type === \"text\"\n              ? { type: \"text\", text: c.text }\n              : c?.type === \"image_url\"\n              ? { type: \"image_url\", image_url: c.image_url }\n              : { type: \"text\", text: JSON.stringify(c) }\n        )\n      : JSON.stringify((message as any).content);\n\n  const functionCall = (message as any).additional_kwargs;\n\n  return {\n    role,\n    content,\n    ...(functionCall &&\n    typeof functionCall === \"object\" &&\n    Object.keys(functionCall).length > 0\n      ? { function_call: functionCall }\n      : {}),\n  };\n}\n\nfunction className(serialized?: Serialized): string {\n  const id = (serialized as any)?.id;\n  if (Array.isArray(id) && id.length) return String(id[id.length - 1]);\n  const ns = (serialized as any)?.lc_namespace;\n  if (Array.isArray(ns) && ns.length) return String(ns[ns.length - 1]);\n\n  return \"\";\n}\n\nfunction shorten(str: string, max = 120): string {\n  return typeof str === \"string\" && str.length > max\n    ? str.slice(0, max - 1) + \"…\"\n    : str;\n}\n\nfunction previewInput(v: unknown): string | undefined {\n  if (typeof v === \"string\") {\n    const s = v.trim();\n    return s ? shorten(s, 120) : void 0;\n  }\n  return void 0;\n}\n\nfunction ctxSkip(serialized?: Serialized, tags?: string[]) {\n  const cls = className(serialized);\n  return (\n    cls.startsWith(\"ChannelWrite\") ||\n    (tags?.includes(\"langsmith:hidden\") ?? false)\n  );\n}\n\nfunction wrapNonScalarValues(\n  value: unknown\n): string | number | boolean | undefined {\n  if (value === void 0) return void 0;\n  if (value === null) return JSON.stringify(null);\n  if (\n    typeof value === \"string\" ||\n    typeof value === \"number\" ||\n    typeof value === \"boolean\"\n  )\n    return value;\n\n  // Special-case: ChatMessage[] detection via zod schema the project already has\n  const chatMessages = chatMessageSchema.array().safeParse(value as any);\n  if (Array.isArray(value) && chatMessages.success) {\n    return JSON.stringify({ type: \"chat_messages\", value: chatMessages.data });\n  }\n\n  try {\n    const seen = new WeakSet();\n    const json = JSON.stringify(value as any, (k, val) => {\n      if (typeof val === \"object\" && val !== null) {\n        if (seen.has(val)) return \"[Circular]\";\n        seen.add(val);\n      }\n      return val;\n    });\n    return json;\n  } catch {\n    return JSON.stringify({ type: \"raw\", value: \"[Non-Serializable]\" });\n  }\n}\n\nfunction addLangChainEvent(\n  span: LangWatchSpan,\n  eventName: string,\n  runId: string,\n  parentRunId: string | undefined,\n  tags?: string[],\n  metadata?: Record<string, unknown>,\n  attributes?: Attributes\n) {\n  const attrs: Attributes = {\n    \"langwatch.langchain.run.id\": runId,\n    \"langwatch.langchain.run.parent_id\": parentRunId,\n    \"langwatch.langchain.event.name\": eventName,\n    ...attributes,\n  };\n\n  if (tags?.length) attrs[\"langwatch.langchain.run.tags\"] = tags.slice(0, 50);\n  if (metadata) {\n    Object.entries(metadata).forEach(([key, value]) => {\n      attrs[key] = wrapNonScalarValues(value);\n    });\n  }\n\n  span.addEvent(\"langwatch.langchain.callback\", attrs);\n}\n\nfunction setLangGraphAttributes(\n  span: LangWatchSpan,\n  metadata?: Record<string, unknown>\n) {\n  if (!metadata) return;\n  const keys = Object.keys(metadata);\n  for (const key of keys) {\n    const value = (metadata as any)[key];\n    if (value !== undefined) {\n      const wrapped = wrapNonScalarValues(value);\n      if (wrapped !== undefined) {\n        span.setAttribute(\n          `langwatch.langgraph.${key}` as const,\n          wrapped as any\n        );\n      }\n    }\n  }\n}\n\nfunction buildLangChainMetadataAttributes(metadata: Record<string, unknown>) {\n  if (!metadata) return {};\n  return Object.fromEntries(\n    Object.entries(metadata)\n      .filter(([key]) => !LANGGRAPH_METADATA_KEYS.has(key))\n      .map(([key, value]) => [\n        `langwatch.langchain.run.metadata.${key}`,\n        wrapNonScalarValues(value),\n      ])\n  );\n}\n\nfunction applyGenAIAttrs(\n  span: LangWatchSpan,\n  metadata?: Record<string, unknown>,\n  extraParams?: Record<string, unknown>\n) {\n  const md = (metadata ?? {}) as any;\n  const ex = (extraParams ?? {}) as any;\n\n  const provider = md.ls_provider as string | undefined;\n  const requestModel = md.ls_model_name ?? md.kwargs?.model ?? ex.kwargs?.model;\n  const temperature =\n    md.ls_temperature ?? md.kwargs?.temperature ?? ex.kwargs?.temperature;\n  const responseModel = md.response_metadata?.model_name as string | undefined;\n\n  if (provider) span.setAttribute(\"gen_ai.system\", provider);\n  if (requestModel) span.setAttribute(\"gen_ai.request.model\", requestModel);\n  if (typeof temperature === \"number\")\n    span.setAttribute(\"gen_ai.request.temperature\", temperature);\n  if (responseModel) span.setAttribute(\"gen_ai.response.model\", responseModel);\n}\n\nfunction getResolvedParentContext(\n  runId: string | undefined,\n  spans: Record<string, LangWatchSpan | undefined>,\n  parentOf: Record<string, string | undefined>\n) {\n  let cur = runId;\n  while (cur) {\n    const s = spans[cur];\n    if (s) return trace.setSpan(context.active(), s);\n    cur = parentOf[cur];\n  }\n  return context.active();\n}\n\nfunction deriveNameAndType(opts: {\n  runType: RunKind;\n  name?: string;\n  serialized?: Serialized;\n  metadata?: Record<string, unknown>;\n  tags?: string[];\n  inputs?: unknown;\n}): { name: string; type: \"llm\" | \"chain\" | \"tool\" | \"rag\" | \"component\" } {\n  const { runType, name, serialized, metadata, inputs } = opts;\n\n  // user-specified name / metadata override\n  const hardName = (name?.trim() ?? (metadata as any)?.operation_name) as\n    | string\n    | undefined;\n  if (hardName) {\n    return {\n      name: hardName,\n      type:\n        runType === \"tool\"\n          ? \"tool\"\n          : runType === \"retriever\"\n          ? \"rag\"\n          : runType === \"llm\" || runType === \"chat\"\n          ? \"llm\"\n          : \"chain\",\n    };\n  }\n\n  const cls = className(serialized);\n  const md = (metadata ?? {}) as any;\n\n  // LangGraph node / router - prioritize routers over nodes\n  const hasNode = md?.langgraph_node != null;\n  const hasTriggers = Array.isArray(md?.langgraph_triggers) && md.langgraph_triggers.length > 0;\n  const isRouter =\n    cls.startsWith(\"Branch<\") || hasTriggers;\n  const isGraphRunner = md?.langgraph_path && !md?.langgraph_node;\n\n  // LLM / Chat - always prioritize runType over metadata\n  if (runType === \"llm\" || runType === \"chat\") {\n    const prov = (md?.ls_provider as string) ?? \"LLM\";\n    const model = (md?.ls_model_name as string) ?? (cls || \"call\");\n    const temp = md?.ls_temperature;\n    const tempStr =\n      temp != null\n        ? typeof temp === \"number\"\n          ? temp.toString()\n          : JSON.stringify(temp)\n        : null;\n    const nm =\n      tempStr != null\n        ? `${prov} ${model} (temp ${tempStr})`\n        : `${prov} ${model}`;\n    return { name: nm, type: \"llm\" };\n  }\n\n  // Prioritize LangGraph routers over nodes (but after LLM/Chat)\n  if (isRouter) {\n    const pathArr = md?.langgraph_path as string[] | undefined;\n    const fromNode =\n      Array.isArray(pathArr) && pathArr.length\n        ? pathArr[pathArr.length - 1]\n        : undefined;\n    const decision = Array.isArray(md?.langgraph_triggers)\n      ? String(\n          md.langgraph_triggers.find((t: any) =>\n            String(t).startsWith(\"branch:\")\n          ) ?? \"\"\n        ).replace(/^branch:(to:)?/, \"\")\n      : undefined;\n    const nm = `Route: ${fromNode ?? \"unknown\"} → ${decision ?? \"unknown\"}`;\n    return { name: nm, type: \"component\" };\n  }\n\n  if (hasNode) {\n    const step = md?.langgraph_step;\n    const nm = `Node: ${md.langgraph_node}${\n      step != null ? ` (step ${String(step)})` : \"\"\n    }`;\n    return { name: nm, type: \"component\" };\n  }\n  if (isGraphRunner && runType === \"chain\") {\n    return { name: \"Graph: LangGraph\", type: \"chain\" };\n  }\n\n  // Tool\n  if (runType === \"tool\") {\n    const tool = (metadata as any)?.name ?? (cls || \"tool\");\n    const prev =\n      previewInput(inputs) ?? previewInput((serialized as any)?.input);\n    return {\n      name: prev ? `Tool: ${tool} — ${prev}` : `Tool: ${tool}`,\n      type: \"tool\",\n    };\n  }\n\n  // Retriever\n  if (runType === \"retriever\") return { name: \"Retriever\", type: \"rag\" };\n\n  // Fallbacks\n  if (cls.includes(\"Agent\"))\n    return { name: `Agent: ${cls}`, type: \"component\" };\n  if (cls.startsWith(\"Runnable\"))\n    return { name: `Runnable: ${cls.replace(/^Runnable/, \"\")}`, type: \"chain\" };\n  return { name: cls || \"LangChain operation\", type: \"chain\" };\n}\n\n// Export helper functions for testing\nexport {\n  className,\n  shorten,\n  previewInput,\n  ctxSkip,\n  wrapNonScalarValues,\n  addLangChainEvent,\n  setLangGraphAttributes,\n  buildLangChainMetadataAttributes,\n  applyGenAIAttrs,\n  getResolvedParentContext,\n  deriveNameAndType,\n};\n"],"mappings":"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","names":[]}