@unbrained/pm-cli 2026.10.17 → 2026.10.18

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 (188) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +25 -0
  3. package/dist/cli/register-list-query.js +2 -2
  4. package/dist/cli-bundle/bundle-manifest.json +1 -1
  5. package/dist/cli-bundle/chunks/{chunk-3QKI3XNX.js → chunk-4GA4MUTE.js} +2 -2
  6. package/dist/cli-bundle/chunks/{chunk-X2ONXFBP.js → chunk-4V6ONLI6.js} +2 -2
  7. package/dist/cli-bundle/chunks/{chunk-B5QVGCZX.js → chunk-6VZKYJW7.js} +2 -2
  8. package/dist/cli-bundle/chunks/chunk-7PATQWTH.js +20 -0
  9. package/dist/cli-bundle/chunks/{chunk-W3KZ22DW.js → chunk-7WIEAGDS.js} +2 -2
  10. package/dist/cli-bundle/chunks/{chunk-EA2CG7UM.js → chunk-AETP4JEM.js} +2 -2
  11. package/dist/cli-bundle/chunks/{chunk-6ZDKKOKM.js → chunk-FIJOSX2C.js} +2 -2
  12. package/dist/cli-bundle/chunks/{chunk-VMCSTFSO.js → chunk-LUKVNL72.js} +2 -2
  13. package/dist/cli-bundle/chunks/{chunk-J4LPQCET.js → chunk-OJ77ZQN3.js} +2 -2
  14. package/dist/cli-bundle/chunks/{chunk-O4YBC3OM.js → chunk-PYRREEUB.js} +30 -30
  15. package/dist/cli-bundle/chunks/chunk-RHQJ6VWC.js +237 -0
  16. package/dist/cli-bundle/chunks/{chunk-OZCSXX4D.js → chunk-RNABUEFB.js} +2 -2
  17. package/dist/cli-bundle/chunks/{chunk-HY7FQ7QX.js → chunk-TO6CIV4C.js} +2 -2
  18. package/dist/cli-bundle/chunks/{chunk-JS3B2M4D.js → chunk-ZZED447K.js} +2 -2
  19. package/dist/cli-bundle/chunks/{register-list-query-RU3QZSAQ.js → register-list-query-PUCVYYBD.js} +7 -7
  20. package/dist/cli-bundle/chunks/{register-mutation-EQYMT32A.js → register-mutation-GGGVBXD5.js} +2 -2
  21. package/dist/cli-bundle/chunks/{register-operations-VXBGE4XI.js → register-operations-NRZ6Q4QE.js} +2 -2
  22. package/dist/cli-bundle/chunks/{register-setup-UUDEGFRO.js → register-setup-MV3P3YSF.js} +2 -2
  23. package/dist/cli-bundle/focused-chunks/{chunk-LDKX4KYJ.js → chunk-2MPQUMTF.js} +2 -2
  24. package/dist/cli-bundle/focused-chunks/{chunk-MBQF6HT6.js → chunk-5UKCSZWT.js} +2 -2
  25. package/dist/cli-bundle/focused-chunks/{chunk-FTUZ3JF2.js → chunk-A4ZHHTEX.js} +2 -2
  26. package/dist/cli-bundle/focused-chunks/{chunk-JXR6UKFM.js → chunk-B4YLP5ZB.js} +2 -2
  27. package/dist/cli-bundle/focused-chunks/{chunk-NZO7GOXD.js → chunk-BFEMT5U3.js} +16 -16
  28. package/dist/cli-bundle/focused-chunks/{chunk-QOSVJDOO.js → chunk-FW7CSSKL.js} +61 -61
  29. package/dist/cli-bundle/focused-chunks/{chunk-AH6NX6GM.js → chunk-HYPRPSYD.js} +2 -2
  30. package/dist/cli-bundle/focused-chunks/{chunk-RBLSY6ML.js → chunk-IRVL4UXR.js} +2 -2
  31. package/dist/cli-bundle/focused-chunks/{chunk-RHTH5ILM.js → chunk-L55KQ2KT.js} +2 -2
  32. package/dist/cli-bundle/focused-chunks/{chunk-PYC7BF6Z.js → chunk-MASIOFPG.js} +2 -2
  33. package/dist/cli-bundle/focused-chunks/chunk-RJ3EIHDU.js +26 -0
  34. package/dist/cli-bundle/focused-chunks/chunk-SEL4Z2OO.js +167 -0
  35. package/dist/cli-bundle/focused-chunks/{chunk-2IOHHNRT.js → chunk-TB7F4FCR.js} +2 -2
  36. package/dist/cli-bundle/focused-chunks/{chunk-UNTQE37U.js → chunk-TZUIBG3P.js} +2 -2
  37. package/dist/cli-bundle/focused-chunks/{chunk-E33QA7PK.js → chunk-Z7YIFCNE.js} +2 -2
  38. package/dist/cli-bundle/focused-chunks/{chunk-SIGIGZCG.js → chunk-ZDBS2DCT.js} +2 -2
  39. package/dist/cli-bundle/main.js +2 -2
  40. package/dist/cli-bundle/sdk-authoring.js +1 -1
  41. package/dist/cli-bundle/sdk-contracts.js +1 -1
  42. package/dist/cli-bundle/sdk-core.js +16 -16
  43. package/dist/cli-bundle/sdk-governance.js +1 -1
  44. package/dist/cli-bundle/sdk-graph.js +1 -1
  45. package/dist/cli-bundle/sdk-merge.js +50 -49
  46. package/dist/cli-bundle/sdk-query.js +1 -1
  47. package/dist/cli-bundle/sdk-runtime.js +1 -1
  48. package/dist/cli-bundle/sdk-testing.js +1 -1
  49. package/dist/cli-bundle/sdk.js +1 -1
  50. package/dist/core/history/event-index.d.ts +8 -1
  51. package/dist/core/history/event-index.js +19 -18
  52. package/dist/core/item/item-format.js +1 -1
  53. package/dist/core/lock/lock.d.ts +8 -1
  54. package/dist/core/lock/lock.js +3 -3
  55. package/dist/core/output/output.js +2 -2
  56. package/dist/core/store/paths.js +1 -1
  57. package/dist/core/telemetry/policy.d.ts +2 -0
  58. package/dist/core/telemetry/policy.js +1 -1
  59. package/dist/core/telemetry/runtime.d.ts +5 -3
  60. package/dist/core/telemetry/runtime.js +3 -3
  61. package/dist/sdk/governance/health/projection.d.ts +37 -0
  62. package/dist/sdk/governance/health/projection.js +2 -0
  63. package/dist/sdk/governance/health.d.ts +7 -18
  64. package/dist/sdk/governance/health.js +2 -2
  65. package/dist/sdk/mutation-events.js +1 -1
  66. package/dist/sdk/public-surface.json +1 -1
  67. package/dist/sdk/query/list.d.ts +2 -0
  68. package/dist/sdk/query/list.js +1 -1
  69. package/dist/types.d.ts +2 -2
  70. package/dist/types.js +1 -1
  71. package/docs/COMMANDS.md +26 -0
  72. package/docs/CONFIGURATION.md +22 -1
  73. package/docs/DEVELOPMENT_DEPENDENCY_SECURITY.md +22 -3
  74. package/docs/OUTPUT_PROJECTION_CONTRACTS.md +10 -0
  75. package/docs/RELEASING.md +8 -1
  76. package/docs/SDK_CONTEXT_COORDINATION.md +71 -7
  77. package/docs/SDK_STORAGE_LIFECYCLE.md +24 -2
  78. package/docs/TESTING.md +8 -0
  79. package/docs/examples/ci/github-actions-pm-extension-gate.yml +1 -1
  80. package/docs/examples/ci/gitlab-ci-pm-extension-gate.yml +1 -1
  81. package/docs/examples/ci/jenkins-pm-extension-gate.Jenkinsfile +1 -1
  82. package/marketplace.json +1 -1
  83. package/node_modules/@opentelemetry/core/package.json +2 -1
  84. package/node_modules/@opentelemetry/instrumentation/package.json +2 -1
  85. package/node_modules/@opentelemetry/resources/package.json +2 -1
  86. package/node_modules/@opentelemetry/sdk-trace/package.json +2 -1
  87. package/node_modules/@opentelemetry/sdk-trace-base/package.json +2 -1
  88. package/node_modules/@sentry/core/build/cjs/client.js +5 -4
  89. package/node_modules/@sentry/core/build/cjs/tracing/ai/gen-ai-attributes.js +0 -4
  90. package/node_modules/@sentry/core/build/cjs/tracing/ai/utils.js +33 -23
  91. package/node_modules/@sentry/core/build/cjs/tracing/anthropic-ai/index.js +7 -6
  92. package/node_modules/@sentry/core/build/cjs/tracing/anthropic-ai/streaming.js +3 -1
  93. package/node_modules/@sentry/core/build/cjs/tracing/google-genai/index.js +13 -14
  94. package/node_modules/@sentry/core/build/cjs/tracing/google-genai/streaming.js +6 -1
  95. package/node_modules/@sentry/core/build/cjs/tracing/langchain/utils.js +71 -21
  96. package/node_modules/@sentry/core/build/cjs/tracing/langgraph/utils.js +23 -33
  97. package/node_modules/@sentry/core/build/cjs/tracing/openai/streaming.js +6 -0
  98. package/node_modules/@sentry/core/build/cjs/tracing/openai/utils.js +11 -0
  99. package/node_modules/@sentry/core/build/cjs/tracing/workers-ai/utils.js +1 -1
  100. package/node_modules/@sentry/core/build/cjs/utils/eventUtils.js +4 -0
  101. package/node_modules/@sentry/core/build/cjs/utils/prepareEvent.js +2 -2
  102. package/node_modules/@sentry/core/build/cjs/utils/version.js +1 -1
  103. package/node_modules/@sentry/core/build/esm/client.js +6 -5
  104. package/node_modules/@sentry/core/build/esm/package.json +1 -1
  105. package/node_modules/@sentry/core/build/esm/tracing/ai/gen-ai-attributes.js +1 -3
  106. package/node_modules/@sentry/core/build/esm/tracing/ai/utils.js +34 -24
  107. package/node_modules/@sentry/core/build/esm/tracing/anthropic-ai/index.js +8 -7
  108. package/node_modules/@sentry/core/build/esm/tracing/anthropic-ai/streaming.js +3 -1
  109. package/node_modules/@sentry/core/build/esm/tracing/google-genai/index.js +15 -16
  110. package/node_modules/@sentry/core/build/esm/tracing/google-genai/streaming.js +6 -1
  111. package/node_modules/@sentry/core/build/esm/tracing/langchain/utils.js +73 -24
  112. package/node_modules/@sentry/core/build/esm/tracing/langgraph/utils.js +24 -34
  113. package/node_modules/@sentry/core/build/esm/tracing/openai/streaming.js +6 -0
  114. package/node_modules/@sentry/core/build/esm/tracing/openai/utils.js +11 -0
  115. package/node_modules/@sentry/core/build/esm/tracing/workers-ai/utils.js +2 -2
  116. package/node_modules/@sentry/core/build/esm/utils/eventUtils.js +4 -1
  117. package/node_modules/@sentry/core/build/esm/utils/prepareEvent.js +2 -2
  118. package/node_modules/@sentry/core/build/esm/utils/version.js +1 -1
  119. package/node_modules/@sentry/core/build/types/tracing/ai/utils.d.ts +3 -7
  120. package/node_modules/@sentry/core/build/types/tracing/anthropic-ai/types.d.ts +2 -2
  121. package/node_modules/@sentry/core/build/types/tracing/langchain/types.d.ts +15 -0
  122. package/node_modules/@sentry/core/build/types/tracing/langchain/utils.d.ts +1 -0
  123. package/node_modules/@sentry/core/build/types/tracing/langgraph/utils.d.ts +2 -0
  124. package/node_modules/@sentry/core/build/types/tracing/openai/types.d.ts +2 -0
  125. package/node_modules/@sentry/core/build/types/utils/eventUtils.d.ts +2 -1
  126. package/node_modules/@sentry/core/build/types-ts3.8/tracing/ai/utils.d.ts +3 -7
  127. package/node_modules/@sentry/core/build/types-ts3.8/tracing/anthropic-ai/types.d.ts +2 -2
  128. package/node_modules/@sentry/core/build/types-ts3.8/tracing/langchain/types.d.ts +15 -0
  129. package/node_modules/@sentry/core/build/types-ts3.8/tracing/langchain/utils.d.ts +1 -0
  130. package/node_modules/@sentry/core/build/types-ts3.8/tracing/langgraph/utils.d.ts +2 -0
  131. package/node_modules/@sentry/core/build/types-ts3.8/tracing/openai/types.d.ts +2 -0
  132. package/node_modules/@sentry/core/build/types-ts3.8/utils/eventUtils.d.ts +2 -1
  133. package/node_modules/@sentry/core/package.json +1 -1
  134. package/node_modules/@sentry/node/build/esm/package.json +1 -1
  135. package/node_modules/@sentry/node/package.json +5 -5
  136. package/node_modules/@sentry/node-core/build/cjs/integrations/anr/index.js +1 -1
  137. package/node_modules/@sentry/node-core/build/cjs/integrations/local-variables/local-variables-async.js +1 -1
  138. package/node_modules/@sentry/node-core/build/esm/integrations/anr/index.js +1 -1
  139. package/node_modules/@sentry/node-core/build/esm/integrations/anr/worker-script.js +2 -2
  140. package/node_modules/@sentry/node-core/build/esm/integrations/local-variables/local-variables-async.js +1 -1
  141. package/node_modules/@sentry/node-core/build/esm/integrations/local-variables/worker-script.js +1 -1
  142. package/node_modules/@sentry/node-core/build/esm/package.json +1 -1
  143. package/node_modules/@sentry/node-core/package.json +10 -4
  144. package/node_modules/@sentry/opentelemetry/build/esm/package.json +1 -1
  145. package/node_modules/@sentry/opentelemetry/package.json +5 -2
  146. package/node_modules/@sentry/server-utils/build/THIRD-PARTY-LICENSES.txt +55 -55
  147. package/node_modules/@sentry/server-utils/build/esm/package.json +1 -1
  148. package/node_modules/@sentry/server-utils/package.json +2 -2
  149. package/node_modules/@toon-format/toon/README.md +10 -41
  150. package/node_modules/@toon-format/toon/dist/index.d.mts +12 -36
  151. package/node_modules/@toon-format/toon/dist/index.mjs +134 -202
  152. package/node_modules/@toon-format/toon/package.json +2 -2
  153. package/node_modules/debug/package.json +3 -0
  154. package/node_modules/fdir/package.json +3 -0
  155. package/node_modules/has-flag/index.d.ts +39 -0
  156. package/node_modules/has-flag/index.js +8 -0
  157. package/node_modules/has-flag/license +9 -0
  158. package/node_modules/has-flag/package.json +46 -0
  159. package/node_modules/has-flag/readme.md +89 -0
  160. package/node_modules/supports-color/browser.js +5 -0
  161. package/node_modules/supports-color/index.js +135 -0
  162. package/node_modules/supports-color/license +9 -0
  163. package/node_modules/supports-color/package.json +53 -0
  164. package/node_modules/supports-color/readme.md +76 -0
  165. package/package.json +4 -4
  166. package/packages/pm-beads/package.json +1 -1
  167. package/packages/pm-calendar/package.json +1 -1
  168. package/packages/pm-command-kit/package.json +1 -1
  169. package/packages/pm-digital-twin/package.json +1 -1
  170. package/packages/pm-governance-audit/package.json +1 -1
  171. package/packages/pm-guide-shell/package.json +1 -1
  172. package/packages/pm-kanban/package.json +1 -1
  173. package/packages/pm-lifecycle-hooks/package.json +1 -1
  174. package/packages/pm-linked-test-adapters/package.json +1 -1
  175. package/packages/pm-search-advanced/package.json +1 -1
  176. package/packages/pm-templates/package.json +1 -1
  177. package/packages/pm-todos/package.json +1 -1
  178. package/packages/pm-vcs/package.json +1 -1
  179. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  180. package/plugins/pm-claude/package.json +1 -1
  181. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  182. package/plugins/pm-codex/package.json +1 -1
  183. package/plugins/pm-codex/plugin.json +1 -1
  184. package/runtime-dependencies.json +1 -1
  185. package/dist/cli-bundle/chunks/chunk-4PNPDT2N.js +0 -236
  186. package/dist/cli-bundle/chunks/chunk-X53HM753.js +0 -20
  187. package/dist/cli-bundle/focused-chunks/chunk-5JEFDEL3.js +0 -166
  188. package/dist/cli-bundle/focused-chunks/chunk-TRFVAWF2.js +0 -26
