shield360 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 (520) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +310 -0
  3. package/dist/__tests__/manual-trace.test.d.ts +1 -0
  4. package/dist/__tests__/manual-trace.test.js +118 -0
  5. package/dist/__tests__/manual-trace.test.js.map +1 -0
  6. package/dist/__tests__/register.test.d.ts +0 -0
  7. package/dist/__tests__/register.test.js +90 -0
  8. package/dist/__tests__/register.test.js.map +1 -0
  9. package/dist/config.d.ts +28 -0
  10. package/dist/config.js +22 -0
  11. package/dist/config.js.map +1 -0
  12. package/dist/constant.d.ts +6 -0
  13. package/dist/constant.js +14 -0
  14. package/dist/constant.js.map +1 -0
  15. package/dist/evals/__tests__/offline.test.d.ts +1 -0
  16. package/dist/evals/__tests__/offline.test.js +427 -0
  17. package/dist/evals/__tests__/offline.test.js.map +1 -0
  18. package/dist/evals/index.d.ts +2 -0
  19. package/dist/evals/index.js +15 -0
  20. package/dist/evals/index.js.map +1 -0
  21. package/dist/evals/offline.d.ts +6 -0
  22. package/dist/evals/offline.js +350 -0
  23. package/dist/evals/offline.js.map +1 -0
  24. package/dist/evals/types.d.ts +74 -0
  25. package/dist/evals/types.js +23 -0
  26. package/dist/evals/types.js.map +1 -0
  27. package/dist/features/__tests__/rule-engine.test.d.ts +1 -0
  28. package/dist/features/__tests__/rule-engine.test.js +146 -0
  29. package/dist/features/__tests__/rule-engine.test.js.map +1 -0
  30. package/dist/features/base.d.ts +8 -0
  31. package/dist/features/base.js +15 -0
  32. package/dist/features/base.js.map +1 -0
  33. package/dist/features/prompt-hub.d.ts +4 -0
  34. package/dist/features/prompt-hub.js +66 -0
  35. package/dist/features/prompt-hub.js.map +1 -0
  36. package/dist/features/rule-engine.d.ts +6 -0
  37. package/dist/features/rule-engine.js +60 -0
  38. package/dist/features/rule-engine.js.map +1 -0
  39. package/dist/features/vault.d.ts +4 -0
  40. package/dist/features/vault.js +63 -0
  41. package/dist/features/vault.js.map +1 -0
  42. package/dist/guard/__tests__/findings.test.d.ts +1 -0
  43. package/dist/guard/__tests__/findings.test.js +79 -0
  44. package/dist/guard/__tests__/findings.test.js.map +1 -0
  45. package/dist/guard/__tests__/integration.test.d.ts +1 -0
  46. package/dist/guard/__tests__/integration.test.js +215 -0
  47. package/dist/guard/__tests__/integration.test.js.map +1 -0
  48. package/dist/guard/__tests__/pii.test.d.ts +1 -0
  49. package/dist/guard/__tests__/pii.test.js +131 -0
  50. package/dist/guard/__tests__/pii.test.js.map +1 -0
  51. package/dist/guard/__tests__/pipeline.test.d.ts +1 -0
  52. package/dist/guard/__tests__/pipeline.test.js +162 -0
  53. package/dist/guard/__tests__/pipeline.test.js.map +1 -0
  54. package/dist/guard/__tests__/prompt-injection.test.d.ts +1 -0
  55. package/dist/guard/__tests__/prompt-injection.test.js +92 -0
  56. package/dist/guard/__tests__/prompt-injection.test.js.map +1 -0
  57. package/dist/guard/__tests__/report.test.d.ts +1 -0
  58. package/dist/guard/__tests__/report.test.js +50 -0
  59. package/dist/guard/__tests__/report.test.js.map +1 -0
  60. package/dist/guard/base.d.ts +79 -0
  61. package/dist/guard/base.js +136 -0
  62. package/dist/guard/base.js.map +1 -0
  63. package/dist/guard/custom.d.ts +19 -0
  64. package/dist/guard/custom.js +46 -0
  65. package/dist/guard/custom.js.map +1 -0
  66. package/dist/guard/findings.d.ts +31 -0
  67. package/dist/guard/findings.js +156 -0
  68. package/dist/guard/findings.js.map +1 -0
  69. package/dist/guard/index.d.ts +24 -0
  70. package/dist/guard/index.js +42 -0
  71. package/dist/guard/index.js.map +1 -0
  72. package/dist/guard/integration.d.ts +44 -0
  73. package/dist/guard/integration.js +363 -0
  74. package/dist/guard/integration.js.map +1 -0
  75. package/dist/guard/moderation.d.ts +18 -0
  76. package/dist/guard/moderation.js +61 -0
  77. package/dist/guard/moderation.js.map +1 -0
  78. package/dist/guard/pii.d.ts +17 -0
  79. package/dist/guard/pii.js +114 -0
  80. package/dist/guard/pii.js.map +1 -0
  81. package/dist/guard/pipeline.d.ts +26 -0
  82. package/dist/guard/pipeline.js +139 -0
  83. package/dist/guard/pipeline.js.map +1 -0
  84. package/dist/guard/prompt-injection.d.ts +21 -0
  85. package/dist/guard/prompt-injection.js +70 -0
  86. package/dist/guard/prompt-injection.js.map +1 -0
  87. package/dist/guard/report.d.ts +34 -0
  88. package/dist/guard/report.js +182 -0
  89. package/dist/guard/report.js.map +1 -0
  90. package/dist/guard/schema.d.ts +20 -0
  91. package/dist/guard/schema.js +99 -0
  92. package/dist/guard/schema.js.map +1 -0
  93. package/dist/guard/sensitive-topic.d.ts +23 -0
  94. package/dist/guard/sensitive-topic.js +89 -0
  95. package/dist/guard/sensitive-topic.js.map +1 -0
  96. package/dist/guard/topic-restriction.d.ts +22 -0
  97. package/dist/guard/topic-restriction.js +54 -0
  98. package/dist/guard/topic-restriction.js.map +1 -0
  99. package/dist/helpers.d.ts +246 -0
  100. package/dist/helpers.js +903 -0
  101. package/dist/helpers.js.map +1 -0
  102. package/dist/index.d.ts +71 -0
  103. package/dist/index.js +234 -0
  104. package/dist/index.js.map +1 -0
  105. package/dist/instrumentation/__tests__/ai21-rag-trace-comparison.test.d.ts +13 -0
  106. package/dist/instrumentation/__tests__/ai21-rag-trace-comparison.test.js +176 -0
  107. package/dist/instrumentation/__tests__/ai21-rag-trace-comparison.test.js.map +1 -0
  108. package/dist/instrumentation/__tests__/ai21-trace-comparison.test.d.ts +10 -0
  109. package/dist/instrumentation/__tests__/ai21-trace-comparison.test.js +203 -0
  110. package/dist/instrumentation/__tests__/ai21-trace-comparison.test.js.map +1 -0
  111. package/dist/instrumentation/__tests__/anthropic-wrapper.test.d.ts +1 -0
  112. package/dist/instrumentation/__tests__/anthropic-wrapper.test.js +284 -0
  113. package/dist/instrumentation/__tests__/anthropic-wrapper.test.js.map +1 -0
  114. package/dist/instrumentation/__tests__/assemblyai-wrapper.test.d.ts +1 -0
  115. package/dist/instrumentation/__tests__/assemblyai-wrapper.test.js +284 -0
  116. package/dist/instrumentation/__tests__/assemblyai-wrapper.test.js.map +1 -0
  117. package/dist/instrumentation/__tests__/astra-trace-comparison.test.d.ts +7 -0
  118. package/dist/instrumentation/__tests__/astra-trace-comparison.test.js +160 -0
  119. package/dist/instrumentation/__tests__/astra-trace-comparison.test.js.map +1 -0
  120. package/dist/instrumentation/__tests__/base-wrapper.test.d.ts +1 -0
  121. package/dist/instrumentation/__tests__/base-wrapper.test.js +171 -0
  122. package/dist/instrumentation/__tests__/base-wrapper.test.js.map +1 -0
  123. package/dist/instrumentation/__tests__/bedrock-trace-comparison.test.d.ts +1 -0
  124. package/dist/instrumentation/__tests__/bedrock-trace-comparison.test.js +422 -0
  125. package/dist/instrumentation/__tests__/bedrock-trace-comparison.test.js.map +1 -0
  126. package/dist/instrumentation/__tests__/browser-use-wrapper.test.d.ts +1 -0
  127. package/dist/instrumentation/__tests__/browser-use-wrapper.test.js +284 -0
  128. package/dist/instrumentation/__tests__/browser-use-wrapper.test.js.map +1 -0
  129. package/dist/instrumentation/__tests__/cache-pricing.test.d.ts +15 -0
  130. package/dist/instrumentation/__tests__/cache-pricing.test.js +155 -0
  131. package/dist/instrumentation/__tests__/cache-pricing.test.js.map +1 -0
  132. package/dist/instrumentation/__tests__/chroma-trace-comparison.test.d.ts +18 -0
  133. package/dist/instrumentation/__tests__/chroma-trace-comparison.test.js +209 -0
  134. package/dist/instrumentation/__tests__/chroma-trace-comparison.test.js.map +1 -0
  135. package/dist/instrumentation/__tests__/cohere-wrapper.test.d.ts +1 -0
  136. package/dist/instrumentation/__tests__/cohere-wrapper.test.js +256 -0
  137. package/dist/instrumentation/__tests__/cohere-wrapper.test.js.map +1 -0
  138. package/dist/instrumentation/__tests__/elevenlabs-wrapper.test.d.ts +1 -0
  139. package/dist/instrumentation/__tests__/elevenlabs-wrapper.test.js +282 -0
  140. package/dist/instrumentation/__tests__/elevenlabs-wrapper.test.js.map +1 -0
  141. package/dist/instrumentation/__tests__/firecrawl-wrapper.test.d.ts +1 -0
  142. package/dist/instrumentation/__tests__/firecrawl-wrapper.test.js +238 -0
  143. package/dist/instrumentation/__tests__/firecrawl-wrapper.test.js.map +1 -0
  144. package/dist/instrumentation/__tests__/google-ai-trace-comparison.test.d.ts +4 -0
  145. package/dist/instrumentation/__tests__/google-ai-trace-comparison.test.js +229 -0
  146. package/dist/instrumentation/__tests__/google-ai-trace-comparison.test.js.map +1 -0
  147. package/dist/instrumentation/__tests__/gpu-collector.test.d.ts +1 -0
  148. package/dist/instrumentation/__tests__/gpu-collector.test.js +247 -0
  149. package/dist/instrumentation/__tests__/gpu-collector.test.js.map +1 -0
  150. package/dist/instrumentation/__tests__/gradient-trace-comparison.test.d.ts +11 -0
  151. package/dist/instrumentation/__tests__/gradient-trace-comparison.test.js +391 -0
  152. package/dist/instrumentation/__tests__/gradient-trace-comparison.test.js.map +1 -0
  153. package/dist/instrumentation/__tests__/groq-trace-comparison.test.d.ts +7 -0
  154. package/dist/instrumentation/__tests__/groq-trace-comparison.test.js +687 -0
  155. package/dist/instrumentation/__tests__/groq-trace-comparison.test.js.map +1 -0
  156. package/dist/instrumentation/__tests__/helpers-genai.test.d.ts +14 -0
  157. package/dist/instrumentation/__tests__/helpers-genai.test.js +347 -0
  158. package/dist/instrumentation/__tests__/helpers-genai.test.js.map +1 -0
  159. package/dist/instrumentation/__tests__/huggingface-trace-comparison.test.d.ts +7 -0
  160. package/dist/instrumentation/__tests__/huggingface-trace-comparison.test.js +529 -0
  161. package/dist/instrumentation/__tests__/huggingface-trace-comparison.test.js.map +1 -0
  162. package/dist/instrumentation/__tests__/langchain-role-map.test.d.ts +1 -0
  163. package/dist/instrumentation/__tests__/langchain-role-map.test.js +19 -0
  164. package/dist/instrumentation/__tests__/langchain-role-map.test.js.map +1 -0
  165. package/dist/instrumentation/__tests__/langchain-wrapper.test.d.ts +1 -0
  166. package/dist/instrumentation/__tests__/langchain-wrapper.test.js +282 -0
  167. package/dist/instrumentation/__tests__/langchain-wrapper.test.js.map +1 -0
  168. package/dist/instrumentation/__tests__/letta-wrapper.test.d.ts +1 -0
  169. package/dist/instrumentation/__tests__/letta-wrapper.test.js +285 -0
  170. package/dist/instrumentation/__tests__/letta-wrapper.test.js.map +1 -0
  171. package/dist/instrumentation/__tests__/mem0-trace-comparison.test.d.ts +13 -0
  172. package/dist/instrumentation/__tests__/mem0-trace-comparison.test.js +208 -0
  173. package/dist/instrumentation/__tests__/mem0-trace-comparison.test.js.map +1 -0
  174. package/dist/instrumentation/__tests__/milvus-trace-comparison.test.d.ts +17 -0
  175. package/dist/instrumentation/__tests__/milvus-trace-comparison.test.js +206 -0
  176. package/dist/instrumentation/__tests__/milvus-trace-comparison.test.js.map +1 -0
  177. package/dist/instrumentation/__tests__/mistral-trace-comparison.test.d.ts +1 -0
  178. package/dist/instrumentation/__tests__/mistral-trace-comparison.test.js +345 -0
  179. package/dist/instrumentation/__tests__/mistral-trace-comparison.test.js.map +1 -0
  180. package/dist/instrumentation/__tests__/openai-wrapper.test.d.ts +1 -0
  181. package/dist/instrumentation/__tests__/openai-wrapper.test.js +179 -0
  182. package/dist/instrumentation/__tests__/openai-wrapper.test.js.map +1 -0
  183. package/dist/instrumentation/__tests__/pg-trace-comparison.test.d.ts +21 -0
  184. package/dist/instrumentation/__tests__/pg-trace-comparison.test.js +455 -0
  185. package/dist/instrumentation/__tests__/pg-trace-comparison.test.js.map +1 -0
  186. package/dist/instrumentation/__tests__/qdrant-trace-comparison.test.d.ts +17 -0
  187. package/dist/instrumentation/__tests__/qdrant-trace-comparison.test.js +182 -0
  188. package/dist/instrumentation/__tests__/qdrant-trace-comparison.test.js.map +1 -0
  189. package/dist/instrumentation/__tests__/replicate-trace-comparison.test.d.ts +8 -0
  190. package/dist/instrumentation/__tests__/replicate-trace-comparison.test.js +346 -0
  191. package/dist/instrumentation/__tests__/replicate-trace-comparison.test.js.map +1 -0
  192. package/dist/instrumentation/__tests__/together-trace-comparison.test.d.ts +4 -0
  193. package/dist/instrumentation/__tests__/together-trace-comparison.test.js +289 -0
  194. package/dist/instrumentation/__tests__/together-trace-comparison.test.js.map +1 -0
  195. package/dist/instrumentation/__tests__/trace-comparison-utils.d.ts +67 -0
  196. package/dist/instrumentation/__tests__/trace-comparison-utils.js +255 -0
  197. package/dist/instrumentation/__tests__/trace-comparison-utils.js.map +1 -0
  198. package/dist/instrumentation/__tests__/transformers-trace-comparison.test.d.ts +11 -0
  199. package/dist/instrumentation/__tests__/transformers-trace-comparison.test.js +214 -0
  200. package/dist/instrumentation/__tests__/transformers-trace-comparison.test.js.map +1 -0
  201. package/dist/instrumentation/__tests__/vercel-ai-trace-comparison.test.d.ts +8 -0
  202. package/dist/instrumentation/__tests__/vercel-ai-trace-comparison.test.js +446 -0
  203. package/dist/instrumentation/__tests__/vercel-ai-trace-comparison.test.js.map +1 -0
  204. package/dist/instrumentation/__tests__/vertexai-trace-comparison.test.d.ts +6 -0
  205. package/dist/instrumentation/__tests__/vertexai-trace-comparison.test.js +409 -0
  206. package/dist/instrumentation/__tests__/vertexai-trace-comparison.test.js.map +1 -0
  207. package/dist/instrumentation/__tests__/vllm-trace-comparison.test.d.ts +1 -0
  208. package/dist/instrumentation/__tests__/vllm-trace-comparison.test.js +519 -0
  209. package/dist/instrumentation/__tests__/vllm-trace-comparison.test.js.map +1 -0
  210. package/dist/instrumentation/ai21/index.d.ts +11 -0
  211. package/dist/instrumentation/ai21/index.js +67 -0
  212. package/dist/instrumentation/ai21/index.js.map +1 -0
  213. package/dist/instrumentation/ai21/wrapper.d.ts +54 -0
  214. package/dist/instrumentation/ai21/wrapper.js +511 -0
  215. package/dist/instrumentation/ai21/wrapper.js.map +1 -0
  216. package/dist/instrumentation/anthropic/index.d.ts +11 -0
  217. package/dist/instrumentation/anthropic/index.js +45 -0
  218. package/dist/instrumentation/anthropic/index.js.map +1 -0
  219. package/dist/instrumentation/anthropic/wrapper.d.ts +34 -0
  220. package/dist/instrumentation/anthropic/wrapper.js +426 -0
  221. package/dist/instrumentation/anthropic/wrapper.js.map +1 -0
  222. package/dist/instrumentation/assemblyai/index.d.ts +12 -0
  223. package/dist/instrumentation/assemblyai/index.js +91 -0
  224. package/dist/instrumentation/assemblyai/index.js.map +1 -0
  225. package/dist/instrumentation/assemblyai/wrapper.d.ts +35 -0
  226. package/dist/instrumentation/assemblyai/wrapper.js +238 -0
  227. package/dist/instrumentation/assemblyai/wrapper.js.map +1 -0
  228. package/dist/instrumentation/astra/index.d.ts +11 -0
  229. package/dist/instrumentation/astra/index.js +87 -0
  230. package/dist/instrumentation/astra/index.js.map +1 -0
  231. package/dist/instrumentation/astra/wrapper.d.ts +39 -0
  232. package/dist/instrumentation/astra/wrapper.js +349 -0
  233. package/dist/instrumentation/astra/wrapper.js.map +1 -0
  234. package/dist/instrumentation/azure-ai-inference/index.d.ts +11 -0
  235. package/dist/instrumentation/azure-ai-inference/index.js +76 -0
  236. package/dist/instrumentation/azure-ai-inference/index.js.map +1 -0
  237. package/dist/instrumentation/azure-ai-inference/wrapper.d.ts +55 -0
  238. package/dist/instrumentation/azure-ai-inference/wrapper.js +580 -0
  239. package/dist/instrumentation/azure-ai-inference/wrapper.js.map +1 -0
  240. package/dist/instrumentation/base-wrapper.d.ts +16 -0
  241. package/dist/instrumentation/base-wrapper.js +139 -0
  242. package/dist/instrumentation/base-wrapper.js.map +1 -0
  243. package/dist/instrumentation/bedrock/index.d.ts +11 -0
  244. package/dist/instrumentation/bedrock/index.js +52 -0
  245. package/dist/instrumentation/bedrock/index.js.map +1 -0
  246. package/dist/instrumentation/bedrock/wrapper.d.ts +41 -0
  247. package/dist/instrumentation/bedrock/wrapper.js +494 -0
  248. package/dist/instrumentation/bedrock/wrapper.js.map +1 -0
  249. package/dist/instrumentation/browser-use/index.d.ts +11 -0
  250. package/dist/instrumentation/browser-use/index.js +98 -0
  251. package/dist/instrumentation/browser-use/index.js.map +1 -0
  252. package/dist/instrumentation/browser-use/wrapper.d.ts +12 -0
  253. package/dist/instrumentation/browser-use/wrapper.js +706 -0
  254. package/dist/instrumentation/browser-use/wrapper.js.map +1 -0
  255. package/dist/instrumentation/chroma/index.d.ts +11 -0
  256. package/dist/instrumentation/chroma/index.js +70 -0
  257. package/dist/instrumentation/chroma/index.js.map +1 -0
  258. package/dist/instrumentation/chroma/wrapper.d.ts +10 -0
  259. package/dist/instrumentation/chroma/wrapper.js +127 -0
  260. package/dist/instrumentation/chroma/wrapper.js.map +1 -0
  261. package/dist/instrumentation/claude-agent-sdk/index.d.ts +23 -0
  262. package/dist/instrumentation/claude-agent-sdk/index.js +83 -0
  263. package/dist/instrumentation/claude-agent-sdk/index.js.map +1 -0
  264. package/dist/instrumentation/claude-agent-sdk/wrapper.d.ts +13 -0
  265. package/dist/instrumentation/claude-agent-sdk/wrapper.js +1123 -0
  266. package/dist/instrumentation/claude-agent-sdk/wrapper.js.map +1 -0
  267. package/dist/instrumentation/cohere/index.d.ts +11 -0
  268. package/dist/instrumentation/cohere/index.js +53 -0
  269. package/dist/instrumentation/cohere/index.js.map +1 -0
  270. package/dist/instrumentation/cohere/wrapper.d.ts +50 -0
  271. package/dist/instrumentation/cohere/wrapper.js +452 -0
  272. package/dist/instrumentation/cohere/wrapper.js.map +1 -0
  273. package/dist/instrumentation/cursor-sdk/index.d.ts +21 -0
  274. package/dist/instrumentation/cursor-sdk/index.js +58 -0
  275. package/dist/instrumentation/cursor-sdk/index.js.map +1 -0
  276. package/dist/instrumentation/cursor-sdk/wrapper.d.ts +17 -0
  277. package/dist/instrumentation/cursor-sdk/wrapper.js +789 -0
  278. package/dist/instrumentation/cursor-sdk/wrapper.js.map +1 -0
  279. package/dist/instrumentation/elevenlabs/index.d.ts +12 -0
  280. package/dist/instrumentation/elevenlabs/index.js +92 -0
  281. package/dist/instrumentation/elevenlabs/index.js.map +1 -0
  282. package/dist/instrumentation/elevenlabs/wrapper.d.ts +34 -0
  283. package/dist/instrumentation/elevenlabs/wrapper.js +280 -0
  284. package/dist/instrumentation/elevenlabs/wrapper.js.map +1 -0
  285. package/dist/instrumentation/firecrawl/index.d.ts +13 -0
  286. package/dist/instrumentation/firecrawl/index.js +115 -0
  287. package/dist/instrumentation/firecrawl/index.js.map +1 -0
  288. package/dist/instrumentation/firecrawl/wrapper.d.ts +22 -0
  289. package/dist/instrumentation/firecrawl/wrapper.js +378 -0
  290. package/dist/instrumentation/firecrawl/wrapper.js.map +1 -0
  291. package/dist/instrumentation/google-adk/index.d.ts +57 -0
  292. package/dist/instrumentation/google-adk/index.js +371 -0
  293. package/dist/instrumentation/google-adk/index.js.map +1 -0
  294. package/dist/instrumentation/google-adk/utils.d.ts +45 -0
  295. package/dist/instrumentation/google-adk/utils.js +663 -0
  296. package/dist/instrumentation/google-adk/utils.js.map +1 -0
  297. package/dist/instrumentation/google-adk/wrapper.d.ts +11 -0
  298. package/dist/instrumentation/google-adk/wrapper.js +391 -0
  299. package/dist/instrumentation/google-adk/wrapper.js.map +1 -0
  300. package/dist/instrumentation/google-ai/index.d.ts +11 -0
  301. package/dist/instrumentation/google-ai/index.js +48 -0
  302. package/dist/instrumentation/google-ai/index.js.map +1 -0
  303. package/dist/instrumentation/google-ai/wrapper.d.ts +52 -0
  304. package/dist/instrumentation/google-ai/wrapper.js +466 -0
  305. package/dist/instrumentation/google-ai/wrapper.js.map +1 -0
  306. package/dist/instrumentation/gpu/index.d.ts +38 -0
  307. package/dist/instrumentation/gpu/index.js +233 -0
  308. package/dist/instrumentation/gpu/index.js.map +1 -0
  309. package/dist/instrumentation/gradient/index.d.ts +12 -0
  310. package/dist/instrumentation/gradient/index.js +74 -0
  311. package/dist/instrumentation/gradient/index.js.map +1 -0
  312. package/dist/instrumentation/gradient/utils.d.ts +14 -0
  313. package/dist/instrumentation/gradient/utils.js +119 -0
  314. package/dist/instrumentation/gradient/utils.js.map +1 -0
  315. package/dist/instrumentation/gradient/wrapper.d.ts +76 -0
  316. package/dist/instrumentation/gradient/wrapper.js +584 -0
  317. package/dist/instrumentation/gradient/wrapper.js.map +1 -0
  318. package/dist/instrumentation/groq/index.d.ts +11 -0
  319. package/dist/instrumentation/groq/index.js +43 -0
  320. package/dist/instrumentation/groq/index.js.map +1 -0
  321. package/dist/instrumentation/groq/wrapper.d.ts +35 -0
  322. package/dist/instrumentation/groq/wrapper.js +442 -0
  323. package/dist/instrumentation/groq/wrapper.js.map +1 -0
  324. package/dist/instrumentation/huggingface/index.d.ts +13 -0
  325. package/dist/instrumentation/huggingface/index.js +110 -0
  326. package/dist/instrumentation/huggingface/index.js.map +1 -0
  327. package/dist/instrumentation/huggingface/wrapper.d.ts +54 -0
  328. package/dist/instrumentation/huggingface/wrapper.js +514 -0
  329. package/dist/instrumentation/huggingface/wrapper.js.map +1 -0
  330. package/dist/instrumentation/index.d.ts +7 -0
  331. package/dist/instrumentation/index.js +176 -0
  332. package/dist/instrumentation/index.js.map +1 -0
  333. package/dist/instrumentation/langchain/index.d.ts +16 -0
  334. package/dist/instrumentation/langchain/index.js +91 -0
  335. package/dist/instrumentation/langchain/index.js.map +1 -0
  336. package/dist/instrumentation/langchain/wrapper.d.ts +41 -0
  337. package/dist/instrumentation/langchain/wrapper.js +1235 -0
  338. package/dist/instrumentation/langchain/wrapper.js.map +1 -0
  339. package/dist/instrumentation/langgraph/index.d.ts +12 -0
  340. package/dist/instrumentation/langgraph/index.js +99 -0
  341. package/dist/instrumentation/langgraph/index.js.map +1 -0
  342. package/dist/instrumentation/langgraph/wrapper.d.ts +20 -0
  343. package/dist/instrumentation/langgraph/wrapper.js +620 -0
  344. package/dist/instrumentation/langgraph/wrapper.js.map +1 -0
  345. package/dist/instrumentation/letta/index.d.ts +10 -0
  346. package/dist/instrumentation/letta/index.js +122 -0
  347. package/dist/instrumentation/letta/index.js.map +1 -0
  348. package/dist/instrumentation/letta/utils.d.ts +24 -0
  349. package/dist/instrumentation/letta/utils.js +343 -0
  350. package/dist/instrumentation/letta/utils.js.map +1 -0
  351. package/dist/instrumentation/letta/wrapper.d.ts +37 -0
  352. package/dist/instrumentation/letta/wrapper.js +180 -0
  353. package/dist/instrumentation/letta/wrapper.js.map +1 -0
  354. package/dist/instrumentation/llamaindex/index.d.ts +36 -0
  355. package/dist/instrumentation/llamaindex/index.js +221 -0
  356. package/dist/instrumentation/llamaindex/index.js.map +1 -0
  357. package/dist/instrumentation/llamaindex/wrapper.d.ts +36 -0
  358. package/dist/instrumentation/llamaindex/wrapper.js +811 -0
  359. package/dist/instrumentation/llamaindex/wrapper.js.map +1 -0
  360. package/dist/instrumentation/mcp/index.d.ts +20 -0
  361. package/dist/instrumentation/mcp/index.js +282 -0
  362. package/dist/instrumentation/mcp/index.js.map +1 -0
  363. package/dist/instrumentation/mcp/wrapper.d.ts +72 -0
  364. package/dist/instrumentation/mcp/wrapper.js +571 -0
  365. package/dist/instrumentation/mcp/wrapper.js.map +1 -0
  366. package/dist/instrumentation/mem0/index.d.ts +17 -0
  367. package/dist/instrumentation/mem0/index.js +113 -0
  368. package/dist/instrumentation/mem0/index.js.map +1 -0
  369. package/dist/instrumentation/mem0/wrapper.d.ts +37 -0
  370. package/dist/instrumentation/mem0/wrapper.js +298 -0
  371. package/dist/instrumentation/mem0/wrapper.js.map +1 -0
  372. package/dist/instrumentation/milvus/index.d.ts +11 -0
  373. package/dist/instrumentation/milvus/index.js +67 -0
  374. package/dist/instrumentation/milvus/index.js.map +1 -0
  375. package/dist/instrumentation/milvus/wrapper.d.ts +15 -0
  376. package/dist/instrumentation/milvus/wrapper.js +219 -0
  377. package/dist/instrumentation/milvus/wrapper.js.map +1 -0
  378. package/dist/instrumentation/mistral/index.d.ts +11 -0
  379. package/dist/instrumentation/mistral/index.js +66 -0
  380. package/dist/instrumentation/mistral/index.js.map +1 -0
  381. package/dist/instrumentation/mistral/wrapper.d.ts +49 -0
  382. package/dist/instrumentation/mistral/wrapper.js +482 -0
  383. package/dist/instrumentation/mistral/wrapper.js.map +1 -0
  384. package/dist/instrumentation/ollama/index.d.ts +11 -0
  385. package/dist/instrumentation/ollama/index.js +72 -0
  386. package/dist/instrumentation/ollama/index.js.map +1 -0
  387. package/dist/instrumentation/ollama/wrapper.d.ts +73 -0
  388. package/dist/instrumentation/ollama/wrapper.js +629 -0
  389. package/dist/instrumentation/ollama/wrapper.js.map +1 -0
  390. package/dist/instrumentation/openai/index.d.ts +11 -0
  391. package/dist/instrumentation/openai/index.js +79 -0
  392. package/dist/instrumentation/openai/index.js.map +1 -0
  393. package/dist/instrumentation/openai/wrapper.d.ts +80 -0
  394. package/dist/instrumentation/openai/wrapper.js +1121 -0
  395. package/dist/instrumentation/openai/wrapper.js.map +1 -0
  396. package/dist/instrumentation/openai-agents/index.d.ts +20 -0
  397. package/dist/instrumentation/openai-agents/index.js +174 -0
  398. package/dist/instrumentation/openai-agents/index.js.map +1 -0
  399. package/dist/instrumentation/openai-agents/processor.d.ts +35 -0
  400. package/dist/instrumentation/openai-agents/processor.js +249 -0
  401. package/dist/instrumentation/openai-agents/processor.js.map +1 -0
  402. package/dist/instrumentation/openai-agents/utils.d.ts +20 -0
  403. package/dist/instrumentation/openai-agents/utils.js +624 -0
  404. package/dist/instrumentation/openai-agents/utils.js.map +1 -0
  405. package/dist/instrumentation/pg/index.d.ts +20 -0
  406. package/dist/instrumentation/pg/index.js +74 -0
  407. package/dist/instrumentation/pg/index.js.map +1 -0
  408. package/dist/instrumentation/pg/wrapper.d.ts +66 -0
  409. package/dist/instrumentation/pg/wrapper.js +441 -0
  410. package/dist/instrumentation/pg/wrapper.js.map +1 -0
  411. package/dist/instrumentation/pinecone/index.d.ts +11 -0
  412. package/dist/instrumentation/pinecone/index.js +79 -0
  413. package/dist/instrumentation/pinecone/index.js.map +1 -0
  414. package/dist/instrumentation/pinecone/wrapper.d.ts +14 -0
  415. package/dist/instrumentation/pinecone/wrapper.js +198 -0
  416. package/dist/instrumentation/pinecone/wrapper.js.map +1 -0
  417. package/dist/instrumentation/qdrant/index.d.ts +11 -0
  418. package/dist/instrumentation/qdrant/index.js +67 -0
  419. package/dist/instrumentation/qdrant/index.js.map +1 -0
  420. package/dist/instrumentation/qdrant/wrapper.d.ts +14 -0
  421. package/dist/instrumentation/qdrant/wrapper.js +213 -0
  422. package/dist/instrumentation/qdrant/wrapper.js.map +1 -0
  423. package/dist/instrumentation/replicate/index.d.ts +11 -0
  424. package/dist/instrumentation/replicate/index.js +57 -0
  425. package/dist/instrumentation/replicate/index.js.map +1 -0
  426. package/dist/instrumentation/replicate/wrapper.d.ts +28 -0
  427. package/dist/instrumentation/replicate/wrapper.js +242 -0
  428. package/dist/instrumentation/replicate/wrapper.js.map +1 -0
  429. package/dist/instrumentation/strands/index.d.ts +21 -0
  430. package/dist/instrumentation/strands/index.js +83 -0
  431. package/dist/instrumentation/strands/index.js.map +1 -0
  432. package/dist/instrumentation/strands/processor.d.ts +51 -0
  433. package/dist/instrumentation/strands/processor.js +625 -0
  434. package/dist/instrumentation/strands/processor.js.map +1 -0
  435. package/dist/instrumentation/strands/utils.d.ts +24 -0
  436. package/dist/instrumentation/strands/utils.js +373 -0
  437. package/dist/instrumentation/strands/utils.js.map +1 -0
  438. package/dist/instrumentation/together/index.d.ts +11 -0
  439. package/dist/instrumentation/together/index.js +43 -0
  440. package/dist/instrumentation/together/index.js.map +1 -0
  441. package/dist/instrumentation/together/wrapper.d.ts +48 -0
  442. package/dist/instrumentation/together/wrapper.js +409 -0
  443. package/dist/instrumentation/together/wrapper.js.map +1 -0
  444. package/dist/instrumentation/transformers/index.d.ts +35 -0
  445. package/dist/instrumentation/transformers/index.js +119 -0
  446. package/dist/instrumentation/transformers/index.js.map +1 -0
  447. package/dist/instrumentation/transformers/wrapper.d.ts +49 -0
  448. package/dist/instrumentation/transformers/wrapper.js +472 -0
  449. package/dist/instrumentation/transformers/wrapper.js.map +1 -0
  450. package/dist/instrumentation/vercel-ai/index.d.ts +10 -0
  451. package/dist/instrumentation/vercel-ai/index.js +59 -0
  452. package/dist/instrumentation/vercel-ai/index.js.map +1 -0
  453. package/dist/instrumentation/vercel-ai/wrapper.d.ts +50 -0
  454. package/dist/instrumentation/vercel-ai/wrapper.js +539 -0
  455. package/dist/instrumentation/vercel-ai/wrapper.js.map +1 -0
  456. package/dist/instrumentation/vertexai/index.d.ts +11 -0
  457. package/dist/instrumentation/vertexai/index.js +70 -0
  458. package/dist/instrumentation/vertexai/index.js.map +1 -0
  459. package/dist/instrumentation/vertexai/wrapper.d.ts +67 -0
  460. package/dist/instrumentation/vertexai/wrapper.js +530 -0
  461. package/dist/instrumentation/vertexai/wrapper.js.map +1 -0
  462. package/dist/instrumentation/vllm/index.d.ts +13 -0
  463. package/dist/instrumentation/vllm/index.js +67 -0
  464. package/dist/instrumentation/vllm/index.js.map +1 -0
  465. package/dist/instrumentation/vllm/wrapper.d.ts +60 -0
  466. package/dist/instrumentation/vllm/wrapper.js +482 -0
  467. package/dist/instrumentation/vllm/wrapper.js.map +1 -0
  468. package/dist/llm/anthropic.d.ts +5 -0
  469. package/dist/llm/anthropic.js +39 -0
  470. package/dist/llm/anthropic.js.map +1 -0
  471. package/dist/llm/index.d.ts +10 -0
  472. package/dist/llm/index.js +93 -0
  473. package/dist/llm/index.js.map +1 -0
  474. package/dist/llm/openai.d.ts +6 -0
  475. package/dist/llm/openai.js +52 -0
  476. package/dist/llm/openai.js.map +1 -0
  477. package/dist/llm/providers.d.ts +7 -0
  478. package/dist/llm/providers.js +10 -0
  479. package/dist/llm/providers.js.map +1 -0
  480. package/dist/manual-trace.d.ts +40 -0
  481. package/dist/manual-trace.js +103 -0
  482. package/dist/manual-trace.js.map +1 -0
  483. package/dist/otel/__tests__/metrics.test.d.ts +1 -0
  484. package/dist/otel/__tests__/metrics.test.js +40 -0
  485. package/dist/otel/__tests__/metrics.test.js.map +1 -0
  486. package/dist/otel/events.d.ts +11 -0
  487. package/dist/otel/events.js +74 -0
  488. package/dist/otel/events.js.map +1 -0
  489. package/dist/otel/metrics.d.ts +35 -0
  490. package/dist/otel/metrics.js +219 -0
  491. package/dist/otel/metrics.js.map +1 -0
  492. package/dist/otel/tracing.d.ts +12 -0
  493. package/dist/otel/tracing.js +93 -0
  494. package/dist/otel/tracing.js.map +1 -0
  495. package/dist/otel/utils.d.ts +11 -0
  496. package/dist/otel/utils.js +34 -0
  497. package/dist/otel/utils.js.map +1 -0
  498. package/dist/pricing.json +951 -0
  499. package/dist/prompt-hub.d.ts +4 -0
  500. package/dist/prompt-hub.js +66 -0
  501. package/dist/prompt-hub.js.map +1 -0
  502. package/dist/register.d.ts +4 -0
  503. package/dist/register.js +52 -0
  504. package/dist/register.js.map +1 -0
  505. package/dist/score/__tests__/score.test.d.ts +1 -0
  506. package/dist/score/__tests__/score.test.js +143 -0
  507. package/dist/score/__tests__/score.test.js.map +1 -0
  508. package/dist/score/index.d.ts +2 -0
  509. package/dist/score/index.js +6 -0
  510. package/dist/score/index.js.map +1 -0
  511. package/dist/score/score.d.ts +15 -0
  512. package/dist/score/score.js +135 -0
  513. package/dist/score/score.js.map +1 -0
  514. package/dist/semantic-convention.d.ts +555 -0
  515. package/dist/semantic-convention.js +630 -0
  516. package/dist/semantic-convention.js.map +1 -0
  517. package/dist/types.d.ts +131 -0
  518. package/dist/types.js +3 -0
  519. package/dist/types.js.map +1 -0
  520. package/package.json +136 -0
