@microsoft/opentelemetry 0.1.0-alpha.6 → 1.0.0

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 (244) hide show
  1. package/README.md +90 -3
  2. package/dist/commonjs/a365/configuration/A365Configuration.d.ts +32 -0
  3. package/dist/commonjs/a365/configuration/A365Configuration.d.ts.map +1 -1
  4. package/dist/commonjs/a365/configuration/A365Configuration.js +74 -5
  5. package/dist/commonjs/a365/configuration/A365Configuration.js.map +1 -1
  6. package/dist/commonjs/a365/configuration/A365ConfigurationOptions.d.ts +49 -0
  7. package/dist/commonjs/a365/configuration/A365ConfigurationOptions.d.ts.map +1 -1
  8. package/dist/commonjs/a365/constants.d.ts +1 -1
  9. package/dist/commonjs/a365/constants.d.ts.map +1 -1
  10. package/dist/commonjs/a365/exporter/Agent365Exporter.d.ts +4 -2
  11. package/dist/commonjs/a365/exporter/Agent365Exporter.d.ts.map +1 -1
  12. package/dist/commonjs/a365/exporter/Agent365Exporter.js +55 -30
  13. package/dist/commonjs/a365/exporter/Agent365Exporter.js.map +1 -1
  14. package/dist/commonjs/a365/exporter/Agent365ExporterOptions.d.ts +3 -0
  15. package/dist/commonjs/a365/exporter/Agent365ExporterOptions.d.ts.map +1 -1
  16. package/dist/commonjs/a365/exporter/Agent365ExporterOptions.js +5 -1
  17. package/dist/commonjs/a365/exporter/Agent365ExporterOptions.js.map +1 -1
  18. package/dist/commonjs/a365/exporter/utils.d.ts +29 -1
  19. package/dist/commonjs/a365/exporter/utils.d.ts.map +1 -1
  20. package/dist/commonjs/a365/exporter/utils.js +121 -5
  21. package/dist/commonjs/a365/exporter/utils.js.map +1 -1
  22. package/dist/commonjs/a365/hosting/agenticTokenCache.d.ts +58 -0
  23. package/dist/commonjs/a365/hosting/agenticTokenCache.d.ts.map +1 -0
  24. package/dist/commonjs/a365/hosting/agenticTokenCache.js +229 -0
  25. package/dist/commonjs/a365/hosting/agenticTokenCache.js.map +1 -0
  26. package/dist/commonjs/a365/hosting/index.d.ts +2 -0
  27. package/dist/commonjs/a365/hosting/index.d.ts.map +1 -1
  28. package/dist/commonjs/a365/hosting/index.js +4 -1
  29. package/dist/commonjs/a365/hosting/index.js.map +1 -1
  30. package/dist/commonjs/a365/index.d.ts +2 -2
  31. package/dist/commonjs/a365/index.d.ts.map +1 -1
  32. package/dist/commonjs/a365/index.js +3 -1
  33. package/dist/commonjs/a365/index.js.map +1 -1
  34. package/dist/commonjs/azureMonitor/index.d.ts +9 -1
  35. package/dist/commonjs/azureMonitor/index.d.ts.map +1 -1
  36. package/dist/commonjs/azureMonitor/index.js +13 -18
  37. package/dist/commonjs/azureMonitor/index.js.map +1 -1
  38. package/dist/commonjs/azureMonitor/metrics/quickpulse/liveMetrics.js +1 -1
  39. package/dist/commonjs/azureMonitor/metrics/quickpulse/liveMetrics.js.map +1 -1
  40. package/dist/commonjs/azureMonitor/metrics/quickpulse/utils.d.ts.map +1 -1
  41. package/dist/commonjs/azureMonitor/metrics/quickpulse/utils.js +4 -6
  42. package/dist/commonjs/azureMonitor/metrics/quickpulse/utils.js.map +1 -1
  43. package/dist/commonjs/distro/distro.d.ts +11 -2
  44. package/dist/commonjs/distro/distro.d.ts.map +1 -1
  45. package/dist/commonjs/distro/distro.js +183 -36
  46. package/dist/commonjs/distro/distro.js.map +1 -1
  47. package/dist/commonjs/distro/loader.d.ts +10 -0
  48. package/dist/commonjs/distro/loader.d.ts.map +1 -0
  49. package/dist/commonjs/distro/loader.js +16 -0
  50. package/dist/commonjs/distro/loader.js.map +1 -0
  51. package/dist/commonjs/genai/instrumentations/langchain/langchainTraceInstrumentor.d.ts +2 -6
  52. package/dist/commonjs/genai/instrumentations/langchain/langchainTraceInstrumentor.d.ts.map +1 -1
  53. package/dist/commonjs/genai/instrumentations/langchain/langchainTraceInstrumentor.js +10 -14
  54. package/dist/commonjs/genai/instrumentations/langchain/langchainTraceInstrumentor.js.map +1 -1
  55. package/dist/commonjs/genai/instrumentations/langchain/tracer.d.ts +9 -8
  56. package/dist/commonjs/genai/instrumentations/langchain/tracer.d.ts.map +1 -1
  57. package/dist/commonjs/genai/instrumentations/langchain/tracer.js +40 -15
  58. package/dist/commonjs/genai/instrumentations/langchain/tracer.js.map +1 -1
  59. package/dist/commonjs/genai/instrumentations/langchain/utils.d.ts.map +1 -1
  60. package/dist/commonjs/genai/instrumentations/langchain/utils.js +259 -75
  61. package/dist/commonjs/genai/instrumentations/langchain/utils.js.map +1 -1
  62. package/dist/commonjs/genai/instrumentations/openai/openAIAgentsTraceInstrumentor.d.ts.map +1 -1
  63. package/dist/commonjs/genai/instrumentations/openai/openAIAgentsTraceInstrumentor.js +0 -1
  64. package/dist/commonjs/genai/instrumentations/openai/openAIAgentsTraceInstrumentor.js.map +1 -1
  65. package/dist/commonjs/genai/instrumentations/openai/openAIAgentsTraceProcessor.d.ts +4 -5
  66. package/dist/commonjs/genai/instrumentations/openai/openAIAgentsTraceProcessor.d.ts.map +1 -1
  67. package/dist/commonjs/genai/instrumentations/openai/openAIAgentsTraceProcessor.js +72 -37
  68. package/dist/commonjs/genai/instrumentations/openai/openAIAgentsTraceProcessor.js.map +1 -1
  69. package/dist/commonjs/genai/instrumentations/openai/semconv.d.ts +0 -2
  70. package/dist/commonjs/genai/instrumentations/openai/semconv.d.ts.map +1 -1
  71. package/dist/commonjs/genai/instrumentations/openai/semconv.js +1 -3
  72. package/dist/commonjs/genai/instrumentations/openai/semconv.js.map +1 -1
  73. package/dist/commonjs/genai/instrumentations/openai/utils.d.ts +37 -16
  74. package/dist/commonjs/genai/instrumentations/openai/utils.d.ts.map +1 -1
  75. package/dist/commonjs/genai/instrumentations/openai/utils.js +239 -60
  76. package/dist/commonjs/genai/instrumentations/openai/utils.js.map +1 -1
  77. package/dist/commonjs/genai/semconv.d.ts +2 -0
  78. package/dist/commonjs/genai/semconv.d.ts.map +1 -1
  79. package/dist/commonjs/genai/semconv.js +5 -1
  80. package/dist/commonjs/genai/semconv.js.map +1 -1
  81. package/dist/commonjs/index.d.ts +2 -2
  82. package/dist/commonjs/index.d.ts.map +1 -1
  83. package/dist/commonjs/index.js +3 -1
  84. package/dist/commonjs/index.js.map +1 -1
  85. package/dist/commonjs/sdkstats/index.d.ts +18 -0
  86. package/dist/commonjs/sdkstats/index.d.ts.map +1 -0
  87. package/dist/commonjs/sdkstats/index.js +37 -0
  88. package/dist/commonjs/sdkstats/index.js.map +1 -0
  89. package/dist/commonjs/sdkstats/manager.d.ts +31 -0
  90. package/dist/commonjs/sdkstats/manager.d.ts.map +1 -0
  91. package/dist/commonjs/sdkstats/manager.js +190 -0
  92. package/dist/commonjs/sdkstats/manager.js.map +1 -0
  93. package/dist/commonjs/sdkstats/metrics.d.ts +20 -0
  94. package/dist/commonjs/sdkstats/metrics.d.ts.map +1 -0
  95. package/dist/commonjs/sdkstats/metrics.js +84 -0
  96. package/dist/commonjs/sdkstats/metrics.js.map +1 -0
  97. package/dist/commonjs/sdkstats/state.d.ts +58 -0
  98. package/dist/commonjs/sdkstats/state.d.ts.map +1 -0
  99. package/dist/commonjs/sdkstats/state.js +94 -0
  100. package/dist/commonjs/sdkstats/state.js.map +1 -0
  101. package/dist/commonjs/types.d.ts +6 -9
  102. package/dist/commonjs/types.d.ts.map +1 -1
  103. package/dist/commonjs/types.js +5 -1
  104. package/dist/commonjs/types.js.map +1 -1
  105. package/dist/commonjs/utils/common.js +2 -2
  106. package/dist/commonjs/utils/common.js.map +1 -1
  107. package/dist/commonjs/utils/index.d.ts +2 -0
  108. package/dist/commonjs/utils/index.d.ts.map +1 -1
  109. package/dist/commonjs/utils/index.js +5 -1
  110. package/dist/commonjs/utils/index.js.map +1 -1
  111. package/dist/commonjs/utils/opentelemetryInstrumentationPatcher.d.ts.map +1 -0
  112. package/dist/commonjs/{azureMonitor/utils → utils}/opentelemetryInstrumentationPatcher.js +13 -11
  113. package/dist/commonjs/utils/opentelemetryInstrumentationPatcher.js.map +1 -0
  114. package/dist/commonjs/{azureMonitor/utils → utils}/statsbeat.d.ts +1 -1
  115. package/dist/commonjs/utils/statsbeat.d.ts.map +1 -0
  116. package/dist/commonjs/{azureMonitor/utils → utils}/statsbeat.js +8 -8
  117. package/dist/commonjs/utils/statsbeat.js.map +1 -0
  118. package/dist/esm/a365/configuration/A365Configuration.d.ts +32 -0
  119. package/dist/esm/a365/configuration/A365Configuration.d.ts.map +1 -1
  120. package/dist/esm/a365/configuration/A365Configuration.js +74 -5
  121. package/dist/esm/a365/configuration/A365Configuration.js.map +1 -1
  122. package/dist/esm/a365/configuration/A365ConfigurationOptions.d.ts +49 -0
  123. package/dist/esm/a365/configuration/A365ConfigurationOptions.d.ts.map +1 -1
  124. package/dist/esm/a365/constants.d.ts +1 -1
  125. package/dist/esm/a365/constants.d.ts.map +1 -1
  126. package/dist/esm/a365/exporter/Agent365Exporter.d.ts +4 -2
  127. package/dist/esm/a365/exporter/Agent365Exporter.d.ts.map +1 -1
  128. package/dist/esm/a365/exporter/Agent365Exporter.js +56 -31
  129. package/dist/esm/a365/exporter/Agent365Exporter.js.map +1 -1
  130. package/dist/esm/a365/exporter/Agent365ExporterOptions.d.ts +3 -0
  131. package/dist/esm/a365/exporter/Agent365ExporterOptions.d.ts.map +1 -1
  132. package/dist/esm/a365/exporter/Agent365ExporterOptions.js +5 -1
  133. package/dist/esm/a365/exporter/Agent365ExporterOptions.js.map +1 -1
  134. package/dist/esm/a365/exporter/utils.d.ts +29 -1
  135. package/dist/esm/a365/exporter/utils.d.ts.map +1 -1
  136. package/dist/esm/a365/exporter/utils.js +119 -6
  137. package/dist/esm/a365/exporter/utils.js.map +1 -1
  138. package/dist/esm/a365/hosting/agenticTokenCache.d.ts +58 -0
  139. package/dist/esm/a365/hosting/agenticTokenCache.d.ts.map +1 -0
  140. package/dist/esm/a365/hosting/agenticTokenCache.js +225 -0
  141. package/dist/esm/a365/hosting/agenticTokenCache.js.map +1 -0
  142. package/dist/esm/a365/hosting/index.d.ts +2 -0
  143. package/dist/esm/a365/hosting/index.d.ts.map +1 -1
  144. package/dist/esm/a365/hosting/index.js +1 -0
  145. package/dist/esm/a365/hosting/index.js.map +1 -1
  146. package/dist/esm/a365/index.d.ts +2 -2
  147. package/dist/esm/a365/index.d.ts.map +1 -1
  148. package/dist/esm/a365/index.js +1 -1
  149. package/dist/esm/a365/index.js.map +1 -1
  150. package/dist/esm/azureMonitor/index.d.ts +9 -1
  151. package/dist/esm/azureMonitor/index.d.ts.map +1 -1
  152. package/dist/esm/azureMonitor/index.js +12 -18
  153. package/dist/esm/azureMonitor/index.js.map +1 -1
  154. package/dist/esm/azureMonitor/metrics/quickpulse/liveMetrics.js +1 -1
  155. package/dist/esm/azureMonitor/metrics/quickpulse/liveMetrics.js.map +1 -1
  156. package/dist/esm/azureMonitor/metrics/quickpulse/utils.d.ts.map +1 -1
  157. package/dist/esm/azureMonitor/metrics/quickpulse/utils.js +5 -7
  158. package/dist/esm/azureMonitor/metrics/quickpulse/utils.js.map +1 -1
  159. package/dist/esm/distro/distro.d.ts +11 -2
  160. package/dist/esm/distro/distro.d.ts.map +1 -1
  161. package/dist/esm/distro/distro.js +181 -35
  162. package/dist/esm/distro/distro.js.map +1 -1
  163. package/dist/esm/distro/loader.d.ts +10 -0
  164. package/dist/esm/distro/loader.d.ts.map +1 -0
  165. package/dist/esm/distro/loader.js +14 -0
  166. package/dist/esm/distro/loader.js.map +1 -0
  167. package/dist/esm/genai/instrumentations/langchain/langchainTraceInstrumentor.d.ts +2 -6
  168. package/dist/esm/genai/instrumentations/langchain/langchainTraceInstrumentor.d.ts.map +1 -1
  169. package/dist/esm/genai/instrumentations/langchain/langchainTraceInstrumentor.js +10 -14
  170. package/dist/esm/genai/instrumentations/langchain/langchainTraceInstrumentor.js.map +1 -1
  171. package/dist/esm/genai/instrumentations/langchain/tracer.d.ts +9 -8
  172. package/dist/esm/genai/instrumentations/langchain/tracer.d.ts.map +1 -1
  173. package/dist/esm/genai/instrumentations/langchain/tracer.js +41 -16
  174. package/dist/esm/genai/instrumentations/langchain/tracer.js.map +1 -1
  175. package/dist/esm/genai/instrumentations/langchain/utils.d.ts.map +1 -1
  176. package/dist/esm/genai/instrumentations/langchain/utils.js +260 -76
  177. package/dist/esm/genai/instrumentations/langchain/utils.js.map +1 -1
  178. package/dist/esm/genai/instrumentations/openai/openAIAgentsTraceInstrumentor.d.ts.map +1 -1
  179. package/dist/esm/genai/instrumentations/openai/openAIAgentsTraceInstrumentor.js +0 -1
  180. package/dist/esm/genai/instrumentations/openai/openAIAgentsTraceInstrumentor.js.map +1 -1
  181. package/dist/esm/genai/instrumentations/openai/openAIAgentsTraceProcessor.d.ts +4 -5
  182. package/dist/esm/genai/instrumentations/openai/openAIAgentsTraceProcessor.d.ts.map +1 -1
  183. package/dist/esm/genai/instrumentations/openai/openAIAgentsTraceProcessor.js +75 -40
  184. package/dist/esm/genai/instrumentations/openai/openAIAgentsTraceProcessor.js.map +1 -1
  185. package/dist/esm/genai/instrumentations/openai/semconv.d.ts +0 -2
  186. package/dist/esm/genai/instrumentations/openai/semconv.d.ts.map +1 -1
  187. package/dist/esm/genai/instrumentations/openai/semconv.js +0 -2
  188. package/dist/esm/genai/instrumentations/openai/semconv.js.map +1 -1
  189. package/dist/esm/genai/instrumentations/openai/utils.d.ts +37 -16
  190. package/dist/esm/genai/instrumentations/openai/utils.d.ts.map +1 -1
  191. package/dist/esm/genai/instrumentations/openai/utils.js +233 -57
  192. package/dist/esm/genai/instrumentations/openai/utils.js.map +1 -1
  193. package/dist/esm/genai/semconv.d.ts +2 -0
  194. package/dist/esm/genai/semconv.d.ts.map +1 -1
  195. package/dist/esm/genai/semconv.js +4 -0
  196. package/dist/esm/genai/semconv.js.map +1 -1
  197. package/dist/esm/index.d.ts +2 -2
  198. package/dist/esm/index.d.ts.map +1 -1
  199. package/dist/esm/index.js +1 -1
  200. package/dist/esm/index.js.map +1 -1
  201. package/dist/esm/sdkstats/index.d.ts +18 -0
  202. package/dist/esm/sdkstats/index.d.ts.map +1 -0
  203. package/dist/esm/sdkstats/index.js +20 -0
  204. package/dist/esm/sdkstats/index.js.map +1 -0
  205. package/dist/esm/sdkstats/manager.d.ts +31 -0
  206. package/dist/esm/sdkstats/manager.d.ts.map +1 -0
  207. package/dist/esm/sdkstats/manager.js +186 -0
  208. package/dist/esm/sdkstats/manager.js.map +1 -0
  209. package/dist/esm/sdkstats/metrics.d.ts +20 -0
  210. package/dist/esm/sdkstats/metrics.d.ts.map +1 -0
  211. package/dist/esm/sdkstats/metrics.js +77 -0
  212. package/dist/esm/sdkstats/metrics.js.map +1 -0
  213. package/dist/esm/sdkstats/state.d.ts +58 -0
  214. package/dist/esm/sdkstats/state.d.ts.map +1 -0
  215. package/dist/esm/sdkstats/state.js +83 -0
  216. package/dist/esm/sdkstats/state.js.map +1 -0
  217. package/dist/esm/types.d.ts +6 -9
  218. package/dist/esm/types.d.ts.map +1 -1
  219. package/dist/esm/types.js +5 -1
  220. package/dist/esm/types.js.map +1 -1
  221. package/dist/esm/utils/common.js +2 -2
  222. package/dist/esm/utils/common.js.map +1 -1
  223. package/dist/esm/utils/index.d.ts +2 -0
  224. package/dist/esm/utils/index.d.ts.map +1 -1
  225. package/dist/esm/utils/index.js +2 -0
  226. package/dist/esm/utils/index.js.map +1 -1
  227. package/dist/esm/utils/opentelemetryInstrumentationPatcher.d.ts.map +1 -0
  228. package/dist/esm/{azureMonitor/utils → utils}/opentelemetryInstrumentationPatcher.js +13 -11
  229. package/dist/esm/utils/opentelemetryInstrumentationPatcher.js.map +1 -0
  230. package/dist/esm/{azureMonitor/utils → utils}/statsbeat.d.ts +1 -1
  231. package/dist/esm/utils/statsbeat.d.ts.map +1 -0
  232. package/dist/esm/{azureMonitor/utils → utils}/statsbeat.js +8 -8
  233. package/dist/esm/utils/statsbeat.js.map +1 -0
  234. package/package.json +6 -6
  235. package/dist/commonjs/azureMonitor/utils/opentelemetryInstrumentationPatcher.d.ts.map +0 -1
  236. package/dist/commonjs/azureMonitor/utils/opentelemetryInstrumentationPatcher.js.map +0 -1
  237. package/dist/commonjs/azureMonitor/utils/statsbeat.d.ts.map +0 -1
  238. package/dist/commonjs/azureMonitor/utils/statsbeat.js.map +0 -1
  239. package/dist/esm/azureMonitor/utils/opentelemetryInstrumentationPatcher.d.ts.map +0 -1
  240. package/dist/esm/azureMonitor/utils/opentelemetryInstrumentationPatcher.js.map +0 -1
  241. package/dist/esm/azureMonitor/utils/statsbeat.d.ts.map +0 -1
  242. package/dist/esm/azureMonitor/utils/statsbeat.js.map +0 -1
  243. /package/dist/commonjs/{azureMonitor/utils → utils}/opentelemetryInstrumentationPatcher.d.ts +0 -0
  244. /package/dist/esm/{azureMonitor/utils → utils}/opentelemetryInstrumentationPatcher.d.ts +0 -0