@@ -29,8 +29,6 @@ const GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE = "gen_ai.response.tool_calls";
29
29
  const GEN_AI_AGENT_NAME_ATTRIBUTE = "gen_ai.agent.name";
30
30
  const GEN_AI_PIPELINE_NAME_ATTRIBUTE = "gen_ai.pipeline.name";
31
31
  const GEN_AI_CONVERSATION_ID_ATTRIBUTE = "gen_ai.conversation.id";
32
- const GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS_ATTRIBUTE = "gen_ai.usage.cache_creation_input_tokens";
33
- const GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS_ATTRIBUTE = "gen_ai.usage.cache_read_input_tokens";
34
32
  const GEN_AI_USAGE_INPUT_TOKENS_CACHE_WRITE_ATTRIBUTE = "gen_ai.usage.input_tokens.cache_write";
35
33
  const GEN_AI_USAGE_INPUT_TOKENS_CACHED_ATTRIBUTE = "gen_ai.usage.input_tokens.cached";
36
34
  const GEN_AI_INVOKE_AGENT_OPERATION_ATTRIBUTE = "gen_ai.invoke_agent";
@@ -44,5 +42,5 @@ const GEN_AI_TOOL_INPUT_ATTRIBUTE = "gen_ai.tool.input";
44
42
  const GEN_AI_TOOL_OUTPUT_ATTRIBUTE = "gen_ai.tool.output";
