langwatch 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/README.md +5 -2
  2. package/dist/add-LBBS4I3H.js +114 -0
  3. package/dist/add-LBBS4I3H.js.map +1 -0
  4. package/dist/add-RD3ZKFAT.mjs +114 -0
  5. package/dist/add-RD3ZKFAT.mjs.map +1 -0
  6. package/dist/chunk-2JU376G7.js +242 -0
  7. package/dist/chunk-2JU376G7.js.map +1 -0
  8. package/dist/chunk-2ODBGSBI.js +4 -0
  9. package/dist/{chunk-G3AUABT7.js.map → chunk-2ODBGSBI.js.map} +1 -1
  10. package/dist/chunk-3GKPQB4R.mjs +242 -0
  11. package/dist/chunk-3GKPQB4R.mjs.map +1 -0
  12. package/dist/chunk-4NRLVT2U.mjs +35 -0
  13. package/dist/chunk-4NRLVT2U.mjs.map +1 -0
  14. package/dist/{chunk-SVJ7SCGB.js → chunk-52GXX3MA.js} +33 -31
  15. package/dist/chunk-52GXX3MA.js.map +1 -0
  16. package/dist/chunk-5NC5ILKA.js +94 -0
  17. package/dist/chunk-5NC5ILKA.js.map +1 -0
  18. package/dist/chunk-AAROJADR.mjs +49 -0
  19. package/dist/chunk-AAROJADR.mjs.map +1 -0
  20. package/dist/chunk-DHJKJVY7.mjs +20 -0
  21. package/dist/chunk-DHJKJVY7.mjs.map +1 -0
  22. package/dist/{chunk-VJSOCNPA.js → chunk-DTEKFQ4U.js} +6 -28
  23. package/dist/chunk-DTEKFQ4U.js.map +1 -0
  24. package/dist/chunk-E7UE2MPD.mjs +93 -0
  25. package/dist/chunk-E7UE2MPD.mjs.map +1 -0
  26. package/dist/chunk-F6E4XQQU.js +20 -0
  27. package/dist/chunk-F6E4XQQU.js.map +1 -0
  28. package/dist/chunk-FJLK5CFL.js +37 -0
  29. package/dist/chunk-FJLK5CFL.js.map +1 -0
  30. package/dist/{chunk-Z5J5UI5E.mjs → chunk-GJSEBQXF.mjs} +139 -107
  31. package/dist/chunk-GJSEBQXF.mjs.map +1 -0
  32. package/dist/chunk-HA3LI5IK.js +35 -0
  33. package/dist/chunk-HA3LI5IK.js.map +1 -0
  34. package/dist/chunk-HJU67C7H.js +93 -0
  35. package/dist/chunk-HJU67C7H.js.map +1 -0
  36. package/dist/chunk-IGHXIIIK.js +49 -0
  37. package/dist/chunk-IGHXIIIK.js.map +1 -0
  38. package/dist/{chunk-PMBEK6YE.mjs → chunk-J7ICRUU4.mjs} +5 -3
  39. package/dist/{chunk-PMBEK6YE.mjs.map → chunk-J7ICRUU4.mjs.map} +1 -1
  40. package/dist/{chunk-HPC6Z7J4.js → chunk-PWZBLTHR.js} +3 -3
  41. package/dist/{chunk-HPC6Z7J4.js.map → chunk-PWZBLTHR.js.map} +1 -1
  42. package/dist/chunk-SMXXAVMB.js +100 -0
  43. package/dist/chunk-SMXXAVMB.js.map +1 -0
  44. package/dist/{chunk-CSC3CMIT.mjs → chunk-STV4ZVNA.mjs} +2 -2
  45. package/dist/chunk-T5AZMMVS.mjs +94 -0
  46. package/dist/chunk-T5AZMMVS.mjs.map +1 -0
  47. package/dist/{chunk-4BZATFKJ.mjs → chunk-UU33HCCZ.mjs} +4 -26
  48. package/dist/{chunk-4BZATFKJ.mjs.map → chunk-UU33HCCZ.mjs.map} +1 -1
  49. package/dist/{chunk-PTJ6AAI7.js → chunk-VGHLQXKB.js} +138 -106
  50. package/dist/chunk-VGHLQXKB.js.map +1 -0
  51. package/dist/chunk-W5ZEP3CI.mjs +100 -0
  52. package/dist/chunk-W5ZEP3CI.mjs.map +1 -0
  53. package/dist/chunk-Y666BJA5.mjs +4 -0
  54. package/dist/chunk-YN4436PK.mjs +37 -0
  55. package/dist/chunk-YN4436PK.mjs.map +1 -0
  56. package/dist/cli/index.d.mts +1 -0
  57. package/dist/cli/index.d.ts +1 -0
  58. package/dist/cli/index.js +106 -0
  59. package/dist/cli/index.js.map +1 -0
  60. package/dist/cli/index.mjs +106 -0
  61. package/dist/cli/index.mjs.map +1 -0
  62. package/dist/client-browser.js +15 -10
  63. package/dist/client-browser.js.map +1 -1
  64. package/dist/client-browser.mjs +9 -4
  65. package/dist/client-browser.mjs.map +1 -1
  66. package/dist/client-node.js +14 -9
  67. package/dist/client-node.js.map +1 -1
  68. package/dist/client-node.mjs +11 -6
  69. package/dist/client-node.mjs.map +1 -1
  70. package/dist/create-G5MTGOOH.js +70 -0
  71. package/dist/create-G5MTGOOH.js.map +1 -0
  72. package/dist/create-QUZYBMQB.mjs +70 -0
  73. package/dist/create-QUZYBMQB.mjs.map +1 -0
  74. package/dist/evaluation/index.js +5 -4
  75. package/dist/evaluation/index.js.map +1 -1
  76. package/dist/evaluation/index.mjs +4 -3
  77. package/dist/index.d.mts +21 -14
  78. package/dist/index.d.ts +21 -14
  79. package/dist/index.js +10 -7
  80. package/dist/index.js.map +1 -1
  81. package/dist/index.mjs +9 -6
  82. package/dist/init-H67RW22E.mjs +16 -0
  83. package/dist/init-H67RW22E.mjs.map +1 -0
  84. package/dist/init-XU2JFY6N.js +16 -0
  85. package/dist/init-XU2JFY6N.js.map +1 -0
  86. package/dist/list-7NPSX2E4.mjs +136 -0
  87. package/dist/list-7NPSX2E4.mjs.map +1 -0
  88. package/dist/list-ZXFLAF52.js +136 -0
  89. package/dist/list-ZXFLAF52.js.map +1 -0
  90. package/dist/login-76NQIHKR.js +110 -0
  91. package/dist/login-76NQIHKR.js.map +1 -0
  92. package/dist/login-EK4WVOI2.mjs +110 -0
  93. package/dist/login-EK4WVOI2.mjs.map +1 -0
  94. package/dist/observability/index.d.mts +3 -3
  95. package/dist/observability/index.d.ts +3 -3
  96. package/dist/observability/index.js +5 -4
  97. package/dist/observability/index.js.map +1 -1
  98. package/dist/observability/index.mjs +4 -3
  99. package/dist/observability/instrumentation/langchain/index.d.mts +2 -2
  100. package/dist/observability/instrumentation/langchain/index.d.ts +2 -2
  101. package/dist/observability/instrumentation/langchain/index.js +29 -27
  102. package/dist/observability/instrumentation/langchain/index.js.map +1 -1
  103. package/dist/observability/instrumentation/langchain/index.mjs +5 -3
  104. package/dist/observability/instrumentation/langchain/index.mjs.map +1 -1
  105. package/dist/prompt/index.d.mts +2 -2
  106. package/dist/prompt/index.d.ts +2 -2
  107. package/dist/prompt/index.js +8 -4
  108. package/dist/prompt/index.js.map +1 -1
  109. package/dist/prompt/index.mjs +10 -6
  110. package/dist/{prompt-BXJWdbQp.d.mts → prompt-D-jpMrLS.d.mts} +245 -0
  111. package/dist/{prompt-BXJWdbQp.d.ts → prompt-D-jpMrLS.d.ts} +245 -0
  112. package/dist/remove-SDJYEPAY.mjs +106 -0
  113. package/dist/remove-SDJYEPAY.mjs.map +1 -0
  114. package/dist/remove-XBNGIVMR.js +106 -0
  115. package/dist/remove-XBNGIVMR.js.map +1 -0
  116. package/dist/sync-EISKGPTL.js +403 -0
  117. package/dist/sync-EISKGPTL.js.map +1 -0
  118. package/dist/sync-ST2IWXSB.mjs +403 -0
  119. package/dist/sync-ST2IWXSB.mjs.map +1 -0
  120. package/dist/{trace-G2312klE.d.ts → trace-CqaKo0kZ.d.ts} +1 -1
  121. package/dist/{trace-D-bZOuqb.d.mts → trace-DtVc5GhF.d.mts} +1 -1
  122. package/package.json +23 -12
  123. package/dist/chunk-76KNOWLS.js +0 -39
  124. package/dist/chunk-76KNOWLS.js.map +0 -1
  125. package/dist/chunk-G3AUABT7.js +0 -4
  126. package/dist/chunk-OM7VY3XT.mjs +0 -4
  127. package/dist/chunk-PTJ6AAI7.js.map +0 -1
  128. package/dist/chunk-SVJ7SCGB.js.map +0 -1
  129. package/dist/chunk-VJSOCNPA.js.map +0 -1
  130. package/dist/chunk-X62YT4WB.mjs +0 -39
  131. package/dist/chunk-X62YT4WB.mjs.map +0 -1
  132. package/dist/chunk-Z5J5UI5E.mjs.map +0 -1
  133. /package/dist/{chunk-CSC3CMIT.mjs.map → chunk-STV4ZVNA.mjs.map} +0 -0
  134. /package/dist/{chunk-OM7VY3XT.mjs.map → chunk-Y666BJA5.mjs.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/observability/trace.ts","../src/observability/span.ts","../src/evaluation/record-evaluation.ts","../src/evaluation/tracer.ts"],"sourcesContent":["import {\n trace as otelTrace,\n Tracer,\n Span,\n SpanOptions,\n Context,\n SpanStatusCode,\n} from \"@opentelemetry/api\";\nimport { LangWatchSpan, createLangWatchSpan } from \"./span\";\n\n/**\n * LangWatch OpenTelemetry Tracing Extensions\n *\n * This module provides wrappers and helpers for OpenTelemetry Tracer and Span objects,\n * adding ergonomic methods for LLM/GenAI observability and structured tracing.\n *\n * @module trace\n */\nexport interface LangWatchTracer extends Tracer {\n /**\n * Starts a new {@link LangWatchSpan}. Start the span without setting it on context.\n *\n * This method does NOT modify the current Context.\n *\n * @param name The name of the span\n * @param [options] SpanOptions used for span creation\n * @param [context] Context to use to extract parent\n * @returns LangWatchSpan The newly created span\n *\n * @example\n * const span = tracer.startSpan('op');\n * span.setAttribute('key', 'value');\n * span.end();\n */\n startSpan(\n name: string,\n options?: SpanOptions,\n context?: Context,\n ): LangWatchSpan;\n\n /**\n * Starts a new {@link LangWatchSpan} and calls the given function passing it the\n * created span as first argument.\n * Additionally the new span gets set in context and this context is activated\n * for the duration of the function call.\n *\n * @param name The name of the span\n * @param [options] SpanOptions used for span creation\n * @param [context] Context to use to extract parent\n * @param fn function called in the context of the span and receives the newly created span as an argument\n * @returns return value of fn\n *\n * @example\n * const result = tracer.startActiveSpan('op', span => {\n * try {\n * // do some work\n * span.setStatus({code: SpanStatusCode.OK});\n * return something;\n * } catch (err) {\n * span.setStatus({\n * code: SpanStatusCode.ERROR,\n * message: err.message,\n * });\n * throw err;\n * } finally {\n * span.end();\n * }\n * });\n *\n * @example\n * const span = tracer.startActiveSpan('op', span => {\n * try {\n * do some work\n * return span;\n * } catch (err) {\n * span.setStatus({\n * code: SpanStatusCode.ERROR,\n * message: err.message,\n * });\n * throw err;\n * }\n * });\n * do some more work\n * span.end();\n */\n startActiveSpan<F extends (span: LangWatchSpan) => unknown>(\n name: string,\n fn: F,\n ): ReturnType<F>;\n startActiveSpan<F extends (span: LangWatchSpan) => unknown>(\n name: string,\n options: SpanOptions,\n fn: F,\n ): ReturnType<F>;\n startActiveSpan<F extends (span: LangWatchSpan) => unknown>(\n name: string,\n options: SpanOptions,\n context: Context,\n fn: F,\n ): ReturnType<F>;\n\n /**\n * Starts a new {@link LangWatchSpan}, runs the provided async function, and automatically handles\n * error recording, status setting, and span ending. This is a safer and more ergonomic alternative\n * to manually using try/catch/finally blocks with startActiveSpan.\n *\n * Overloads:\n * - withActiveSpan(name, fn)\n * - withActiveSpan(name, options, fn)\n * - withActiveSpan(name, options, context, fn)\n *\n * @param name The name of the span\n * @param options Optional SpanOptions for span creation\n * @param context Optional Context to use to extract parent\n * @param fn The async function to execute within the span context. Receives the span as its first argument.\n * @returns The return value of the provided function\n *\n * @example\n * await tracer.withActiveSpan('my-operation', async (span) => {\n * // ... your code ...\n * });\n *\n * await tracer.withActiveSpan('my-operation', { attributes: { foo: 'bar' } }, async (span) => {\n * // ... your code ...\n * });\n *\n * await tracer.withActiveSpan('my-operation', { attributes: { foo: 'bar' } }, myContext, async (span) => {\n * // ... your code ...\n * });\n */\n withActiveSpan<T>(\n name: string,\n fn: (span: LangWatchSpan) => Promise<T> | T\n ): Promise<T>;\n withActiveSpan<T>(\n name: string,\n options: SpanOptions,\n fn: (span: LangWatchSpan) => Promise<T> | T\n ): Promise<T>;\n withActiveSpan<T>(\n name: string,\n options: SpanOptions,\n context: Context,\n fn: (span: LangWatchSpan) => Promise<T> | T\n ): Promise<T>;\n}\n\n/**\n * Extension of OpenTelemetry's Tracer with LangWatch-specific helpers.\n *\n * This interface provides methods for starting spans and active spans that return LangWatchSpan objects,\n * which include ergonomic helpers for LLM/GenAI tracing.\n *\n * @example\n * import { getLangWatchTracer } from 'langwatch';\n * const tracer = getLangWatchTracer('my-service');\n * const span = tracer.startSpan('llm-call');\n * span.setType('llm').setInput('Prompt').setOutput('Completion');\n * span.end();\n *\n * tracer.startActiveSpan('llm-call', (span) => {\n * span.setType('llm');\n * // ...\n * span.end();\n * });\n */\nexport function getLangWatchTracer(name: string, version?: string): LangWatchTracer {\n const tracer = otelTrace.getTracer(name, version);\n\n // Create a proxy for the tracer that intercepts the calls to startActiveSpan and\n // startSpan, and wraps the span object with our custom LangWatchSpan.\n const handler: ProxyHandler<LangWatchTracer> = {\n get(target, prop, _receiver) {\n switch (prop) {\n case \"startActiveSpan\": {\n const startActiveSpan: StartActiveSpanOverloads = (\n ...args: [\n string,\n SpanOptions?,\n Context?,\n ((span: Span) => unknown)?,\n ]\n ) => {\n // Find the span callback function (usually the last argument!)\n const fnIndex = args.findIndex((arg) => typeof arg === \"function\");\n if (fnIndex === -1) {\n throw new Error(\n \"startActiveSpan requires a function as the last argument\",\n );\n }\n\n // A type assertion is safe here due to the check above, but still sad 😥\n const userFn = args[fnIndex] as (\n span: Span,\n ...rest: unknown[]\n ) => unknown;\n\n // Replace the function with one that wraps the span first\n const spanWrapFunc = (...fnArgs: unknown[]) => {\n const [span, ...rest] = fnArgs;\n return userFn(createLangWatchSpan(span as Span), ...rest);\n };\n\n const newArgs = [...args];\n newArgs[fnIndex] = spanWrapFunc;\n\n // TypeScript can't infer the overload, but this is safe\n return (\n target.startActiveSpan as unknown as (\n ...args: unknown[]\n ) => unknown\n )(...newArgs);\n };\n return startActiveSpan;\n }\n\n case \"startSpan\": {\n return function (\n ...args: Parameters<Tracer[\"startSpan\"]>\n ): ReturnType<Tracer[\"startSpan\"]> {\n const span = target.startSpan(...args);\n return createLangWatchSpan(span);\n };\n }\n\n case \"withActiveSpan\": {\n /**\n * Implementation of withActiveSpan: supports all overloads like startActiveSpan.\n * Uses startActiveSpan to ensure context propagation for nested spans.\n */\n return async function withActiveSpan(...args: any[]): Promise<any> {\n // Find the function argument (should be the last argument)\n const fnIndex = args.findIndex((arg) => typeof arg === \"function\");\n if (fnIndex === -1) {\n throw new Error(\"withActiveSpan requires a function as the last argument\");\n }\n const userFn = args[fnIndex] as (span: LangWatchSpan) => Promise<any> | any;\n // The preceding arguments are: name, options?, context?\n const name = args[0];\n const options = args.length > 2 ? args[1] : undefined;\n const context = args.length > 3 ? args[2] : undefined;\n\n return await new Promise((resolve, reject) => {\n // Use startActiveSpan to ensure context propagation\n const cb = async (span: Span) => {\n const wrappedSpan = createLangWatchSpan(span);\n try {\n resolve(await userFn(wrappedSpan));\n } catch (err: any) {\n wrappedSpan.setStatus({\n code: SpanStatusCode.ERROR,\n message: err && err.message ? err.message : String(err),\n });\n wrappedSpan.recordException(err);\n reject(err);\n } finally {\n wrappedSpan.end();\n }\n };\n // Call the correct overload of startActiveSpan\n if (context !== undefined) {\n target.startActiveSpan(name, options, context, cb);\n } else if (options !== undefined) {\n target.startActiveSpan(name, options, cb);\n } else {\n target.startActiveSpan(name, cb);\n }\n });\n };\n }\n\n default: {\n const value = target[prop as keyof Tracer];\n return typeof value === \"function\" ? value.bind(target) : value;\n }\n }\n },\n };\n\n return new Proxy(tracer, handler) as LangWatchTracer;\n}\n\n/**\n * Helper type for the function overloads of startActiveSpan.\n *\n * This matches OpenTelemetry's Tracer interface and is used internally for type safety.\n */\ntype StartActiveSpanOverloads = {\n <F extends (span: Span) => unknown>(name: string, fn: F): ReturnType<F>;\n <F extends (span: Span) => unknown>(\n name: string,\n options: SpanOptions,\n fn: F,\n ): ReturnType<F>;\n <F extends (span: Span) => unknown>(\n name: string,\n options: SpanOptions,\n context: Context,\n fn: F,\n ): ReturnType<F>;\n};\n","import {\n Attributes,\n AttributeValue,\n Span,\n SpanContext,\n SpanStatus,\n Link,\n Exception\n} from \"@opentelemetry/api\";\nimport semconv from \"@opentelemetry/semantic-conventions/incubating\";\nimport * as intSemconv from \"./semconv\";\nimport {\n RecordedEvaluationDetails,\n recordEvaluation,\n} from \"../evaluation/record-evaluation\";\nimport { EvaluationResultModel } from \"../evaluation/types\";\nimport { Prompt } from \"../prompt/prompt\";\n\n/**\n * Supported types of spans for LangWatch observability. These types categorize the nature of the span for downstream analysis and visualization.\n *\n * @example\n * import { spanTypes, SpanType } from './span';\n * const myType: SpanType = 'llm';\n */\nexport const spanTypes = [\n \"span\",\n \"llm\",\n \"chain\",\n \"tool\",\n \"agent\",\n \"guardrail\",\n \"evaluation\",\n \"rag\",\n \"prompt\",\n \"workflow\",\n \"component\",\n \"module\",\n \"server\",\n \"client\",\n \"producer\",\n \"consumer\",\n \"task\",\n \"unknown\",\n] as const;\n\nexport type SpanType = (typeof spanTypes)[number];\n\n/**\n * Context for a RAG (Retrieval-Augmented Generation) span.\n *\n * This structure is used to record which document and chunk were retrieved and used as context for a generation.\n *\n * @property document_id - Unique identifier for the source document.\n * @property chunk_id - Unique identifier for the chunk within the document.\n * @property content - The actual content of the chunk provided to the model.\n *\n * @example\n * const ragContext: LangWatchSpanRAGContext = {\n * document_id: 'doc-123',\n * chunk_id: 'chunk-456',\n * content: 'Relevant passage from the document.'\n * };\n */\nexport interface LangWatchSpanRAGContext {\n document_id: string;\n chunk_id: string;\n content: string;\n}\n\n/**\n * Metrics for a LangWatch span.\n *\n * @property promptTokens - The number of prompt tokens used.\n * @property completionTokens - The number of completion tokens used.\n * @property cost - The cost of the span.\n */\nexport interface LangWatchSpanMetrics {\n /** The number of prompt tokens used */\n promptTokens?: number;\n /** The number of completion tokens used */\n completionTokens?: number;\n /** The cost of the span */\n cost?: number;\n}\n\n/**\n * Body for a system message event in a GenAI span.\n *\n * Used to log system/instruction messages sent to the model.\n *\n * @property content - The message content.\n * @property role - The role of the message, typically 'system' or 'instruction'.\n *\n * @example\n * span.addGenAISystemMessageEvent({ content: 'You are a helpful assistant.' });\n */\nexport interface LangWatchSpanGenAISystemMessageEventBody {\n /** Content of the system message */\n content?: string;\n /** Role of the message (system or instruction) */\n role?: \"system\" | \"instruction\";\n}\n\n/**\n * Body for a user message event in a GenAI span.\n *\n * Used to log user/customer messages sent to the model.\n *\n * @property content - The message content.\n * @property role - The role of the message, typically 'user' or 'customer'.\n *\n * @example\n * span.addGenAIUserMessageEvent({ content: 'What is the weather today?' });\n */\nexport interface LangWatchSpanGenAIUserMessageEventBody {\n /** Content of the user message */\n content?: string;\n /** Role of the message (user or customer) */\n role?: \"user\" | \"customer\";\n}\n\n/**\n * Body for an assistant message event in a GenAI span.\n *\n * Used to log assistant/bot responses, including tool calls.\n *\n * @property content - The message content.\n * @property role - The role of the message, typically 'assistant' or 'bot'.\n * @property tool_calls - Array of tool call objects, if the assistant invoked tools/functions.\n *\n * @example\n * span.addGenAIAssistantMessageEvent({ content: 'The weather is sunny.', role: 'assistant' });\n */\nexport interface LangWatchSpanGenAIAssistantMessageEventBody {\n /** Content of the assistant message */\n content?: string;\n /** Role of the message (assistant or bot) */\n role?: \"assistant\" | \"bot\";\n /** Tool calls made by the assistant */\n tool_calls?: {\n function: {\n /** Name of the function called */\n name: string;\n /** Arguments passed to the function */\n arguments?: string;\n };\n /** Tool call identifier */\n id: string;\n /** Type of tool call */\n type: \"function\";\n }[];\n}\n\n/**\n * Body for a tool message event in a GenAI span.\n *\n * Used to log messages from tools/functions invoked by the assistant.\n *\n * @property content - The message content.\n * @property id - Unique identifier for the tool call.\n * @property role - The role, typically 'tool' or 'function'.\n *\n * @example\n * span.addGenAIToolMessageEvent({ content: 'Result from tool', id: 'tool-1', role: 'tool' });\n */\nexport interface LangWatchSpanGenAIToolMessageEventBody {\n /** Content of the tool message */\n content?: string;\n /** Tool call identifier */\n id: string;\n /** Role of the message (tool or function) */\n role?: \"tool\" | \"function\";\n}\n\n/**\n * Body for a choice event in a GenAI span.\n *\n * Used to log the model's output choices, including finish reason and message content.\n *\n * @property finish_reason - Why the generation finished (e.g., 'stop', 'length').\n * @property index - Index of the choice (for multi-choice outputs).\n * @property message - The message content and tool calls for this choice.\n *\n * @example\n * span.addGenAIChoiceEvent({ finish_reason: 'stop', index: 0, message: { content: 'Hello!' } });\n */\nexport interface LangWatchSpanGenAIChoiceEventBody {\n /** Reason the generation finished */\n finish_reason: intSemconv.VAL_GEN_AI_FINISH_REASONS | (string & {});\n /** Index of the choice */\n index: number;\n /** Message content for the choice */\n message?: {\n /** Content of the message */\n content?: string;\n /** Role of the message (assistant or bot) */\n role?: \"assistant\" | \"bot\";\n /** Tool calls made by the assistant */\n tool_calls?: {\n function: {\n /** Name of the function called */\n name: string;\n /** Arguments passed to the function */\n arguments?: string;\n };\n /** Tool call identifier */\n id: string;\n /** Type of tool call */\n type: \"function\";\n }[];\n };\n}\n\n/**\n * Extension of OpenTelemetry's Span with LangWatch-specific helpers for LLM, RAG, and GenAI tracing.\n *\n * This interface provides ergonomic methods for recording structured LLM/GenAI data, such as inputs, outputs, RAG contexts, and message events.\n *\n * All methods return `this` for chaining.\n *\n * @example\n * const span = createLangWatchSpan(otelSpan);\n * span\n * .setType('llm')\n * .setInput({ prompt: 'Hello' })\n * .setOutput('Hi!')\n * .addGenAIUserMessageEvent({ content: 'Hello' })\n * .addGenAIAssistantMessageEvent({ content: 'Hi!' });\n */\nexport interface LangWatchSpan extends Span {\n /**\n * Record the evaluation result for the span.\n *\n * @param details - The evaluation details\n * @param attributes - Additional attributes to add to the evaluation span.\n * @returns this\n */\n recordEvaluation(\n details: RecordedEvaluationDetails,\n attributes?: Attributes,\n ): this;\n\n /**\n * Add a GenAI system message event to the span.\n *\n * This logs a system/instruction message sent to the model.\n *\n * @param body - The event body (content and role)\n * @param system - The GenAI system (optional, e.g., 'openai', 'anthropic')\n * @param attributes - Additional OpenTelemetry attributes (optional)\n * @returns this\n */\n addGenAISystemMessageEvent(\n body: LangWatchSpanGenAISystemMessageEventBody,\n system?: intSemconv.VAL_GEN_AI_SYSTEMS | (string & {}),\n attributes?: Record<string, AttributeValue>,\n ): this;\n /**\n * Add a GenAI user message event to the span.\n *\n * This logs a user/customer message sent to the model.\n *\n * @param body - The event body (content and role)\n * @param system - The GenAI system (optional)\n * @param attributes - Additional OpenTelemetry attributes (optional)\n * @returns this\n */\n addGenAIUserMessageEvent(\n body: LangWatchSpanGenAIUserMessageEventBody,\n system?: intSemconv.VAL_GEN_AI_SYSTEMS | (string & {}),\n attributes?: Record<string, AttributeValue>,\n ): this;\n /**\n * Add a GenAI assistant message event to the span.\n *\n * This logs an assistant/bot response, including tool calls if present.\n *\n * @param body - The event body (content, role, tool_calls)\n * @param system - The GenAI system (optional)\n * @param attributes - Additional OpenTelemetry attributes (optional)\n * @returns this\n */\n addGenAIAssistantMessageEvent(\n body: LangWatchSpanGenAIAssistantMessageEventBody,\n system?: intSemconv.VAL_GEN_AI_SYSTEMS | (string & {}),\n attributes?: Record<string, AttributeValue>,\n ): this;\n /**\n * Add a GenAI tool message event to the span.\n *\n * This logs a message from a tool/function invoked by the assistant.\n *\n * @param body - The event body (content, id, role)\n * @param system - The GenAI system (optional)\n * @param attributes - Additional OpenTelemetry attributes (optional)\n * @returns this\n */\n addGenAIToolMessageEvent(\n body: LangWatchSpanGenAIToolMessageEventBody,\n system?: intSemconv.VAL_GEN_AI_SYSTEMS | (string & {}),\n attributes?: Record<string, AttributeValue>,\n ): this;\n /**\n * Add a GenAI choice event to the span.\n *\n * This logs a model output choice, including finish reason and message content.\n *\n * @param body - The event body (finish_reason, index, message)\n * @param system - The GenAI system (optional)\n * @param attributes - Additional OpenTelemetry attributes (optional)\n * @returns this\n */\n addGenAIChoiceEvent(\n body: LangWatchSpanGenAIChoiceEventBody,\n system?: intSemconv.VAL_GEN_AI_SYSTEMS | (string & {}),\n attributes?: Record<string, AttributeValue>,\n ): this;\n\n /**\n * Set the type of the span (e.g., 'llm', 'rag', 'tool', etc).\n *\n * This is used for downstream filtering and analytics.\n *\n * @param type - The span type (see SpanType)\n * @returns this\n */\n setType(type: SpanType): this;\n\n /**\n * Set the request model name for the span.\n *\n * This is typically the model name sent in the API request (e.g., 'gpt-4', 'claude-3').\n *\n * @param model - The request model name\n * @returns this\n */\n setRequestModel(model: string): this;\n /**\n * Set the response model name for the span.\n *\n * This is the model name returned in the API response, if different from the request.\n *\n * @param model - The response model name\n * @returns this\n */\n setResponseModel(model: string): this;\n\n /**\n * Set multiple RAG contexts for the span.\n *\n * Use this to record all retrieved documents/chunks used as context for a generation.\n *\n * @param ragContexts - Array of RAG context objects\n * @returns this\n */\n setRAGContexts(ragContexts: LangWatchSpanRAGContext[]): this;\n /**\n * Set a single RAG context for the span.\n *\n * Use this if only one context was retrieved.\n *\n * @param ragContext - The RAG context object\n * @returns this\n */\n setRAGContext(ragContext: LangWatchSpanRAGContext): this;\n\n /**\n * Set the metrics for the span.\n *\n * @param metrics - The metrics object\n * @returns this\n */\n setMetrics(metrics: LangWatchSpanMetrics): this;\n\n /**\n * Set the selected prompt for the span. This will attach this prompt to the trace. If\n * this is set on multiple spans, the last one will be used.\n *\n * @param prompt - The prompt object\n * @returns this\n */\n setSelectedPrompt(prompt: Prompt): this;\n\n /**\n * Record the input to the span as a JSON-serializable value.\n *\n * The input is stringified and stored as a span attribute for later analysis.\n *\n * @param input - The input value (any type, will be JSON.stringified)\n * @returns this\n */\n setInput(input: unknown): this;\n /**\n * Record the input to the span as a plain string.\n *\n * Use this for raw text prompts or queries.\n *\n * @param input - The input string\n * @returns this\n */\n setInputString(input: string): this;\n /**\n * Record the output from the span as a JSON-serializable value.\n *\n * The output is stringified and stored as a span attribute for later analysis.\n *\n * @param output - The output value (any type, will be JSON.stringified)\n * @returns this\n */\n setOutput(output: unknown): this;\n /**\n * Record the output from the span as a plain string.\n *\n * Use this for raw text completions or responses.\n *\n * @param output - The output string\n * @returns this\n */\n setOutputString(output: string): this;\n\n /**\n * Set the evaluation output for the span.\n *\n * @param guardrail - Whether the evaluation is a guardrail\n * @param output - The evaluation result\n * @returns this\n */\n setOutputEvaluation(guardrail: boolean, output: EvaluationResultModel): this;\n}\n\n/**\n * LangWatchSpan class that wraps an OpenTelemetry Span with LangWatch-specific helpers.\n *\n * This class provides a clean, type-safe wrapper around OpenTelemetry spans with\n * additional methods for LLM, RAG, and GenAI tracing. All methods support fluent API chaining.\n *\n * @example\n * import { createLangWatchSpan } from './span';\n * const otelSpan = tracer.startSpan('llm-call');\n * const span = createLangWatchSpan(otelSpan);\n * span.setType('llm').setInput('Prompt').setOutput('Completion');\n */\nclass LangWatchSpanImpl implements LangWatchSpan {\n constructor(private span: Span) {}\n\n // OpenTelemetry Span methods with fluent API support\n setAttribute(key: string, value: AttributeValue): this {\n this.span.setAttribute(key, value);\n return this;\n }\n\n setAttributes(attributes: Attributes): this {\n this.span.setAttributes(attributes);\n return this;\n }\n\n addEvent(name: string, attributes?: Attributes): this {\n this.span.addEvent(name, attributes);\n return this;\n }\n\n recordException(exception: Exception): this {\n this.span.recordException(exception);\n return this;\n }\n\n setStatus(status: SpanStatus): this {\n this.span.setStatus(status);\n return this;\n }\n\n updateName(name: string): this {\n this.span.updateName(name);\n return this;\n }\n\n // Pass through other Span methods without chaining\n end(endTime?: number): void {\n this.span.end(endTime);\n }\n\n isRecording(): boolean {\n return this.span.isRecording();\n }\n\n spanContext(): SpanContext {\n return this.span.spanContext();\n }\n\n addLink(link: Link): this {\n this.span.addLink(link);\n return this;\n }\n\n addLinks(links: Link[]): this {\n this.span.addLinks(links);\n return this;\n }\n\n // LangWatch-specific methods\n recordEvaluation(\n details: RecordedEvaluationDetails,\n attributes?: Attributes,\n ): this {\n recordEvaluation(details, attributes);\n return this;\n }\n\n addGenAISystemMessageEvent(\n body: LangWatchSpanGenAISystemMessageEventBody,\n system?: intSemconv.VAL_GEN_AI_SYSTEMS | (string & {}),\n attributes?: Record<string, AttributeValue>,\n ): this {\n if (body.role === void 0) {\n body.role = \"system\";\n }\n\n this.span.addEvent(intSemconv.LOG_EVNT_GEN_AI_SYSTEM_MESSAGE, {\n ...attributes,\n [semconv.ATTR_GEN_AI_SYSTEM]: system,\n [intSemconv.ATTR_LANGWATCH_GEN_AI_LOG_EVENT_BODY]: JSON.stringify(body),\n [intSemconv.ATTR_LANGWATCH_GEN_AI_LOG_EVENT_IMPOSTER]: true,\n });\n return this;\n }\n\n addGenAIUserMessageEvent(\n body: LangWatchSpanGenAIUserMessageEventBody,\n system?: intSemconv.VAL_GEN_AI_SYSTEMS | (string & {}),\n attributes?: Record<string, AttributeValue>,\n ): this {\n if (body.role === void 0) {\n body.role = \"user\";\n }\n\n this.span.addEvent(intSemconv.LOG_EVNT_GEN_AI_USER_MESSAGE, {\n ...attributes,\n [semconv.ATTR_GEN_AI_SYSTEM]: system,\n [intSemconv.ATTR_LANGWATCH_GEN_AI_LOG_EVENT_BODY]: JSON.stringify(body),\n [intSemconv.ATTR_LANGWATCH_GEN_AI_LOG_EVENT_IMPOSTER]: true,\n });\n return this;\n }\n\n addGenAIAssistantMessageEvent(\n body: LangWatchSpanGenAIAssistantMessageEventBody,\n system?: intSemconv.VAL_GEN_AI_SYSTEMS | (string & {}),\n attributes?: Record<string, AttributeValue>,\n ): this {\n if (body.role === void 0) {\n body.role = \"assistant\";\n }\n\n this.span.addEvent(intSemconv.LOG_EVNT_GEN_AI_ASSISTANT_MESSAGE, {\n ...attributes,\n [semconv.ATTR_GEN_AI_SYSTEM]: system,\n [intSemconv.ATTR_LANGWATCH_GEN_AI_LOG_EVENT_BODY]: JSON.stringify(body),\n [intSemconv.ATTR_LANGWATCH_GEN_AI_LOG_EVENT_IMPOSTER]: true,\n });\n return this;\n }\n\n addGenAIToolMessageEvent(\n body: LangWatchSpanGenAIToolMessageEventBody,\n system?: intSemconv.VAL_GEN_AI_SYSTEMS | (string & {}),\n attributes?: Record<string, AttributeValue>,\n ): this {\n if (body.role === void 0) {\n body.role = \"tool\";\n }\n\n this.span.addEvent(intSemconv.LOG_EVNT_GEN_AI_TOOL_MESSAGE, {\n ...attributes,\n [semconv.ATTR_GEN_AI_SYSTEM]: system,\n [intSemconv.ATTR_LANGWATCH_GEN_AI_LOG_EVENT_BODY]: JSON.stringify(body),\n [intSemconv.ATTR_LANGWATCH_GEN_AI_LOG_EVENT_IMPOSTER]: true,\n });\n return this;\n }\n\n addGenAIChoiceEvent(\n body: LangWatchSpanGenAIChoiceEventBody,\n system?: intSemconv.VAL_GEN_AI_SYSTEMS | (string & {}),\n attributes?: Record<string, AttributeValue>,\n ): this {\n if (body.message && body.message.role === void 0) {\n body.message.role = \"assistant\";\n }\n\n this.span.addEvent(intSemconv.LOG_EVNT_GEN_AI_CHOICE, {\n ...attributes,\n [semconv.ATTR_GEN_AI_SYSTEM]: system,\n [intSemconv.ATTR_LANGWATCH_GEN_AI_LOG_EVENT_BODY]: JSON.stringify(body),\n [intSemconv.ATTR_LANGWATCH_GEN_AI_LOG_EVENT_IMPOSTER]: true,\n });\n return this;\n }\n\n setType(type: SpanType): this {\n this.span.setAttribute(intSemconv.ATTR_LANGWATCH_SPAN_TYPE, type);\n return this;\n }\n\n setRequestModel(model: string): this {\n this.span.setAttribute(semconv.ATTR_GEN_AI_REQUEST_MODEL, model);\n return this;\n }\n\n setResponseModel(model: string): this {\n this.span.setAttribute(semconv.ATTR_GEN_AI_RESPONSE_MODEL, model);\n return this;\n }\n\n setRAGContexts(ragContexts: LangWatchSpanRAGContext[]): this {\n this.span.setAttribute(\n intSemconv.ATTR_LANGWATCH_RAG_CONTEXTS,\n JSON.stringify({\n type: \"json\",\n value: ragContexts,\n }),\n );\n return this;\n }\n\n setRAGContext(ragContext: LangWatchSpanRAGContext): this {\n this.span.setAttribute(\n intSemconv.ATTR_LANGWATCH_RAG_CONTEXTS,\n JSON.stringify({\n type: \"json\",\n value: [ragContext],\n }),\n );\n return this;\n }\n\n setMetrics(metrics: LangWatchSpanMetrics): this {\n this.span.setAttribute(\n intSemconv.ATTR_LANGWATCH_METRICS,\n JSON.stringify({\n type: \"json\",\n value: metrics,\n }),\n );\n return this;\n }\n\n setSelectedPrompt(prompt: Prompt): this {\n this.span.setAttributes({\n [intSemconv.ATTR_LANGWATCH_PROMPT_SELECTED_ID]: prompt.id,\n [intSemconv.ATTR_LANGWATCH_PROMPT_ID]: prompt.id,\n [intSemconv.ATTR_LANGWATCH_PROMPT_VERSION_ID]: prompt.versionId,\n [intSemconv.ATTR_LANGWATCH_PROMPT_VERSION_NUMBER]: prompt.version,\n });\n return this;\n }\n\n setInput(input: unknown): this {\n this.span.setAttribute(\n intSemconv.ATTR_LANGWATCH_INPUT,\n JSON.stringify({\n type: \"json\",\n value: input,\n }),\n );\n return this;\n }\n\n setInputString(input: string): this {\n this.span.setAttribute(\n intSemconv.ATTR_LANGWATCH_INPUT,\n JSON.stringify({\n type: \"text\",\n value: input,\n }),\n );\n return this;\n }\n\n setOutput(output: unknown): this {\n this.span.setAttribute(\n intSemconv.ATTR_LANGWATCH_OUTPUT,\n JSON.stringify({\n type: \"json\",\n value: output,\n }),\n );\n return this;\n }\n\n setOutputString(output: string): this {\n this.span.setAttribute(\n intSemconv.ATTR_LANGWATCH_OUTPUT,\n JSON.stringify({\n type: \"text\",\n value: output,\n }),\n );\n return this;\n }\n\n setOutputEvaluation(guardrail: boolean, output: EvaluationResultModel): this {\n this.span.setAttribute(\n intSemconv.ATTR_LANGWATCH_OUTPUT,\n JSON.stringify({\n type: guardrail ? \"guardrail_result\" : \"evaluation_result\",\n value: output,\n }),\n );\n return this;\n }\n}\n\n/**\n * Creates a LangWatchSpan wrapper around an OpenTelemetry Span.\n *\n * @param span - The OpenTelemetry Span to wrap\n * @returns A LangWatchSpan with additional methods for LLM/GenAI observability\n *\n * @example\n * import { createLangWatchSpan } from './span';\n * const otelSpan = tracer.startSpan('llm-call');\n * const span = createLangWatchSpan(otelSpan);\n * span.setType('llm').setInput('Prompt').setOutput('Completion');\n */\nexport function createLangWatchSpan(span: Span): LangWatchSpan {\n return new LangWatchSpanImpl(span);\n}\n","import { EvaluationRESTResult } from \"../internal/generated/types/evaluations\";\nimport * as intSemconv from \"../observability/semconv\";\nimport { Attributes, SpanStatusCode } from \"@opentelemetry/api\";\nimport { generate } from \"xksuid\";\nimport { tracer } from \"./tracer\";\n\nexport interface RecordedEvaluationDetails {\n evaluationId?: string;\n name: string;\n type?: string;\n isGuardrail?: boolean;\n status?: \"processed\" | \"skipped\" | \"error\";\n passed?: boolean;\n score?: number;\n label?: string;\n details?: string;\n cost?: number | { currency: string; amount: number };\n error?: Error;\n timestamps?: {\n startedAtUnixMs: number;\n finishedAtUnixMs: number;\n };\n}\n\nexport function recordEvaluation(\n details: RecordedEvaluationDetails,\n attributes?: Attributes,\n) {\n let result: EvaluationRESTResult;\n const status = details.status || \"processed\";\n\n if (status === \"skipped\") {\n result = {\n status: \"skipped\",\n details: details.details,\n };\n } else if (status === \"error\") {\n result = {\n status: \"error\",\n error_type: details.error?.name || \"Unknown\",\n details: details.details || details.error?.message || \"Unknown error\",\n };\n } else {\n result = {\n status: \"processed\",\n passed: details.passed,\n score: details.score,\n label: details.label,\n details: details.details,\n };\n if (details.cost) {\n (result as any).cost =\n typeof details.cost === \"number\"\n ? { currency: \"USD\", amount: details.cost }\n : details.cost;\n }\n }\n\n tracer.startActiveSpan(\"record evaluation\", (span) => {\n try {\n span.setType(details.isGuardrail ? \"guardrail\" : \"evaluation\");\n span.addEvent(intSemconv.ATTR_LANGWATCH_EVALUATION_CUSTOM, {\n json_encoded_event: JSON.stringify({\n evaluation_id: details.evaluationId ?? `eval_${generate()}`,\n name: details.name,\n type: details.type,\n is_guardrail: details.isGuardrail,\n status: result.status,\n passed: details.passed,\n score: details.score,\n label: details.label,\n details: details.details,\n cost: details.cost,\n error: details.error,\n timestamps: details.timestamps,\n }),\n });\n\n span.setOutput(result);\n\n if (attributes) {\n span.setAttributes(attributes);\n }\n if (details.cost) {\n span.setMetrics({\n cost:\n typeof details.cost === \"number\"\n ? details.cost\n : details.cost.amount,\n });\n }\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({ code: SpanStatusCode.ERROR, message: (error as Error)?.message });\n } finally {\n span.end();\n }\n\n return;\n });\n}\n","import { getLangWatchTracer } from \"../observability/trace\";\n\nexport const tracer = getLangWatchTracer(\"langwatch.evaluation\");\n"],"mappings":"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","names":["SpanStatusCode","_a","tracer","name","SpanStatusCode"]}