@@ -58,22 +58,20 @@ const Utils = __importStar(require("./utils.js"));
58
58
  * - Skips LangChain-internal runs (tagged `langsmith:hidden`, `Branch*`, or
59
59
  * unmapped run types) to avoid noisy traces.
60
60
  * - Guards against unbounded memory with a hard cap of {@link MAX_RUNS}.
61
- * - Content-sensitive attributes (messages, tool args, system instructions)
62
- * are only recorded when `isContentRecordingEnabled` is true.
61
+ * - Content attributes (messages, tool args) are always recorded
62
+ * (aligned with Python/.NET SDKs).
63
63
  */
64
64
  class LangChainTracer extends base_1.BaseTracer {
65
65
  /** Hard cap on concurrent tracked runs to prevent memory leaks. */
66
66
  static MAX_RUNS = 10_000;
67
67
  tracer;
68
- isContentRecordingEnabled;
69
68
  /** Active runs keyed by LangChain run ID. */
70
69
  runs = new Map();
71
70
  /** Maps each run ID → its parent run ID for parent-span-context lookup. */
72
71
  parentByRunId = new Map();
73
- constructor(tracer, options) {
72
+ constructor(tracer) {
74
73
  super();
75
74
  this.tracer = tracer;
76
- this.isContentRecordingEnabled = options?.isContentRecordingEnabled ?? false;
77
75
  }
78
76
  name = "OpenTelemetryLangChainTracer";
79
77
  persistRun(_run) {
@@ -113,14 +111,18 @@ class LangChainTracer extends base_1.BaseTracer {
113
111
  : api_1.context.active();
114
112
  // Build span name: "<operation> <name|model>"
115
113
  let spanName = run.name;
114
+ let kind = api_1.SpanKind.INTERNAL;
116
115
  if (operation === "invoke_agent") {
117
116
  spanName = `${operation} ${run.name}`;
117
+ kind = api_1.SpanKind.SERVER;
118
118
  }
119
119
  else if (operation === "execute_tool") {
120
120
  spanName = `${operation} ${run.name}`;
121
+ kind = api_1.SpanKind.CLIENT;
121
122
  }
122
123
  else if (operation === "chat") {
123
124
  spanName = `${operation} ${Utils.getModel(run) || run.name}`.trim();
125
+ kind = api_1.SpanKind.CLIENT;
124
126
  }
125
127
  if (this.runs.size >= LangChainTracer.MAX_RUNS) {
126
128
  api_2.diag.warn(`[LangChainTracer] Max runs (${LangChainTracer.MAX_RUNS}) reached, skipping span`);
@@ -129,7 +131,7 @@ class LangChainTracer extends base_1.BaseTracer {
129
131
  }
130
132
  const startTime = run.start_time ?? Date.now();
131
133
  const span = this.tracer.startSpan(spanName, {
132
- kind: api_1.SpanKind.INTERNAL,
134
+ kind,
133
135
  startTime,
134
136
  attributes: { [index_js_1.ATTR_GEN_AI_PROVIDER_NAME]: "langchain" },
135
137
  }, activeContext);
@@ -137,8 +139,7 @@ class LangChainTracer extends base_1.BaseTracer {
137
139
  }
138
140
  /**
139
141
  * Called by LangChain when a run finishes. Sets status, enriches the span
140
- * with GenAI attributes, and ends it. If content recording is enabled,
141
- * message bodies, tool arguments, and system instructions are also attached.
142
+ * with GenAI attributes, and ends it.
142
143
  */
143
144
  async _endTrace(run) {
144
145
  if ((0, core_1.isTracingSuppressed)(api_1.context.active())) {
@@ -168,6 +169,11 @@ class LangChainTracer extends base_1.BaseTracer {
168
169
  if (run.error) {
169
170
  span.setStatus({ code: api_1.SpanStatusCode.ERROR });
170
171
  span.setAttribute(index_js_1.ATTR_ERROR_MESSAGE, String(run.error));
172
+ const errorType = run.error?.name ??
173
+ run.error?.constructor?.name;
174
+ if (typeof errorType === "string" && errorType.length > 0) {
175
+ span.setAttribute(index_js_1.ATTR_ERROR_TYPE, errorType);
176
+ }
171
177
  }
172
178
  else {
173
179
  span.setStatus({ code: api_1.SpanStatusCode.OK });
@@ -175,17 +181,21 @@ class LangChainTracer extends base_1.BaseTracer {
175
181
  // Always-on attributes: operation type, agent info, model, provider, session, tokens
176
182
  Utils.setOperationTypeAttribute(operation, span);
177
183
  Utils.setAgentAttributes(run, span);
184
+ if (operation === "invoke_agent") {
185
+ const callerName = this.findCallerAgentName(run);
186
+ if (callerName) {
187
+ span.setAttribute(index_js_1.ATTR_GEN_AI_CALLER_AGENT_NAME, callerName);
188
+ }
189
+ }
178
190
  Utils.setModelAttribute(run, span);
179
191
  Utils.setProviderNameAttribute(run, span);
180
192
  Utils.setSessionIdAttribute(run, span);
181
193
  Utils.setTokenAttributes(run, span);
182
- // Opt-in content attributes (may contain PII / large payloads)
183
- if (this.isContentRecordingEnabled) {
184
- Utils.setToolAttributes(run, span);
185
- Utils.setInputMessagesAttribute(run, span);
186
- Utils.setOutputMessagesAttribute(run, span);
187
- Utils.setSystemInstructionsAttribute(run, span);
188
- }
194
+ // Content attributes — always recorded (aligned with Python/.NET SDKs)
195
+ Utils.setToolAttributes(run, span);
196
+ Utils.setInputMessagesAttribute(run, span);
197
+ Utils.setOutputMessagesAttribute(run, span);
198
+ Utils.setSystemInstructionsAttribute(run, span);
189
199
  }
190
200
  catch (error) {
191
201
  api_2.diag.error(`[LangChainTracer] Error setting span attributes for run ${run.name}: ${error instanceof Error ? error.message : String(error)}`);
@@ -213,6 +223,21 @@ class LangChainTracer extends base_1.BaseTracer {
213
223
  }
214
224
  return undefined;
215
225
  }
226
+ /**
227
+ * Walk up the parent run chain to find the nearest ancestor that is an
228
+ * invoke_agent run, returning its name as the caller agent name.
229
+ */
230
+ findCallerAgentName(run) {
231
+ let pid = run.parent_run_id;
232
+ while (pid) {
233
+ const entry = this.runs.get(pid);
234
+ if (entry && Utils.getOperationType(entry.run) === "invoke_agent") {
235
+ return entry.run.name;
236
+ }
237
+ pid = this.parentByRunId.get(pid);
238
+ }
239
+ return undefined;
240
+ }
216
241
  }
217
242
  exports.LangChainTracer = LangChainTracer;
218
243
  //# sourceMappingURL=tracer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tracer.js","sourceRoot":"","sources":["../../../../../src/genai/instrumentations/langchain/tracer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tracer.js","sourceRoot":"","sources":["../../../../../src/genai/instrumentations/langchain/tracer.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../src/genai/instrumentations/langchain/utils.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,GAAG,EAAE,MAAM,8BAA8B,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAuB1C,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAExD;AAGD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAWjD;AAGD,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,QAEtE;AAGD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,QAOtD;AAGD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,QAyBrD;AAED,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,QAwB7D;AA+ED,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,QAgE9D;AAGD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,GAAG,SAAS,CASrD;AAGD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,QAGrD;AAGD,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,QAG5D;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAShE;AAGD,wBAAgB,8BAA8B,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,oBAuBlE;AAGD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,QA2BtD"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../src/genai/instrumentations/langchain/utils.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,GAAG,EAAE,MAAM,8BAA8B,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAiC1C,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAExD;AAGD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAWjD;AAGD,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,QAEtE;AAGD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,QAOtD;AAGD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,QA4CrD;AAED,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,QAgC7D;AAmOD,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,QA6D9D;AAGD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,GAAG,SAAS,CAarD;AAGD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,QAGrD;AAGD,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,QAG5D;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAahE;AAGD,wBAAgB,8BAA8B,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,oBA+BlE;AAGD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,QAoCtD"}
@@ -17,6 +17,8 @@ exports.setSessionIdAttribute = setSessionIdAttribute;
17
17
  exports.setSystemInstructionsAttribute = setSystemInstructionsAttribute;
18
18
  exports.setTokenAttributes = setTokenAttributes;
19
19
  const index_js_1 = require("../../index.js");
20
+ const message_utils_js_1 = require("../../../a365/message-utils.js");
21
+ const contracts_js_1 = require("../../../a365/contracts.js");
20
22
  // Type guards
21
23
  function isString(value) {
22
24
  return typeof value === "string";
@@ -59,49 +61,78 @@ function setToolAttributes(run, span) {
59
61
  if (isString(run.name)) {
60
62
  span.setAttribute(index_js_1.ATTR_GEN_AI_TOOL_NAME, run.name);
61
63
  }
62
- if (run.inputs)
63
- span.setAttribute(index_js_1.ATTR_GEN_AI_TOOL_CALL_ARGUMENTS, JSON.stringify(run.inputs?.input ?? run.inputs));
64
- if (run.outputs?.output?.kwargs?.content)
65
- span.setAttribute(index_js_1.ATTR_GEN_AI_TOOL_CALL_RESULT, JSON.stringify(run.outputs?.output?.kwargs?.content));
64
+ if (run.inputs) {
65
+ const argsValue = run.inputs?.input ?? run.inputs;
66
+ span.setAttribute(index_js_1.ATTR_GEN_AI_TOOL_CALL_ARGUMENTS, (0, message_utils_js_1.safeSerializeToJson)(typeof argsValue === "object" ? argsValue : String(argsValue), "arguments"));
67
+ }
68
+ // Tool result: v0 uses output.kwargs.content, v1 returns output as a plain string or has content directly
69
+ const toolResult = run.outputs?.output?.kwargs?.content ??
70
+ (isString(run.outputs?.output) ? run.outputs.output : null) ??
71
+ run.outputs?.output?.content;
72
+ if (toolResult != null) {
73
+ span.setAttribute(index_js_1.ATTR_GEN_AI_TOOL_CALL_RESULT, (0, message_utils_js_1.safeSerializeToJson)(typeof toolResult === "object"
74
+ ? toolResult
75
+ : String(toolResult), "result"));
76
+ }
66
77
  span.setAttribute(index_js_1.ATTR_GEN_AI_TOOL_TYPE, "extension");
67
- if (run.outputs?.output?.tool_call_id)
68
- span.setAttribute(index_js_1.ATTR_GEN_AI_TOOL_CALL_ID, run.outputs?.output?.tool_call_id);
78
+ // Tool call ID: v0 uses output.tool_call_id, v1 may have it on inputs
79
+ const toolCallId = run.outputs?.output?.tool_call_id ?? run.inputs?.tool_call_id;
80
+ if (toolCallId)
81
+ span.setAttribute(index_js_1.ATTR_GEN_AI_TOOL_CALL_ID, toolCallId);
69
82
  }
70
83
  function setInputMessagesAttribute(run, span) {
71
84
  const messages = run.inputs?.messages;
72
85
  if (!Array.isArray(messages)) {
73
86
  return;
74
87
  }
75
- const preprocess = getScopeType(run) === "inference" && messages.length > 0 ? messages[0] : messages;
76
- const processed = preprocess
77
- ?.map((msg) => {
78
- const content = extractMessageContent(msg);
79
- if (!content)
80
- return null;
81
- const msgType = getMessageType(msg);
82
- if (shouldIncludeInputMessage(msgType)) {
83
- return content;
84
- }
85
- return null;
86
- })
87
- .filter(Boolean);
88
- if (processed.length > 0) {
89
- span.setAttribute(index_js_1.ATTR_GEN_AI_INPUT_MESSAGES, JSON.stringify(processed));
88
+ // LangChain may provide messages as a direct array or as a single nested array.
89
+ // Normalize both shapes so agent/inference inputs are consistently processed.
90
+ const preprocess = getScopeType(run) !== "unknown" && messages.length > 0 && Array.isArray(messages[0])
91
+ ? messages[0]
92
+ : messages;
93
+ const chatMessages = [];
94
+ for (const msg of preprocess) {
95
+ if (!msg || typeof msg !== "object")
96
+ continue;
97
+ const msgObj = msg;
98
+ const parts = buildPartsFromMessage(msgObj);
99
+ if (parts.length === 0)
100
+ continue;
101
+ const msgType = getMessageType(msgObj);
102
+ const role = mapLangChainRole(msgType);
103
+ chatMessages.push({ role, parts });
104
+ }
105
+ if (chatMessages.length > 0) {
106
+ const wrapper = {
107
+ version: contracts_js_1.A365_MESSAGE_SCHEMA_VERSION,
108
+ messages: chatMessages,
109
+ };
110
+ span.setAttribute(index_js_1.ATTR_GEN_AI_INPUT_MESSAGES, (0, message_utils_js_1.serializeMessages)(wrapper));
90
111
  }
91
112
  }
92
- // Helper: Extract message content from various formats
93
- function extractMessageContent(msg) {
94
- // Simple format: {role: "user", content}
95
- if (isString(msg.content)) {
96
- return msg.content;
113
+ // Helper: Extract string content from a message (used for fallback text extraction and system instructions)
114
+ function extractStringContent(msg) {
115
+ const raw = extractRawContent(msg);
116
+ return isString(raw) ? raw : null;
117
+ }
118
+ // Helper: Extract raw content (string or content block array) from various message formats
119
+ function extractRawContent(msg) {
120
+ // Simple format: {role: "user", content: string | array}
121
+ if (msg.content !== undefined && msg.content !== null) {
122
+ if (isString(msg.content))
123
+ return msg.content;
124
+ if (Array.isArray(msg.content))
125
+ return msg.content;
97
126
  }
98
127
  // LangChain format: {lc_type: "human", lc_kwargs: {content}}
99
128
  if (msg.lc_kwargs && typeof msg.lc_kwargs === "object" && !Array.isArray(msg.lc_kwargs)) {
100
129
  const kwargs = msg.lc_kwargs;
101
130
  if (isString(kwargs.content))
102
131
  return kwargs.content;
132
+ if (Array.isArray(kwargs.content))
133
+ return kwargs.content;
103
134
  }
104
- // New LangChain format: {lc: 1, type: "constructor", kwargs: {content}}
135
+ // LangChain v1 serialized class instance format: { lc: 1, type: "constructor", kwargs: {...} }
105
136
  if (msg.lc === 1 &&
106
137
  msg.type === "constructor" &&
107
138
  msg.kwargs &&
@@ -110,9 +141,140 @@ function extractMessageContent(msg) {
110
141
  const kwargs = msg.kwargs;
111
142
  if (isString(kwargs.content))
112
143
  return kwargs.content;
144
+ if (Array.isArray(kwargs.content))
145
+ return kwargs.content;
113
146
  }
114
147
  return null;
115
148
  }
149
+ // Helper: Map LangChain message type to MessageRole
150
+ function mapLangChainRole(msgType) {
151
+ switch (msgType) {
152
+ case "user":
153
+ case "human":
154
+ return contracts_js_1.MessageRole.USER;
155
+ case "assistant":
156
+ case "ai":
157
+ return contracts_js_1.MessageRole.ASSISTANT;
158
+ case "system":
159
+ return contracts_js_1.MessageRole.SYSTEM;
160
+ case "tool":
161
+ return contracts_js_1.MessageRole.TOOL;
162
+ default:
163
+ return msgType;
164
+ }
165
+ }
166
+ // Helper: Build MessagePart[] from a LangChain message
167
+ function buildPartsFromMessage(msg) {
168
+ const parts = [];
169
+ const rawContent = extractRawContent(msg);
170
+ const addUnknownBlockPart = (blockType, block) => {
171
+ try {
172
+ parts.push({ type: blockType, content: JSON.stringify(block) });
173
+ }
174
+ catch {
175
+ parts.push({ type: blockType, content: "[unserializable]" });
176
+ }
177
+ };
178
+ const addPartFromContentBlock = (block) => {
179
+ if (!block || typeof block !== "object")
180
+ return;
181
+ const contentBlock = block;
182
+ const blockType = contentBlock.type;
183
+ if (!blockType)
184
+ return;
185
+ if (blockType === "text" && isString(contentBlock.text)) {
186
+ parts.push({ type: "text", content: contentBlock.text });
187
+ return;
188
+ }
189
+ if (blockType === "reasoning" && isString(contentBlock.reasoning)) {
190
+ parts.push({ type: "reasoning", content: contentBlock.reasoning });
191
+ return;
192
+ }
193
+ if (blockType === "tool_call") {
194
+ parts.push({
195
+ type: "tool_call",
196
+ name: String(contentBlock.name ?? ""),
197
+ id: contentBlock.id != null ? String(contentBlock.id) : undefined,
198
+ arguments: contentBlock.args && typeof contentBlock.args === "object"
199
+ ? contentBlock.args
200
+ : undefined,
201
+ });
202
+ return;
203
+ }
204
+ addUnknownBlockPart(blockType, contentBlock);
205
+ };
206
+ if (isString(rawContent)) {
207
+ parts.push({ type: "text", content: rawContent });
208
+ }
209
+ else if (Array.isArray(rawContent)) {
210
+ for (const block of rawContent) {
211
+ addPartFromContentBlock(block);
212
+ }
213
+ }
214
+ // Extract tool_calls from the message (AI messages may have a separate tool_calls array)
215
+ // Deduplicate by ID to avoid duplicates when tool_calls appear in both content blocks and tool_calls array
216
+ const seenToolCallIds = new Set();
217
+ for (const part of parts) {
218
+ if (part.type !== "tool_call")
219
+ continue;
220
+ const partId = part.id;
221
+ if (isString(partId)) {
222
+ seenToolCallIds.add(partId);
223
+ }
224
+ }
225
+ for (const toolCall of extractToolCalls(msg)) {
226
+ const toolCallId = toolCall.id;
227
+ if (isString(toolCallId) && seenToolCallIds.has(toolCallId)) {
228
+ continue;
229
+ }
230
+ if (isString(toolCallId)) {
231
+ seenToolCallIds.add(toolCallId);
232
+ }
233
+ parts.push(toolCall);
234
+ }
235
+ // Fallback: if no parts were built, use text extraction
236
+ if (parts.length === 0) {
237
+ const textContent = extractStringContent(msg);
238
+ if (textContent) {
239
+ parts.push({ type: "text", content: textContent });
240
+ }
241
+ }
242
+ return parts;
243
+ }
244
+ // Helper: Extract tool_calls from a LangChain message
245
+ function extractToolCalls(msg) {
246
+ const parts = [];
247
+ // Standard format: message.tool_calls[] — check direct, lc_kwargs, and kwargs paths
248
+ const directToolCalls = getNestedValue(msg, "tool_calls") ??
249
+ getNestedValue(msg, "lc_kwargs", "tool_calls") ??
250
+ getNestedValue(msg, "kwargs", "tool_calls");
251
+ if (Array.isArray(directToolCalls)) {
252
+ for (const tc of directToolCalls) {
253
+ if (!tc || typeof tc !== "object")
254
+ continue;
255
+ const call = tc;
256
+ parts.push({
257
+ type: "tool_call",
258
+ name: String(call.name ?? ""),
259
+ id: call.id != null ? String(call.id) : undefined,
260
+ arguments: call.args && typeof call.args === "object"
261
+ ? call.args
262
+ : undefined,
263
+ });
264
+ }
265
+ }
266
+ return parts;
267
+ }
268
+ // Helper: Safely get a nested value from a message object
269
+ function getNestedValue(obj, ...keys) {
270
+ let current = obj;
271
+ for (const key of keys) {
272
+ if (!current || typeof current !== "object" || Array.isArray(current))
273
+ return undefined;
274
+ current = current[key];
275
+ }
276
+ return current;
277
+ }
116
278
  // Helper: Determine message type
117
279
  function getMessageType(msg) {
118
280
  // Simple format
@@ -121,9 +283,10 @@ function getMessageType(msg) {
121
283
  // LangChain old format
122
284
  if (isString(msg.lc_type))
123
285
  return msg.lc_type;
124
- if (isString(msg.type))
286
+ // Skip v1 constructor type marker — fall through to id array check
287
+ if (isString(msg.type) && msg.type !== "constructor")
125
288
  return msg.type;
126
- // LangChain new format - check id array for message type
289
+ // LangChain v1 format - check id array for message type (e.g., ["langchain_core", "messages", "HumanMessage"])
127
290
  if (Array.isArray(msg.id)) {
128
291
  const lastId = msg.id[msg.id.length - 1];
129
292
  if (isString(lastId)) {
@@ -133,6 +296,8 @@ function getMessageType(msg) {
133
296
  return "ai";
134
297
  if (lastId.includes("System"))
135
298
  return "system";
299
+ if (lastId.includes("Tool"))
300
+ return "tool";
136
301
  }
137
302
  }
138
303
  return "unknown";
@@ -150,11 +315,6 @@ function getScopeType(run) {
150
315
  }
151
316
  return "unknown";
152
317
  }
153
- // Helper: Check if input message should be included based on scope and message type
154
- function shouldIncludeInputMessage(msgType) {
155
- // For input messages: all scopes want user/human messages only
156
- return msgType === "user" || msgType === "human";
157
- }
158
318
  // Helper: Check if output message should be included based on scope and message type
159
319
  function shouldIncludeOutputMessage(scopeType, msgType) {
160
320
  if (scopeType === "agent" || scopeType === "inference") {
@@ -174,18 +334,23 @@ function setOutputMessagesAttribute(run, span) {
174
334
  return;
175
335
  }
176
336
  const scopeType = getScopeType(run);
177
- const messages = [];
337
+ const outputMessages = [];
338
+ // Helper: process a single message object into an OutputMessage
339
+ const processMessage = (msg) => {
340
+ const msgType = getMessageType(msg);
341
+ if (!shouldIncludeOutputMessage(scopeType, msgType))
342
+ return;
343
+ const parts = buildPartsFromMessage(msg);
344
+ if (parts.length === 0)
345
+ return;
346
+ const role = mapLangChainRole(msgType);
347
+ outputMessages.push({ role, parts });
348
+ };
178
349
  // Direct messages array (used in agent/chain outputs)
179
350
  if (Array.isArray(outputs.messages)) {
180
- outputs.messages.forEach((msg) => {
181
- const content = extractMessageContent(msg);
182
- if (!content)
183
- return;
184
- const msgType = getMessageType(msg);
185
- if (shouldIncludeOutputMessage(scopeType, msgType)) {
186
- messages.push(content);
187
- }
188
- });
351
+ for (const msg of outputs.messages) {
352
+ processMessage(msg);
353
+ }
189
354
  }
190
355
  // LangChain generations format (used in LLM/inference outputs)
191
356
  if (Array.isArray(outputs.generations)) {
@@ -194,19 +359,14 @@ function setOutputMessagesAttribute(run, span) {
194
359
  gen.forEach((item) => {
195
360
  // Try message property
196
361
  if (item.message && typeof item.message === "object" && !Array.isArray(item.message)) {
197
- const msg = item.message;
198
- const content = extractMessageContent(msg);
199
- if (!content) {
200
- return;
201
- }
202
- const msgType = getMessageType(msg);
203
- if (shouldIncludeOutputMessage(scopeType, msgType)) {
204
- messages.push(content);
205
- }
362
+ processMessage(item.message);
206
363
  }
207
364
  // Try direct text property (for generation items)
208
365
  else if (isString(item.text) && scopeType === "inference") {
209
- messages.push(item.text);
366
+ outputMessages.push({
367
+ role: contracts_js_1.MessageRole.ASSISTANT,
368
+ parts: [{ type: "text", content: item.text }],
369
+ });
210
370
  }
211
371
  });
212
372
  }
@@ -214,23 +374,24 @@ function setOutputMessagesAttribute(run, span) {
214
374
  }
215
375
  // Check for direct message object (some models return this)
216
376
  if (outputs.message && typeof outputs.message === "object" && !Array.isArray(outputs.message)) {
217
- const msg = outputs.message;
218
- const content = extractMessageContent(msg);
219
- if (content) {
220
- const msgType = getMessageType(msg);
221
- if (shouldIncludeOutputMessage(scopeType, msgType)) {
222
- messages.push(content);
223
- }
224
- }
377
+ processMessage(outputs.message);
225
378
  }
226
- if (messages.length > 0) {
227
- span.setAttribute(index_js_1.ATTR_GEN_AI_OUTPUT_MESSAGES, JSON.stringify(messages));
379
+ if (outputMessages.length > 0) {
380
+ const wrapper = {
381
+ version: contracts_js_1.A365_MESSAGE_SCHEMA_VERSION,
382
+ messages: outputMessages,
383
+ };
384
+ span.setAttribute(index_js_1.ATTR_GEN_AI_OUTPUT_MESSAGES, (0, message_utils_js_1.serializeMessages)(wrapper));
228
385
  }
229
386
  }
230
387
  // Model - Helper to extract model name from run
231
388
  function getModel(run) {
232
389
  return [
390
+ // v1: response_metadata directly on message
391
+ run.outputs?.generations?.[0]?.[0]?.message?.response_metadata?.model_name,
392
+ // v0: response_metadata nested under kwargs
233
393
  run.outputs?.generations?.[0]?.[0]?.message?.kwargs?.response_metadata?.model_name,
394
+ // Metadata paths (both v0 and v1)
234
395
  run.extra?.metadata?.ls_model_name,
235
396
  run.extra?.invocation_params?.model,
236
397
  run.extra?.invocation_params?.model_name,
@@ -254,10 +415,14 @@ function setSessionIdAttribute(run, span) {
254
415
  const metadata = run.extra?.metadata;
255
416
  if (!metadata)
256
417
  return;
257
- const sessionId = metadata.session_id ?? metadata.conversation_id ?? metadata.thread_id;
258
- if (typeof sessionId === "string" && sessionId.length > 0) {
418
+ const sessionId = metadata.session_id ?? metadata.thread_id;
419
+ if (isString(sessionId) && sessionId.length > 0) {
259
420
  span.setAttribute(index_js_1.ATTR_MICROSOFT_SESSION_ID, sessionId);
260
421
  }
422
+ const conversationId = metadata.conversation_id;
423
+ if (isString(conversationId) && conversationId.length > 0) {
424
+ span.setAttribute(index_js_1.ATTR_GEN_AI_CONVERSATION_ID, conversationId);
425
+ }
261
426
  }
262
427
  // System instructions
263
428
  function setSystemInstructionsAttribute(run, span) {
@@ -273,10 +438,20 @@ function setSystemInstructionsAttribute(run, span) {
273
438
  : "";
274
439
  if (prompts)
275
440
  return span.setAttribute(index_js_1.ATTR_GEN_AI_SYSTEM_INSTRUCTIONS, prompts);
276
- const messages = Array.isArray(inputs.messages) ? inputs.messages : [];
277
- const systemText = messages
278
- .filter((m) => m.lc_type === "system")
279
- .map((m) => String(m.lc_kwargs?.content ?? "").trim())
441
+ // Check both flat and nested message arrays
442
+ const rawMessages = Array.isArray(inputs.messages) ? inputs.messages : [];
443
+ const flatMessages = rawMessages.length > 0 && Array.isArray(rawMessages[0])
444
+ ? rawMessages[0]
445
+ : rawMessages;
446
+ const systemText = flatMessages
447
+ .filter((m) => {
448
+ if (!m || typeof m !== "object")
449
+ return false;
450
+ const msgType = getMessageType(m);
451
+ return msgType === "system";
452
+ })
453
+ .map((m) => extractStringContent(m) ?? "")
454
+ .map((s) => s.trim())
280
455
  .filter(Boolean)
281
456
  .join("\n");
282
457
  if (systemText)
@@ -285,10 +460,15 @@ function setSystemInstructionsAttribute(run, span) {
285
460
  // Tokens (input and output)
286
461
  function setTokenAttributes(run, span) {
287
462
  // Try multiple paths to find usage metadata (LLM direct/kwargs/response_metadata, agent calls, and chain/model_request outputs)
463
+ // v1: usage_metadata is often on the last AI message in outputs.messages
464
+ const lastMsg = Array.isArray(run.outputs?.messages)
465
+ ? run.outputs.messages[run.outputs.messages.length - 1]
466
+ : undefined;
288
467
  const usage = run.outputs?.generations?.[0]?.[0]?.message?.usage_metadata ||
289
468
  run.outputs?.generations?.[0]?.[0]?.message?.kwargs?.usage_metadata ||
469
+ run.outputs?.generations?.[0]?.[0]?.message?.response_metadata?.tokenUsage ||
290
470
  run.outputs?.generations?.[0]?.[0]?.message?.kwargs?.response_metadata?.tokenUsage ||
291
- run.outputs?.messages?.[1]?.usage_metadata ||
471
+ lastMsg?.usage_metadata ||
292
472
  run.outputs?.message?.response_metadata?.usage ||
293
473
  run.outputs?.message?.response_metadata?.tokenUsage ||
294
474
  run.outputs?.messages
@@ -298,11 +478,15 @@ function setTokenAttributes(run, span) {
298
478
  return;
299
479
  }
300
480
  const usageObj = usage;
301
- if (typeof usageObj.input_tokens === "number") {
302
- span.setAttribute(index_js_1.ATTR_GEN_AI_USAGE_INPUT_TOKENS, usageObj.input_tokens);
481
+ // Support both usage_metadata shape (input_tokens/output_tokens) and
482
+ // tokenUsage shape (promptTokens/completionTokens) from LangChain OpenAI provider
483
+ const inputTokens = usageObj.input_tokens ?? usageObj.promptTokens;
484
+ const outputTokens = usageObj.output_tokens ?? usageObj.completionTokens;
485
+ if (typeof inputTokens === "number") {
486
+ span.setAttribute(index_js_1.ATTR_GEN_AI_USAGE_INPUT_TOKENS, inputTokens);
303
487
  }
304
- if (typeof usageObj.output_tokens === "number") {
305
- span.setAttribute(index_js_1.ATTR_GEN_AI_USAGE_OUTPUT_TOKENS, usageObj.output_tokens);
488
+ if (typeof outputTokens === "number") {
489
+ span.setAttribute(index_js_1.ATTR_GEN_AI_USAGE_OUTPUT_TOKENS, outputTokens);
306
490
  }
307
491
  }
308
492
  // LangGraph agent check