45
43
  const GEN_AI_TOOL_DESCRIPTION_ATTRIBUTE = "gen_ai.tool.description";
46
44
 
47
- export { GEN_AI_AGENT_NAME_ATTRIBUTE, GEN_AI_CONVERSATION_ID_ATTRIBUTE, GEN_AI_EMBEDDINGS_INPUT_ATTRIBUTE, GEN_AI_EMBEDDINGS_OPERATION_ATTRIBUTE, GEN_AI_EXECUTE_TOOL_OPERATION_ATTRIBUTE, GEN_AI_INPUT_MESSAGES_ATTRIBUTE, GEN_AI_INPUT_MESSAGES_ORIGINAL_LENGTH_ATTRIBUTE, GEN_AI_INVOKE_AGENT_OPERATION_ATTRIBUTE, GEN_AI_OPERATION_NAME_ATTRIBUTE, GEN_AI_OUTPUT_MESSAGES_ATTRIBUTE, GEN_AI_PIPELINE_NAME_ATTRIBUTE, GEN_AI_PROMPT_ATTRIBUTE, GEN_AI_REQUEST_AVAILABLE_TOOLS_ATTRIBUTE, GEN_AI_REQUEST_DIMENSIONS_ATTRIBUTE, GEN_AI_REQUEST_ENCODING_FORMAT_ATTRIBUTE, GEN_AI_REQUEST_FREQUENCY_PENALTY_ATTRIBUTE, GEN_AI_REQUEST_MAX_TOKENS_ATTRIBUTE, GEN_AI_REQUEST_MODEL_ATTRIBUTE, GEN_AI_REQUEST_PRESENCE_PENALTY_ATTRIBUTE, GEN_AI_REQUEST_STREAM_ATTRIBUTE, GEN_AI_REQUEST_TEMPERATURE_ATTRIBUTE, GEN_AI_REQUEST_TOP_K_ATTRIBUTE, GEN_AI_REQUEST_TOP_P_ATTRIBUTE, GEN_AI_RESPONSE_FINISH_REASONS_ATTRIBUTE, GEN_AI_RESPONSE_ID_ATTRIBUTE, GEN_AI_RESPONSE_MODEL_ATTRIBUTE, GEN_AI_RESPONSE_STOP_REASON_ATTRIBUTE, GEN_AI_RESPONSE_STREAMING_ATTRIBUTE, GEN_AI_RESPONSE_TEXT_ATTRIBUTE, GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE, GEN_AI_SYSTEM_ATTRIBUTE, GEN_AI_SYSTEM_INSTRUCTIONS_ATTRIBUTE, GEN_AI_TOOL_CALL_ID_ATTRIBUTE, GEN_AI_TOOL_DESCRIPTION_ATTRIBUTE, GEN_AI_TOOL_INPUT_ATTRIBUTE, GEN_AI_TOOL_NAME_ATTRIBUTE, GEN_AI_TOOL_OUTPUT_ATTRIBUTE, GEN_AI_TOOL_TYPE_ATTRIBUTE, GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_INPUT_TOKENS_CACHED_ATTRIBUTE, GEN_AI_USAGE_INPUT_TOKENS_CACHE_WRITE_ATTRIBUTE, GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE };
45
+ export { GEN_AI_AGENT_NAME_ATTRIBUTE, GEN_AI_CONVERSATION_ID_ATTRIBUTE, GEN_AI_EMBEDDINGS_INPUT_ATTRIBUTE, GEN_AI_EMBEDDINGS_OPERATION_ATTRIBUTE, GEN_AI_EXECUTE_TOOL_OPERATION_ATTRIBUTE, GEN_AI_INPUT_MESSAGES_ATTRIBUTE, GEN_AI_INPUT_MESSAGES_ORIGINAL_LENGTH_ATTRIBUTE, GEN_AI_INVOKE_AGENT_OPERATION_ATTRIBUTE, GEN_AI_OPERATION_NAME_ATTRIBUTE, GEN_AI_OUTPUT_MESSAGES_ATTRIBUTE, GEN_AI_PIPELINE_NAME_ATTRIBUTE, GEN_AI_PROMPT_ATTRIBUTE, GEN_AI_REQUEST_AVAILABLE_TOOLS_ATTRIBUTE, GEN_AI_REQUEST_DIMENSIONS_ATTRIBUTE, GEN_AI_REQUEST_ENCODING_FORMAT_ATTRIBUTE, GEN_AI_REQUEST_FREQUENCY_PENALTY_ATTRIBUTE, GEN_AI_REQUEST_MAX_TOKENS_ATTRIBUTE, GEN_AI_REQUEST_MODEL_ATTRIBUTE, GEN_AI_REQUEST_PRESENCE_PENALTY_ATTRIBUTE, GEN_AI_REQUEST_STREAM_ATTRIBUTE, GEN_AI_REQUEST_TEMPERATURE_ATTRIBUTE, GEN_AI_REQUEST_TOP_K_ATTRIBUTE, GEN_AI_REQUEST_TOP_P_ATTRIBUTE, GEN_AI_RESPONSE_FINISH_REASONS_ATTRIBUTE, GEN_AI_RESPONSE_ID_ATTRIBUTE, GEN_AI_RESPONSE_MODEL_ATTRIBUTE, GEN_AI_RESPONSE_STOP_REASON_ATTRIBUTE, GEN_AI_RESPONSE_STREAMING_ATTRIBUTE, GEN_AI_RESPONSE_TEXT_ATTRIBUTE, GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE, GEN_AI_SYSTEM_ATTRIBUTE, GEN_AI_SYSTEM_INSTRUCTIONS_ATTRIBUTE, GEN_AI_TOOL_CALL_ID_ATTRIBUTE, GEN_AI_TOOL_DESCRIPTION_ATTRIBUTE, GEN_AI_TOOL_INPUT_ATTRIBUTE, GEN_AI_TOOL_NAME_ATTRIBUTE, GEN_AI_TOOL_OUTPUT_ATTRIBUTE, GEN_AI_TOOL_TYPE_ATTRIBUTE, GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_INPUT_TOKENS_CACHED_ATTRIBUTE, GEN_AI_USAGE_INPUT_TOKENS_CACHE_WRITE_ATTRIBUTE, GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE };
48
46
  //# sourceMappingURL=gen-ai-attributes.js.map
@@ -1,7 +1,8 @@
1
+ import { GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS, GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS, GEN_AI_USAGE_REASONING_OUTPUT_TOKENS } from '@sentry/conventions/attributes';
1
2
  import { getClient } from '../../currentScopes.js';
2
3
  import { hasSpanStreamingEnabled } from '../spans/hasSpanStreamingEnabled.js';
3
4
  import { isThenable } from '../../utils/is.js';
4
- import { GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE, GEN_AI_RESPONSE_STREAMING_ATTRIBUTE, GEN_AI_RESPONSE_ID_ATTRIBUTE, GEN_AI_RESPONSE_MODEL_ATTRIBUTE, GEN_AI_RESPONSE_FINISH_REASONS_ATTRIBUTE, GEN_AI_RESPONSE_TEXT_ATTRIBUTE, GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE } from './gen-ai-attributes.js';
5
+ import { GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE, GEN_AI_RESPONSE_FINISH_REASONS_ATTRIBUTE, GEN_AI_RESPONSE_TEXT_ATTRIBUTE, GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE, GEN_AI_RESPONSE_STREAMING_ATTRIBUTE, GEN_AI_RESPONSE_ID_ATTRIBUTE, GEN_AI_RESPONSE_MODEL_ATTRIBUTE } from './gen-ai-attributes.js';
5
6
  import { truncateGenAiStringInput, truncateGenAiMessages } from './messageTruncation.js';
6
7
 