1
+ {"version":3,"sources":["../src/observability/trace.ts","../src/observability/span.ts","../src/evaluation/record-evaluation.ts","../src/evaluation/tracer.ts"],"sourcesContent":["import {\n trace as otelTrace,\n Tracer,\n Span,\n SpanOptions,\n Context,\n SpanStatusCode,\n} from \"@opentelemetry/api\";\nimport { LangWatchSpan, createLangWatchSpan } from \"./span\";\n\n/**\n * LangWatch OpenTelemetry Tracing Extensions\n *\n * This module provides wrappers and helpers for OpenTelemetry Tracer and Span objects,\n * adding ergonomic methods for LLM/GenAI observability and structured tracing.\n *\n * @module trace\n */\nexport interface LangWatchTracer extends Tracer {\n /**\n * Starts a new {@link LangWatchSpan}. Start the span without setting it on context.\n *\n * This method does NOT modify the current Context.\n *\n * @param name The name of the span\n * @param [options] SpanOptions used for span creation\n * @param [context] Context to use to extract parent\n * @returns LangWatchSpan The newly created span\n *\n * @example\n * const span = tracer.startSpan('op');\n * span.setAttribute('key', 'value');\n * span.end();\n */\n startSpan(\n name: string,\n options?: SpanOptions,\n context?: Context,\n ): LangWatchSpan;\n\n /**\n * Starts a new {@link LangWatchSpan} and calls the given function passing it the\n * created span as first argument.\n * Additionally the new span gets set in context and this context is activated\n * for the duration of the function call.\n *\n * @param name The name of the span\n * @param [options] SpanOptions used for span creation\n * @param [context] Context to use to extract parent\n * @param fn function called in the context of the span and receives the newly created span as an argument\n * @returns return value of fn\n *\n * @example\n * const result = tracer.startActiveSpan('op', span => {\n * try {\n * // do some work\n * span.setStatus({code: SpanStatusCode.OK});\n * return something;\n * } catch (err) {\n * span.setStatus({\n * code: SpanStatusCode.ERROR,\n * message: err.message,\n * });\n * throw err;\n * } finally {\n * span.end();\n * }\n * });\n *\n * @example\n * const span = tracer.startActiveSpan('op', span => {\n * try {\n * do some work\n * return span;\n * } catch (err) {\n * span.setStatus({\n * code: SpanStatusCode.ERROR,\n * message: err.message,\n * });\n * throw err;\n * }\n * });\n * do some more work\n * span.end();\n */\n startActiveSpan<F extends (span: LangWatchSpan) => unknown>(\n name: string,\n fn: F,\n ): ReturnType<F>;\n startActiveSpan<F extends (span: LangWatchSpan) => unknown>(\n name: string,\n options: SpanOptions,\n fn: F,\n ): ReturnType<F>;\n startActiveSpan<F extends (span: LangWatchSpan) => unknown>(\n name: string,\n options: SpanOptions,\n context: Context,\n fn: F,\n ): ReturnType<F>;\n\n /**\n * Starts a new {@link LangWatchSpan}, runs the provided async function, and automatically handles\n * error recording, status setting, and span ending. This is a safer and more ergonomic alternative\n * to manually using try/catch/finally blocks with startActiveSpan.\n *\n * Overloads:\n * - withActiveSpan(name, fn)\n * - withActiveSpan(name, options, fn)\n * - withActiveSpan(name, options, context, fn)\n *\n * @param name The name of the span\n * @param options Optional SpanOptions for span creation\n * @param context Optional Context to use to extract parent\n * @param fn The async function to execute within the span context. Receives the span as its first argument.\n * @returns The return value of the provided function\n *\n * @example\n * await tracer.withActiveSpan('my-operation', async (span) => {\n * // ... your code ...\n * });\n *\n * await tracer.withActiveSpan('my-operation', { attributes: { foo: 'bar' } }, async (span) => {\n * // ... your code ...\n * });\n *\n * await tracer.withActiveSpan('my-operation', { attributes: { foo: 'bar' } }, myContext, async (span) => {\n * // ... your code ...\n * });\n */\n withActiveSpan<T>(\n name: string,\n fn: (span: LangWatchSpan) => Promise<T> | T\n ): Promise<T>;\n withActiveSpan<T>(\n name: string,\n options: SpanOptions,\n fn: (span: LangWatchSpan) => Promise<T> | T\n ): Promise<T>;\n withActiveSpan<T>(\n name: string,\n options: SpanOptions,\n context: Context,\n fn: (span: LangWatchSpan) => Promise<T> | T\n ): Promise<T>;\n}\n\n/**\n * Extension of OpenTelemetry's Tracer with LangWatch-specific helpers.\n *\n * This interface provides methods for starting spans and active spans that return LangWatchSpan objects,\n * which include ergonomic helpers for LLM/GenAI tracing.\n *\n * @example\n * import { getLangWatchTracer } from 'langwatch';\n * const tracer = getLangWatchTracer('my-service');\n * const span = tracer.startSpan('llm-call');\n * span.setType('llm').setInput('Prompt').setOutput('Completion');\n * span.end();\n *\n * tracer.startActiveSpan('llm-call', (span) => {\n * span.setType('llm');\n * // ...\n * span.end();\n * });\n */\nexport function getLangWatchTracer(name: string, version?: string): LangWatchTracer {\n const tracer = otelTrace.getTracer(name, version);\n\n // Create a proxy for the tracer that intercepts the calls to startActiveSpan and\n // startSpan, and wraps the span object with our custom LangWatchSpan.\n const handler: ProxyHandler<LangWatchTracer> = {\n get(target, prop, _receiver) {\n switch (prop) {\n case \"startActiveSpan\": {\n const startActiveSpan: StartActiveSpanOverloads = (\n ...args: [\n string,\n SpanOptions?,\n Context?,\n ((span: Span) => unknown)?,\n ]\n ) => {\n // Find the span callback function (usually the last argument!)\n const fnIndex = args.findIndex((arg) => typeof arg === \"function\");\n if (fnIndex === -1) {\n throw new Error(\n \"startActiveSpan requires a function as the last argument\",\n );\n }\n\n // A type assertion is safe here due to the check above, but still sad 😥\n const userFn = args[fnIndex] as (\n span: Span,\n ...rest: unknown[]\n ) => unknown;\n\n // Replace the function with one that wraps the span first\n const spanWrapFunc = (...fnArgs: unknown[]) => {\n const [span, ...rest] = fnArgs;\n return userFn(createLangWatchSpan(span as Span), ...rest);\n };\n\n const newArgs = [...args];\n newArgs[fnIndex] = spanWrapFunc;\n\n // TypeScript can't infer the overload, but this is safe\n return (\n target.startActiveSpan as unknown as (\n ...args: unknown[]\n ) => unknown\n )(...newArgs);\n };\n return startActiveSpan;\n }\n\n case \"startSpan\": {\n return function (\n ...args: Parameters<Tracer[\"startSpan\"]>\n ): ReturnType<Tracer[\"startSpan\"]> {\n const span = target.startSpan(...args);\n return createLangWatchSpan(span);\n };\n }\n\n case \"withActiveSpan\": {\n /**\n * Implementation of withActiveSpan: supports all overloads like startActiveSpan.\n * Uses startActiveSpan to ensure context propagation for nested spans.\n */\n return async function withActiveSpan(...args: any[]): Promise<any> {\n // Find the function argument (should be the last argument)\n const fnIndex = args.findIndex((arg) => typeof arg === \"function\");\n if (fnIndex === -1) {\n throw new Error(\"withActiveSpan requires a function as the last argument\");\n }\n const userFn = args[fnIndex] as (span: LangWatchSpan) => Promise<any> | any;\n // The preceding arguments are: name, options?, context?\n const name = args[0];\n const options = args.length > 2 ? args[1] : undefined;\n const context = args.length > 3 ? args[2] : undefined;\n\n return await new Promise((resolve, reject) => {\n // Use startActiveSpan to ensure context propagation\n const cb = async (span: Span) => {\n const wrappedSpan = createLangWatchSpan(span);\n try {\n resolve(await userFn(wrappedSpan));\n } catch (err: any) {\n wrappedSpan.setStatus({\n code: SpanStatusCode.ERROR,\n message: err && err.message ? err.message : String(err),\n });\n wrappedSpan.recordException(err);\n reject(err);\n } finally {\n wrappedSpan.end();\n }\n };\n // Call the correct overload of startActiveSpan\n if (context !== undefined) {\n target.startActiveSpan(name, options, context, cb);\n } else if (options !== undefined) {\n target.startActiveSpan(name, options, cb);\n } else {\n target.startActiveSpan(name, cb);\n }\n });\n };\n }\n\n default: {\n const value = target[prop as keyof Tracer];\n return typeof value === \"function\" ? value.bind(target) : value;\n }\n }\n },\n };\n\n return new Proxy(tracer, handler) as LangWatchTracer;\n}\n\n/**\n * Helper type for the function overloads of startActiveSpan.\n *\n * This matches OpenTelemetry's Tracer interface and is used internally for type safety.\n */\ntype StartActiveSpanOverloads = {\n <F extends (span: Span) => unknown>(name: string, fn: F): ReturnType<F>;\n <F extends (span: Span) => unknown>(\n name: string,\n options: SpanOptions,\n fn: F,\n ): ReturnType<F>;\n <F extends (span: Span) => unknown>(\n name: string,\n options: SpanOptions,\n context: Context,\n fn: F,\n ): ReturnType<F>;\n};\n","import {\n Attributes,\n AttributeValue,\n Span,\n SpanContext,\n SpanStatus,\n Link,\n Exception\n} from \"@opentelemetry/api\";\nimport semconv from \"@opentelemetry/semantic-conventions/incubating\";\nimport * as intSemconv from \"./semconv\";\nimport {\n RecordedEvaluationDetails,\n recordEvaluation,\n} from \"../evaluation/record-evaluation\";\nimport { EvaluationResultModel } from \"../evaluation/types\";\nimport { Prompt } from \"../prompt/prompt\";\n\n/**\n * Supported types of spans for LangWatch observability. These types categorize the nature of the span for downstream analysis and visualization.\n *\n * @example\n * import { spanTypes, SpanType } from './span';\n * const myType: SpanType = 'llm';\n */\nexport const spanTypes = [\n \"span\",\n \"llm\",\n \"chain\",\n \"tool\",\n \"agent\",\n \"guardrail\",\n \"evaluation\",\n \"rag\",\n \"prompt\",\n \"workflow\",\n \"component\",\n \"module\",\n \"server\",\n \"client\",\n \"producer\",\n \"consumer\",\n \"task\",\n \"unknown\",\n] as const;\n\nexport type SpanType = (typeof spanTypes)[number];\n\n/**\n * Context for a RAG (Retrieval-Augmented Generation) span.\n *\n * This structure is used to record which document and chunk were retrieved and used as context for a generation.\n *\n * @property document_id - Unique identifier for the source document.\n * @property chunk_id - Unique identifier for the chunk within the document.\n * @property content - The actual content of the chunk provided to the model.\n *\n * @example\n * const ragContext: LangWatchSpanRAGContext = {\n * document_id: 'doc-123',\n * chunk_id: 'chunk-456',\n * content: 'Relevant passage from the document.'\n * };\n */\nexport interface LangWatchSpanRAGContext {\n document_id: string;\n chunk_id: string;\n content: string;\n}\n\n/**\n * Metrics for a LangWatch span.\n *\n * @property promptTokens - The number of prompt tokens used.\n * @property completionTokens - The number of completion tokens used.\n * @property cost - The cost of the span.\n */\nexport interface LangWatchSpanMetrics {\n /** The number of prompt tokens used */\n promptTokens?: number;\n /** The number of completion tokens used */\n completionTokens?: number;\n /** The cost of the span */\n cost?: number;\n}\n\n/**\n * Body for a system message event in a GenAI span.\n *\n * Used to log system/instruction messages sent to the model.\n *\n * @property content - The message content.\n * @property role - The role of the message, typically 'system' or 'instruction'.\n *\n * @example\n * span.addGenAISystemMessageEvent({ content: 'You are a helpful assistant.' });\n */\nexport interface LangWatchSpanGenAISystemMessageEventBody {\n /** Content of the system message */\n content?: string;\n /** Role of the message (system or instruction) */\n role?: \"system\" | \"instruction\";\n}\n\n/**\n * Body for a user message event in a GenAI span.\n *\n * Used to log user/customer messages sent to the model.\n *\n * @property content - The message content.\n * @property role - The role of the message, typically 'user' or 'customer'.\n *\n * @example\n * span.addGenAIUserMessageEvent({ content: 'What is the weather today?' });\n */\nexport interface LangWatchSpanGenAIUserMessageEventBody {\n /** Content of the user message */\n content?: string;\n /** Role of the message (user or customer) */\n role?: \"user\" | \"customer\";\n}\n\n/**\n * Body for an assistant message event in a GenAI span.\n *\n * Used to log assistant/bot responses, including tool calls.\n *\n * @property content - The message content.\n * @property role - The role of the message, typically 'assistant' or 'bot'.\n * @property tool_calls - Array of tool call objects, if the assistant invoked tools/functions.\n *\n * @example\n * span.addGenAIAssistantMessageEvent({ content: 'The weather is sunny.', role: 'assistant' });\n */\nexport interface LangWatchSpanGenAIAssistantMessageEventBody {\n /** Content of the assistant message */\n content?: string;\n /** Role of the message (assistant or bot) */\n role?: \"assistant\" | \"bot\";\n /** Tool calls made by the assistant */\n tool_calls?: {\n function: {\n /** Name of the function called */\n name: string;\n /** Arguments passed to the function */\n arguments?: string;\n };\n /** Tool call identifier */\n id: string;\n /** Type of tool call */\n type: \"function\";\n }[];\n}\n\n/**\n * Body for a tool message event in a GenAI span.\n *\n * Used to log messages from tools/functions invoked by the assistant.\n *\n * @property content - The message content.\n * @property id - Unique identifier for the tool call.\n * @property role - The role, typically 'tool' or 'function'.\n *\n * @example\n * span.addGenAIToolMessageEvent({ content: 'Result from tool', id: 'tool-1', role: 'tool' });\n */\nexport interface LangWatchSpanGenAIToolMessageEventBody {\n /** Content of the tool message */\n content?: string;\n /** Tool call identifier */\n id: string;\n /** Role of the message (tool or function) */\n role?: \"tool\" | \"function\";\n}\n\n/**\n * Body for a choice event in a GenAI span.\n *\n * Used to log the model's output choices, including finish reason and message content.\n *\n * @property finish_reason - Why the generation finished (e.g., 'stop', 'length').\n * @property index - Index of the choice (for multi-choice outputs).\n * @property message - The message content and tool calls for this choice.\n *\n * @example\n * span.addGenAIChoiceEvent({ finish_reason: 'stop', index: 0, message: { content: 'Hello!' } });\n */\nexport interface LangWatchSpanGenAIChoiceEventBody {\n /** Reason the generation finished */\n finish_reason: intSemconv.VAL_GEN_AI_FINISH_REASONS | (string & {});\n /** Index of the choice */\n index: number;\n /** Message content for the choice */\n message?: {\n /** Content of the message */\n content?: string;\n /** Role of the message (assistant or bot) */\n role?: \"assistant\" | \"bot\";\n /** Tool calls made by the assistant */\n tool_calls?: {\n function: {\n /** Name of the function called */\n name: string;\n /** Arguments passed to the function */\n arguments?: string;\n };\n /** Tool call identifier */\n id: string;\n /** Type of tool call */\n type: \"function\";\n }[];\n };\n}\n\n/**\n * Extension of OpenTelemetry's Span with LangWatch-specific helpers for LLM, RAG, and GenAI tracing.\n *\n * This interface provides ergonomic methods for recording structured LLM/GenAI data, such as inputs, outputs, RAG contexts, and message events.\n *\n * All methods return `this` for chaining.\n *\n * @example\n * const span = createLangWatchSpan(otelSpan);\n * span\n * .setType('llm')\n * .setInput({ prompt: 'Hello' })\n * .setOutput('Hi!')\n * .addGenAIUserMessageEvent({ content: 'Hello' })\n * .addGenAIAssistantMessageEvent({ content: 'Hi!' });\n */\nexport interface LangWatchSpan extends Span {\n /**\n * Record the evaluation result for the span.\n *\n * @param details - The evaluation details\n * @param attributes - Additional attributes to add to the evaluation span.\n * @returns this\n */\n recordEvaluation(\n details: RecordedEvaluationDetails,\n attributes?: Attributes,\n ): this;\n\n /**\n * Add a GenAI system message event to the span.\n *\n * This logs a system/instruction message sent to the model.\n *\n * @param body - The event body (content and role)\n * @param system - The GenAI system (optional, e.g., 'openai', 'anthropic')\n * @param attributes - Additional OpenTelemetry attributes (optional)\n * @returns this\n */\n addGenAISystemMessageEvent(\n body: LangWatchSpanGenAISystemMessageEventBody,\n system?: intSemconv.VAL_GEN_AI_SYSTEMS | (string & {}),\n attributes?: Record<string, AttributeValue>,\n ): this;\n /**\n * Add a GenAI user message event to the span.\n *\n * This logs a user/customer message sent to the model.\n *\n * @param body - The event body (content and role)\n * @param system - The GenAI system (optional)\n * @param attributes - Additional OpenTelemetry attributes (optional)\n * @returns this\n */\n addGenAIUserMessageEvent(\n body: LangWatchSpanGenAIUserMessageEventBody,\n system?: intSemconv.VAL_GEN_AI_SYSTEMS | (string & {}),\n attributes?: Record<string, AttributeValue>,\n ): this;\n /**\n * Add a GenAI assistant message event to the span.\n *\n * This logs an assistant/bot response, including tool calls if present.\n *\n * @param body - The event body (content, role, tool_calls)\n * @param system - The GenAI system (optional)\n * @param attributes - Additional OpenTelemetry attributes (optional)\n * @returns this\n */\n addGenAIAssistantMessageEvent(\n body: LangWatchSpanGenAIAssistantMessageEventBody,\n system?: intSemconv.VAL_GEN_AI_SYSTEMS | (string & {}),\n attributes?: Record<string, AttributeValue>,\n ): this;\n /**\n * Add a GenAI tool message event to the span.\n *\n * This logs a message from a tool/function invoked by the assistant.\n *\n * @param body - The event body (content, id, role)\n * @param system - The GenAI system (optional)\n * @param attributes - Additional OpenTelemetry attributes (optional)\n * @returns this\n */\n addGenAIToolMessageEvent(\n body: LangWatchSpanGenAIToolMessageEventBody,\n system?: intSemconv.VAL_GEN_AI_SYSTEMS | (string & {}),\n attributes?: Record<string, AttributeValue>,\n ): this;\n /**\n * Add a GenAI choice event to the span.\n *\n * This logs a model output choice, including finish reason and message content.\n *\n * @param body - The event body (finish_reason, index, message)\n * @param system - The GenAI system (optional)\n * @param attributes - Additional OpenTelemetry attributes (optional)\n * @returns this\n */\n addGenAIChoiceEvent(\n body: LangWatchSpanGenAIChoiceEventBody,\n system?: intSemconv.VAL_GEN_AI_SYSTEMS | (string & {}),\n attributes?: Record<string, AttributeValue>,\n ): this;\n\n /**\n * Set the type of the span (e.g., 'llm', 'rag', 'tool', etc).\n *\n * This is used for downstream filtering and analytics.\n *\n * @param type - The span type (see SpanType)\n * @returns this\n */\n setType(type: SpanType): this;\n\n /**\n * Set the request model name for the span.\n *\n * This is typically the model name sent in the API request (e.g., 'gpt-4', 'claude-3').\n *\n * @param model - The request model name\n * @returns this\n */\n setRequestModel(model: string): this;\n /**\n * Set the response model name for the span.\n *\n * This is the model name returned in the API response, if different from the request.\n *\n * @param model - The response model name\n * @returns this\n */\n setResponseModel(model: string): this;\n\n /**\n * Set multiple RAG contexts for the span.\n *\n * Use this to record all retrieved documents/chunks used as context for a generation.\n *\n * @param ragContexts - Array of RAG context objects\n * @returns this\n */\n setRAGContexts(ragContexts: LangWatchSpanRAGContext[]): this;\n /**\n * Set a single RAG context for the span.\n *\n * Use this if only one context was retrieved.\n *\n * @param ragContext - The RAG context object\n * @returns this\n */\n setRAGContext(ragContext: LangWatchSpanRAGContext): this;\n\n /**\n * Set the metrics for the span.\n *\n * @param metrics - The metrics object\n * @returns this\n */\n setMetrics(metrics: LangWatchSpanMetrics): this;\n\n /**\n * Set the selected prompt for the span. This will attach this prompt to the trace. If\n * this is set on multiple spans, the last one will be used.\n *\n * @param prompt - The prompt object\n * @returns this\n */\n setSelectedPrompt(prompt: Prompt): this;\n\n /**\n * Record the input to the span as a JSON-serializable value.\n *\n * The input is stringified and stored as a span attribute for later analysis.\n *\n * @param input - The input value (any type, will be JSON.stringified)\n * @returns this\n */\n setInput(input: unknown): this;\n /**\n * Record the input to the span as a plain string.\n *\n * Use this for raw text prompts or queries.\n *\n * @param input - The input string\n * @returns this\n */\n setInputString(input: string): this;\n /**\n * Record the output from the span as a JSON-serializable value.\n *\n * The output is stringified and stored as a span attribute for later analysis.\n *\n * @param output - The output value (any type, will be JSON.stringified)\n * @returns this\n */\n setOutput(output: unknown): this;\n /**\n * Record the output from the span as a plain string.\n *\n * Use this for raw text completions or responses.\n *\n * @param output - The output string\n * @returns this\n */\n setOutputString(output: string): this;\n\n /**\n * Set the evaluation output for the span.\n *\n * @param guardrail - Whether the evaluation is a guardrail\n * @param output - The evaluation result\n * @returns this\n */\n setOutputEvaluation(guardrail: boolean, output: EvaluationResultModel): this;\n}\n\n/**\n * LangWatchSpan class that wraps an OpenTelemetry Span with LangWatch-specific helpers.\n *\n * This class provides a clean, type-safe wrapper around OpenTelemetry spans with\n * additional methods for LLM, RAG, and GenAI tracing. All methods support fluent API chaining.\n *\n * @example\n * import { createLangWatchSpan } from './span';\n * const otelSpan = tracer.startSpan('llm-call');\n * const span = createLangWatchSpan(otelSpan);\n * span.setType('llm').setInput('Prompt').setOutput('Completion');\n */\nclass LangWatchSpanImpl implements LangWatchSpan {\n constructor(private span: Span) {}\n\n // OpenTelemetry Span methods with fluent API support\n setAttribute(key: string, value: AttributeValue): this {\n this.span.setAttribute(key, value);\n return this;\n }\n\n setAttributes(attributes: Attributes): this {\n this.span.setAttributes(attributes);\n return this;\n }\n\n addEvent(name: string, attributes?: Attributes): this {\n this.span.addEvent(name, attributes);\n return this;\n }\n\n recordException(exception: Exception): this {\n this.span.recordException(exception);\n return this;\n }\n\n setStatus(status: SpanStatus): this {\n this.span.setStatus(status);\n return this;\n }\n\n updateName(name: string): this {\n this.span.updateName(name);\n return this;\n }\n\n // Pass through other Span methods without chaining\n end(endTime?: number): void {\n this.span.end(endTime);\n }\n\n isRecording(): boolean {\n return this.span.isRecording();\n }\n\n spanContext(): SpanContext {\n return this.span.spanContext();\n }\n\n addLink(link: Link): this {\n this.span.addLink(link);\n return this;\n }\n\n addLinks(links: Link[]): this {\n this.span.addLinks(links);\n return this;\n }\n\n // LangWatch-specific methods\n recordEvaluation(\n details: RecordedEvaluationDetails,\n attributes?: Attributes,\n ): this {\n recordEvaluation(details, attributes);\n return this;\n }\n\n addGenAISystemMessageEvent(\n body: LangWatchSpanGenAISystemMessageEventBody,\n system?: intSemconv.VAL_GEN_AI_SYSTEMS | (string & {}),\n attributes?: Record<string, AttributeValue>,\n ): this {\n if (body.role === void 0) {\n body.role = \"system\";\n }\n\n this.span.addEvent(intSemconv.LOG_EVNT_GEN_AI_SYSTEM_MESSAGE, {\n ...attributes,\n [semconv.ATTR_GEN_AI_SYSTEM]: system,\n [intSemconv.ATTR_LANGWATCH_GEN_AI_LOG_EVENT_BODY]: JSON.stringify(body),\n [intSemconv.ATTR_LANGWATCH_GEN_AI_LOG_EVENT_IMPOSTER]: true,\n });\n return this;\n }\n\n addGenAIUserMessageEvent(\n body: LangWatchSpanGenAIUserMessageEventBody,\n system?: intSemconv.VAL_GEN_AI_SYSTEMS | (string & {}),\n attributes?: Record<string, AttributeValue>,\n ): this {\n if (body.role === void 0) {\n body.role = \"user\";\n }\n\n this.span.addEvent(intSemconv.LOG_EVNT_GEN_AI_USER_MESSAGE, {\n ...attributes,\n [semconv.ATTR_GEN_AI_SYSTEM]: system,\n [intSemconv.ATTR_LANGWATCH_GEN_AI_LOG_EVENT_BODY]: JSON.stringify(body),\n [intSemconv.ATTR_LANGWATCH_GEN_AI_LOG_EVENT_IMPOSTER]: true,\n });\n return this;\n }\n\n addGenAIAssistantMessageEvent(\n body: LangWatchSpanGenAIAssistantMessageEventBody,\n system?: intSemconv.VAL_GEN_AI_SYSTEMS | (string & {}),\n attributes?: Record<string, AttributeValue>,\n ): this {\n if (body.role === void 0) {\n body.role = \"assistant\";\n }\n\n this.span.addEvent(intSemconv.LOG_EVNT_GEN_AI_ASSISTANT_MESSAGE, {\n ...attributes,\n [semconv.ATTR_GEN_AI_SYSTEM]: system,\n [intSemconv.ATTR_LANGWATCH_GEN_AI_LOG_EVENT_BODY]: JSON.stringify(body),\n [intSemconv.ATTR_LANGWATCH_GEN_AI_LOG_EVENT_IMPOSTER]: true,\n });\n return this;\n }\n\n addGenAIToolMessageEvent(\n body: LangWatchSpanGenAIToolMessageEventBody,\n system?: intSemconv.VAL_GEN_AI_SYSTEMS | (string & {}),\n attributes?: Record<string, AttributeValue>,\n ): this {\n if (body.role === void 0) {\n body.role = \"tool\";\n }\n\n this.span.addEvent(intSemconv.LOG_EVNT_GEN_AI_TOOL_MESSAGE, {\n ...attributes,\n [semconv.ATTR_GEN_AI_SYSTEM]: system,\n [intSemconv.ATTR_LANGWATCH_GEN_AI_LOG_EVENT_BODY]: JSON.stringify(body),\n [intSemconv.ATTR_LANGWATCH_GEN_AI_LOG_EVENT_IMPOSTER]: true,\n });\n return this;\n }\n\n addGenAIChoiceEvent(\n body: LangWatchSpanGenAIChoiceEventBody,\n system?: intSemconv.VAL_GEN_AI_SYSTEMS | (string & {}),\n attributes?: Record<string, AttributeValue>,\n ): this {\n if (body.message && body.message.role === void 0) {\n body.message.role = \"assistant\";\n }\n\n this.span.addEvent(intSemconv.LOG_EVNT_GEN_AI_CHOICE, {\n ...attributes,\n [semconv.ATTR_GEN_AI_SYSTEM]: system,\n [intSemconv.ATTR_LANGWATCH_GEN_AI_LOG_EVENT_BODY]: JSON.stringify(body),\n [intSemconv.ATTR_LANGWATCH_GEN_AI_LOG_EVENT_IMPOSTER]: true,\n });\n return this;\n }\n\n setType(type: SpanType): this {\n this.span.setAttribute(intSemconv.ATTR_LANGWATCH_SPAN_TYPE, type);\n return this;\n }\n\n setRequestModel(model: string): this {\n this.span.setAttribute(semconv.ATTR_GEN_AI_REQUEST_MODEL, model);\n return this;\n }\n\n setResponseModel(model: string): this {\n this.span.setAttribute(semconv.ATTR_GEN_AI_RESPONSE_MODEL, model);\n return this;\n }\n\n setRAGContexts(ragContexts: LangWatchSpanRAGContext[]): this {\n this.span.setAttribute(\n intSemconv.ATTR_LANGWATCH_RAG_CONTEXTS,\n JSON.stringify({\n type: \"json\",\n value: ragContexts,\n }),\n );\n return this;\n }\n\n setRAGContext(ragContext: LangWatchSpanRAGContext): this {\n this.span.setAttribute(\n intSemconv.ATTR_LANGWATCH_RAG_CONTEXTS,\n JSON.stringify({\n type: \"json\",\n value: [ragContext],\n }),\n );\n return this;\n }\n\n setMetrics(metrics: LangWatchSpanMetrics): this {\n this.span.setAttribute(\n intSemconv.ATTR_LANGWATCH_METRICS,\n JSON.stringify({\n type: \"json\",\n value: metrics,\n }),\n );\n return this;\n }\n\n setSelectedPrompt(prompt: Prompt): this {\n this.span.setAttributes({\n [intSemconv.ATTR_LANGWATCH_PROMPT_SELECTED_ID]: prompt.id,\n [intSemconv.ATTR_LANGWATCH_PROMPT_ID]: prompt.id,\n [intSemconv.ATTR_LANGWATCH_PROMPT_VERSION_ID]: prompt.versionId,\n [intSemconv.ATTR_LANGWATCH_PROMPT_VERSION_NUMBER]: prompt.version,\n });\n return this;\n }\n\n setInput(input: unknown): this {\n this.span.setAttribute(\n intSemconv.ATTR_LANGWATCH_INPUT,\n JSON.stringify({\n type: \"json\",\n value: input,\n }),\n );\n return this;\n }\n\n setInputString(input: string): this {\n this.span.setAttribute(\n intSemconv.ATTR_LANGWATCH_INPUT,\n JSON.stringify({\n type: \"text\",\n value: input,\n }),\n );\n return this;\n }\n\n setOutput(output: unknown): this {\n this.span.setAttribute(\n intSemconv.ATTR_LANGWATCH_OUTPUT,\n JSON.stringify({\n type: \"json\",\n value: output,\n }),\n );\n return this;\n }\n\n setOutputString(output: string): this {\n this.span.setAttribute(\n intSemconv.ATTR_LANGWATCH_OUTPUT,\n JSON.stringify({\n type: \"text\",\n value: output,\n }),\n );\n return this;\n }\n\n setOutputEvaluation(guardrail: boolean, output: EvaluationResultModel): this {\n this.span.setAttribute(\n intSemconv.ATTR_LANGWATCH_OUTPUT,\n JSON.stringify({\n type: guardrail ? \"guardrail_result\" : \"evaluation_result\",\n value: output,\n }),\n );\n return this;\n }\n}\n\n/**\n * Creates a LangWatchSpan wrapper around an OpenTelemetry Span.\n *\n * @param span - The OpenTelemetry Span to wrap\n * @returns A LangWatchSpan with additional methods for LLM/GenAI observability\n *\n * @example\n * import { createLangWatchSpan } from './span';\n * const otelSpan = tracer.startSpan('llm-call');\n * const span = createLangWatchSpan(otelSpan);\n * span.setType('llm').setInput('Prompt').setOutput('Completion');\n */\nexport function createLangWatchSpan(span: Span): LangWatchSpan {\n return new LangWatchSpanImpl(span);\n}\n","import { EvaluationRESTResult } from \"../internal/generated/types/evaluations\";\nimport * as intSemconv from \"../observability/semconv\";\nimport { Attributes, SpanStatusCode } from \"@opentelemetry/api\";\nimport { generate } from \"xksuid\";\nimport { tracer } from \"./tracer\";\n\nexport interface RecordedEvaluationDetails {\n evaluationId?: string;\n name: string;\n type?: string;\n isGuardrail?: boolean;\n status?: \"processed\" | \"skipped\" | \"error\";\n passed?: boolean;\n score?: number;\n label?: string;\n details?: string;\n cost?: number | { currency: string; amount: number };\n error?: Error;\n timestamps?: {\n startedAtUnixMs: number;\n finishedAtUnixMs: number;\n };\n}\n\nexport function recordEvaluation(\n details: RecordedEvaluationDetails,\n attributes?: Attributes,\n) {\n let result: EvaluationRESTResult;\n const status = details.status || \"processed\";\n\n if (status === \"skipped\") {\n result = {\n status: \"skipped\",\n details: details.details,\n };\n } else if (status === \"error\") {\n result = {\n status: \"error\",\n error_type: details.error?.name || \"Unknown\",\n details: details.details || details.error?.message || \"Unknown error\",\n };\n } else {\n result = {\n status: \"processed\",\n passed: details.passed,\n score: details.score,\n label: details.label,\n details: details.details,\n };\n if (details.cost) {\n (result as any).cost =\n typeof details.cost === \"number\"\n ? { currency: \"USD\", amount: details.cost }\n : details.cost;\n }\n }\n\n tracer.startActiveSpan(\"record evaluation\", (span) => {\n try {\n span.setType(details.isGuardrail ? \"guardrail\" : \"evaluation\");\n span.addEvent(intSemconv.ATTR_LANGWATCH_EVALUATION_CUSTOM, {\n json_encoded_event: JSON.stringify({\n evaluation_id: details.evaluationId ?? `eval_${generate()}`,\n name: details.name,\n type: details.type,\n is_guardrail: details.isGuardrail,\n status: result.status,\n passed: details.passed,\n score: details.score,\n label: details.label,\n details: details.details,\n cost: details.cost,\n error: details.error,\n timestamps: details.timestamps,\n }),\n });\n\n span.setOutput(result);\n\n if (attributes) {\n span.setAttributes(attributes);\n }\n if (details.cost) {\n span.setMetrics({\n cost:\n typeof details.cost === \"number\"\n ? details.cost\n : details.cost.amount,\n });\n }\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({ code: SpanStatusCode.ERROR, message: (error as Error)?.message });\n } finally {\n span.end();\n }\n\n return;\n });\n}\n","import { getLangWatchTracer } from \"../observability/trace\";\n\nexport const tracer = getLangWatchTracer(\"langwatch.evaluation\");\n"],"mappings":"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","names":["SpanStatusCode","_a","tracer","name","SpanStatusCode"]}
@@ -5,7 +5,7 @@
5
5
  var _chunkPCQVQ7SBjs = require('./chunk-PCQVQ7SB.js');
