{"version":3,"sources":["../src/tracing.ts"],"sourcesContent":["/**\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BaseTracer, type Run } from '@langchain/core/tracers/base';\nimport {\n  SpanStatusCode,\n  context,\n  trace,\n  type Span as ApiSpan,\n} from '@opentelemetry/api';\n\nconst TRACER_NAME = 'genkit-tracer';\nconst TRACER_VERSION = 'v1';\n\nexport class GenkitTracer extends BaseTracer {\n  spans: Record<string, ApiSpan> = {};\n  tracer = trace.getTracer(TRACER_NAME, TRACER_VERSION);\n\n  name = 'genkit_callback_handler' as const;\n\n  protected persistRun(_run: Run) {\n    return Promise.resolve();\n  }\n\n  getParents(run: Run) {\n    const parents: Run[] = [];\n    let currentRun = run;\n    while (currentRun.parent_run_id) {\n      const parent = this.runMap.get(currentRun.parent_run_id);\n      if (parent) {\n        parents.push(parent);\n        currentRun = parent;\n      } else {\n        break;\n      }\n    }\n    return parents;\n  }\n\n  getBreadcrumbs(run: Run) {\n    const parents = this.getParents(run).reverse();\n    return [...parents, run].map((parent) => `${parent.name}`).join('/');\n  }\n\n  private startSpan(run: Run) {\n    let ctx;\n    if (run.parent_run_id) {\n      const parentCtx = this.spans[run.parent_run_id];\n      ctx = trace.setSpan(context.active(), parentCtx);\n    }\n    const span = this.tracer.startSpan(run.name, undefined, ctx);\n    if (run.inputs) {\n      span.setAttribute(\n        'genkit:input',\n        JSON.stringify(this.maybeFlattenInput(run.inputs))\n      );\n    }\n    span.setAttribute('langchain:path', this.getBreadcrumbs(run));\n    this.spans[run.id] = span;\n    return span;\n  }\n\n  private endSpan(run: Run, attributes?: Record<string, string>) {\n    const span = this.spans[run.id];\n    span.setAttribute('genkit:state', run.error ? 'error' : 'success');\n    if (run.error) {\n      span.setStatus({\n        code: SpanStatusCode.ERROR,\n        message: run.error,\n      });\n    }\n    if (run.outputs) {\n      span.setAttribute(\n        'genkit:output',\n        JSON.stringify(this.maybeFlattenOutput(run.outputs))\n      );\n    }\n    if (attributes) {\n      span.setAttributes(attributes);\n    }\n    span.end();\n    return span;\n  }\n\n  onChainStart(run: Run) {\n    this.startSpan(run);\n  }\n\n  onChainEnd(run: Run) {\n    this.endSpan(run);\n  }\n\n  onChainError(run: Run) {\n    this.endSpan(run);\n  }\n\n  onLLMStart(run: Run) {\n    this.startSpan(run);\n  }\n\n  onLLMEnd(run: Run) {\n    this.endSpan(run);\n  }\n\n  onLLMError(run: Run) {\n    this.endSpan(run);\n  }\n\n  onToolStart(run: Run) {\n    this.startSpan(run);\n  }\n\n  onToolEnd(run: Run) {\n    this.endSpan(run);\n  }\n\n  onToolError(run: Run) {\n    this.endSpan(run);\n  }\n\n  onRetrieverStart(run: Run) {\n    this.startSpan(run);\n  }\n\n  onRetrieverEnd(run: Run) {\n    this.endSpan(run);\n  }\n\n  onRetrieverError(run: Run) {\n    this.endSpan(run);\n  }\n\n  onAgentAction(run: Run) {\n    this.startSpan(run);\n    this.endSpan(run);\n  }\n\n  private maybeFlattenInput(input: any) {\n    if (\n      input &&\n      input.hasOwnProperty('input') &&\n      Object.keys(input).length === 1\n    ) {\n      return input.input;\n    }\n    return input;\n  }\n\n  private maybeFlattenOutput(output: any) {\n    if (\n      output &&\n      output.hasOwnProperty('output') &&\n      Object.keys(output).length === 1\n    ) {\n      return output.output;\n    }\n    return output;\n  }\n}\n"],"mappings":"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","names":[]}