7
8
  function resolveAIRecordingOptions(options) {
@@ -25,23 +26,26 @@ function shouldEnableTruncation(enableTruncation) {
25
26
  function buildMethodPath(currentPath, prop) {
26
27
  return currentPath ? `${currentPath}.${prop}` : prop;
27
28
  }
28
- function setTokenUsageAttributes(span, promptTokens, completionTokens, cachedInputTokens, cachedOutputTokens) {
29
- if (promptTokens !== void 0) {
30
- span.setAttributes({
31
- [GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE]: promptTokens
32
- });
33
- }
34
- if (completionTokens !== void 0) {
35
- span.setAttributes({
36
- [GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE]: completionTokens
37
- });
38
- }
39
- if (promptTokens !== void 0 || completionTokens !== void 0 || cachedInputTokens !== void 0 || cachedOutputTokens !== void 0) {
40
- const totalTokens = (promptTokens ?? 0) + (completionTokens ?? 0) + (cachedInputTokens ?? 0) + (cachedOutputTokens ?? 0);
41
- span.setAttributes({
42
- [GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE]: totalTokens
43
- });
29
+ function getTokenUsageAttributes(promptTokens, completionTokens, cacheCreationInputTokens, cacheReadInputTokens, totalTokens) {
30
+ const attributes = {};
31
+ if (typeof promptTokens === "number") {
32
+ attributes[GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE] = promptTokens;
44
33
  }
34
+ if (typeof cacheCreationInputTokens === "number") {
35
+ attributes[GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS] = cacheCreationInputTokens;
36
+ }
37
+ if (typeof cacheReadInputTokens === "number") {
38
+ attributes[GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS] = cacheReadInputTokens;
39
+ }
40
+ if (typeof completionTokens === "number") {
41
+ attributes[GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE] = completionTokens;
42
+ }
43
+ if (typeof totalTokens === "number") {
44
+ attributes[GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE] = totalTokens;
45
+ } else if (typeof promptTokens === "number" || typeof completionTokens === "number") {
46
+ attributes[GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE] = (typeof promptTokens === "number" ? promptTokens : 0) + (typeof completionTokens === "number" ? completionTokens : 0);
47
+ }
48
+ return attributes;
45
49
  }
46
50
  function endStreamSpan(span, state, recordOutputs) {
47
51
  if (!span.isRecording()) {
@@ -52,12 +56,18 @@ function endStreamSpan(span, state, recordOutputs) {
52
56
  };
53
57
  if (state.responseId) attrs[GEN_AI_RESPONSE_ID_ATTRIBUTE] = state.responseId;
54
58
  if (state.responseModel) attrs[GEN_AI_RESPONSE_MODEL_ATTRIBUTE] = state.responseModel;
55
- if (state.promptTokens !== void 0) attrs[GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE] = state.promptTokens;
56
- if (state.completionTokens !== void 0) attrs[GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE] = state.completionTokens;
57
- if (state.totalTokens !== void 0) {
58
- attrs[GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE] = state.totalTokens;
59
- } else if (state.promptTokens !== void 0 || state.completionTokens !== void 0 || state.cacheCreationInputTokens !== void 0 || state.cacheReadInputTokens !== void 0) {
60
- attrs[GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE] = (state.promptTokens ?? 0) + (state.completionTokens ?? 0) + (state.cacheCreationInputTokens ?? 0) + (state.cacheReadInputTokens ?? 0);
59
+ Object.assign(
60
+ attrs,
61
+ getTokenUsageAttributes(
62
+ state.promptTokens,
63
+ state.completionTokens,
64
+ state.cacheCreationInputTokens,
65
+ state.cacheReadInputTokens,
66
+ state.totalTokens
67
+ )
68
+ );
69
+ if (typeof state.reasoningOutputTokens === "number") {
70
+ attrs[GEN_AI_USAGE_REASONING_OUTPUT_TOKENS] = state.reasoningOutputTokens;
61
71
  }
62
72
  if (state.finishReasons.length) {
63
73
  attrs[GEN_AI_RESPONSE_FINISH_REASONS_ATTRIBUTE] = JSON.stringify(state.finishReasons);
@@ -130,5 +140,5 @@ function wrapPromiseWithMethods(originalPromiseLike, instrumentedPromise) {
130
140
  });
131
141
  }
132
142
 
133
- export { buildMethodPath, endStreamSpan, extractSystemInstructions, getTruncatedJsonString, resolveAIRecordingOptions, setTokenUsageAttributes, shouldEnableTruncation, wrapPromiseWithMethods };
143
+ export { buildMethodPath, endStreamSpan, extractSystemInstructions, getTokenUsageAttributes, getTruncatedJsonString, resolveAIRecordingOptions, shouldEnableTruncation, wrapPromiseWithMethods };
134
144
  //# sourceMappingURL=utils.js.map
@@ -2,7 +2,7 @@ import { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '../../semanticAttributes.js';
2
2
  import { SPAN_STATUS_ERROR } from '../spanstatus.js';
3
3
  import { startSpan, startSpanManual } from '../trace.js';
4
4
  import { GEN_AI_PROMPT_ATTRIBUTE, GEN_AI_REQUEST_AVAILABLE_TOOLS_ATTRIBUTE, GEN_AI_REQUEST_MODEL_ATTRIBUTE, GEN_AI_REQUEST_TEMPERATURE_ATTRIBUTE, GEN_AI_REQUEST_TOP_P_ATTRIBUTE, GEN_AI_REQUEST_STREAM_ATTRIBUTE, GEN_AI_REQUEST_TOP_K_ATTRIBUTE, GEN_AI_REQUEST_FREQUENCY_PENALTY_ATTRIBUTE, GEN_AI_REQUEST_MAX_TOKENS_ATTRIBUTE, GEN_AI_RESPONSE_TEXT_ATTRIBUTE, GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE, GEN_AI_RESPONSE_MODEL_ATTRIBUTE, GEN_AI_RESPONSE_ID_ATTRIBUTE, GEN_AI_OPERATION_NAME_ATTRIBUTE, GEN_AI_SYSTEM_ATTRIBUTE } from '../ai/gen-ai-attributes.js';
5
- import { resolveAIRecordingOptions, setTokenUsageAttributes, shouldEnableTruncation, wrapPromiseWithMethods } from '../ai/utils.js';
5
+ import { resolveAIRecordingOptions, getTokenUsageAttributes, shouldEnableTruncation, wrapPromiseWithMethods } from '../ai/utils.js';
6
6
  import { ANTHROPIC_METHOD_REGISTRY } from './constants.js';
7
7
  import { instrumentAsyncIterableStream, instrumentMessageStream } from './streaming.js';
8
8
  import { messagesFromParams, setMessagesAttribute, handleResponseError } from './utils.js';
@@ -75,12 +75,13 @@ function addMetadataAttributes(span, response) {
75
75
  [GEN_AI_RESPONSE_MODEL_ATTRIBUTE]: response.model
76
76
  });
77
77
  if ("usage" in response && response.usage) {
78
- setTokenUsageAttributes(
79
- span,
80
- response.usage.input_tokens,
81
- response.usage.output_tokens,
82
- response.usage.cache_creation_input_tokens,
83
- response.usage.cache_read_input_tokens
78
+ span.setAttributes(
79
+ getTokenUsageAttributes(
80
+ response.usage.input_tokens + (response.usage.cache_creation_input_tokens ?? 0) + (response.usage.cache_read_input_tokens ?? 0),
81
+ response.usage.output_tokens,
82
+ response.usage.cache_creation_input_tokens,
83
+ response.usage.cache_read_input_tokens
84
+ )
84
85
  );
85
86
  }
86
87
  }
@@ -26,7 +26,9 @@ function handleMessageMetadata(event, state) {
26
26
  if (message.id) state.responseId = message.id;
27
27
  if (message.model) state.responseModel = message.model;
28
28
  if (message.usage) {
29
- if (typeof message.usage.input_tokens === "number") state.promptTokens = message.usage.input_tokens;
29
+ if (typeof message.usage.input_tokens === "number") {
30
+ state.promptTokens = message.usage.input_tokens + (message.usage.cache_creation_input_tokens ?? 0) + (message.usage.cache_read_input_tokens ?? 0);
31
+ }
30
32
  if (typeof message.usage.cache_creation_input_tokens === "number")
31
33
  state.cacheCreationInputTokens = message.usage.cache_creation_input_tokens;
32
34
  if (typeof message.usage.cache_read_input_tokens === "number")
@@ -1,10 +1,11 @@
1
+ import { GEN_AI_USAGE_REASONING_OUTPUT_TOKENS } from '@sentry/conventions/attributes';
1
2
  import { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '../../semanticAttributes.js';
2
3
  import { stringify } from '../../utils/string.js';
3
4
  import { SPAN_STATUS_ERROR } from '../spanstatus.js';
4
5
  import { startSpanManual, startSpan } from '../trace.js';
5
6
  import { handleCallbackErrors } from '../../utils/handleCallbackErrors.js';
6
- import { GEN_AI_EMBEDDINGS_INPUT_ATTRIBUTE, GEN_AI_SYSTEM_INSTRUCTIONS_ATTRIBUTE, GEN_AI_INPUT_MESSAGES_ATTRIBUTE, GEN_AI_INPUT_MESSAGES_ORIGINAL_LENGTH_ATTRIBUTE, GEN_AI_RESPONSE_MODEL_ATTRIBUTE, GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE, GEN_AI_RESPONSE_TEXT_ATTRIBUTE, GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE, GEN_AI_REQUEST_MODEL_ATTRIBUTE, GEN_AI_REQUEST_AVAILABLE_TOOLS_ATTRIBUTE, GEN_AI_OPERATION_NAME_ATTRIBUTE, GEN_AI_SYSTEM_ATTRIBUTE, GEN_AI_REQUEST_TEMPERATURE_ATTRIBUTE, GEN_AI_REQUEST_TOP_P_ATTRIBUTE, GEN_AI_REQUEST_TOP_K_ATTRIBUTE, GEN_AI_REQUEST_MAX_TOKENS_ATTRIBUTE, GEN_AI_REQUEST_FREQUENCY_PENALTY_ATTRIBUTE, GEN_AI_REQUEST_PRESENCE_PENALTY_ATTRIBUTE } from '../ai/gen-ai-attributes.js';
7
- import { extractSystemInstructions, getTruncatedJsonString, resolveAIRecordingOptions, shouldEnableTruncation, buildMethodPath } from '../ai/utils.js';
7
+ import { GEN_AI_EMBEDDINGS_INPUT_ATTRIBUTE, GEN_AI_SYSTEM_INSTRUCTIONS_ATTRIBUTE, GEN_AI_INPUT_MESSAGES_ATTRIBUTE, GEN_AI_INPUT_MESSAGES_ORIGINAL_LENGTH_ATTRIBUTE, GEN_AI_RESPONSE_MODEL_ATTRIBUTE, GEN_AI_RESPONSE_TEXT_ATTRIBUTE, GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE, GEN_AI_REQUEST_MODEL_ATTRIBUTE, GEN_AI_REQUEST_AVAILABLE_TOOLS_ATTRIBUTE, GEN_AI_OPERATION_NAME_ATTRIBUTE, GEN_AI_SYSTEM_ATTRIBUTE, GEN_AI_REQUEST_TEMPERATURE_ATTRIBUTE, GEN_AI_REQUEST_TOP_P_ATTRIBUTE, GEN_AI_REQUEST_TOP_K_ATTRIBUTE, GEN_AI_REQUEST_MAX_TOKENS_ATTRIBUTE, GEN_AI_REQUEST_FREQUENCY_PENALTY_ATTRIBUTE, GEN_AI_REQUEST_PRESENCE_PENALTY_ATTRIBUTE } from '../ai/gen-ai-attributes.js';
8
+ import { extractSystemInstructions, getTruncatedJsonString, getTokenUsageAttributes, resolveAIRecordingOptions, shouldEnableTruncation, buildMethodPath } from '../ai/utils.js';
8
9
  import { GOOGLE_GENAI_SYSTEM_NAME, GOOGLE_GENAI_METHOD_REGISTRY } from './constants.js';
9
10
  import { instrumentStream } from './streaming.js';
10
11
  import { contentUnionToMessages } from './utils.js';
@@ -112,20 +113,18 @@ function addResponseAttributes(span, response, recordOutputs) {
112
113
  }
113
114
  if (response.usageMetadata && typeof response.usageMetadata === "object") {
114
115
  const usage = response.usageMetadata;
115
- if (typeof usage.promptTokenCount === "number") {
116
- span.setAttributes({
117
- [GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE]: usage.promptTokenCount
118
- });
119
- }
120
- if (typeof usage.candidatesTokenCount === "number") {
121
- span.setAttributes({
122
- [GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE]: usage.candidatesTokenCount
123
- });
124
- }
125
- if (typeof usage.totalTokenCount === "number") {
126
- span.setAttributes({
127
- [GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE]: usage.totalTokenCount
128
- });
116
+ const hasOutput = typeof usage.candidatesTokenCount === "number" || typeof usage.thoughtsTokenCount === "number";
117
+ span.setAttributes(
118
+ getTokenUsageAttributes(
119
+ usage.promptTokenCount,
120
+ hasOutput ? (usage.candidatesTokenCount ?? 0) + (usage.thoughtsTokenCount ?? 0) : void 0,
121
+ void 0,
122
+ usage.cachedContentTokenCount,
123
+ usage.totalTokenCount
124
+ )
125
+ );
126
+ if (typeof usage.thoughtsTokenCount === "number") {
127
+ span.setAttribute(GEN_AI_USAGE_REASONING_OUTPUT_TOKENS, usage.thoughtsTokenCount);
129
128
  }
130
129
  }
131
130
  if (recordOutputs && Array.isArray(response.candidates) && response.candidates.length > 0) {
@@ -20,8 +20,13 @@ function handleResponseMetadata(chunk, state) {
20
20
  const usage = chunk.usageMetadata;
21
21
  if (usage) {
22
22
  if (typeof usage.promptTokenCount === "number") state.promptTokens = usage.promptTokenCount;
23
- if (typeof usage.candidatesTokenCount === "number") state.completionTokens = usage.candidatesTokenCount;
23
+ if (typeof usage.candidatesTokenCount === "number") state.candidateTokens = usage.candidatesTokenCount;
24
+ if (typeof usage.thoughtsTokenCount === "number") state.reasoningOutputTokens = usage.thoughtsTokenCount;
25
+ if (state.candidateTokens !== void 0 || state.reasoningOutputTokens !== void 0) {
26
+ state.completionTokens = (state.candidateTokens ?? 0) + (state.reasoningOutputTokens ?? 0);
27
+ }
24
28
  if (typeof usage.totalTokenCount === "number") state.totalTokens = usage.totalTokenCount;
29
+ if (typeof usage.cachedContentTokenCount === "number") state.cacheReadInputTokens = usage.cachedContentTokenCount;
25
30
  }
26
31
  }
27
32
  function handleCandidateContent(chunk, state, recordOutputs) {
@@ -1,8 +1,10 @@
1
+ import { GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS, GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS } from '@sentry/conventions/attributes';
1
2
  import { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '../../semanticAttributes.js';
2
3
  import { stringify } from '../../utils/string.js';
3
- import { GEN_AI_RESPONSE_FINISH_REASONS_ATTRIBUTE, GEN_AI_RESPONSE_TEXT_ATTRIBUTE, GEN_AI_RESPONSE_STOP_REASON_ATTRIBUTE, GEN_AI_INPUT_MESSAGES_ATTRIBUTE, GEN_AI_INPUT_MESSAGES_ORIGINAL_LENGTH_ATTRIBUTE, GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE, GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE, GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS_ATTRIBUTE, GEN_AI_REQUEST_MODEL_ATTRIBUTE, GEN_AI_OPERATION_NAME_ATTRIBUTE, GEN_AI_SYSTEM_ATTRIBUTE, GEN_AI_REQUEST_TEMPERATURE_ATTRIBUTE, GEN_AI_REQUEST_MAX_TOKENS_ATTRIBUTE, GEN_AI_REQUEST_TOP_P_ATTRIBUTE, GEN_AI_REQUEST_FREQUENCY_PENALTY_ATTRIBUTE, GEN_AI_REQUEST_PRESENCE_PENALTY_ATTRIBUTE, GEN_AI_REQUEST_STREAM_ATTRIBUTE, GEN_AI_SYSTEM_INSTRUCTIONS_ATTRIBUTE, GEN_AI_RESPONSE_MODEL_ATTRIBUTE, GEN_AI_RESPONSE_ID_ATTRIBUTE, GEN_AI_AGENT_NAME_ATTRIBUTE } from '../ai/gen-ai-attributes.js';
4
+ import { isObjectLike } from '../../utils/is.js';
5
+ import { GEN_AI_RESPONSE_FINISH_REASONS_ATTRIBUTE, GEN_AI_RESPONSE_TEXT_ATTRIBUTE, GEN_AI_RESPONSE_STOP_REASON_ATTRIBUTE, GEN_AI_INPUT_MESSAGES_ATTRIBUTE, GEN_AI_INPUT_MESSAGES_ORIGINAL_LENGTH_ATTRIBUTE, GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE, GEN_AI_REQUEST_MODEL_ATTRIBUTE, GEN_AI_OPERATION_NAME_ATTRIBUTE, GEN_AI_SYSTEM_ATTRIBUTE, GEN_AI_REQUEST_STREAM_ATTRIBUTE, GEN_AI_REQUEST_TEMPERATURE_ATTRIBUTE, GEN_AI_REQUEST_MAX_TOKENS_ATTRIBUTE, GEN_AI_REQUEST_TOP_P_ATTRIBUTE, GEN_AI_REQUEST_FREQUENCY_PENALTY_ATTRIBUTE, GEN_AI_REQUEST_PRESENCE_PENALTY_ATTRIBUTE, GEN_AI_SYSTEM_INSTRUCTIONS_ATTRIBUTE, GEN_AI_RESPONSE_MODEL_ATTRIBUTE, GEN_AI_RESPONSE_ID_ATTRIBUTE, GEN_AI_AGENT_NAME_ATTRIBUTE } from '../ai/gen-ai-attributes.js';
4
6
  import { isContentMedia, stripInlineMediaFromSingleMessage } from '../ai/mediaStripping.js';
5
- import { extractSystemInstructions, getTruncatedJsonString } from '../ai/utils.js';
7
+ import { extractSystemInstructions, getTruncatedJsonString, getTokenUsageAttributes } from '../ai/utils.js';
6
8
  import { LANGCHAIN_ORIGIN, ROLE_MAP } from './constants.js';
7
9
 
8
10
  const setIfDefined = (target, key, value) => {
@@ -170,29 +172,76 @@ function addToolCallsAttributes(generations, attrs) {
170
172
  setIfDefined(attrs, GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE, stringify(toolCalls, String));
171
173
  }
172
174
  }
173
- function addTokenUsageAttributes(llmOutput, attrs) {
175
+ function extractMessageTokenUsageAttributes(message) {
176
+ const usage = message.usage_metadata;
177
+ if (isObjectLike(usage)) {
178
+ const details = isObjectLike(usage.input_token_details) ? usage.input_token_details : void 0;
179
+ return getTokenUsageAttributes(
180
+ usage.input_tokens,
181
+ usage.output_tokens,
182
+ details?.cache_creation,
183
+ details?.cache_read,
184
+ usage.total_tokens
185
+ );
186
+ }
187
+ const metadata = message.response_metadata;
188
+ const tokenUsage = isObjectLike(metadata) && isObjectLike(metadata.tokenUsage) ? metadata.tokenUsage : void 0;
189
+ return getTokenUsageAttributes(
190
+ tokenUsage?.promptTokens,
191
+ tokenUsage?.completionTokens,
192
+ void 0,
193
+ void 0,
194
+ tokenUsage?.totalTokens
195
+ );
196
+ }
197
+ function addTokenUsageAttributes(llmResult, attrs) {
198
+ const normalizedUsage = {};
199
+ const legacyMessageUsage = {};
200
+ for (const generations of llmResult.generations ?? []) {
201
+ const message = generations[0]?.message;
202
+ if (message) {
203
+ const usage = isObjectLike(message.usage_metadata) ? normalizedUsage : legacyMessageUsage;
204
+ for (const [key, value] of Object.entries(extractMessageTokenUsageAttributes(message))) {
205
+ usage[key] = (usage[key] ?? 0) + value;
206
+ }
207
+ }
208
+ }
209
+ Object.assign(attrs, Object.keys(normalizedUsage).length > 0 ? normalizedUsage : legacyMessageUsage);
210
+ const llmOutput = llmResult.llmOutput;
174
211
  if (!llmOutput) return;
175
212
  const tokenUsage = llmOutput.tokenUsage;
176
213
  const anthropicUsage = llmOutput.usage;
177
- if (tokenUsage) {
178
- setNumberIfDefined(attrs, GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE, tokenUsage.promptTokens);
179
- setNumberIfDefined(attrs, GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE, tokenUsage.completionTokens);
180
- setNumberIfDefined(attrs, GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE, tokenUsage.totalTokens);
181
- } else if (anthropicUsage) {
182
- setNumberIfDefined(attrs, GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE, anthropicUsage.input_tokens);
183
- setNumberIfDefined(attrs, GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE, anthropicUsage.output_tokens);
184
- const input = Number(anthropicUsage.input_tokens);
185
- const output = Number(anthropicUsage.output_tokens);
186
- const total = (Number.isNaN(input) ? 0 : input) + (Number.isNaN(output) ? 0 : output);
187
- if (total > 0) setNumberIfDefined(attrs, GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE, total);
188
- if (anthropicUsage.cache_creation_input_tokens !== void 0)
189
- setNumberIfDefined(
190
- attrs,
191
- GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS_ATTRIBUTE,
192
- anthropicUsage.cache_creation_input_tokens
193
- );
194
- if (anthropicUsage.cache_read_input_tokens !== void 0)
195
- setNumberIfDefined(attrs, GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS_ATTRIBUTE, anthropicUsage.cache_read_input_tokens);
214
+ if (anthropicUsage && Object.keys(normalizedUsage).length === 0 && Object.keys(legacyMessageUsage).length === 0) {
215
+ const { input_tokens, output_tokens, cache_creation_input_tokens, cache_read_input_tokens } = anthropicUsage;
216
+ const hasInput = input_tokens !== void 0 || cache_creation_input_tokens !== void 0 || cache_read_input_tokens !== void 0;
217
+ Object.assign(
218
+ attrs,
219
+ getTokenUsageAttributes(
220
+ hasInput ? (input_tokens ?? 0) + (cache_creation_input_tokens ?? 0) + (cache_read_input_tokens ?? 0) : void 0,
221
+ output_tokens,
222
+ cache_creation_input_tokens,
223
+ cache_read_input_tokens
224
+ )
225
+ );
226
+ } else if (tokenUsage && Object.keys(normalizedUsage).length === 0 && Object.keys(legacyMessageUsage).length === 0) {
227
+ Object.assign(
228
+ attrs,
229
+ getTokenUsageAttributes(
230
+ tokenUsage.promptTokens,
231
+ tokenUsage.completionTokens,
232
+ void 0,
233
+ void 0,
234
+ tokenUsage.totalTokens
235
+ )
236
+ );
237
+ }
238
+ if (anthropicUsage) {
239
+ if (typeof anthropicUsage.cache_creation_input_tokens === "number" && !(GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS in attrs)) {
240
+ attrs[GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS] = anthropicUsage.cache_creation_input_tokens;
241
+ }
242
+ if (typeof anthropicUsage.cache_read_input_tokens === "number" && !(GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS in attrs)) {
243
+ attrs[GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS] = anthropicUsage.cache_read_input_tokens;
244
+ }
196
245
  }
197
246
  }
198
247
  function extractLlmResponseAttributes(llmResult, recordOutputs) {
@@ -219,7 +268,7 @@ function extractLlmResponseAttributes(llmResult, recordOutputs) {
219
268
  }
220
269
  }
221
270
  }
222
- addTokenUsageAttributes(llmResult.llmOutput, attrs);
271
+ addTokenUsageAttributes(llmResult, attrs);
223
272
  const llmOutput = llmResult.llmOutput;
224
273
  const firstGeneration = llmResult.generations?.[0]?.[0];
225
274
  const v1Message = firstGeneration?.message;
@@ -288,5 +337,5 @@ function _INTERNAL_mergeLangChainCallbackHandler(existing, sentryHandler) {
288
337
  return [...handlers, sentryHandler];
289
338
  }
290
339
 
291
- export { _INTERNAL_mergeLangChainCallbackHandler, extractChatModelRequestAttributes, extractLLMRequestAttributes, extractLlmResponseAttributes, extractToolDefinitions, getAgentNameFromMetadata, getInvocationParams, normalizeLangChainMessages };
340
+ export { _INTERNAL_mergeLangChainCallbackHandler, extractChatModelRequestAttributes, extractLLMRequestAttributes, extractLlmResponseAttributes, extractMessageTokenUsageAttributes, extractToolDefinitions, getAgentNameFromMetadata, getInvocationParams, normalizeLangChainMessages };
292
341
  //# sourceMappingURL=utils.js.map
@@ -1,8 +1,9 @@
1
+ import { GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS, GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS } from '@sentry/conventions/attributes';
1
2
  import { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '../../semanticAttributes.js';
2
3
  import { SPAN_STATUS_ERROR } from '../spanstatus.js';
3
4
  import { startSpan } from '../trace.js';
4
5
  import { GEN_AI_EXECUTE_TOOL_OPERATION_ATTRIBUTE, GEN_AI_TOOL_INPUT_ATTRIBUTE, GEN_AI_TOOL_OUTPUT_ATTRIBUTE, GEN_AI_TOOL_TYPE_ATTRIBUTE, GEN_AI_TOOL_NAME_ATTRIBUTE, GEN_AI_OPERATION_NAME_ATTRIBUTE, GEN_AI_AGENT_NAME_ATTRIBUTE, GEN_AI_TOOL_DESCRIPTION_ATTRIBUTE, GEN_AI_TOOL_CALL_ID_ATTRIBUTE, GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE, GEN_AI_RESPONSE_TEXT_ATTRIBUTE, GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE, GEN_AI_RESPONSE_MODEL_ATTRIBUTE, GEN_AI_RESPONSE_FINISH_REASONS_ATTRIBUTE } from '../ai/gen-ai-attributes.js';
5
- import { normalizeLangChainMessages } from '../langchain/utils.js';
6
+ import { normalizeLangChainMessages, extractMessageTokenUsageAttributes } from '../langchain/utils.js';
6
7
  import { LANGGRAPH_ORIGIN } from './constants.js';
7
8
 
8
9
  function extractLLMFromParams(args) {
@@ -116,39 +117,14 @@ function extractToolCalls(messages) {
116
117
  return toolCalls.length > 0 ? toolCalls : null;
117
118
  }
118
119
  function extractTokenUsageFromMessage(message) {
119
- const msg = message;
120
- let inputTokens = 0;
121
- let outputTokens = 0;
122
- let totalTokens = 0;
123
- if (msg.usage_metadata && typeof msg.usage_metadata === "object") {
124
- const usage = msg.usage_metadata;
125
- if (typeof usage.input_tokens === "number") {
126
- inputTokens = usage.input_tokens;
127
- }
128
- if (typeof usage.output_tokens === "number") {
129
- outputTokens = usage.output_tokens;
130
- }
131
- if (typeof usage.total_tokens === "number") {
132
- totalTokens = usage.total_tokens;
133
- }
134
- return { inputTokens, outputTokens, totalTokens };
135
- }
136
- if (msg.response_metadata && typeof msg.response_metadata === "object") {
137
- const metadata = msg.response_metadata;
138
- if (metadata.tokenUsage && typeof metadata.tokenUsage === "object") {
139
- const tokenUsage = metadata.tokenUsage;
140
- if (typeof tokenUsage.promptTokens === "number") {
141
- inputTokens = tokenUsage.promptTokens;
142
- }
143
- if (typeof tokenUsage.completionTokens === "number") {
144
- outputTokens = tokenUsage.completionTokens;
145
- }
146
- if (typeof tokenUsage.totalTokens === "number") {
147
- totalTokens = tokenUsage.totalTokens;
148
- }
149
- }
150
- }
151
- return { inputTokens, outputTokens, totalTokens };
120
+ const attributes = extractMessageTokenUsageAttributes(message);
121
+ return {
122
+ inputTokens: attributes[GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE] ?? 0,
123
+ outputTokens: attributes[GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE] ?? 0,
124
+ totalTokens: attributes[GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE] ?? 0,
125
+ cacheCreationInputTokens: attributes[GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS],
126
+ cacheReadInputTokens: attributes[GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS]
127
+ };
152
128
  }
153
129
  function extractModelMetadata(span, message) {
154
130
  const msg = message;
@@ -196,11 +172,19 @@ function setResponseAttributes(span, inputMessages, result) {
196
172
  let totalInputTokens = 0;
197
173
  let totalOutputTokens = 0;
198
174
  let totalTokens = 0;
175
+ let cacheCreationInputTokens;
176
+ let cacheReadInputTokens;
199
177
  for (const message of newMessages) {
200
178
  const tokens = extractTokenUsageFromMessage(message);
201
179
  totalInputTokens += tokens.inputTokens;
202
180
  totalOutputTokens += tokens.outputTokens;
203
181
  totalTokens += tokens.totalTokens;
182
+ if (tokens.cacheCreationInputTokens !== void 0) {
183
+ cacheCreationInputTokens = (cacheCreationInputTokens ?? 0) + tokens.cacheCreationInputTokens;
184
+ }
185
+ if (tokens.cacheReadInputTokens !== void 0) {
186
+ cacheReadInputTokens = (cacheReadInputTokens ?? 0) + tokens.cacheReadInputTokens;
187
+ }
204
188
  extractModelMetadata(span, message);
205
189
  }
206
190
  if (totalInputTokens > 0) {
@@ -212,6 +196,12 @@ function setResponseAttributes(span, inputMessages, result) {
212
196
  if (totalTokens > 0) {
213
197
  span.setAttribute(GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE, totalTokens);
214
198
  }
199
+ if (cacheCreationInputTokens !== void 0) {
200
+ span.setAttribute(GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS, cacheCreationInputTokens);
201
+ }
202
+ if (cacheReadInputTokens !== void 0) {
203
+ span.setAttribute(GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS, cacheReadInputTokens);
204
+ }
215
205
  }
216
206
 
217
207
  export { extractAgentNameFromParams, extractLLMFromParams, extractModelMetadata, extractTokenUsageFromMessage, extractToolCalls, extractToolsFromCompiledGraph, setResponseAttributes, wrapToolsWithSpans };
@@ -31,6 +31,8 @@ function processChatCompletionChunk(chunk, state, recordOutputs) {
31
31
  state.promptTokens = chunk.usage.prompt_tokens;
32
32
  state.completionTokens = chunk.usage.completion_tokens;
33
33
  state.totalTokens = chunk.usage.total_tokens;
34
+ state.cacheReadInputTokens = chunk.usage.prompt_tokens_details?.cached_tokens ?? state.cacheReadInputTokens;
35
+ state.cacheCreationInputTokens = chunk.usage.prompt_tokens_details?.cache_write_tokens ?? state.cacheCreationInputTokens;
34
36
  }
35
37
  for (const choice of chunk.choices ?? []) {
36
38
  if (recordOutputs) {
@@ -84,6 +86,8 @@ function processResponsesApiEvent(streamEvent, state, recordOutputs, span) {
84
86
  state.promptTokens = response.usage.input_tokens;
85
87
  state.completionTokens = response.usage.output_tokens;
86
88
  state.totalTokens = response.usage.total_tokens;
89
+ state.cacheReadInputTokens = response.usage.input_tokens_details?.cached_tokens ?? state.cacheReadInputTokens;
90
+ state.cacheCreationInputTokens = response.usage.input_tokens_details?.cache_write_tokens ?? state.cacheCreationInputTokens;
87
91
  }
88
92
  if (response.status) {
89
93
  state.finishReasons.push(response.status);
@@ -103,6 +107,8 @@ async function* instrumentStream(stream, span, recordOutputs) {
103
107
  promptTokens: void 0,
104
108
  completionTokens: void 0,
105
109
  totalTokens: void 0,
110
+ cacheReadInputTokens: void 0,
111
+ cacheCreationInputTokens: void 0,
106
112
  chatCompletionToolCalls: {},
107
113
  responsesApiToolCalls: []
108
114
  };
@@ -1,3 +1,5 @@
1
+ import { GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS, GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS } from '@sentry/conventions/attributes';
2
+ import { isObjectLike } from '../../utils/is.js';
1
3
  import { GEN_AI_RESPONSE_FINISH_REASONS_ATTRIBUTE, GEN_AI_RESPONSE_TEXT_ATTRIBUTE, GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE, GEN_AI_REQUEST_MODEL_ATTRIBUTE, GEN_AI_REQUEST_TEMPERATURE_ATTRIBUTE, GEN_AI_REQUEST_TOP_P_ATTRIBUTE, GEN_AI_REQUEST_FREQUENCY_PENALTY_ATTRIBUTE, GEN_AI_REQUEST_PRESENCE_PENALTY_ATTRIBUTE, GEN_AI_REQUEST_STREAM_ATTRIBUTE, GEN_AI_REQUEST_ENCODING_FORMAT_ATTRIBUTE, GEN_AI_REQUEST_DIMENSIONS_ATTRIBUTE, GEN_AI_CONVERSATION_ID_ATTRIBUTE, GEN_AI_RESPONSE_ID_ATTRIBUTE, GEN_AI_RESPONSE_MODEL_ATTRIBUTE, GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE, GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE } from '../ai/gen-ai-attributes.js';
2
4
 
3
5
  function isResponsesApiStreamEvent(event) {
@@ -32,6 +34,15 @@ function addResponseAttributes(span, result, recordOutputs) {
32
34
  if (typeof usage.total_tokens === "number") {
33
35
  attrs[GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE] = usage.total_tokens;
34
36
  }
37
+ const inputDetails = usage.prompt_tokens_details ?? usage.input_tokens_details;
38
+ if (isObjectLike(inputDetails)) {
39
+ if (typeof inputDetails.cached_tokens === "number") {
40
+ attrs[GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS] = inputDetails.cached_tokens;
41
+ }
42
+ if (typeof inputDetails.cache_write_tokens === "number") {
43
+ attrs[GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS] = inputDetails.cache_write_tokens;
44
+ }
45
+ }
35
46
  }
36
47
  if (Array.isArray(response.choices)) {
37
48
  const choices = response.choices;
@@ -1,7 +1,7 @@
1
1
  import { GEN_AI_REQUEST_TEMPERATURE, GEN_AI_REQUEST_MAX_TOKENS, GEN_AI_REQUEST_TOP_P, GEN_AI_REQUEST_TOP_K, GEN_AI_REQUEST_FREQUENCY_PENALTY, GEN_AI_REQUEST_PRESENCE_PENALTY, GEN_AI_EMBEDDINGS_INPUT, GEN_AI_SYSTEM_INSTRUCTIONS, GEN_AI_INPUT_MESSAGES, GEN_AI_REQUEST_MODEL, GEN_AI_OPERATION_NAME, GEN_AI_PROVIDER_NAME } from '@sentry/conventions/attributes';
2
2
  import { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '../../semanticAttributes.js';
3
3
  import { GEN_AI_REQUEST_STREAM_ATTRIBUTE, GEN_AI_INPUT_MESSAGES_ORIGINAL_LENGTH_ATTRIBUTE, GEN_AI_RESPONSE_TEXT_ATTRIBUTE, GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE, GEN_AI_OUTPUT_MESSAGES_ATTRIBUTE } from '../ai/gen-ai-attributes.js';
4
- import { extractSystemInstructions, getTruncatedJsonString, setTokenUsageAttributes } from '../ai/utils.js';
4
+ import { extractSystemInstructions, getTruncatedJsonString, getTokenUsageAttributes } from '../ai/utils.js';
5
5
  import { stringify } from '../../utils/string.js';
6
6
  import { WORKERS_AI_ORIGIN, WORKERS_AI_PROVIDER_NAME } from './constants.js';
7
7
 
@@ -111,7 +111,7 @@ function addResponseAttributes(span, result, recordOutputs) {
111
111
  }
112
112
  const response = result;
113
113
  if (response.usage) {
114
- setTokenUsageAttributes(span, response.usage.prompt_tokens, response.usage.completion_tokens);
114
+ span.setAttributes(getTokenUsageAttributes(response.usage.prompt_tokens, response.usage.completion_tokens));
115
115
  }
116
116
  if (recordOutputs) {
117
117
  let responseText;
@@ -1,3 +1,6 @@
1
+ function isInternalException(hint) {
2
+ return hint.data?.__sentry__ === true;
3
+ }
1
4
  function getPossibleEventMessages(event) {
2
5
  const possibleMessages = [];
3
6
  if (event.message) {
@@ -16,5 +19,5 @@ function getPossibleEventMessages(event) {
16
19
  return possibleMessages;
17
20
  }
18
21
 
19
- export { getPossibleEventMessages };
22
+ export { getPossibleEventMessages, isInternalException };
20
23
  //# sourceMappingURL=eventUtils.js.map
@@ -2,6 +2,7 @@ import { DEFAULT_ENVIRONMENT } from '../constants.js';
2
2
  import { notifyEventProcessors } from '../eventProcessors.js';
3
3
  import { Scope } from '../scope.js';
4
4
  import { getFilenameToDebugIdMap } from './debug-ids.js';
5
+ import { isInternalException } from './eventUtils.js';
5
6
  import { uuid4, addExceptionMechanism } from './misc.js';
6
7
  import { normalize } from './normalize.js';
7
8
  import { getCombinedScopeData, applyScopeDataToEvent } from './scopeData.js';
@@ -41,8 +42,7 @@ function prepareEvent(options, event, hint, scope, client, isolationScope) {
41
42
  // Run scope event processors _after_ all other processors
42
43
  ...data.eventProcessors
43
44
  ];
44
- const isInternalException = hint.data && hint.data.__sentry__ === true;
45
- const result = isInternalException ? resolvedSyncPromise(prepared) : notifyEventProcessors(eventProcessors, prepared, hint);
45
+ const result = isInternalException(hint) ? resolvedSyncPromise(prepared) : notifyEventProcessors(eventProcessors, prepared, hint);
46
46
  return result.then((evt) => {
47
47
  if (evt) {
48
48
  applyDebugMeta(evt);
@@ -1,4 +1,4 @@
1
- const SDK_VERSION = "10.76.0" ;
1
+ const SDK_VERSION = "10.76.2" ;
2
2
 
3
3
  export { SDK_VERSION };
4
4
  //# sourceMappingURL=version.js.map
@@ -40,14 +40,9 @@ export declare function shouldEnableTruncation(enableTruncation: boolean | undef
40
40
  */
41
41
  export declare function buildMethodPath(currentPath: string, prop: string): string;
42
42
  /**
43
- * Set token usage attributes
44
- * @param span - The span to add attributes to
45
- * @param promptTokens - The number of prompt tokens
46
- * @param completionTokens - The number of completion tokens
47
- * @param cachedInputTokens - The number of cached input tokens
48
- * @param cachedOutputTokens - The number of cached output tokens
43
+ * Build token usage attributes. Input tokens include cache reads and writes, which are subsets.
49
44
  */
50
- export declare function setTokenUsageAttributes(span: Span, promptTokens?: number, completionTokens?: number, cachedInputTokens?: number, cachedOutputTokens?: number): void;
45
+ export declare function getTokenUsageAttributes(promptTokens?: number, completionTokens?: number, cacheCreationInputTokens?: number, cacheReadInputTokens?: number, totalTokens?: number): Record<string, number>;
51
46
  export interface StreamResponseState {
52
47
  responseId?: string;
53
48
  responseModel?: string;
@@ -59,6 +54,7 @@ export interface StreamResponseState {
59
54
  totalTokens?: number;
60
55
  cacheCreationInputTokens?: number;
61
56
  cacheReadInputTokens?: number;
57
+ reasoningOutputTokens?: number;
62
58
  }
63
59
  /**
64
60
  * Ends a streaming span by setting all accumulated response attributes and ending the span.
@@ -49,8 +49,8 @@ type SuccessfulResponse = {
49
49
  usage?: {
50
50
  input_tokens: number;
51
51
  output_tokens: number;
52
- cache_creation_input_tokens: number;
53
- cache_read_input_tokens: number;
52
+ cache_creation_input_tokens?: number;
53
+ cache_read_input_tokens?: number;
54
54
  };
55
55
  error?: never;
56
56
  };
@@ -54,11 +54,26 @@ export interface LangChainMessage {
54
54
  };
55
55
  role?: string;
56
56
  additional_kwargs?: Record<string, unknown>;
57
+ usage_metadata?: {
58
+ input_tokens?: number;
59
+ output_tokens?: number;
60
+ total_tokens?: number;
61
+ input_token_details?: {
62
+ cache_read?: number;
63
+ cache_creation?: number;
64
+ };
65
+ };
57
66
  lc?: number;
58
67
  id?: string[] | string;
59
68
  response_metadata?: {
69
+ [key: string]: unknown;
60
70
  model_name?: string;
61
71
  finish_reason?: string;
72
+ tokenUsage?: {
73
+ promptTokens?: number;
74
+ completionTokens?: number;
75
+ totalTokens?: number;
76
+ };
62
77
  };
63
78
  kwargs?: {
64
79
  [key: string]: unknown;
@@ -47,6 +47,7 @@ export declare function extractLLMRequestAttributes(llm: LangChainSerialized, pr
47
47
  * - Provider system value falls back to `serialized.id?.[2]`.
48
48
  */
49
49
  export declare function extractChatModelRequestAttributes(llm: LangChainSerialized, langChainMessages: LangChainMessage[][], recordInputs: boolean, enableTruncation: boolean, invocationParams?: Record<string, unknown>, langSmithMetadata?: Record<string, unknown>): Record<string, SpanAttributeValue | undefined>;
50
+ export declare function extractMessageTokenUsageAttributes(message: LangChainMessage): Record<string, number>;
50
51
  /**
51
52
  * Extracts response-related attributes based on a `LangChainLLMResult`.
52
53
  *
@@ -27,6 +27,8 @@ export declare function extractTokenUsageFromMessage(message: LangChainMessage):
27
27
  inputTokens: number;
28
28
  outputTokens: number;
29
29
  totalTokens: number;
30
+ cacheCreationInputTokens?: number;
31
+ cacheReadInputTokens?: number;
30
32
  };
31
33
  /**
32
34
  * Extract model and finish reason from a message's response_metadata