6
6
 
7
7
 
8
- var _chunkSVJ7SCGBjs = require('./chunk-SVJ7SCGB.js');
8
+ var _chunk52GXX3MAjs = require('./chunk-52GXX3MA.js');
9
9
 
10
10
  // src/internal/api/errors.ts
11
11
  var LangWatchApiError = class extends Error {
@@ -35,7 +35,7 @@ var LangWatchApiError = class extends Error {
35
35
  // src/evaluation/run-evaluation.ts
36
36
  var _api = require('@opentelemetry/api');
37
37
  async function runEvaluation(details) {
38
- return await _chunkSVJ7SCGBjs.tracer.startActiveSpan("run evaluation", async (span) => {
38
+ return await _chunk52GXX3MAjs.tracer.startActiveSpan("run evaluation", async (span) => {
39
39
  var _a, _b;
40
40
  span.setType(details.asGuardrail ? "guardrail" : "evaluation");
41
41
  try {
@@ -115,4 +115,4 @@ async function runEvaluation(details) {
115
115
 
116
116
 
117
117
  exports.runEvaluation = runEvaluation;
118
- //# sourceMappingURL=chunk-HPC6Z7J4.js.map
118
+ //# sourceMappingURL=chunk-PWZBLTHR.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/langwatch/langwatch/typescript-sdk/dist/chunk-HPC6Z7J4.js","../src/internal/api/errors.ts","../src/evaluation/run-evaluation.ts"],"names":[],"mappings":"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","file":"/home/runner/work/langwatch/langwatch/typescript-sdk/dist/chunk-HPC6Z7J4.js","sourcesContent":[null,"export class LangWatchApiError extends Error {\n public readonly httpStatus: number;\n public readonly httpStatusText: string;\n public apiError: string | undefined;\n public body: unknown;\n\n constructor(message: string, response: Response) {\n super(message);\n this.httpStatus = response.status;\n this.httpStatusText = response.statusText;\n }\n\n async safeParseBody(response: Response): Promise<void> {\n try {\n if (response.headers.get(\"Content-Type\")?.includes(\"application/json\")) {\n const json = await response.json();\n\n this.body = json;\n\n if (json.error && typeof json.error === \"string\") {\n this.apiError = json.error;\n }\n\n return;\n }\n\n this.body = await response.text();\n } catch {\n this.body = null;\n }\n }\n}\n","import { LangWatchApiError } from \"../internal/api/errors\";\nimport { canAutomaticallyCaptureInput, getApiKey, getEndpoint } from \"../client\";\nimport { Conversation } from \"../internal/generated/types/evaluations\";\nimport {\n Evaluators,\n EvaluatorTypes,\n SingleEvaluationResult,\n} from \"../internal/generated/types/evaluators.generated\";\nimport { RAGChunk } from \"../internal/generated/types/tracer\";\nimport { tracer } from \"./tracer\";\nimport { EvaluationResultModel } from \"./types\";\nimport { SpanStatusCode } from \"@opentelemetry/api\";\n\nexport interface BasicEvaluationData {\n input?: string;\n output?: string;\n expected_output?: unknown;\n contexts?: RAGChunk[] | string[];\n expected_contexts?: RAGChunk[] | string[];\n conversation?: Conversation;\n}\n\nexport interface EvaluationDetailsBase {\n name?: string;\n data: BasicEvaluationData | Record<string, unknown>;\n contexts?: RAGChunk[] | string[];\n conversation?: Conversation;\n asGuardrail?: boolean;\n}\n\nexport interface SavedEvaluationDetails extends EvaluationDetailsBase {\n slug: string;\n settings?: Record<string, unknown>;\n}\n\nexport interface LangEvalsEvaluationDetails<T extends EvaluatorTypes>\n extends EvaluationDetailsBase {\n evaluator: T;\n settings?: Evaluators[T][\"settings\"];\n}\n\nexport type EvaluationDetails =\n | SavedEvaluationDetails\n | LangEvalsEvaluationDetails<EvaluatorTypes>;\n\nexport async function runEvaluation(\n details: EvaluationDetails,\n): Promise<SingleEvaluationResult> {\n return await tracer.startActiveSpan(\"run evaluation\", async (span) => {\n span.setType(details.asGuardrail ? \"guardrail\" : \"evaluation\");\n\n try {\n const evaluatorId =\n \"slug\" in details ? details.slug : details.evaluator;\n const request = {\n trace_id: span.spanContext().traceId,\n span_id: span.spanContext().spanId,\n data: details.data,\n name: details.name,\n settings: details.settings,\n as_guardrail: details.asGuardrail,\n };\n\n if (canAutomaticallyCaptureInput()) {\n span.setInput(request);\n }\n\n const url = new URL(\n `/api/evaluations/${evaluatorId}/evaluate`,\n getEndpoint(),\n );\n\n const response = await fetch(url.toString(), {\n method: \"POST\",\n headers: {\n \"X-Auth-Token\": getApiKey(),\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(request),\n });\n if (!response.ok) {\n const err = new LangWatchApiError(\"Unable to run evaluation\", response);\n await err.safeParseBody(response);\n\n throw err;\n }\n\n const result: EvaluationResultModel = await response.json();\n\n span.setMetrics({\n cost: result.cost?.amount,\n });\n\n span.setOutputEvaluation(details.asGuardrail ?? false, result);\n\n if (result.status === \"processed\") {\n return {\n status: \"processed\",\n passed: result.passed,\n score: result.score,\n details: result.details,\n label: result.label,\n cost: result.cost,\n } as SingleEvaluationResult;\n } else if (result.status === \"skipped\") {\n return {\n status: \"skipped\",\n details: result.details,\n } as SingleEvaluationResult;\n } else if (result.status === \"error\") {\n return {\n status: \"error\",\n error_type: (result as any).error_type || \"Unknown\",\n details: result.details || \"Unknown error\",\n traceback: (result as any).traceback || [],\n } as SingleEvaluationResult;\n } else {\n return {\n status: \"error\",\n error_type: \"UnknownStatus\",\n details: `Unknown evaluation status: ${result.status}`,\n traceback: [],\n } as SingleEvaluationResult;\n }\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({ code: SpanStatusCode.ERROR, message: (error as Error)?.message });\n throw error;\n } finally {\n span.end();\n }\n });\n}\n"]}
1
+ {"version":3,"sources":["/home/runner/work/langwatch/langwatch/typescript-sdk/dist/chunk-PWZBLTHR.js","../src/internal/api/errors.ts","../src/evaluation/run-evaluation.ts"],"names":[],"mappings":"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","file":"/home/runner/work/langwatch/langwatch/typescript-sdk/dist/chunk-PWZBLTHR.js","sourcesContent":[null,"export class LangWatchApiError extends Error {\n public readonly httpStatus: number;\n public readonly httpStatusText: string;\n public apiError: string | undefined;\n public body: unknown;\n\n constructor(message: string, response: Response) {\n super(message);\n this.httpStatus = response.status;\n this.httpStatusText = response.statusText;\n }\n\n async safeParseBody(response: Response): Promise<void> {\n try {\n if (response.headers.get(\"Content-Type\")?.includes(\"application/json\")) {\n const json = await response.json();\n\n this.body = json;\n\n if (json.error && typeof json.error === \"string\") {\n this.apiError = json.error;\n }\n\n return;\n }\n\n this.body = await response.text();\n } catch {\n this.body = null;\n }\n }\n}\n","import { LangWatchApiError } from \"../internal/api/errors\";\nimport { canAutomaticallyCaptureInput, getApiKey, getEndpoint } from \"../client\";\nimport { Conversation } from \"../internal/generated/types/evaluations\";\nimport {\n Evaluators,\n EvaluatorTypes,\n SingleEvaluationResult,\n} from \"../internal/generated/types/evaluators.generated\";\nimport { RAGChunk } from \"../internal/generated/types/tracer\";\nimport { tracer } from \"./tracer\";\nimport { EvaluationResultModel } from \"./types\";\nimport { SpanStatusCode } from \"@opentelemetry/api\";\n\nexport interface BasicEvaluationData {\n input?: string;\n output?: string;\n expected_output?: unknown;\n contexts?: RAGChunk[] | string[];\n expected_contexts?: RAGChunk[] | string[];\n conversation?: Conversation;\n}\n\nexport interface EvaluationDetailsBase {\n name?: string;\n data: BasicEvaluationData | Record<string, unknown>;\n contexts?: RAGChunk[] | string[];\n conversation?: Conversation;\n asGuardrail?: boolean;\n}\n\nexport interface SavedEvaluationDetails extends EvaluationDetailsBase {\n slug: string;\n settings?: Record<string, unknown>;\n}\n\nexport interface LangEvalsEvaluationDetails<T extends EvaluatorTypes>\n extends EvaluationDetailsBase {\n evaluator: T;\n settings?: Evaluators[T][\"settings\"];\n}\n\nexport type EvaluationDetails =\n | SavedEvaluationDetails\n | LangEvalsEvaluationDetails<EvaluatorTypes>;\n\nexport async function runEvaluation(\n details: EvaluationDetails,\n): Promise<SingleEvaluationResult> {\n return await tracer.startActiveSpan(\"run evaluation\", async (span) => {\n span.setType(details.asGuardrail ? \"guardrail\" : \"evaluation\");\n\n try {\n const evaluatorId =\n \"slug\" in details ? details.slug : details.evaluator;\n const request = {\n trace_id: span.spanContext().traceId,\n span_id: span.spanContext().spanId,\n data: details.data,\n name: details.name,\n settings: details.settings,\n as_guardrail: details.asGuardrail,\n };\n\n if (canAutomaticallyCaptureInput()) {\n span.setInput(request);\n }\n\n const url = new URL(\n `/api/evaluations/${evaluatorId}/evaluate`,\n getEndpoint(),\n );\n\n const response = await fetch(url.toString(), {\n method: \"POST\",\n headers: {\n \"X-Auth-Token\": getApiKey(),\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(request),\n });\n if (!response.ok) {\n const err = new LangWatchApiError(\"Unable to run evaluation\", response);\n await err.safeParseBody(response);\n\n throw err;\n }\n\n const result: EvaluationResultModel = await response.json();\n\n span.setMetrics({\n cost: result.cost?.amount,\n });\n\n span.setOutputEvaluation(details.asGuardrail ?? false, result);\n\n if (result.status === \"processed\") {\n return {\n status: \"processed\",\n passed: result.passed,\n score: result.score,\n details: result.details,\n label: result.label,\n cost: result.cost,\n } as SingleEvaluationResult;\n } else if (result.status === \"skipped\") {\n return {\n status: \"skipped\",\n details: result.details,\n } as SingleEvaluationResult;\n } else if (result.status === \"error\") {\n return {\n status: \"error\",\n error_type: (result as any).error_type || \"Unknown\",\n details: result.details || \"Unknown error\",\n traceback: (result as any).traceback || [],\n } as SingleEvaluationResult;\n } else {\n return {\n status: \"error\",\n error_type: \"UnknownStatus\",\n details: `Unknown evaluation status: ${result.status}`,\n traceback: [],\n } as SingleEvaluationResult;\n }\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({ code: SpanStatusCode.ERROR, message: (error as Error)?.message });\n throw error;\n } finally {\n span.end();\n }\n });\n}\n"]}
@@ -0,0 +1,100 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/prompt/converter.ts
2
+ var PromptConverter = class {
3
+ /**
4
+ * Converts a Prompt instance from the API service to the MaterializedPrompt format
5
+ * used for saving to the .materialized directory.
6
+ */
7
+ static fromApiToMaterialized(prompt) {
8
+ return {
9
+ id: prompt.id,
10
+ name: prompt.name,
11
+ version: prompt.version,
12
+ versionId: prompt.versionId,
13
+ model: prompt.model,
14
+ messages: prompt.messages,
15
+ prompt: prompt.prompt,
16
+ updatedAt: prompt.updatedAt,
17
+ versionCreatedAt: prompt.versionCreatedAt
18
+ };
19
+ }
20
+ /**
21
+ * Converts a MaterializedPrompt to the YAML content structure
22
+ * for saving to .prompt.yaml files.
23
+ */
24
+ static fromMaterializedToYaml(prompt) {
25
+ return {
26
+ model: prompt.model,
27
+ messages: prompt.messages
28
+ };
29
+ }
30
+ /**
31
+ * Converts a LocalPromptConfig (loaded from YAML) to the format
32
+ * expected by the API service for upserting.
33
+ */
34
+ static fromLocalToApiFormat(config) {
35
+ return {
36
+ model: config.model,
37
+ modelParameters: config.modelParameters,
38
+ messages: config.messages
39
+ };
40
+ }
41
+ /**
42
+ * Extracts the system prompt from messages array.
43
+ * Used when converting to API format that separates system prompt from messages.
44
+ */
45
+ static extractSystemPrompt(messages) {
46
+ var _a;
47
+ return ((_a = messages.find((m) => m.role === "system")) == null ? void 0 : _a.content) || "";
48
+ }
49
+ /**
50
+ * Filters out system messages from the messages array.
51
+ * Used when converting to API format that handles system prompt separately.
52
+ */
53
+ static filterNonSystemMessages(messages) {
54
+ return messages.filter((m) => m.role !== "system");
55
+ }
56
+ /**
57
+ * Converts version specification strings to actual version constraints.
58
+ * Handles npm-style version specs like "latest", "5", "^5", etc.
59
+ */
60
+ static parseVersionSpec(versionSpec) {
61
+ if (versionSpec === "latest") {
62
+ return { type: "latest", value: "latest" };
63
+ }
64
+ if (/^\d+$/.test(versionSpec)) {
65
+ return { type: "exact", value: versionSpec };
66
+ }
67
+ return { type: "tag", value: versionSpec };
68
+ }
69
+ /**
70
+ * Validates that a YAML config can be safely converted to API format.
71
+ * Returns validation errors if any, or null if valid.
72
+ */
73
+ static validateForApiConversion(config) {
74
+ var _a;
75
+ const errors = [];
76
+ if (!((_a = config.model) == null ? void 0 : _a.trim())) {
77
+ errors.push("Model is required and cannot be empty");
78
+ }
79
+ if (!config.messages || config.messages.length === 0) {
80
+ errors.push("At least one message is required");
81
+ }
82
+ if (config.messages) {
83
+ config.messages.forEach((message, index) => {
84
+ var _a2;
85
+ if (!["system", "user", "assistant"].includes(message.role)) {
86
+ errors.push(`Message ${index}: role must be 'system', 'user', or 'assistant'`);
87
+ }
88
+ if (!((_a2 = message.content) == null ? void 0 : _a2.trim())) {
89
+ errors.push(`Message ${index}: content cannot be empty`);
90
+ }
91
+ });
92
+ }
93
+ return errors;
94
+ }
95
+ };
96
+
97
+
98
+
99
+ exports.PromptConverter = PromptConverter;
100
+ //# sourceMappingURL=chunk-SMXXAVMB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/langwatch/langwatch/typescript-sdk/dist/chunk-SMXXAVMB.js","../src/prompt/converter.ts"],"names":["_a"],"mappings":"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","file":"/home/runner/work/langwatch/langwatch/typescript-sdk/dist/chunk-SMXXAVMB.js","sourcesContent":[null,"import type { Prompt } from \"./prompt\";\nimport type { LocalPromptConfig, MaterializedPrompt } from \"../cli/types\";\n\n/**\n * Converter utility for transforming between YAML prompt format and API service format.\n *\n * The YAML format follows the GitHub .prompt.yaml file format standard,\n * while the API format is our internal prompt service schema tied to the database.\n *\n * This separation allows us to maintain and evolve both formats independently\n * while keeping the conversion logic centralized and well-tested.\n */\nexport class PromptConverter {\n /**\n * Converts a Prompt instance from the API service to the MaterializedPrompt format\n * used for saving to the .materialized directory.\n */\n static fromApiToMaterialized(prompt: Prompt): MaterializedPrompt {\n return {\n id: prompt.id,\n name: prompt.name,\n version: prompt.version,\n versionId: prompt.versionId,\n model: prompt.model,\n messages: prompt.messages,\n prompt: prompt.prompt,\n updatedAt: prompt.updatedAt,\n versionCreatedAt: prompt.versionCreatedAt,\n };\n }\n\n /**\n * Converts a MaterializedPrompt to the YAML content structure\n * for saving to .prompt.yaml files.\n */\n static fromMaterializedToYaml(prompt: MaterializedPrompt): {\n model: string;\n messages: Array<{\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n }>;\n } {\n return {\n model: prompt.model,\n messages: prompt.messages,\n };\n }\n\n /**\n * Converts a LocalPromptConfig (loaded from YAML) to the format\n * expected by the API service for upserting.\n */\n static fromLocalToApiFormat(config: LocalPromptConfig): {\n model: string;\n modelParameters?: {\n temperature?: number;\n max_tokens?: number;\n };\n messages: Array<{\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n }>;\n } {\n return {\n model: config.model,\n modelParameters: config.modelParameters,\n messages: config.messages,\n };\n }\n\n /**\n * Extracts the system prompt from messages array.\n * Used when converting to API format that separates system prompt from messages.\n */\n static extractSystemPrompt(messages: Array<{ role: string; content: string }>): string {\n return messages.find(m => m.role === \"system\")?.content || \"\";\n }\n\n /**\n * Filters out system messages from the messages array.\n * Used when converting to API format that handles system prompt separately.\n */\n static filterNonSystemMessages(messages: Array<{ role: string; content: string }>) {\n return messages.filter(m => m.role !== \"system\");\n }\n\n /**\n * Converts version specification strings to actual version constraints.\n * Handles npm-style version specs like \"latest\", \"5\", \"^5\", etc.\n */\n static parseVersionSpec(versionSpec: string): {\n type: \"latest\" | \"exact\" | \"tag\";\n value: string;\n } {\n if (versionSpec === \"latest\") {\n return { type: \"latest\", value: \"latest\" };\n }\n\n // For now, treat everything else as tags until we implement proper semver\n if (/^\\d+$/.test(versionSpec)) {\n return { type: \"exact\", value: versionSpec };\n }\n\n // Handle prefixes like ^, ~, etc. as tags for now\n return { type: \"tag\", value: versionSpec };\n }\n\n /**\n * Validates that a YAML config can be safely converted to API format.\n * Returns validation errors if any, or null if valid.\n */\n static validateForApiConversion(config: LocalPromptConfig): string[] {\n const errors: string[] = [];\n\n if (!config.model?.trim()) {\n errors.push(\"Model is required and cannot be empty\");\n }\n\n if (!config.messages || config.messages.length === 0) {\n errors.push(\"At least one message is required\");\n }\n\n if (config.messages) {\n config.messages.forEach((message, index) => {\n if (![\"system\", \"user\", \"assistant\"].includes(message.role)) {\n errors.push(`Message ${index}: role must be 'system', 'user', or 'assistant'`);\n }\n if (!message.content?.trim()) {\n errors.push(`Message ${index}: content cannot be empty`);\n }\n });\n }\n\n return errors;\n }\n}"]}
@@ -5,7 +5,7 @@ import {
5
5
  } from "./chunk-QEWDG5QE.mjs";
6
6
  import {
7
7
  tracer
8
- } from "./chunk-PMBEK6YE.mjs";
8
+ } from "./chunk-J7ICRUU4.mjs";
9
9
 
10
10
  // src/internal/api/errors.ts
11
11
  var LangWatchApiError = class extends Error {
@@ -115,4 +115,4 @@ async function runEvaluation(details) {
115
115
  export {
116
116
  runEvaluation
117
117
  };
118
- //# sourceMappingURL=chunk-CSC3CMIT.mjs.map
118
+ //# sourceMappingURL=chunk-STV4ZVNA.mjs.map
@@ -0,0 +1,94 @@
1
+ import {
2
+ PromptService
3
+ } from "./chunk-GJSEBQXF.mjs";
4
+ import {
5
+ canAutomaticallyCaptureInput,
6
+ canAutomaticallyCaptureOutput
7
+ } from "./chunk-QEWDG5QE.mjs";
8
+ import {
9
+ getLangWatchTracer
10
+ } from "./chunk-J7ICRUU4.mjs";
11
+ import {
12
+ ATTR_LANGWATCH_PROMPT_ID,
13
+ ATTR_LANGWATCH_PROMPT_VARIABLES,
14
+ ATTR_LANGWATCH_PROMPT_VERSION_ID,
15
+ ATTR_LANGWATCH_PROMPT_VERSION_NUMBER
16
+ } from "./chunk-UU33HCCZ.mjs";
17
+
18
+ // src/prompt/tracer.ts
19
+ var tracer = getLangWatchTracer("langwatch.prompt");
20
+
21
+ // src/prompt/get-prompt.ts
22
+ async function getPrompt(id, variables) {
23
+ return tracer.withActiveSpan("retrieve prompt", async (span) => {
24
+ span.setType("prompt");
25
+ span.setAttribute(ATTR_LANGWATCH_PROMPT_ID, id);
26
+ const service = PromptService.getInstance();
27
+ const prompt = await service.get(id);
28
+ if (!prompt) {
29
+ throw new Error(`Prompt with ID "${id}" not found`);
30
+ }
31
+ if (canAutomaticallyCaptureOutput()) {
32
+ span.setOutput(prompt);
33
+ }
34
+ span.setAttributes({
35
+ [ATTR_LANGWATCH_PROMPT_ID]: id,
36
+ [ATTR_LANGWATCH_PROMPT_VERSION_ID]: prompt.versionId,
37
+ [ATTR_LANGWATCH_PROMPT_VERSION_NUMBER]: prompt.version
38
+ });
39
+ if (variables) {
40
+ if (canAutomaticallyCaptureInput()) {
41
+ span.setAttribute(
42
+ ATTR_LANGWATCH_PROMPT_VARIABLES,
43
+ JSON.stringify({
44
+ type: "json",
45
+ value: variables
46
+ })
47
+ );
48
+ }
49
+ return prompt.compile(variables);
50
+ }
51
+ return prompt;
52
+ });
53
+ }
54
+
55
+ // src/prompt/get-prompt-version.ts
56
+ async function getPromptVersion(id, versionId, variables) {
57
+ return tracer.withActiveSpan("retrieve prompt version", async (span) => {
58
+ span.setType("prompt");
59
+ span.setAttribute(ATTR_LANGWATCH_PROMPT_ID, id);
60
+ const service = PromptService.getInstance();
61
+ const prompt = await service.getVersions(id);
62
+ const promptVersion = prompt[versionId];
63
+ if (!promptVersion) {
64
+ throw new Error(`Prompt version ${versionId} not found for prompt ${id}`);
65
+ }
66
+ if (canAutomaticallyCaptureOutput()) {
67
+ span.setOutput(prompt);
68
+ }
69
+ span.setAttributes({
70
+ [ATTR_LANGWATCH_PROMPT_ID]: id,
71
+ [ATTR_LANGWATCH_PROMPT_VERSION_ID]: promptVersion.id,
72
+ [ATTR_LANGWATCH_PROMPT_VERSION_NUMBER]: promptVersion.version
73
+ });
74
+ if (variables) {
75
+ if (canAutomaticallyCaptureInput()) {
76
+ span.setAttribute(
77
+ ATTR_LANGWATCH_PROMPT_VARIABLES,
78
+ JSON.stringify({
79
+ type: "json",
80
+ value: variables
81
+ })
82
+ );
83
+ }
84
+ return promptVersion.compile(variables);
85
+ }
86
+ return promptVersion;
87
+ });
88
+ }
89
+
90
+ export {
91
+ getPrompt,
92
+ getPromptVersion
93
+ };
94
+ //# sourceMappingURL=chunk-T5AZMMVS.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/prompt/tracer.ts","../src/prompt/get-prompt.ts","../src/prompt/get-prompt-version.ts"],"sourcesContent":["import { getLangWatchTracer } from \"../observability/trace\";\n\nexport const tracer = getLangWatchTracer(\"langwatch.prompt\");\n","import { PromptService } from \"./service\";\nimport { CompiledPrompt, Prompt, TemplateVariables } from \"./prompt\";\nimport * as intSemconv from \"../observability/semconv\";\nimport { tracer } from \"./tracer\";\nimport { canAutomaticallyCaptureInput, canAutomaticallyCaptureOutput } from \"../client\";\n\nexport async function getPrompt(id: string, variables: TemplateVariables): Promise<CompiledPrompt>;\nexport async function getPrompt(id: string): Promise<Prompt>;\n\nexport async function getPrompt(id: string, variables?: TemplateVariables): Promise<Prompt | CompiledPrompt> {\n return tracer.withActiveSpan(\"retrieve prompt\", async (span) => {\n span.setType(\"prompt\");\n span.setAttribute(intSemconv.ATTR_LANGWATCH_PROMPT_ID, id);\n\n const service = PromptService.getInstance();\n const prompt = await service.get(id);\n\n if (!prompt) {\n throw new Error(`Prompt with ID \"${id}\" not found`);\n }\n\n if (canAutomaticallyCaptureOutput()) {\n span.setOutput(prompt);\n }\n\n span.setAttributes({\n [intSemconv.ATTR_LANGWATCH_PROMPT_ID]: id,\n [intSemconv.ATTR_LANGWATCH_PROMPT_VERSION_ID]: prompt.versionId,\n [intSemconv.ATTR_LANGWATCH_PROMPT_VERSION_NUMBER]: prompt.version,\n });\n\n if (variables) {\n if (canAutomaticallyCaptureInput()) {\n span.setAttribute(\n intSemconv.ATTR_LANGWATCH_PROMPT_VARIABLES,\n JSON.stringify({\n type: \"json\",\n value: variables,\n }),\n );\n }\n\n return prompt.compile(variables);\n }\n\n return prompt;\n });\n}\n","import { PromptService } from \"./service\";\nimport { CompiledPrompt, Prompt, TemplateVariables } from \"./prompt\";\nimport * as intSemconv from \"../observability/semconv\";\nimport { tracer } from \"./tracer\";\nimport { canAutomaticallyCaptureInput, canAutomaticallyCaptureOutput } from \"../client\";\n\nexport async function getPromptVersion(id: string, versionId: string, variables: TemplateVariables): Promise<CompiledPrompt>;\nexport async function getPromptVersion(id: string, versionId: string): Promise<Prompt>;\n\nexport async function getPromptVersion(id: string, versionId: string, variables?: TemplateVariables): Promise<Prompt | CompiledPrompt> {\n return tracer.withActiveSpan(\"retrieve prompt version\", async (span) => {\n span.setType(\"prompt\");\n span.setAttribute(intSemconv.ATTR_LANGWATCH_PROMPT_ID, id);\n\n const service = PromptService.getInstance();\n const prompt = await service.getVersions(id);\n const promptVersion = prompt[versionId];\n\n if (!promptVersion) {\n throw new Error(`Prompt version ${versionId} not found for prompt ${id}`);\n }\n\n if (canAutomaticallyCaptureOutput()) {\n span.setOutput(prompt);\n }\n\n span.setAttributes({\n [intSemconv.ATTR_LANGWATCH_PROMPT_ID]: id,\n [intSemconv.ATTR_LANGWATCH_PROMPT_VERSION_ID]: promptVersion.id,\n [intSemconv.ATTR_LANGWATCH_PROMPT_VERSION_NUMBER]: promptVersion.version,\n });\n\n if (variables) {\n if (canAutomaticallyCaptureInput()) {\n span.setAttribute(\n intSemconv.ATTR_LANGWATCH_PROMPT_VARIABLES,\n JSON.stringify({\n type: \"json\",\n value: variables,\n }),\n );\n }\n\n return promptVersion.compile(variables);\n }\n\n return promptVersion;\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAEO,IAAM,SAAS,mBAAmB,kBAAkB;;;ACO3D,eAAsB,UAAU,IAAY,WAAiE;AAC3G,SAAO,OAAO,eAAe,mBAAmB,OAAO,SAAS;AAC9D,SAAK,QAAQ,QAAQ;AACrB,SAAK,aAAwB,0BAA0B,EAAE;AAEzD,UAAM,UAAU,cAAc,YAAY;AAC1C,UAAM,SAAS,MAAM,QAAQ,IAAI,EAAE;AAEnC,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,mBAAmB,EAAE,aAAa;AAAA,IACpD;AAEA,QAAI,8BAA8B,GAAG;AACnC,WAAK,UAAU,MAAM;AAAA,IACvB;AAEA,SAAK,cAAc;AAAA,MACjB,CAAY,wBAAwB,GAAG;AAAA,MACvC,CAAY,gCAAgC,GAAG,OAAO;AAAA,MACtD,CAAY,oCAAoC,GAAG,OAAO;AAAA,IAC5D,CAAC;AAED,QAAI,WAAW;AACb,UAAI,6BAA6B,GAAG;AAClC,aAAK;AAAA,UACQ;AAAA,UACX,KAAK,UAAU;AAAA,YACb,MAAM;AAAA,YACN,OAAO;AAAA,UACT,CAAC;AAAA,QACH;AAAA,MACF;AAEA,aAAO,OAAO,QAAQ,SAAS;AAAA,IACjC;AAEA,WAAO;AAAA,EACT,CAAC;AACH;;;ACtCA,eAAsB,iBAAiB,IAAY,WAAmB,WAAiE;AACrI,SAAO,OAAO,eAAe,2BAA2B,OAAO,SAAS;AACtE,SAAK,QAAQ,QAAQ;AACrB,SAAK,aAAwB,0BAA0B,EAAE;AAEzD,UAAM,UAAU,cAAc,YAAY;AAC1C,UAAM,SAAS,MAAM,QAAQ,YAAY,EAAE;AAC3C,UAAM,gBAAgB,OAAO,SAAS;AAEtC,QAAI,CAAC,eAAe;AAClB,YAAM,IAAI,MAAM,kBAAkB,SAAS,yBAAyB,EAAE,EAAE;AAAA,IAC1E;AAEA,QAAI,8BAA8B,GAAG;AACnC,WAAK,UAAU,MAAM;AAAA,IACvB;AAEA,SAAK,cAAc;AAAA,MACjB,CAAY,wBAAwB,GAAG;AAAA,MACvC,CAAY,gCAAgC,GAAG,cAAc;AAAA,MAC7D,CAAY,oCAAoC,GAAG,cAAc;AAAA,IACnE,CAAC;AAED,QAAI,WAAW;AACb,UAAI,6BAA6B,GAAG;AAClC,aAAK;AAAA,UACQ;AAAA,UACX,KAAK,UAAU;AAAA,YACb,MAAM;AAAA,YACN,OAAO;AAAA,UACT,CAAC;AAAA,QACH;AAAA,MACF;AAEA,aAAO,cAAc,QAAQ,SAAS;AAAA,IACxC;AAEA,WAAO;AAAA,EACT,CAAC;AACH;","names":[]}
@@ -1,26 +1,6 @@
1
- var __defProp = Object.defineProperty;
2
- var __defProps = Object.defineProperties;
3
- var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
- var __spreadValues = (a, b) => {
9
- for (var prop in b || (b = {}))
10
- if (__hasOwnProp.call(b, prop))
11
- __defNormalProp(a, prop, b[prop]);
12
- if (__getOwnPropSymbols)
13
- for (var prop of __getOwnPropSymbols(b)) {
14
- if (__propIsEnum.call(b, prop))
15
- __defNormalProp(a, prop, b[prop]);
16
- }
17
- return a;
18
- };
19
- var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
- var __export = (target, all) => {
21
- for (var name in all)
22
- __defProp(target, name, { get: all[name], enumerable: true });
23
- };
1
+ import {
2
+ __export
3
+ } from "./chunk-YN4436PK.mjs";
24
4
 
25
5
  // src/observability/semconv/attributes.ts
26
6
  var ATTR_LANGWATCH_INPUT = "langwatch.input";
@@ -144,8 +124,6 @@ var VAL_GEN_AI_FINISH_REASON_STOP = "stop";
144
124
  var VAL_GEN_AI_FINISH_REASON_TOOL_CALLS = "tool_calls";
145
125
 
146
126
  export {
147
- __spreadValues,
148
- __spreadProps,
149
127
  ATTR_LANGWATCH_INPUT,
150
128
  ATTR_LANGWATCH_OUTPUT,
151
129
  ATTR_LANGWATCH_SPAN_TYPE,
@@ -178,4 +156,4 @@ export {
178
156
  EVNT_LANGWATCH_LANGCHAIN_CALLBACK,
179
157
  semconv_exports
180
158
  };
181
- //# sourceMappingURL=chunk-4BZATFKJ.mjs.map
159
+ //# sourceMappingURL=chunk-UU33HCCZ.mjs.map