@@ -0,0 +1,1235 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.runWithFrameworkLlm = exports.Shield360CallbackHandler = void 0;
40
+ const api_1 = require("@opentelemetry/api");
41
+ const semantic_conventions_1 = require("@opentelemetry/semantic-conventions");
42
+ const config_1 = __importDefault(require("../../config"));
43
+ const helpers_1 = __importStar(require("../../helpers"));
44
+ Object.defineProperty(exports, "runWithFrameworkLlm", { enumerable: true, get: function () { return helpers_1.runWithFrameworkLlm; } });
45
+ const constant_1 = require("../../constant");
46
+ const semantic_convention_1 = __importDefault(require("../../semantic-convention"));
47
+ const base_wrapper_1 = __importDefault(require("../base-wrapper"));
48
+ // ---------------------------------------------------------------------------
49
+ // Provider detection (mirrors Python PROVIDER_MAP)
50
+ // ---------------------------------------------------------------------------
51
+ const PROVIDER_MAP = {
52
+ anthropic: 'anthropic',
53
+ azure: 'azure',
54
+ bedrock: 'aws.bedrock',
55
+ bedrock_converse: 'aws.bedrock',
56
+ cohere: 'cohere',
57
+ google: 'google',
58
+ google_genai: 'google',
59
+ google_vertexai: 'google',
60
+ groq: 'groq',
61
+ mistralai: 'mistral_ai',
62
+ ollama: 'ollama',
63
+ openai: 'openai',
64
+ together: 'together',
65
+ vertexai: 'google',
66
+ fireworks: 'fireworks',
67
+ perplexity: 'perplexity',
68
+ huggingface: 'huggingface',
69
+ deepinfra: 'deepinfra',
70
+ anyscale: 'anyscale',
71
+ };
72
+ function detectProvider(serialized) {
73
+ if (!serialized)
74
+ return semantic_convention_1.default.GEN_AI_SYSTEM_LANGCHAIN;
75
+ const classId = serialized.id || [];
76
+ if (Array.isArray(classId)) {
77
+ const classPath = classId.join('.').toLowerCase();
78
+ for (const [key, val] of Object.entries(PROVIDER_MAP)) {
79
+ if (classPath.includes(key))
80
+ return val;
81
+ }
82
+ }
83
+ return semantic_convention_1.default.GEN_AI_SYSTEM_LANGCHAIN;
84
+ }
85
+ // ---------------------------------------------------------------------------
86
+ // Model name extraction (mirrors Python extract_model_name)
87
+ // ---------------------------------------------------------------------------
88
+ const MODEL_PATHS_BY_ID = [
89
+ ['ChatGoogleGenerativeAI', ['kwargs', 'model'], 'serialized'],
90
+ ['ChatVertexAI', ['kwargs', 'model_name'], 'serialized'],
91
+ ['ChatMistralAI', ['kwargs', 'model'], 'serialized'],
92
+ ['OpenAI', ['invocation_params', 'model_name'], 'kwargs'],
93
+ ['ChatOpenAI', ['invocation_params', 'model_name'], 'kwargs'],
94
+ ['AzureChatOpenAI', ['invocation_params', 'model'], 'kwargs'],
95
+ ['AzureChatOpenAI', ['invocation_params', 'model_name'], 'kwargs'],
96
+ ['AzureChatOpenAI', ['invocation_params', 'azure_deployment'], 'kwargs'],
97
+ ['HuggingFacePipeline', ['invocation_params', 'model_id'], 'kwargs'],
98
+ ['BedrockChat', ['kwargs', 'model_id'], 'serialized'],
99
+ ['Bedrock', ['kwargs', 'model_id'], 'serialized'],
100
+ ['BedrockLLM', ['kwargs', 'model_id'], 'serialized'],
101
+ ['ChatBedrock', ['kwargs', 'model_id'], 'serialized'],
102
+ ['ChatBedrockConverse', ['kwargs', 'model_id'], 'serialized'],
103
+ ['LlamaCpp', ['invocation_params', 'model_path'], 'kwargs'],
104
+ ['WatsonxLLM', ['invocation_params', 'model_id'], 'kwargs'],
105
+ ];
106
+ const MODEL_PATTERNS = [
107
+ ['ChatAnthropic', 'model', 'anthropic'],
108
+ ['Anthropic', 'model', 'anthropic'],
109
+ ['ChatTongyi', 'model_name', null],
110
+ ['ChatCohere', 'model', null],
111
+ ['Cohere', 'model', null],
112
+ ['HuggingFaceHub', 'model', null],
113
+ ['ChatAnyscale', 'model_name', null],
114
+ ['TextGen', 'model', 'text-gen'],
115
+ ['Ollama', 'model', null],
116
+ ['OllamaLLM', 'model', null],
117
+ ['ChatOllama', 'model', null],
118
+ ['ChatFireworks', 'model', null],
119
+ ['ChatPerplexity', 'model', null],
120
+ ['VLLM', 'model', null],
121
+ ['Xinference', 'model_uid', null],
122
+ ['ChatOCIGenAI', 'model_id', null],
123
+ ['DeepInfra', 'model_id', null],
124
+ ];
125
+ const FALLBACK_PATHS = [
126
+ [['kwargs', 'model_name'], 'serialized'],
127
+ [['kwargs', 'model'], 'serialized'],
128
+ [['kwargs', 'model_id'], 'serialized'],
129
+ [['invocation_params', 'model_name'], 'kwargs'],
130
+ [['invocation_params', 'model'], 'kwargs'],
131
+ [['invocation_params', 'model_id'], 'kwargs'],
132
+ ];
133
+ function _extractByPath(serialized, kwargs, keys, selectFrom) {
134
+ let obj = selectFrom === 'kwargs' ? kwargs : serialized;
135
+ if (obj == null)
136
+ return null;
137
+ for (const key of keys) {
138
+ if (typeof obj === 'object' && obj !== null) {
139
+ obj = obj[key];
140
+ }
141
+ else {
142
+ return null;
143
+ }
144
+ if (obj == null)
145
+ return null;
146
+ }
147
+ return obj ? String(obj) : null;
148
+ }
149
+ function _getClassName(serialized) {
150
+ if (!serialized)
151
+ return null;
152
+ const id = serialized.id;
153
+ if (Array.isArray(id) && id.length > 0)
154
+ return id[id.length - 1];
155
+ return null;
156
+ }
157
+ function _extractModelFromRepr(serialized, pattern) {
158
+ if (!serialized)
159
+ return null;
160
+ const repr = serialized.repr || '';
161
+ if (repr) {
162
+ const re = new RegExp(`${pattern}='(.*?)'`);
163
+ const match = re.exec(repr);
164
+ if (match)
165
+ return match[1];
166
+ }
167
+ return null;
168
+ }
169
+ function extractModelName(serialized, kwargs) {
170
+ const className = _getClassName(serialized);
171
+ for (const [modelId, keys, selectFrom] of MODEL_PATHS_BY_ID) {
172
+ if (className === modelId) {
173
+ const result = _extractByPath(serialized, kwargs, keys, selectFrom);
174
+ if (result)
175
+ return result;
176
+ }
177
+ }
178
+ for (const [modelId, pattern, defaultVal] of MODEL_PATTERNS) {
179
+ if (className === modelId) {
180
+ const result = _extractModelFromRepr(serialized, pattern);
181
+ if (result)
182
+ return result;
183
+ if (defaultVal)
184
+ return defaultVal;
185
+ }
186
+ }
187
+ for (const [keys, selectFrom] of FALLBACK_PATHS) {
188
+ const result = _extractByPath(serialized, kwargs, keys, selectFrom);
189
+ if (result)
190
+ return result;
191
+ }
192
+ return className || 'unknown';
193
+ }
194
+ function extractModelParameters(kwargs) {
195
+ const params = {};
196
+ const ip = kwargs?.invocation_params || {};
197
+ const paramKeys = [
198
+ 'temperature', 'max_tokens', 'max_completion_tokens',
199
+ 'top_p', 'top_k', 'frequency_penalty', 'presence_penalty',
200
+ 'request_timeout', 'stop_sequences', 'seed',
201
+ ];
202
+ for (const key of paramKeys) {
203
+ if (ip[key] != null)
204
+ params[key] = ip[key];
205
+ }
206
+ return params;
207
+ }
208
+ // ---------------------------------------------------------------------------
209
+ // Chain type detection (mirrors Python)
210
+ // ---------------------------------------------------------------------------
211
+ const SKIP_CHAIN_CLASS_PREFIXES = new Set([
212
+ 'RunnableSequence', 'RunnableParallel', 'RunnableLambda',
213
+ 'RunnablePassthrough', 'RunnableAssign', 'RunnablePick',
214
+ 'RunnableBranch', 'RunnableEach', 'Prompt', 'PromptTemplate',
215
+ 'ChatPromptTemplate', 'MessagesPlaceholder',
216
+ 'SystemMessagePromptTemplate', 'HumanMessagePromptTemplate',
217
+ 'AIMessagePromptTemplate', 'BasePromptTemplate',
218
+ 'StrOutputParser', 'JsonOutputParser', 'PydanticOutputParser',
219
+ ]);
220
+ function isInternalChain(serialized, name) {
221
+ if (serialized?.id) {
222
+ const classPath = serialized.id;
223
+ if (Array.isArray(classPath) && classPath.length > 0) {
224
+ const cn = String(classPath[classPath.length - 1]);
225
+ if (SKIP_CHAIN_CLASS_PREFIXES.has(cn))
226
+ return true;
227
+ if (cn.startsWith('Runnable'))
228
+ return true;
229
+ }
230
+ }
231
+ if (SKIP_CHAIN_CLASS_PREFIXES.has(name))
232
+ return true;
233
+ return false;
234
+ }
235
+ function detectObservationType(serialized, callbackType, name) {
236
+ if (callbackType === 'tool')
237
+ return 'tool';
238
+ if (callbackType === 'retriever')
239
+ return 'retriever';
240
+ if (callbackType === 'llm')
241
+ return 'generation';
242
+ if (callbackType === 'chain') {
243
+ if (serialized?.id) {
244
+ const classPath = serialized.id;
245
+ if (classPath.some((part) => String(part).toLowerCase().includes('agent'))) {
246
+ return 'agent';
247
+ }
248
+ }
249
+ if (name && name.toLowerCase().includes('agent'))
250
+ return 'agent';
251
+ return 'chain';
252
+ }
253
+ return 'span';
254
+ }
255
+ // ---------------------------------------------------------------------------
256
+ // Message formatting helpers (mirrors Python utils.py)
257
+ // ---------------------------------------------------------------------------
258
+ const ROLE_MAP = helpers_1.LANGCHAIN_ROLE_MAP;
259
+ function buildInputMessagesFromLangChain(messages) {
260
+ try {
261
+ const structured = [];
262
+ for (const msgList of messages) {
263
+ for (const msg of msgList) {
264
+ const role = msg._getType?.() || msg.type || 'user';
265
+ const content = msg.content ?? String(msg);
266
+ const otelRole = ROLE_MAP[role] || 'user';
267
+ structured.push({ role: otelRole, parts: buildParts(content) });
268
+ }
269
+ }
270
+ return structured;
271
+ }
272
+ catch {
273
+ return [];
274
+ }
275
+ }
276
+ function buildInputMessagesFromPrompts(prompts) {
277
+ try {
278
+ return prompts.map(p => ({
279
+ role: 'user',
280
+ parts: [{ type: 'text', content: typeof p === 'string' ? p : String(p) }],
281
+ }));
282
+ }
283
+ catch {
284
+ return [];
285
+ }
286
+ }
287
+ function buildInputMessages(messagesOrPrompts) {
288
+ if (!messagesOrPrompts)
289
+ return [];
290
+ if (Array.isArray(messagesOrPrompts) && messagesOrPrompts.length > 0) {
291
+ const first = messagesOrPrompts[0];
292
+ if (typeof first === 'string')
293
+ return buildInputMessagesFromPrompts(messagesOrPrompts);
294
+ if (Array.isArray(first) && first.length > 0 && first[0]?.content !== undefined) {
295
+ return buildInputMessagesFromLangChain(messagesOrPrompts);
296
+ }
297
+ return buildInputMessagesFromPrompts(messagesOrPrompts);
298
+ }
299
+ return [];
300
+ }
301
+ function buildParts(content) {
302
+ if (typeof content === 'string')
303
+ return [{ type: 'text', content }];
304
+ if (Array.isArray(content)) {
305
+ const parts = [];
306
+ for (const part of content) {
307
+ if (typeof part === 'string') {
308
+ parts.push({ type: 'text', content: part });
309
+ }
310
+ else if (typeof part === 'object' && part !== null) {
311
+ const ptype = part.type || 'text';
312
+ if (ptype === 'text') {
313
+ parts.push({ type: 'text', content: part.text || '' });
314
+ }
315
+ else if (ptype === 'image_url') {
316
+ const url = part.image_url;
317
+ if (typeof url === 'string')
318
+ parts.push({ type: 'image', url });
319
+ else if (url?.url)
320
+ parts.push({ type: 'image', url: url.url });
321
+ }
322
+ else {
323
+ parts.push({ type: ptype, content: String(part) });
324
+ }
325
+ }
326
+ }
327
+ return parts.length > 0 ? parts : [{ type: 'text', content: '' }];
328
+ }
329
+ return [{ type: 'text', content: String(content) }];
330
+ }
331
+ function shouldCaptureMessageContent() {
332
+ return config_1.default.captureMessageContent ?? config_1.default.traceContent ?? true;
333
+ }
334
+ function normalizeToolCalls(rawToolCalls) {
335
+ return rawToolCalls.map((call) => ({
336
+ id: call?.id || call?.tool_call_id || '',
337
+ type: call?.type || 'function',
338
+ name: call?.name || call?.function?.name || '',
339
+ arguments: call?.args ?? call?.arguments ?? call?.function?.arguments ?? {},
340
+ }));
341
+ }
342
+ function stringifyToolCallArgument(value) {
343
+ if (typeof value === 'string')
344
+ return value;
345
+ try {
346
+ return JSON.stringify(value ?? {});
347
+ }
348
+ catch {
349
+ return '[unserializable]';
350
+ }
351
+ }
352
+ // ---------------------------------------------------------------------------
353
+ // Conversation ID extraction (mirrors Python _resolve_conversation_id)
354
+ // ---------------------------------------------------------------------------
355
+ function resolveConversationId(metadata) {
356
+ if (!metadata)
357
+ return null;
358
+ for (const key of ['thread_id', 'conversation_id', 'session_id']) {
359
+ if (metadata[key])
360
+ return String(metadata[key]);
361
+ }
362
+ const configurable = metadata.configurable || {};
363
+ for (const key of ['thread_id', 'conversation_id']) {
364
+ if (configurable[key])
365
+ return String(configurable[key]);
366
+ }
367
+ return null;
368
+ }
369
+ // ---------------------------------------------------------------------------
370
+ // Token calculation (approximate, mirrors Python general_tokens)
371
+ // ---------------------------------------------------------------------------
372
+ function generalTokens(text) {
373
+ return Math.ceil(text.length / 2);
374
+ }
375
+ // ---------------------------------------------------------------------------
376
+ // Callback Handler
377
+ // ---------------------------------------------------------------------------
378
+ let handlerInstance = null;
379
+ class Shield360CallbackHandler {
380
+ constructor(tracer) {
381
+ this.name = 'shield360_callback_handler';
382
+ this.lc_serializable = false;
383
+ this.awaitHandlers = false;
384
+ this.spans = new Map();
385
+ this.skippedRuns = new Map();
386
+ this.tracer = tracer;
387
+ }
388
+ // ---- Helpers -----------------------------------------------------------
389
+ _getNameFromCallback(serialized, kwargs) {
390
+ if (kwargs?.name)
391
+ return kwargs.name;
392
+ if (serialized) {
393
+ if (serialized.kwargs?.name)
394
+ return serialized.kwargs.name;
395
+ if (serialized.name)
396
+ return serialized.name;
397
+ if (serialized.id) {
398
+ const id = serialized.id;
399
+ if (Array.isArray(id) && id.length > 0)
400
+ return id[id.length - 1];
401
+ }
402
+ }
403
+ return 'unknown';
404
+ }
405
+ _resolveParentRunId(parentRunId) {
406
+ const visited = new Set();
407
+ let current = parentRunId;
408
+ while (current && this.skippedRuns.has(current)) {
409
+ if (visited.has(current))
410
+ break;
411
+ visited.add(current);
412
+ current = this.skippedRuns.get(current);
413
+ }
414
+ return current;
415
+ }
416
+ _getParentContext(parentRunId) {
417
+ const resolved = this._resolveParentRunId(parentRunId);
418
+ if (!resolved)
419
+ return undefined;
420
+ const holder = this.spans.get(resolved);
421
+ if (!holder)
422
+ return undefined;
423
+ return api_1.trace.setSpan(api_1.context.active(), holder.span);
424
+ }
425
+ _createSpan(runId, parentRunId, spanName, kind = api_1.SpanKind.INTERNAL) {
426
+ const resolved = this._resolveParentRunId(parentRunId);
427
+ let parentContext;
428
+ if (resolved && this.spans.has(resolved)) {
429
+ parentContext = api_1.trace.setSpan(api_1.context.active(), this.spans.get(resolved).span);
430
+ }
431
+ return this.tracer.startSpan(spanName, { kind }, parentContext);
432
+ }
433
+ _newHolder(span, parentRunId) {
434
+ return {
435
+ span,
436
+ startTime: Date.now(),
437
+ modelName: 'unknown',
438
+ modelParameters: {},
439
+ provider: '',
440
+ serverAddress: '',
441
+ serverPort: 0,
442
+ parentRunId,
443
+ children: [],
444
+ streamingContent: [],
445
+ tokenTimestamps: [],
446
+ inputTokens: 0,
447
+ outputTokens: 0,
448
+ cacheReadInputTokens: 0,
449
+ cacheCreationInputTokens: 0,
450
+ promptContent: '',
451
+ inputMessagesRaw: null,
452
+ prompts: [],
453
+ inputMessagesStructured: [],
454
+ systemInstructions: null,
455
+ toolDefinitions: null,
456
+ toolCalls: null,
457
+ finishReason: 'stop',
458
+ isAgentChain: false,
459
+ responseId: null,
460
+ suppressionActive: false,
461
+ };
462
+ }
463
+ _setCommonAttributes(span, operationType) {
464
+ span.setAttribute(semantic_convention_1.default.GEN_AI_OPERATION, operationType);
465
+ span.setAttribute(semantic_conventions_1.ATTR_TELEMETRY_SDK_NAME, constant_1.SDK_NAME);
466
+ span.setAttribute(semantic_convention_1.default.ATTR_DEPLOYMENT_ENVIRONMENT, config_1.default.environment || 'default');
467
+ span.setAttribute(semantic_conventions_1.ATTR_SERVICE_NAME, config_1.default.applicationName || 'default');
468
+ span.setAttribute(semantic_convention_1.default.GEN_AI_SDK_VERSION, constant_1.SDK_VERSION);
469
+ }
470
+ _setModelParameters(span, params) {
471
+ if (params.temperature != null)
472
+ span.setAttribute(semantic_convention_1.default.GEN_AI_REQUEST_TEMPERATURE, params.temperature);
473
+ if (params.max_tokens != null)
474
+ span.setAttribute(semantic_convention_1.default.GEN_AI_REQUEST_MAX_TOKENS, params.max_tokens);
475
+ if (params.max_completion_tokens != null)
476
+ span.setAttribute(semantic_convention_1.default.GEN_AI_REQUEST_MAX_TOKENS, params.max_completion_tokens);
477
+ if (params.top_p != null)
478
+ span.setAttribute(semantic_convention_1.default.GEN_AI_REQUEST_TOP_P, params.top_p);
479
+ if (params.top_k != null)
480
+ span.setAttribute(semantic_convention_1.default.GEN_AI_REQUEST_TOP_K, params.top_k);
481
+ if (params.frequency_penalty != null)
482
+ span.setAttribute(semantic_convention_1.default.GEN_AI_REQUEST_FREQUENCY_PENALTY, params.frequency_penalty);
483
+ if (params.presence_penalty != null)
484
+ span.setAttribute(semantic_convention_1.default.GEN_AI_REQUEST_PRESENCE_PENALTY, params.presence_penalty);
485
+ if (params.seed != null)
486
+ span.setAttribute(semantic_convention_1.default.GEN_AI_REQUEST_SEED, Number(params.seed));
487
+ const stop = params.stop || params.stop_sequences;
488
+ if (stop) {
489
+ span.setAttribute(semantic_convention_1.default.GEN_AI_REQUEST_STOP_SEQUENCES, Array.isArray(stop) ? stop : [stop]);
490
+ }
491
+ }
492
+ _endSpan(runId, error) {
493
+ const holder = this.spans.get(runId);
494
+ if (!holder)
495
+ return;
496
+ for (const childId of holder.children || []) {
497
+ const child = this.spans.get(childId);
498
+ if (child) {
499
+ try {
500
+ child.span.end();
501
+ }
502
+ catch { /* already ended */ }
503
+ }
504
+ }
505
+ if (error) {
506
+ holder.span.setStatus({ code: api_1.SpanStatusCode.ERROR, message: error });
507
+ }
508
+ else {
509
+ holder.span.setStatus({ code: api_1.SpanStatusCode.OK });
510
+ }
511
+ holder.span.end();
512
+ this.spans.delete(runId);
513
+ }
514
+ // ---- Chain Callbacks ---------------------------------------------------
515
+ handleChainStart(chain, inputs, runId, parentRunId, _tags, metadata, _runType, name) {
516
+ try {
517
+ const resolvedName = this._getNameFromCallback(chain, { name });
518
+ const obsType = detectObservationType(chain, 'chain', resolvedName);
519
+ if (obsType !== 'agent' && isInternalChain(chain, resolvedName)) {
520
+ this.skippedRuns.set(runId, parentRunId);
521
+ return;
522
+ }
523
+ if (obsType !== 'agent' && (0, helpers_1.isLangGraphActive)() && !parentRunId) {
524
+ this.skippedRuns.set(runId, parentRunId);
525
+ return;
526
+ }
527
+ if (obsType !== 'agent' && parentRunId) {
528
+ this.skippedRuns.set(runId, parentRunId);
529
+ return;
530
+ }
531
+ const operationType = obsType === 'agent'
532
+ ? semantic_convention_1.default.GEN_AI_OPERATION_TYPE_AGENT
533
+ : semantic_convention_1.default.GEN_AI_OPERATION_TYPE_FRAMEWORK;
534
+ const spanName = obsType === 'agent'
535
+ ? `invoke_agent ${resolvedName}`
536
+ : `invoke_workflow ${resolvedName}`;
537
+ const span = this._createSpan(runId, parentRunId, spanName);
538
+ const holder = this._newHolder(span, parentRunId);
539
+ if (obsType === 'agent')
540
+ holder.isAgentChain = true;
541
+ this.spans.set(runId, holder);
542
+ if (parentRunId) {
543
+ const parentResolved = this._resolveParentRunId(parentRunId);
544
+ if (parentResolved && this.spans.has(parentResolved)) {
545
+ this.spans.get(parentResolved).children.push(runId);
546
+ }
547
+ }
548
+ span.setAttribute(semantic_convention_1.default.GEN_AI_PROVIDER_NAME_OTEL, semantic_convention_1.default.GEN_AI_SYSTEM_LANGCHAIN);
549
+ this._setCommonAttributes(span, operationType);
550
+ if (obsType === 'agent') {
551
+ span.setAttribute(semantic_convention_1.default.GEN_AI_AGENT_NAME, resolvedName);
552
+ span.setAttribute(semantic_convention_1.default.GEN_AI_AGENT_ID, runId);
553
+ }
554
+ else {
555
+ span.setAttribute(semantic_convention_1.default.GEN_AI_WORKFLOW_NAME, resolvedName);
556
+ }
557
+ const convId = resolveConversationId(metadata);
558
+ if (convId)
559
+ span.setAttribute(semantic_convention_1.default.GEN_AI_CONVERSATION_ID, convId);
560
+ if (config_1.default.captureMessageContent && inputs) {
561
+ try {
562
+ const inputStr = typeof inputs === 'string' ? inputs : JSON.stringify(inputs);
563
+ span.setAttribute(semantic_convention_1.default.GEN_AI_WORKFLOW_INPUT, inputStr.slice(0, 2000));
564
+ }
565
+ catch { /* non-blocking */ }
566
+ }
567
+ (0, helpers_1.applyCustomSpanAttributes)(span);
568
+ }
569
+ catch { /* non-blocking */ }
570
+ }
571
+ handleChainEnd(outputs, runId) {
572
+ try {
573
+ this.skippedRuns.delete(runId);
574
+ const holder = this.spans.get(runId);
575
+ if (!holder)
576
+ return;
577
+ const duration = (Date.now() - holder.startTime) / 1000;
578
+ holder.span.setAttribute(semantic_convention_1.default.GEN_AI_CLIENT_OPERATION_DURATION, duration);
579
+ if (config_1.default.captureMessageContent && outputs) {
580
+ try {
581
+ const outputStr = typeof outputs === 'string' ? outputs : JSON.stringify(outputs);
582
+ holder.span.setAttribute(semantic_convention_1.default.GEN_AI_WORKFLOW_OUTPUT, outputStr.slice(0, 2000));
583
+ }
584
+ catch { /* non-blocking */ }
585
+ }
586
+ this._endSpan(runId);
587
+ }
588
+ catch { /* non-blocking */ }
589
+ }
590
+ handleChainError(error, runId) {
591
+ try {
592
+ this.skippedRuns.delete(runId);
593
+ if (this.spans.has(runId)) {
594
+ const span = this.spans.get(runId).span;
595
+ const errorType = error?.constructor?.name || '_OTHER';
596
+ span.setAttribute(semantic_convention_1.default.ERROR_TYPE, errorType);
597
+ }
598
+ this._endSpan(runId, String(error));
599
+ }
600
+ catch { /* non-blocking */ }
601
+ }
602
+ // ---- LLM Callbacks -----------------------------------------------------
603
+ handleChatModelStart(llm, messages, runId, parentRunId, _extraParams, _tags, metadata, kwargs) {
604
+ try {
605
+ const modelName = extractModelName(llm, kwargs || {});
606
+ const modelParams = extractModelParameters(kwargs || {});
607
+ const provider = detectProvider(llm);
608
+ const spanName = `chat ${modelName}`;
609
+ const span = this._createSpan(runId, parentRunId, spanName, api_1.SpanKind.CLIENT);
610
+ const holder = this._newHolder(span, parentRunId);
611
+ holder.modelName = modelName;
612
+ holder.modelParameters = modelParams;
613
+ holder.provider = provider;
614
+ holder.suppressionActive = true;
615
+ (0, helpers_1.setFrameworkLlmActive)();
616
+ (0, helpers_1.setFrameworkParentContext)(api_1.trace.setSpan(api_1.context.active(), span));
617
+ this.spans.set(runId, holder);
618
+ if (parentRunId) {
619
+ const parentResolved = this._resolveParentRunId(parentRunId);
620
+ if (parentResolved && this.spans.has(parentResolved)) {
621
+ this.spans.get(parentResolved).children.push(runId);
622
+ }
623
+ }
624
+ span.setAttribute(semantic_convention_1.default.GEN_AI_PROVIDER_NAME_OTEL, provider);
625
+ this._setCommonAttributes(span, semantic_convention_1.default.GEN_AI_OPERATION_TYPE_CHAT);
626
+ span.setAttribute(semantic_convention_1.default.GEN_AI_REQUEST_MODEL, modelName);
627
+ this._setModelParameters(span, modelParams);
628
+ const convId = resolveConversationId(metadata);
629
+ if (convId)
630
+ span.setAttribute(semantic_convention_1.default.GEN_AI_CONVERSATION_ID, convId);
631
+ // Server address from invocation_params or provider defaults
632
+ const ip = kwargs?.invocation_params || {};
633
+ const apiBase = ip.api_base || ip.base_url;
634
+ if (apiBase) {
635
+ try {
636
+ const url = new URL(apiBase);
637
+ holder.serverAddress = url.hostname || '';
638
+ holder.serverPort = url.port ? Number(url.port) : 443;
639
+ }
640
+ catch { /* ignore */ }
641
+ }
642
+ if (!holder.serverAddress) {
643
+ const [defaultHost, defaultPort] = (0, helpers_1.getServerAddressForProvider)(provider);
644
+ if (defaultHost) {
645
+ holder.serverAddress = defaultHost;
646
+ holder.serverPort = defaultPort;
647
+ }
648
+ }
649
+ if (messages) {
650
+ const formatted = [];
651
+ for (const msgList of messages) {
652
+ for (const msg of msgList) {
653
+ const role = msg._getType?.() || msg.type || 'unknown';
654
+ const content = msg.content ?? String(msg);
655
+ formatted.push(`${role}: ${content}`);
656
+ }
657
+ }
658
+ const promptStr = formatted.join('\n');
659
+ holder.promptContent = promptStr;
660
+ holder.inputTokens = generalTokens(promptStr);
661
+ holder.inputMessagesRaw = messages;
662
+ if (config_1.default.captureMessageContent) {
663
+ // System instructions
664
+ const sysInstructions = [];
665
+ for (const msgList of messages) {
666
+ for (const msg of msgList) {
667
+ const role = msg._getType?.() || msg.type || '';
668
+ if (role === 'system') {
669
+ const content = msg.content ?? '';
670
+ if (content)
671
+ sysInstructions.push({ type: 'text', content: String(content) });
672
+ }
673
+ }
674
+ }
675
+ if (sysInstructions.length > 0) {
676
+ holder.systemInstructions = sysInstructions;
677
+ span.setAttribute(semantic_convention_1.default.GEN_AI_SYSTEM_INSTRUCTIONS, JSON.stringify(sysInstructions));
678
+ }
679
+ // Tool definitions
680
+ const tools = ip.tools || ip.functions;
681
+ if (tools && Array.isArray(tools)) {
682
+ holder.toolDefinitions = tools;
683
+ span.setAttribute(semantic_convention_1.default.GEN_AI_TOOL_DEFINITIONS, JSON.stringify(tools));
684
+ }
685
+ // Structured input messages
686
+ try {
687
+ holder.inputMessagesStructured = buildInputMessages(messages);
688
+ }
689
+ catch { /* non-blocking */ }
690
+ }
691
+ }
692
+ (0, helpers_1.applyCustomSpanAttributes)(span);
693
+ }
694
+ catch { /* non-blocking */ }
695
+ }
696
+ handleLLMStart(serialized, prompts, runId, parentRunId, _extraParams, _tags, metadata, kwargs) {
697
+ try {
698
+ const modelName = extractModelName(serialized, kwargs || {});
699
+ const modelParams = extractModelParameters(kwargs || {});
700
+ const provider = detectProvider(serialized);
701
+ const spanName = `chat ${modelName}`;
702
+ const span = this._createSpan(runId, parentRunId, spanName, api_1.SpanKind.CLIENT);
703
+ const holder = this._newHolder(span, parentRunId);
704
+ holder.modelName = modelName;
705
+ holder.modelParameters = modelParams;
706
+ holder.provider = provider;
707
+ holder.prompts = prompts || [];
708
+ holder.suppressionActive = true;
709
+ (0, helpers_1.setFrameworkLlmActive)();
710
+ (0, helpers_1.setFrameworkParentContext)(api_1.trace.setSpan(api_1.context.active(), span));
711
+ this.spans.set(runId, holder);
712
+ if (parentRunId) {
713
+ const parentResolved = this._resolveParentRunId(parentRunId);
714
+ if (parentResolved && this.spans.has(parentResolved)) {
715
+ this.spans.get(parentResolved).children.push(runId);
716
+ }
717
+ }
718
+ span.setAttribute(semantic_convention_1.default.GEN_AI_PROVIDER_NAME_OTEL, provider);
719
+ this._setCommonAttributes(span, semantic_convention_1.default.GEN_AI_OPERATION_TYPE_CHAT);
720
+ span.setAttribute(semantic_convention_1.default.GEN_AI_REQUEST_MODEL, modelName);
721
+ this._setModelParameters(span, modelParams);
722
+ const convId = resolveConversationId(metadata);
723
+ if (convId)
724
+ span.setAttribute(semantic_convention_1.default.GEN_AI_CONVERSATION_ID, convId);
725
+ // Server address
726
+ const ip = kwargs?.invocation_params || {};
727
+ const apiBase = ip.api_base || ip.base_url;
728
+ if (apiBase) {
729
+ try {
730
+ const url = new URL(apiBase);
731
+ holder.serverAddress = url.hostname || '';
732
+ holder.serverPort = url.port ? Number(url.port) : 443;
733
+ }
734
+ catch { /* ignore */ }
735
+ }
736
+ if (!holder.serverAddress) {
737
+ const [defaultHost, defaultPort] = (0, helpers_1.getServerAddressForProvider)(provider);
738
+ if (defaultHost) {
739
+ holder.serverAddress = defaultHost;
740
+ holder.serverPort = defaultPort;
741
+ }
742
+ }
743
+ if (prompts && prompts.length > 0) {
744
+ const promptStr = prompts.join('\n');
745
+ holder.inputTokens = generalTokens(promptStr);
746
+ if (config_1.default.captureMessageContent) {
747
+ try {
748
+ holder.inputMessagesStructured = buildInputMessages(prompts);
749
+ }
750
+ catch { /* non-blocking */ }
751
+ }
752
+ }
753
+ (0, helpers_1.applyCustomSpanAttributes)(span);
754
+ }
755
+ catch { /* non-blocking */ }
756
+ }
757
+ handleLLMNewToken(token, _idx, runId, _chunk) {
758
+ try {
759
+ const holder = this.spans.get(runId);
760
+ if (!holder)
761
+ return;
762
+ const now = Date.now();
763
+ if (!holder.firstTokenTime)
764
+ holder.firstTokenTime = now;
765
+ holder.tokenTimestamps.push(now);
766
+ if (token)
767
+ holder.streamingContent.push(token);
768
+ }
769
+ catch { /* non-blocking */ }
770
+ }
771
+ handleLLMEnd(output, runId) {
772
+ try {
773
+ const holder = this.spans.get(runId);
774
+ if (!holder)
775
+ return;
776
+ const { span, startTime, modelName, modelParameters = {}, streamingContent = [], tokenTimestamps = [], firstTokenTime, } = holder;
777
+ const endTime = Date.now();
778
+ const duration = (endTime - startTime) / 1000;
779
+ span.setAttribute(semantic_convention_1.default.GEN_AI_CLIENT_OPERATION_DURATION, duration);
780
+ const isStreaming = streamingContent.length > 0;
781
+ let ttft = 0;
782
+ let tbt = 0;
783
+ if (isStreaming) {
784
+ if (firstTokenTime)
785
+ ttft = (firstTokenTime - startTime) / 1000;
786
+ if (tokenTimestamps.length > 1) {
787
+ const diffs = tokenTimestamps.slice(1).map((t, i) => t - tokenTimestamps[i]);
788
+ tbt = diffs.reduce((a, b) => a + b, 0) / diffs.length / 1000;
789
+ }
790
+ }
791
+ else {
792
+ ttft = duration;
793
+ }
794
+ // Extract tokens and content from output
795
+ let inputTokens = holder.inputTokens;
796
+ let outputTokens = 0;
797
+ let completionContent = streamingContent.join('');
798
+ let responseModel = modelName;
799
+ let responseId = null;
800
+ // From llm_output (top-level)
801
+ if (output?.llm_output) {
802
+ const lu = output.llm_output;
803
+ const tu = lu.token_usage || lu.usage || {};
804
+ inputTokens = tu.prompt_tokens || tu.input_tokens || inputTokens;
805
+ outputTokens = tu.completion_tokens || tu.output_tokens || outputTokens;
806
+ responseModel = lu.model_name || lu.model || modelName;
807
+ responseId = lu.id || null;
808
+ // Cache token extraction
809
+ const promptDetails = tu.prompt_tokens_details || tu.input_tokens_details || {};
810
+ let cached = promptDetails.cached_tokens || 0;
811
+ const inputDetails = tu.input_tokens_details || {};
812
+ let creation = inputDetails.cache_creation_tokens || 0;
813
+ const langchainInput = tu.input_token_details || {};
814
+ if (!cached)
815
+ cached = langchainInput.cache_read || 0;
816
+ if (!creation)
817
+ creation = langchainInput.cache_creation || 0;
818
+ holder.cacheReadInputTokens = cached;
819
+ holder.cacheCreationInputTokens = creation;
820
+ }
821
+ // From generations
822
+ const generations = output?.generations || [];
823
+ for (const genList of generations) {
824
+ for (const gen of (Array.isArray(genList) ? genList : [genList])) {
825
+ const msg = gen?.message || gen;
826
+ // Usage from usage_metadata
827
+ const um = msg?.usage_metadata;
828
+ if (um) {
829
+ if (!inputTokens)
830
+ inputTokens = um.input_tokens || um.prompt_tokens || 0;
831
+ if (!outputTokens)
832
+ outputTokens = um.output_tokens || um.completion_tokens || 0;
833
+ // Cache tokens from usage_metadata
834
+ const pd = um.prompt_tokens_details || um.input_tokens_details || {};
835
+ if (!holder.cacheReadInputTokens)
836
+ holder.cacheReadInputTokens = pd.cached_tokens || 0;
837
+ const langchainInput = um.input_token_details || {};
838
+ if (!holder.cacheReadInputTokens)
839
+ holder.cacheReadInputTokens = langchainInput.cache_read || 0;
840
+ if (!holder.cacheCreationInputTokens)
841
+ holder.cacheCreationInputTokens = langchainInput.cache_creation || 0;
842
+ }
843
+ // Token usage from response_metadata
844
+ if (msg?.response_metadata) {
845
+ const rm = msg.response_metadata;
846
+ const tokenUsage = rm.token_usage;
847
+ if (tokenUsage) {
848
+ inputTokens = tokenUsage.prompt_tokens || tokenUsage.input_tokens || inputTokens;
849
+ outputTokens = tokenUsage.completion_tokens || tokenUsage.output_tokens || outputTokens;
850
+ }
851
+ if (rm.usage) {
852
+ inputTokens = rm.usage.inputTokens || rm.usage.input_tokens || inputTokens;
853
+ outputTokens = rm.usage.outputTokens || rm.usage.output_tokens || outputTokens;
854
+ }
855
+ if (rm['amazon-bedrock-invocationMetrics']) {
856
+ const bm = rm['amazon-bedrock-invocationMetrics'];
857
+ inputTokens = bm.inputTokenCount || inputTokens;
858
+ outputTokens = bm.outputTokenCount || outputTokens;
859
+ }
860
+ }
861
+ // Content
862
+ const genContent = gen?.text || msg?.content;
863
+ if (genContent && typeof genContent === 'string' && genContent.length > completionContent.length) {
864
+ completionContent = genContent;
865
+ }
866
+ // Finish reason
867
+ const fr = gen?.generationInfo?.finish_reason || msg?.response_metadata?.finish_reason;
868
+ if (fr)
869
+ holder.finishReason = fr;
870
+ // Tool calls. Keep last-writer-wins semantics across generations so
871
+ // choices are not merged into one assistant message.
872
+ const tc = msg?.tool_calls || msg?.additional_kwargs?.tool_calls || gen?.message?.tool_calls;
873
+ if (tc && Array.isArray(tc) && tc.length > 0) {
874
+ holder.toolCalls = normalizeToolCalls(tc);
875
+ }
876
+ }
877
+ }
878
+ // Fallback token estimation
879
+ if (!outputTokens && completionContent)
880
+ outputTokens = generalTokens(completionContent);
881
+ if (!inputTokens && holder.promptContent)
882
+ inputTokens = generalTokens(holder.promptContent);
883
+ // Cost
884
+ const pricingInfo = config_1.default.pricingInfo || {};
885
+ // LangChain's normalized usage reports input_tokens as the sum of all
886
+ // input token types (uncached + cache read + cache creation), so flag the
887
+ // prompt tokens as cache-inclusive to avoid billing cached tokens twice.
888
+ const cost = helpers_1.default.getChatModelCost(modelName, pricingInfo, inputTokens, outputTokens, holder.cacheReadInputTokens || 0, holder.cacheCreationInputTokens || 0, true);
889
+ // Provider for span attributes
890
+ const provider = holder.provider || semantic_convention_1.default.GEN_AI_SYSTEM_LANGCHAIN;
891
+ const serverAddress = holder.serverAddress || '';
892
+ const serverPort = holder.serverPort || 0;
893
+ // Set span attributes
894
+ span.setAttribute(semantic_convention_1.default.GEN_AI_RESPONSE_MODEL, responseModel);
895
+ span.setAttribute(semantic_convention_1.default.GEN_AI_USAGE_INPUT_TOKENS, inputTokens);
896
+ span.setAttribute(semantic_convention_1.default.GEN_AI_USAGE_OUTPUT_TOKENS, outputTokens);
897
+ span.setAttribute(semantic_convention_1.default.GEN_AI_CLIENT_TOKEN_USAGE, inputTokens + outputTokens);
898
+ span.setAttribute(semantic_convention_1.default.GEN_AI_USAGE_COST, cost);
899
+ span.setAttribute(semantic_convention_1.default.GEN_AI_RESPONSE_FINISH_REASON, [holder.finishReason]);
900
+ span.setAttribute(semantic_convention_1.default.GEN_AI_OUTPUT_TYPE, typeof completionContent === 'string' ? 'text' : 'json');
901
+ span.setAttribute(semantic_convention_1.default.GEN_AI_REQUEST_IS_STREAM, isStreaming);
902
+ if (responseId)
903
+ span.setAttribute(semantic_convention_1.default.GEN_AI_RESPONSE_ID, responseId);
904
+ if (serverAddress) {
905
+ span.setAttribute(semantic_convention_1.default.SERVER_ADDRESS, serverAddress);
906
+ span.setAttribute(semantic_convention_1.default.SERVER_PORT, serverPort);
907
+ }
908
+ if (isStreaming && ttft > 0) {
909
+ span.setAttribute(semantic_convention_1.default.GEN_AI_SERVER_TTFT, ttft);
910
+ if (tbt > 0)
911
+ span.setAttribute(semantic_convention_1.default.GEN_AI_SERVER_TBT, tbt);
912
+ }
913
+ // Cache tokens
914
+ if (holder.cacheReadInputTokens) {
915
+ span.setAttribute(semantic_convention_1.default.GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS, holder.cacheReadInputTokens);
916
+ }
917
+ if (holder.cacheCreationInputTokens) {
918
+ span.setAttribute(semantic_convention_1.default.GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS, holder.cacheCreationInputTokens);
919
+ }
920
+ // Tool calls on span
921
+ if (holder.toolCalls && holder.toolCalls.length > 0) {
922
+ const names = holder.toolCalls.map((t) => t.name || t.function?.name || '').filter(Boolean);
923
+ const ids = holder.toolCalls.map((t) => t.id || '').filter(Boolean);
924
+ const args = holder.toolCalls.map((t) => stringifyToolCallArgument(t.arguments ?? t.function?.arguments));
925
+ if (names.length)
926
+ span.setAttribute(semantic_convention_1.default.GEN_AI_TOOL_NAME, names.join(', '));
927
+ if (ids.length)
928
+ span.setAttribute(semantic_convention_1.default.GEN_AI_TOOL_CALL_ID, ids.join(', '));
929
+ if (args.length)
930
+ span.setAttribute(semantic_convention_1.default.GEN_AI_TOOL_CALL_ARGUMENTS, args);
931
+ }
932
+ let outputMessagesJson = null;
933
+ // Content attributes (gated by captureMessageContent)
934
+ if (shouldCaptureMessageContent()) {
935
+ const inputRaw = holder.inputMessagesRaw || holder.prompts || [];
936
+ const inputMessagesStructured = holder.inputMessagesStructured || [];
937
+ const inputMsgs = inputMessagesStructured.length > 0
938
+ ? inputMessagesStructured
939
+ : buildInputMessages(inputRaw);
940
+ const outputToolCalls = holder.toolCalls && holder.toolCalls.length > 0 ? holder.toolCalls : undefined;
941
+ outputMessagesJson = helpers_1.default.buildOutputMessages(completionContent, holder.finishReason, outputToolCalls);
942
+ if (inputMsgs.length > 0)
943
+ span.setAttribute(semantic_convention_1.default.GEN_AI_INPUT_MESSAGES, JSON.stringify(inputMsgs));
944
+ if (outputMessagesJson && (outputMessagesJson !== '[]' || completionContent || outputToolCalls)) {
945
+ span.setAttribute(semantic_convention_1.default.GEN_AI_OUTPUT_MESSAGES, outputMessagesJson);
946
+ }
947
+ }
948
+ // Emit inference event (always emitted; content within is gated)
949
+ const eventAttrs = {
950
+ [semantic_convention_1.default.GEN_AI_OPERATION]: semantic_convention_1.default.GEN_AI_OPERATION_TYPE_CHAT,
951
+ [semantic_convention_1.default.GEN_AI_REQUEST_MODEL]: modelName,
952
+ [semantic_convention_1.default.GEN_AI_RESPONSE_MODEL]: responseModel,
953
+ [semantic_convention_1.default.GEN_AI_USAGE_INPUT_TOKENS]: inputTokens,
954
+ [semantic_convention_1.default.GEN_AI_USAGE_OUTPUT_TOKENS]: outputTokens,
955
+ [semantic_convention_1.default.GEN_AI_RESPONSE_FINISH_REASON]: [holder.finishReason],
956
+ [semantic_convention_1.default.GEN_AI_OUTPUT_TYPE]: typeof completionContent === 'string' ? 'text' : 'json',
957
+ };
958
+ if (serverAddress)
959
+ eventAttrs[semantic_convention_1.default.SERVER_ADDRESS] = serverAddress;
960
+ if (serverPort)
961
+ eventAttrs[semantic_convention_1.default.SERVER_PORT] = serverPort;
962
+ if (responseId)
963
+ eventAttrs[semantic_convention_1.default.GEN_AI_RESPONSE_ID] = responseId;
964
+ if (shouldCaptureMessageContent()) {
965
+ const inputRaw = holder.inputMessagesRaw || holder.prompts || [];
966
+ const inputMessagesStructured = holder.inputMessagesStructured || [];
967
+ const inputMsgs = inputMessagesStructured.length > 0
968
+ ? inputMessagesStructured
969
+ : buildInputMessages(inputRaw);
970
+ if (inputMsgs.length > 0)
971
+ eventAttrs[semantic_convention_1.default.GEN_AI_INPUT_MESSAGES] = JSON.stringify(inputMsgs);
972
+ if (outputMessagesJson && outputMessagesJson !== '[]')
973
+ eventAttrs[semantic_convention_1.default.GEN_AI_OUTPUT_MESSAGES] = outputMessagesJson;
974
+ if (holder.systemInstructions) {
975
+ eventAttrs[semantic_convention_1.default.GEN_AI_SYSTEM_INSTRUCTIONS] = JSON.stringify(holder.systemInstructions);
976
+ }
977
+ if (holder.toolDefinitions) {
978
+ eventAttrs[semantic_convention_1.default.GEN_AI_TOOL_DEFINITIONS] = JSON.stringify(holder.toolDefinitions);
979
+ }
980
+ // Request params for event
981
+ for (const [k, attr] of [
982
+ ['temperature', semantic_convention_1.default.GEN_AI_REQUEST_TEMPERATURE],
983
+ ['top_p', semantic_convention_1.default.GEN_AI_REQUEST_TOP_P],
984
+ ['frequency_penalty', semantic_convention_1.default.GEN_AI_REQUEST_FREQUENCY_PENALTY],
985
+ ['presence_penalty', semantic_convention_1.default.GEN_AI_REQUEST_PRESENCE_PENALTY],
986
+ ]) {
987
+ if (modelParameters[k] != null)
988
+ eventAttrs[attr] = modelParameters[k];
989
+ }
990
+ const maxT = modelParameters.max_tokens || modelParameters.max_completion_tokens;
991
+ if (maxT != null)
992
+ eventAttrs[semantic_convention_1.default.GEN_AI_REQUEST_MAX_TOKENS] = maxT;
993
+ }
994
+ if (typeof helpers_1.default.emitInferenceEvent === 'function') {
995
+ helpers_1.default.emitInferenceEvent(span, eventAttrs);
996
+ }
997
+ // Record metrics
998
+ const metricParams = {
999
+ genAIEndpoint: 'langchain.chat_model',
1000
+ model: responseModel,
1001
+ cost,
1002
+ aiSystem: provider,
1003
+ serverAddress,
1004
+ serverPort,
1005
+ };
1006
+ base_wrapper_1.default.recordMetrics(span, metricParams);
1007
+ if (holder.suppressionActive) {
1008
+ (0, helpers_1.resetFrameworkLlmActive)();
1009
+ (0, helpers_1.clearFrameworkParentContext)();
1010
+ }
1011
+ this._endSpan(runId);
1012
+ }
1013
+ catch { /* non-blocking */ }
1014
+ }
1015
+ handleLLMError(error, runId) {
1016
+ try {
1017
+ const holder = this.spans.get(runId);
1018
+ if (!holder)
1019
+ return;
1020
+ if (holder.suppressionActive) {
1021
+ (0, helpers_1.resetFrameworkLlmActive)();
1022
+ (0, helpers_1.clearFrameworkParentContext)();
1023
+ }
1024
+ const errorType = error?.constructor?.name || '_OTHER';
1025
+ holder.span.setAttribute(semantic_convention_1.default.ERROR_TYPE, errorType);
1026
+ helpers_1.default.handleException(holder.span, error instanceof Error ? error : new Error(String(error)));
1027
+ this._endSpan(runId, String(error));
1028
+ }
1029
+ catch { /* non-blocking */ }
1030
+ }
1031
+ // ---- Tool Callbacks ----------------------------------------------------
1032
+ handleToolStart(tool, input, runId, parentRunId, _tags, metadata, kwargs) {
1033
+ try {
1034
+ const name = this._getNameFromCallback(tool, kwargs || {});
1035
+ const spanName = `execute_tool ${name}`;
1036
+ const span = this._createSpan(runId, parentRunId, spanName);
1037
+ const holder = this._newHolder(span, parentRunId);
1038
+ this.spans.set(runId, holder);
1039
+ if (parentRunId) {
1040
+ const parentResolved = this._resolveParentRunId(parentRunId);
1041
+ if (parentResolved && this.spans.has(parentResolved)) {
1042
+ this.spans.get(parentResolved).children.push(runId);
1043
+ }
1044
+ }
1045
+ span.setAttribute(semantic_convention_1.default.GEN_AI_PROVIDER_NAME_OTEL, semantic_convention_1.default.GEN_AI_SYSTEM_LANGCHAIN);
1046
+ this._setCommonAttributes(span, semantic_convention_1.default.GEN_AI_OPERATION_TYPE_TOOLS);
1047
+ span.setAttribute(semantic_convention_1.default.GEN_AI_TOOL_NAME, name);
1048
+ span.setAttribute(semantic_convention_1.default.GEN_AI_TOOL_TYPE_OTEL, 'function');
1049
+ span.setAttribute(semantic_convention_1.default.GEN_AI_TOOL_CALL_ID, runId);
1050
+ const description = tool?.description;
1051
+ if (description)
1052
+ span.setAttribute(semantic_convention_1.default.GEN_AI_TOOL_DESCRIPTION, String(description));
1053
+ const convId = resolveConversationId(metadata);
1054
+ if (convId)
1055
+ span.setAttribute(semantic_convention_1.default.GEN_AI_CONVERSATION_ID, convId);
1056
+ if (config_1.default.captureMessageContent && input) {
1057
+ span.setAttribute(semantic_convention_1.default.GEN_AI_TOOL_CALL_ARGUMENTS, String(input).slice(0, 2000));
1058
+ }
1059
+ (0, helpers_1.applyCustomSpanAttributes)(span);
1060
+ }
1061
+ catch { /* non-blocking */ }
1062
+ }
1063
+ handleToolEnd(output, runId) {
1064
+ try {
1065
+ const holder = this.spans.get(runId);
1066
+ if (!holder)
1067
+ return;
1068
+ const duration = (Date.now() - holder.startTime) / 1000;
1069
+ holder.span.setAttribute(semantic_convention_1.default.GEN_AI_CLIENT_OPERATION_DURATION, duration);
1070
+ // Extract tool_call_id from output if available
1071
+ if (output?.tool_call_id) {
1072
+ holder.span.setAttribute(semantic_convention_1.default.GEN_AI_TOOL_CALL_ID, output.tool_call_id);
1073
+ }
1074
+ if (config_1.default.captureMessageContent && output) {
1075
+ holder.span.setAttribute(semantic_convention_1.default.GEN_AI_TOOL_CALL_RESULT, String(output).slice(0, 2000));
1076
+ }
1077
+ this._endSpan(runId);
1078
+ }
1079
+ catch { /* non-blocking */ }
1080
+ }
1081
+ handleToolError(error, runId) {
1082
+ try {
1083
+ if (this.spans.has(runId)) {
1084
+ const span = this.spans.get(runId).span;
1085
+ const errorType = error?.constructor?.name || '_OTHER';
1086
+ span.setAttribute(semantic_convention_1.default.ERROR_TYPE, errorType);
1087
+ }
1088
+ this._endSpan(runId, String(error));
1089
+ }
1090
+ catch { /* non-blocking */ }
1091
+ }
1092
+ // ---- Retriever Callbacks -----------------------------------------------
1093
+ handleRetrieverStart(retriever, query, runId, parentRunId, _tags, metadata, kwargs) {
1094
+ try {
1095
+ const name = this._getNameFromCallback(retriever, kwargs || {});
1096
+ const spanName = `retrieval ${name}`;
1097
+ const span = this._createSpan(runId, parentRunId, spanName, api_1.SpanKind.CLIENT);
1098
+ const holder = this._newHolder(span, parentRunId);
1099
+ this.spans.set(runId, holder);
1100
+ if (parentRunId) {
1101
+ const parentResolved = this._resolveParentRunId(parentRunId);
1102
+ if (parentResolved && this.spans.has(parentResolved)) {
1103
+ this.spans.get(parentResolved).children.push(runId);
1104
+ }
1105
+ }
1106
+ span.setAttribute(semantic_convention_1.default.GEN_AI_PROVIDER_NAME_OTEL, semantic_convention_1.default.GEN_AI_SYSTEM_LANGCHAIN);
1107
+ this._setCommonAttributes(span, semantic_convention_1.default.GEN_AI_OPERATION_TYPE_RETRIEVE);
1108
+ span.setAttribute(semantic_convention_1.default.GEN_AI_DATA_SOURCE_ID, name);
1109
+ const convId = resolveConversationId(metadata);
1110
+ if (convId)
1111
+ span.setAttribute(semantic_convention_1.default.GEN_AI_CONVERSATION_ID, convId);
1112
+ if (config_1.default.captureMessageContent && query) {
1113
+ span.setAttribute(semantic_convention_1.default.GEN_AI_RETRIEVAL_QUERY_TEXT, String(query).slice(0, 2000));
1114
+ }
1115
+ (0, helpers_1.applyCustomSpanAttributes)(span);
1116
+ }
1117
+ catch { /* non-blocking */ }
1118
+ }
1119
+ handleRetrieverEnd(documents, runId) {
1120
+ try {
1121
+ const holder = this.spans.get(runId);
1122
+ if (!holder)
1123
+ return;
1124
+ const duration = (Date.now() - holder.startTime) / 1000;
1125
+ holder.span.setAttribute(semantic_convention_1.default.GEN_AI_CLIENT_OPERATION_DURATION, duration);
1126
+ holder.span.setAttribute(semantic_convention_1.default.GEN_AI_RETRIEVAL_DOCUMENT_COUNT, documents?.length || 0);
1127
+ if (config_1.default.captureMessageContent && documents?.length > 0) {
1128
+ const structured = documents.slice(0, 3).map((doc) => {
1129
+ const content = doc?.pageContent || doc?.page_content || String(doc);
1130
+ const entry = { content: String(content).slice(0, 2000) };
1131
+ const meta = doc?.metadata;
1132
+ if (meta) {
1133
+ const docId = meta.id || meta.source;
1134
+ if (docId)
1135
+ entry.id = String(docId);
1136
+ }
1137
+ return entry;
1138
+ });
1139
+ holder.span.setAttribute(semantic_convention_1.default.GEN_AI_RETRIEVAL_DOCUMENTS, JSON.stringify(structured));
1140
+ }
1141
+ this._endSpan(runId);
1142
+ }
1143
+ catch { /* non-blocking */ }
1144
+ }
1145
+ handleRetrieverError(error, runId) {
1146
+ try {
1147
+ if (this.spans.has(runId)) {
1148
+ const span = this.spans.get(runId).span;
1149
+ const errorType = error?.constructor?.name || '_OTHER';
1150
+ span.setAttribute(semantic_convention_1.default.ERROR_TYPE, errorType);
1151
+ }
1152
+ this._endSpan(runId, String(error));
1153
+ }
1154
+ catch { /* non-blocking */ }
1155
+ }
1156
+ // ---- Agent Callbacks ---------------------------------------------------
1157
+ handleAgentAction(action, runId) {
1158
+ try {
1159
+ const holder = this.spans.get(runId);
1160
+ if (!holder)
1161
+ return;
1162
+ holder.span.setAttribute(semantic_convention_1.default.GEN_AI_OPERATION, semantic_convention_1.default.GEN_AI_OPERATION_TYPE_AGENT);
1163
+ if (config_1.default.captureMessageContent) {
1164
+ const tool = action?.tool ?? String(action);
1165
+ const toolInput = action?.tool_input ?? '';
1166
+ const log = action?.log ?? '';
1167
+ holder.span.setAttribute(semantic_convention_1.default.GEN_AI_AGENT_ACTION_TOOL, String(tool).slice(0, 2000));
1168
+ holder.span.setAttribute(semantic_convention_1.default.GEN_AI_AGENT_ACTION_TOOL_INPUT, String(toolInput).slice(0, 2000));
1169
+ if (log)
1170
+ holder.span.setAttribute(semantic_convention_1.default.GEN_AI_AGENT_ACTION_LOG, String(log).slice(0, 2000));
1171
+ }
1172
+ }
1173
+ catch { /* non-blocking */ }
1174
+ }
1175
+ handleAgentFinish(finish, runId) {
1176
+ try {
1177
+ const holder = this.spans.get(runId);
1178
+ if (!holder)
1179
+ return;
1180
+ if (config_1.default.captureMessageContent) {
1181
+ const output = finish?.return_values ?? String(finish);
1182
+ const log = finish?.log ?? '';
1183
+ holder.span.setAttribute(semantic_convention_1.default.GEN_AI_AGENT_FINISH_OUTPUT, String(output).slice(0, 2000));
1184
+ if (log)
1185
+ holder.span.setAttribute(semantic_convention_1.default.GEN_AI_AGENT_FINISH_LOG, String(log).slice(0, 2000));
1186
+ }
1187
+ }
1188
+ catch { /* non-blocking */ }
1189
+ }
1190
+ }
1191
+ exports.Shield360CallbackHandler = Shield360CallbackHandler;
1192
+ // ---------------------------------------------------------------------------
1193
+ // Wrapper factory that patches CallbackManager._configureSync
1194
+ // ---------------------------------------------------------------------------
1195
+ class LangChainWrapper extends base_wrapper_1.default {
1196
+ static _patchConfigure(tracer) {
1197
+ if (!handlerInstance) {
1198
+ handlerInstance = new Shield360CallbackHandler(tracer);
1199
+ }
1200
+ const handler = handlerInstance;
1201
+ /**
1202
+ * The LLM call itself must run inside runWithFrameworkLlm() so that
1203
+ * provider wrappers (OpenAI, Anthropic, etc.) skip their own span
1204
+ * creation. We achieve this by wrapping _configureSync: when
1205
+ * LangChain configures callbacks for an LLM call, the callback
1206
+ * handler's handleChatModelStart/handleLLMStart already sets the
1207
+ * suppression flag via the span holder. But to actually suppress
1208
+ * the provider wrapper, we need the flag in the AsyncLocalStorage
1209
+ * context of the LLM call. Since LangChain doesn't give us a
1210
+ * hook around the actual LLM invocation, we rely on the provider
1211
+ * wrappers checking isFrameworkLlmActive() which is set during
1212
+ * the configure phase and active throughout the call chain.
1213
+ */
1214
+ return (originalConfigure) => {
1215
+ return function (inheritableHandlers, ...rest) {
1216
+ if (Array.isArray(inheritableHandlers) || !inheritableHandlers) {
1217
+ const handlers = inheritableHandlers ? [...inheritableHandlers] : [];
1218
+ if (!handlers.some((h) => h?.name === 'shield360_callback_handler')) {
1219
+ handlers.unshift(handler);
1220
+ }
1221
+ return originalConfigure.call(this, handlers, ...rest);
1222
+ }
1223
+ else {
1224
+ const cbManager = inheritableHandlers;
1225
+ if (cbManager?.handlers && !cbManager.handlers.some((h) => h?.name === 'shield360_callback_handler')) {
1226
+ cbManager.addHandler(handler, true);
1227
+ }
1228
+ return originalConfigure.call(this, cbManager, ...rest);
1229
+ }
1230
+ };
1231
+ };
1232
+ }
1233
+ }
1234
+ exports.default = LangChainWrapper;
1235
+ //# sourceMappingURL=wrapper.js.map