@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.
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +25 -0
- package/dist/cli/register-list-query.js +2 -2
- package/dist/cli-bundle/bundle-manifest.json +1 -1
- package/dist/cli-bundle/chunks/{chunk-3QKI3XNX.js → chunk-4GA4MUTE.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-X2ONXFBP.js → chunk-4V6ONLI6.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-B5QVGCZX.js → chunk-6VZKYJW7.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-7PATQWTH.js +20 -0
- package/dist/cli-bundle/chunks/{chunk-W3KZ22DW.js → chunk-7WIEAGDS.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-EA2CG7UM.js → chunk-AETP4JEM.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-6ZDKKOKM.js → chunk-FIJOSX2C.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-VMCSTFSO.js → chunk-LUKVNL72.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-J4LPQCET.js → chunk-OJ77ZQN3.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-O4YBC3OM.js → chunk-PYRREEUB.js} +30 -30
- package/dist/cli-bundle/chunks/chunk-RHQJ6VWC.js +237 -0
- package/dist/cli-bundle/chunks/{chunk-OZCSXX4D.js → chunk-RNABUEFB.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-HY7FQ7QX.js → chunk-TO6CIV4C.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-JS3B2M4D.js → chunk-ZZED447K.js} +2 -2
- package/dist/cli-bundle/chunks/{register-list-query-RU3QZSAQ.js → register-list-query-PUCVYYBD.js} +7 -7
- package/dist/cli-bundle/chunks/{register-mutation-EQYMT32A.js → register-mutation-GGGVBXD5.js} +2 -2
- package/dist/cli-bundle/chunks/{register-operations-VXBGE4XI.js → register-operations-NRZ6Q4QE.js} +2 -2
- package/dist/cli-bundle/chunks/{register-setup-UUDEGFRO.js → register-setup-MV3P3YSF.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-LDKX4KYJ.js → chunk-2MPQUMTF.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-MBQF6HT6.js → chunk-5UKCSZWT.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-FTUZ3JF2.js → chunk-A4ZHHTEX.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-JXR6UKFM.js → chunk-B4YLP5ZB.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-NZO7GOXD.js → chunk-BFEMT5U3.js} +16 -16
- package/dist/cli-bundle/focused-chunks/{chunk-QOSVJDOO.js → chunk-FW7CSSKL.js} +61 -61
- package/dist/cli-bundle/focused-chunks/{chunk-AH6NX6GM.js → chunk-HYPRPSYD.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-RBLSY6ML.js → chunk-IRVL4UXR.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-RHTH5ILM.js → chunk-L55KQ2KT.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-PYC7BF6Z.js → chunk-MASIOFPG.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-RJ3EIHDU.js +26 -0
- package/dist/cli-bundle/focused-chunks/chunk-SEL4Z2OO.js +167 -0
- package/dist/cli-bundle/focused-chunks/{chunk-2IOHHNRT.js → chunk-TB7F4FCR.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-UNTQE37U.js → chunk-TZUIBG3P.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-E33QA7PK.js → chunk-Z7YIFCNE.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-SIGIGZCG.js → chunk-ZDBS2DCT.js} +2 -2
- package/dist/cli-bundle/main.js +2 -2
- package/dist/cli-bundle/sdk-authoring.js +1 -1
- package/dist/cli-bundle/sdk-contracts.js +1 -1
- package/dist/cli-bundle/sdk-core.js +16 -16
- package/dist/cli-bundle/sdk-governance.js +1 -1
- package/dist/cli-bundle/sdk-graph.js +1 -1
- package/dist/cli-bundle/sdk-merge.js +50 -49
- package/dist/cli-bundle/sdk-query.js +1 -1
- package/dist/cli-bundle/sdk-runtime.js +1 -1
- package/dist/cli-bundle/sdk-testing.js +1 -1
- package/dist/cli-bundle/sdk.js +1 -1
- package/dist/core/history/event-index.d.ts +8 -1
- package/dist/core/history/event-index.js +19 -18
- package/dist/core/item/item-format.js +1 -1
- package/dist/core/lock/lock.d.ts +8 -1
- package/dist/core/lock/lock.js +3 -3
- package/dist/core/output/output.js +2 -2
- package/dist/core/store/paths.js +1 -1
- package/dist/core/telemetry/policy.d.ts +2 -0
- package/dist/core/telemetry/policy.js +1 -1
- package/dist/core/telemetry/runtime.d.ts +5 -3
- package/dist/core/telemetry/runtime.js +3 -3
- package/dist/sdk/governance/health/projection.d.ts +37 -0
- package/dist/sdk/governance/health/projection.js +2 -0
- package/dist/sdk/governance/health.d.ts +7 -18
- package/dist/sdk/governance/health.js +2 -2
- package/dist/sdk/mutation-events.js +1 -1
- package/dist/sdk/public-surface.json +1 -1
- package/dist/sdk/query/list.d.ts +2 -0
- package/dist/sdk/query/list.js +1 -1
- package/dist/types.d.ts +2 -2
- package/dist/types.js +1 -1
- package/docs/COMMANDS.md +26 -0
- package/docs/CONFIGURATION.md +22 -1
- package/docs/DEVELOPMENT_DEPENDENCY_SECURITY.md +22 -3
- package/docs/OUTPUT_PROJECTION_CONTRACTS.md +10 -0
- package/docs/RELEASING.md +8 -1
- package/docs/SDK_CONTEXT_COORDINATION.md +71 -7
- package/docs/SDK_STORAGE_LIFECYCLE.md +24 -2
- package/docs/TESTING.md +8 -0
- package/docs/examples/ci/github-actions-pm-extension-gate.yml +1 -1
- package/docs/examples/ci/gitlab-ci-pm-extension-gate.yml +1 -1
- package/docs/examples/ci/jenkins-pm-extension-gate.Jenkinsfile +1 -1
- package/marketplace.json +1 -1
- package/node_modules/@opentelemetry/core/package.json +2 -1
- package/node_modules/@opentelemetry/instrumentation/package.json +2 -1
- package/node_modules/@opentelemetry/resources/package.json +2 -1
- package/node_modules/@opentelemetry/sdk-trace/package.json +2 -1
- package/node_modules/@opentelemetry/sdk-trace-base/package.json +2 -1
- package/node_modules/@sentry/core/build/cjs/client.js +5 -4
- package/node_modules/@sentry/core/build/cjs/tracing/ai/gen-ai-attributes.js +0 -4
- package/node_modules/@sentry/core/build/cjs/tracing/ai/utils.js +33 -23
- package/node_modules/@sentry/core/build/cjs/tracing/anthropic-ai/index.js +7 -6
- package/node_modules/@sentry/core/build/cjs/tracing/anthropic-ai/streaming.js +3 -1
- package/node_modules/@sentry/core/build/cjs/tracing/google-genai/index.js +13 -14
- package/node_modules/@sentry/core/build/cjs/tracing/google-genai/streaming.js +6 -1
- package/node_modules/@sentry/core/build/cjs/tracing/langchain/utils.js +71 -21
- package/node_modules/@sentry/core/build/cjs/tracing/langgraph/utils.js +23 -33
- package/node_modules/@sentry/core/build/cjs/tracing/openai/streaming.js +6 -0
- package/node_modules/@sentry/core/build/cjs/tracing/openai/utils.js +11 -0
- package/node_modules/@sentry/core/build/cjs/tracing/workers-ai/utils.js +1 -1
- package/node_modules/@sentry/core/build/cjs/utils/eventUtils.js +4 -0
- package/node_modules/@sentry/core/build/cjs/utils/prepareEvent.js +2 -2
- package/node_modules/@sentry/core/build/cjs/utils/version.js +1 -1
- package/node_modules/@sentry/core/build/esm/client.js +6 -5
- package/node_modules/@sentry/core/build/esm/package.json +1 -1
- package/node_modules/@sentry/core/build/esm/tracing/ai/gen-ai-attributes.js +1 -3
- package/node_modules/@sentry/core/build/esm/tracing/ai/utils.js +34 -24
- package/node_modules/@sentry/core/build/esm/tracing/anthropic-ai/index.js +8 -7
- package/node_modules/@sentry/core/build/esm/tracing/anthropic-ai/streaming.js +3 -1
- package/node_modules/@sentry/core/build/esm/tracing/google-genai/index.js +15 -16
- package/node_modules/@sentry/core/build/esm/tracing/google-genai/streaming.js +6 -1
- package/node_modules/@sentry/core/build/esm/tracing/langchain/utils.js +73 -24
- package/node_modules/@sentry/core/build/esm/tracing/langgraph/utils.js +24 -34
- package/node_modules/@sentry/core/build/esm/tracing/openai/streaming.js +6 -0
- package/node_modules/@sentry/core/build/esm/tracing/openai/utils.js +11 -0
- package/node_modules/@sentry/core/build/esm/tracing/workers-ai/utils.js +2 -2
- package/node_modules/@sentry/core/build/esm/utils/eventUtils.js +4 -1
- package/node_modules/@sentry/core/build/esm/utils/prepareEvent.js +2 -2
- package/node_modules/@sentry/core/build/esm/utils/version.js +1 -1
- package/node_modules/@sentry/core/build/types/tracing/ai/utils.d.ts +3 -7
- package/node_modules/@sentry/core/build/types/tracing/anthropic-ai/types.d.ts +2 -2
- package/node_modules/@sentry/core/build/types/tracing/langchain/types.d.ts +15 -0
- package/node_modules/@sentry/core/build/types/tracing/langchain/utils.d.ts +1 -0
- package/node_modules/@sentry/core/build/types/tracing/langgraph/utils.d.ts +2 -0
- package/node_modules/@sentry/core/build/types/tracing/openai/types.d.ts +2 -0
- package/node_modules/@sentry/core/build/types/utils/eventUtils.d.ts +2 -1
- package/node_modules/@sentry/core/build/types-ts3.8/tracing/ai/utils.d.ts +3 -7
- package/node_modules/@sentry/core/build/types-ts3.8/tracing/anthropic-ai/types.d.ts +2 -2
- package/node_modules/@sentry/core/build/types-ts3.8/tracing/langchain/types.d.ts +15 -0
- package/node_modules/@sentry/core/build/types-ts3.8/tracing/langchain/utils.d.ts +1 -0
- package/node_modules/@sentry/core/build/types-ts3.8/tracing/langgraph/utils.d.ts +2 -0
- package/node_modules/@sentry/core/build/types-ts3.8/tracing/openai/types.d.ts +2 -0
- package/node_modules/@sentry/core/build/types-ts3.8/utils/eventUtils.d.ts +2 -1
- package/node_modules/@sentry/core/package.json +1 -1
- package/node_modules/@sentry/node/build/esm/package.json +1 -1
- package/node_modules/@sentry/node/package.json +5 -5
- package/node_modules/@sentry/node-core/build/cjs/integrations/anr/index.js +1 -1
- package/node_modules/@sentry/node-core/build/cjs/integrations/local-variables/local-variables-async.js +1 -1
- package/node_modules/@sentry/node-core/build/esm/integrations/anr/index.js +1 -1
- package/node_modules/@sentry/node-core/build/esm/integrations/anr/worker-script.js +2 -2
- package/node_modules/@sentry/node-core/build/esm/integrations/local-variables/local-variables-async.js +1 -1
- package/node_modules/@sentry/node-core/build/esm/integrations/local-variables/worker-script.js +1 -1
- package/node_modules/@sentry/node-core/build/esm/package.json +1 -1
- package/node_modules/@sentry/node-core/package.json +10 -4
- package/node_modules/@sentry/opentelemetry/build/esm/package.json +1 -1
- package/node_modules/@sentry/opentelemetry/package.json +5 -2
- package/node_modules/@sentry/server-utils/build/THIRD-PARTY-LICENSES.txt +55 -55
- package/node_modules/@sentry/server-utils/build/esm/package.json +1 -1
- package/node_modules/@sentry/server-utils/package.json +2 -2
- package/node_modules/@toon-format/toon/README.md +10 -41
- package/node_modules/@toon-format/toon/dist/index.d.mts +12 -36
- package/node_modules/@toon-format/toon/dist/index.mjs +134 -202
- package/node_modules/@toon-format/toon/package.json +2 -2
- package/node_modules/debug/package.json +3 -0
- package/node_modules/fdir/package.json +3 -0
- package/node_modules/has-flag/index.d.ts +39 -0
- package/node_modules/has-flag/index.js +8 -0
- package/node_modules/has-flag/license +9 -0
- package/node_modules/has-flag/package.json +46 -0
- package/node_modules/has-flag/readme.md +89 -0
- package/node_modules/supports-color/browser.js +5 -0
- package/node_modules/supports-color/index.js +135 -0
- package/node_modules/supports-color/license +9 -0
- package/node_modules/supports-color/package.json +53 -0
- package/node_modules/supports-color/readme.md +76 -0
- package/package.json +4 -4
- package/packages/pm-beads/package.json +1 -1
- package/packages/pm-calendar/package.json +1 -1
- package/packages/pm-command-kit/package.json +1 -1
- package/packages/pm-digital-twin/package.json +1 -1
- package/packages/pm-governance-audit/package.json +1 -1
- package/packages/pm-guide-shell/package.json +1 -1
- package/packages/pm-kanban/package.json +1 -1
- package/packages/pm-lifecycle-hooks/package.json +1 -1
- package/packages/pm-linked-test-adapters/package.json +1 -1
- package/packages/pm-search-advanced/package.json +1 -1
- package/packages/pm-templates/package.json +1 -1
- package/packages/pm-todos/package.json +1 -1
- package/packages/pm-vcs/package.json +1 -1
- package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
- package/plugins/pm-claude/package.json +1 -1
- package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
- package/plugins/pm-codex/package.json +1 -1
- package/plugins/pm-codex/plugin.json +1 -1
- package/runtime-dependencies.json +1 -1
- package/dist/cli-bundle/chunks/chunk-4PNPDT2N.js +0 -236
- package/dist/cli-bundle/chunks/chunk-X53HM753.js +0 -20
- package/dist/cli-bundle/focused-chunks/chunk-5JEFDEL3.js +0 -166
- package/dist/cli-bundle/focused-chunks/chunk-TRFVAWF2.js +0 -26
package/marketplace.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"pm","owner":{"name":"unbrained","url":"https://github.com/unbraind/pm-cli"},"description":"Official marketplace for pm CLI — native git-based project management for Claude Code and AI coding agents.","version":"2026.10.
|
|
1
|
+
{"name":"pm","owner":{"name":"unbrained","url":"https://github.com/unbraind/pm-cli"},"description":"Official marketplace for pm CLI — native git-based project management for Claude Code and AI coding agents.","version":"2026.10.18","plugins":[{"name":"pm-claude","source":"./plugins/pm-claude","description":"Native pm CLI integration for Claude Code — 32 MCP tools, 14 workflow skills with slash invocations, 4 subagents, hybrid TUI task tracking, session context injection, and coordination subagents for git-based project management without leaving Claude Code.","version":"2026.10.18","author":{"name":"unbrained","url":"https://github.com/unbraind/pm-cli"},"homepage":"https://github.com/unbraind/pm-cli","repository":"https://github.com/unbraind/pm-cli","license":"MIT","keywords":["pm-cli","project-management","mcp","tasks","agents","workflows","git-native","task-tracker","ai"],"category":"productivity"}]}
|
|
@@ -86,7 +86,8 @@
|
|
|
86
86
|
"@opentelemetry/api": ">=1.0.0 <1.10.0"
|
|
87
87
|
},
|
|
88
88
|
"dependencies": {
|
|
89
|
-
"@opentelemetry/semantic-conventions": "^1.29.0"
|
|
89
|
+
"@opentelemetry/semantic-conventions": "^1.29.0",
|
|
90
|
+
"@opentelemetry/api": "1.9.1"
|
|
90
91
|
},
|
|
91
92
|
"homepage": "https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-core",
|
|
92
93
|
"sideEffects": false,
|
|
@@ -72,7 +72,8 @@
|
|
|
72
72
|
"dependencies": {
|
|
73
73
|
"@opentelemetry/api-logs": "0.220.0",
|
|
74
74
|
"import-in-the-middle": "^3.0.0",
|
|
75
|
-
"require-in-the-middle": "^8.0.0"
|
|
75
|
+
"require-in-the-middle": "^8.0.0",
|
|
76
|
+
"@opentelemetry/api": "1.9.1"
|
|
76
77
|
},
|
|
77
78
|
"peerDependencies": {
|
|
78
79
|
"@opentelemetry/api": "^1.3.0"
|
|
@@ -83,7 +83,8 @@
|
|
|
83
83
|
},
|
|
84
84
|
"dependencies": {
|
|
85
85
|
"@opentelemetry/core": "2.12.0",
|
|
86
|
-
"@opentelemetry/semantic-conventions": "^1.29.0"
|
|
86
|
+
"@opentelemetry/semantic-conventions": "^1.29.0",
|
|
87
|
+
"@opentelemetry/api": "1.9.1"
|
|
87
88
|
},
|
|
88
89
|
"homepage": "https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-resources",
|
|
89
90
|
"sideEffects": false,
|
|
@@ -92,7 +92,8 @@
|
|
|
92
92
|
"dependencies": {
|
|
93
93
|
"@opentelemetry/core": "2.12.0",
|
|
94
94
|
"@opentelemetry/resources": "2.12.0",
|
|
95
|
-
"@opentelemetry/semantic-conventions": "^1.29.0"
|
|
95
|
+
"@opentelemetry/semantic-conventions": "^1.29.0",
|
|
96
|
+
"@opentelemetry/api": "1.9.1"
|
|
96
97
|
},
|
|
97
98
|
"homepage": "https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/sdk-trace",
|
|
98
99
|
"sideEffects": false,
|
|
@@ -92,7 +92,8 @@
|
|
|
92
92
|
"@opentelemetry/core": "2.12.0",
|
|
93
93
|
"@opentelemetry/resources": "2.12.0",
|
|
94
94
|
"@opentelemetry/sdk-trace": "2.12.0",
|
|
95
|
-
"@opentelemetry/semantic-conventions": "^1.29.0"
|
|
95
|
+
"@opentelemetry/semantic-conventions": "^1.29.0",
|
|
96
|
+
"@opentelemetry/api": "1.9.1"
|
|
96
97
|
},
|
|
97
98
|
"homepage": "https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-sdk-trace-base",
|
|
98
99
|
"sideEffects": false,
|
|
@@ -333,8 +333,10 @@ class Client {
|
|
|
333
333
|
this.emit("beforeSendEvent", event, hint);
|
|
334
334
|
const genAiSpanItem = extractGenAiSpans.extractGenAiSpansFromEvent(event, this);
|
|
335
335
|
let env = envelope.createEventEnvelope(event, this._dsn, this._options._metadata, this._options.tunnel);
|
|
336
|
-
|
|
337
|
-
|
|
336
|
+
if (!eventUtils.isInternalException(hint)) {
|
|
337
|
+
for (const attachment of hint.attachments || []) {
|
|
338
|
+
env = envelope$1.addItemToEnvelope(env, envelope$1.createAttachmentEnvelopeItem(attachment));
|
|
339
|
+
}
|
|
338
340
|
}
|
|
339
341
|
if (genAiSpanItem) {
|
|
340
342
|
env = envelope$1.addItemToEnvelope(env, genAiSpanItem);
|
|
@@ -588,8 +590,7 @@ class Client {
|
|
|
588
590
|
this.recordDroppedEvent("event_processor", dataCategory);
|
|
589
591
|
throw _makeDoNotSendEventError("An event processor returned `null`, will not send event.");
|
|
590
592
|
}
|
|
591
|
-
|
|
592
|
-
if (isInternalException) {
|
|
593
|
+
if (eventUtils.isInternalException(hint)) {
|
|
593
594
|
return prepared;
|
|
594
595
|
}
|
|
595
596
|
const result = processBeforeSend(this, options, prepared, hint);
|
|
@@ -31,8 +31,6 @@ const GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE = "gen_ai.response.tool_calls";
|
|
|
31
31
|
const GEN_AI_AGENT_NAME_ATTRIBUTE = "gen_ai.agent.name";
|
|
32
32
|
const GEN_AI_PIPELINE_NAME_ATTRIBUTE = "gen_ai.pipeline.name";
|
|
33
33
|
const GEN_AI_CONVERSATION_ID_ATTRIBUTE = "gen_ai.conversation.id";
|
|
34
|
-
const GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS_ATTRIBUTE = "gen_ai.usage.cache_creation_input_tokens";
|
|
35
|
-
const GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS_ATTRIBUTE = "gen_ai.usage.cache_read_input_tokens";
|
|
36
34
|
const GEN_AI_USAGE_INPUT_TOKENS_CACHE_WRITE_ATTRIBUTE = "gen_ai.usage.input_tokens.cache_write";
|
|
37
35
|
const GEN_AI_USAGE_INPUT_TOKENS_CACHED_ATTRIBUTE = "gen_ai.usage.input_tokens.cached";
|
|
38
36
|
const GEN_AI_INVOKE_AGENT_OPERATION_ATTRIBUTE = "gen_ai.invoke_agent";
|
|
@@ -84,8 +82,6 @@ exports.GEN_AI_TOOL_INPUT_ATTRIBUTE = GEN_AI_TOOL_INPUT_ATTRIBUTE;
|
|
|
84
82
|
exports.GEN_AI_TOOL_NAME_ATTRIBUTE = GEN_AI_TOOL_NAME_ATTRIBUTE;
|
|
85
83
|
exports.GEN_AI_TOOL_OUTPUT_ATTRIBUTE = GEN_AI_TOOL_OUTPUT_ATTRIBUTE;
|
|
86
84
|
exports.GEN_AI_TOOL_TYPE_ATTRIBUTE = GEN_AI_TOOL_TYPE_ATTRIBUTE;
|
|
87
|
-
exports.GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS_ATTRIBUTE = GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS_ATTRIBUTE;
|
|
88
|
-
exports.GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS_ATTRIBUTE = GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS_ATTRIBUTE;
|
|
89
85
|
exports.GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE = GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE;
|
|
90
86
|
exports.GEN_AI_USAGE_INPUT_TOKENS_CACHED_ATTRIBUTE = GEN_AI_USAGE_INPUT_TOKENS_CACHED_ATTRIBUTE;
|
|
91
87
|
exports.GEN_AI_USAGE_INPUT_TOKENS_CACHE_WRITE_ATTRIBUTE = GEN_AI_USAGE_INPUT_TOKENS_CACHE_WRITE_ATTRIBUTE;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
2
|
|
|
3
|
+
const attributes = require('@sentry/conventions/attributes');
|
|
3
4
|
const currentScopes = require('../../currentScopes.js');
|
|
4
5
|
const hasSpanStreamingEnabled = require('../spans/hasSpanStreamingEnabled.js');
|
|
5
6
|
const is = require('../../utils/is.js');
|
|
@@ -27,23 +28,26 @@ function shouldEnableTruncation(enableTruncation) {
|
|
|
27
28
|
function buildMethodPath(currentPath, prop) {
|
|
28
29
|
return currentPath ? `${currentPath}.${prop}` : prop;
|
|
29
30
|
}
|
|
30
|
-
function
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
if (completionTokens !== void 0) {
|
|
37
|
-
span.setAttributes({
|
|
38
|
-
[genAiAttributes.GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE]: completionTokens
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
if (promptTokens !== void 0 || completionTokens !== void 0 || cachedInputTokens !== void 0 || cachedOutputTokens !== void 0) {
|
|
42
|
-
const totalTokens = (promptTokens ?? 0) + (completionTokens ?? 0) + (cachedInputTokens ?? 0) + (cachedOutputTokens ?? 0);
|
|
43
|
-
span.setAttributes({
|
|
44
|
-
[genAiAttributes.GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE]: totalTokens
|
|
45
|
-
});
|
|
31
|
+
function getTokenUsageAttributes(promptTokens, completionTokens, cacheCreationInputTokens, cacheReadInputTokens, totalTokens) {
|
|
32
|
+
const attributes$1 = {};
|
|
33
|
+
if (typeof promptTokens === "number") {
|
|
34
|
+
attributes$1[genAiAttributes.GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE] = promptTokens;
|
|
46
35
|
}
|
|
36
|
+
if (typeof cacheCreationInputTokens === "number") {
|
|
37
|
+
attributes$1[attributes.GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS] = cacheCreationInputTokens;
|
|
38
|
+
}
|
|
39
|
+
if (typeof cacheReadInputTokens === "number") {
|
|
40
|
+
attributes$1[attributes.GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS] = cacheReadInputTokens;
|
|
41
|
+
}
|
|
42
|
+
if (typeof completionTokens === "number") {
|
|
43
|
+
attributes$1[genAiAttributes.GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE] = completionTokens;
|
|
44
|
+
}
|
|
45
|
+
if (typeof totalTokens === "number") {
|
|
46
|
+
attributes$1[genAiAttributes.GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE] = totalTokens;
|
|
47
|
+
} else if (typeof promptTokens === "number" || typeof completionTokens === "number") {
|
|
48
|
+
attributes$1[genAiAttributes.GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE] = (typeof promptTokens === "number" ? promptTokens : 0) + (typeof completionTokens === "number" ? completionTokens : 0);
|
|
49
|
+
}
|
|
50
|
+
return attributes$1;
|
|
47
51
|
}
|
|
48
52
|
function endStreamSpan(span, state, recordOutputs) {
|
|
49
53
|
if (!span.isRecording()) {
|
|
@@ -54,12 +58,18 @@ function endStreamSpan(span, state, recordOutputs) {
|
|
|
54
58
|
};
|
|
55
59
|
if (state.responseId) attrs[genAiAttributes.GEN_AI_RESPONSE_ID_ATTRIBUTE] = state.responseId;
|
|
56
60
|
if (state.responseModel) attrs[genAiAttributes.GEN_AI_RESPONSE_MODEL_ATTRIBUTE] = state.responseModel;
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
61
|
+
Object.assign(
|
|
62
|
+
attrs,
|
|
63
|
+
getTokenUsageAttributes(
|
|
64
|
+
state.promptTokens,
|
|
65
|
+
state.completionTokens,
|
|
66
|
+
state.cacheCreationInputTokens,
|
|
67
|
+
state.cacheReadInputTokens,
|
|
68
|
+
state.totalTokens
|
|
69
|
+
)
|
|
70
|
+
);
|
|
71
|
+
if (typeof state.reasoningOutputTokens === "number") {
|
|
72
|
+
attrs[attributes.GEN_AI_USAGE_REASONING_OUTPUT_TOKENS] = state.reasoningOutputTokens;
|
|
63
73
|
}
|
|
64
74
|
if (state.finishReasons.length) {
|
|
65
75
|
attrs[genAiAttributes.GEN_AI_RESPONSE_FINISH_REASONS_ATTRIBUTE] = JSON.stringify(state.finishReasons);
|
|
@@ -135,9 +145,9 @@ function wrapPromiseWithMethods(originalPromiseLike, instrumentedPromise) {
|
|
|
135
145
|
exports.buildMethodPath = buildMethodPath;
|
|
136
146
|
exports.endStreamSpan = endStreamSpan;
|
|
137
147
|
exports.extractSystemInstructions = extractSystemInstructions;
|
|
148
|
+
exports.getTokenUsageAttributes = getTokenUsageAttributes;
|
|
138
149
|
exports.getTruncatedJsonString = getTruncatedJsonString;
|
|
139
150
|
exports.resolveAIRecordingOptions = resolveAIRecordingOptions;
|
|
140
|
-
exports.setTokenUsageAttributes = setTokenUsageAttributes;
|
|
141
151
|
exports.shouldEnableTruncation = shouldEnableTruncation;
|
|
142
152
|
exports.wrapPromiseWithMethods = wrapPromiseWithMethods;
|
|
143
153
|
//# sourceMappingURL=utils.js.map
|
|
@@ -77,12 +77,13 @@ function addMetadataAttributes(span, response) {
|
|
|
77
77
|
[genAiAttributes.GEN_AI_RESPONSE_MODEL_ATTRIBUTE]: response.model
|
|
78
78
|
});
|
|
79
79
|
if ("usage" in response && response.usage) {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
80
|
+
span.setAttributes(
|
|
81
|
+
utils$1.getTokenUsageAttributes(
|
|
82
|
+
response.usage.input_tokens + (response.usage.cache_creation_input_tokens ?? 0) + (response.usage.cache_read_input_tokens ?? 0),
|
|
83
|
+
response.usage.output_tokens,
|
|
84
|
+
response.usage.cache_creation_input_tokens,
|
|
85
|
+
response.usage.cache_read_input_tokens
|
|
86
|
+
)
|
|
86
87
|
);
|
|
87
88
|
}
|
|
88
89
|
}
|
|
@@ -28,7 +28,9 @@ function handleMessageMetadata(event, state) {
|
|
|
28
28
|
if (message.id) state.responseId = message.id;
|
|
29
29
|
if (message.model) state.responseModel = message.model;
|
|
30
30
|
if (message.usage) {
|
|
31
|
-
if (typeof message.usage.input_tokens === "number")
|
|
31
|
+
if (typeof message.usage.input_tokens === "number") {
|
|
32
|
+
state.promptTokens = message.usage.input_tokens + (message.usage.cache_creation_input_tokens ?? 0) + (message.usage.cache_read_input_tokens ?? 0);
|
|
33
|
+
}
|
|
32
34
|
if (typeof message.usage.cache_creation_input_tokens === "number")
|
|
33
35
|
state.cacheCreationInputTokens = message.usage.cache_creation_input_tokens;
|
|
34
36
|
if (typeof message.usage.cache_read_input_tokens === "number")
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
2
|
|
|
3
|
+
const attributes = require('@sentry/conventions/attributes');
|
|
3
4
|
const semanticAttributes = require('../../semanticAttributes.js');
|
|
4
5
|
const string = require('../../utils/string.js');
|
|
5
6
|
const spanstatus = require('../spanstatus.js');
|
|
@@ -114,20 +115,18 @@ function addResponseAttributes(span, response, recordOutputs) {
|
|
|
114
115
|
}
|
|
115
116
|
if (response.usageMetadata && typeof response.usageMetadata === "object") {
|
|
116
117
|
const usage = response.usageMetadata;
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
if (typeof usage.
|
|
128
|
-
span.
|
|
129
|
-
[genAiAttributes.GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE]: usage.totalTokenCount
|
|
130
|
-
});
|
|
118
|
+
const hasOutput = typeof usage.candidatesTokenCount === "number" || typeof usage.thoughtsTokenCount === "number";
|
|
119
|
+
span.setAttributes(
|
|
120
|
+
utils$1.getTokenUsageAttributes(
|
|
121
|
+
usage.promptTokenCount,
|
|
122
|
+
hasOutput ? (usage.candidatesTokenCount ?? 0) + (usage.thoughtsTokenCount ?? 0) : void 0,
|
|
123
|
+
void 0,
|
|
124
|
+
usage.cachedContentTokenCount,
|
|
125
|
+
usage.totalTokenCount
|
|
126
|
+
)
|
|
127
|
+
);
|
|
128
|
+
if (typeof usage.thoughtsTokenCount === "number") {
|
|
129
|
+
span.setAttribute(attributes.GEN_AI_USAGE_REASONING_OUTPUT_TOKENS, usage.thoughtsTokenCount);
|
|
131
130
|
}
|
|
132
131
|
}
|
|
133
132
|
if (recordOutputs && Array.isArray(response.candidates) && response.candidates.length > 0) {
|
|
@@ -22,8 +22,13 @@ function handleResponseMetadata(chunk, state) {
|
|
|
22
22
|
const usage = chunk.usageMetadata;
|
|
23
23
|
if (usage) {
|
|
24
24
|
if (typeof usage.promptTokenCount === "number") state.promptTokens = usage.promptTokenCount;
|
|
25
|
-
if (typeof usage.candidatesTokenCount === "number") state.
|
|
25
|
+
if (typeof usage.candidatesTokenCount === "number") state.candidateTokens = usage.candidatesTokenCount;
|
|
26
|
+
if (typeof usage.thoughtsTokenCount === "number") state.reasoningOutputTokens = usage.thoughtsTokenCount;
|
|
27
|
+
if (state.candidateTokens !== void 0 || state.reasoningOutputTokens !== void 0) {
|
|
28
|
+
state.completionTokens = (state.candidateTokens ?? 0) + (state.reasoningOutputTokens ?? 0);
|
|
29
|
+
}
|
|
26
30
|
if (typeof usage.totalTokenCount === "number") state.totalTokens = usage.totalTokenCount;
|
|
31
|
+
if (typeof usage.cachedContentTokenCount === "number") state.cacheReadInputTokens = usage.cachedContentTokenCount;
|
|
27
32
|
}
|
|
28
33
|
}
|
|
29
34
|
function handleCandidateContent(chunk, state, recordOutputs) {
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
2
|
|
|
3
|
+
const attributes = require('@sentry/conventions/attributes');
|
|
3
4
|
const semanticAttributes = require('../../semanticAttributes.js');
|
|
4
5
|
const string = require('../../utils/string.js');
|
|
6
|
+
const is = require('../../utils/is.js');
|
|
5
7
|
const genAiAttributes = require('../ai/gen-ai-attributes.js');
|
|
6
8
|
const mediaStripping = require('../ai/mediaStripping.js');
|
|
7
9
|
const utils = require('../ai/utils.js');
|
|
@@ -172,29 +174,76 @@ function addToolCallsAttributes(generations, attrs) {
|
|
|
172
174
|
setIfDefined(attrs, genAiAttributes.GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE, string.stringify(toolCalls, String));
|
|
173
175
|
}
|
|
174
176
|
}
|
|
175
|
-
function
|
|
177
|
+
function extractMessageTokenUsageAttributes(message) {
|
|
178
|
+
const usage = message.usage_metadata;
|
|
179
|
+
if (is.isObjectLike(usage)) {
|
|
180
|
+
const details = is.isObjectLike(usage.input_token_details) ? usage.input_token_details : void 0;
|
|
181
|
+
return utils.getTokenUsageAttributes(
|
|
182
|
+
usage.input_tokens,
|
|
183
|
+
usage.output_tokens,
|
|
184
|
+
details?.cache_creation,
|
|
185
|
+
details?.cache_read,
|
|
186
|
+
usage.total_tokens
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
const metadata = message.response_metadata;
|
|
190
|
+
const tokenUsage = is.isObjectLike(metadata) && is.isObjectLike(metadata.tokenUsage) ? metadata.tokenUsage : void 0;
|
|
191
|
+
return utils.getTokenUsageAttributes(
|
|
192
|
+
tokenUsage?.promptTokens,
|
|
193
|
+
tokenUsage?.completionTokens,
|
|
194
|
+
void 0,
|
|
195
|
+
void 0,
|
|
196
|
+
tokenUsage?.totalTokens
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
function addTokenUsageAttributes(llmResult, attrs) {
|
|
200
|
+
const normalizedUsage = {};
|
|
201
|
+
const legacyMessageUsage = {};
|
|
202
|
+
for (const generations of llmResult.generations ?? []) {
|
|
203
|
+
const message = generations[0]?.message;
|
|
204
|
+
if (message) {
|
|
205
|
+
const usage = is.isObjectLike(message.usage_metadata) ? normalizedUsage : legacyMessageUsage;
|
|
206
|
+
for (const [key, value] of Object.entries(extractMessageTokenUsageAttributes(message))) {
|
|
207
|
+
usage[key] = (usage[key] ?? 0) + value;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
Object.assign(attrs, Object.keys(normalizedUsage).length > 0 ? normalizedUsage : legacyMessageUsage);
|
|
212
|
+
const llmOutput = llmResult.llmOutput;
|
|
176
213
|
if (!llmOutput) return;
|
|
177
214
|
const tokenUsage = llmOutput.tokenUsage;
|
|
178
215
|
const anthropicUsage = llmOutput.usage;
|
|
179
|
-
if (
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
216
|
+
if (anthropicUsage && Object.keys(normalizedUsage).length === 0 && Object.keys(legacyMessageUsage).length === 0) {
|
|
217
|
+
const { input_tokens, output_tokens, cache_creation_input_tokens, cache_read_input_tokens } = anthropicUsage;
|
|
218
|
+
const hasInput = input_tokens !== void 0 || cache_creation_input_tokens !== void 0 || cache_read_input_tokens !== void 0;
|
|
219
|
+
Object.assign(
|
|
220
|
+
attrs,
|
|
221
|
+
utils.getTokenUsageAttributes(
|
|
222
|
+
hasInput ? (input_tokens ?? 0) + (cache_creation_input_tokens ?? 0) + (cache_read_input_tokens ?? 0) : void 0,
|
|
223
|
+
output_tokens,
|
|
224
|
+
cache_creation_input_tokens,
|
|
225
|
+
cache_read_input_tokens
|
|
226
|
+
)
|
|
227
|
+
);
|
|
228
|
+
} else if (tokenUsage && Object.keys(normalizedUsage).length === 0 && Object.keys(legacyMessageUsage).length === 0) {
|
|
229
|
+
Object.assign(
|
|
230
|
+
attrs,
|
|
231
|
+
utils.getTokenUsageAttributes(
|
|
232
|
+
tokenUsage.promptTokens,
|
|
233
|
+
tokenUsage.completionTokens,
|
|
234
|
+
void 0,
|
|
235
|
+
void 0,
|
|
236
|
+
tokenUsage.totalTokens
|
|
237
|
+
)
|
|
238
|
+
);
|
|
239
|
+
}
|
|
240
|
+
if (anthropicUsage) {
|
|
241
|
+
if (typeof anthropicUsage.cache_creation_input_tokens === "number" && !(attributes.GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS in attrs)) {
|
|
242
|
+
attrs[attributes.GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS] = anthropicUsage.cache_creation_input_tokens;
|
|
243
|
+
}
|
|
244
|
+
if (typeof anthropicUsage.cache_read_input_tokens === "number" && !(attributes.GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS in attrs)) {
|
|
245
|
+
attrs[attributes.GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS] = anthropicUsage.cache_read_input_tokens;
|
|
246
|
+
}
|
|
198
247
|
}
|
|
199
248
|
}
|
|
200
249
|
function extractLlmResponseAttributes(llmResult, recordOutputs) {
|
|
@@ -221,7 +270,7 @@ function extractLlmResponseAttributes(llmResult, recordOutputs) {
|
|
|
221
270
|
}
|
|
222
271
|
}
|
|
223
272
|
}
|
|
224
|
-
addTokenUsageAttributes(llmResult
|
|
273
|
+
addTokenUsageAttributes(llmResult, attrs);
|
|
225
274
|
const llmOutput = llmResult.llmOutput;
|
|
226
275
|
const firstGeneration = llmResult.generations?.[0]?.[0];
|
|
227
276
|
const v1Message = firstGeneration?.message;
|
|
@@ -294,6 +343,7 @@ exports._INTERNAL_mergeLangChainCallbackHandler = _INTERNAL_mergeLangChainCallba
|
|
|
294
343
|
exports.extractChatModelRequestAttributes = extractChatModelRequestAttributes;
|
|
295
344
|
exports.extractLLMRequestAttributes = extractLLMRequestAttributes;
|
|
296
345
|
exports.extractLlmResponseAttributes = extractLlmResponseAttributes;
|
|
346
|
+
exports.extractMessageTokenUsageAttributes = extractMessageTokenUsageAttributes;
|
|
297
347
|
exports.extractToolDefinitions = extractToolDefinitions;
|
|
298
348
|
exports.getAgentNameFromMetadata = getAgentNameFromMetadata;
|
|
299
349
|
exports.getInvocationParams = getInvocationParams;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
2
|
|
|
3
|
+
const attributes = require('@sentry/conventions/attributes');
|
|
3
4
|
const semanticAttributes = require('../../semanticAttributes.js');
|
|
4
5
|
const spanstatus = require('../spanstatus.js');
|
|
5
6
|
const trace = require('../trace.js');
|
|
@@ -118,39 +119,14 @@ function extractToolCalls(messages) {
|
|
|
118
119
|
return toolCalls.length > 0 ? toolCalls : null;
|
|
119
120
|
}
|
|
120
121
|
function extractTokenUsageFromMessage(message) {
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
}
|
|
130
|
-
if (typeof usage.output_tokens === "number") {
|
|
131
|
-
outputTokens = usage.output_tokens;
|
|
132
|
-
}
|
|
133
|
-
if (typeof usage.total_tokens === "number") {
|
|
134
|
-
totalTokens = usage.total_tokens;
|
|
135
|
-
}
|
|
136
|
-
return { inputTokens, outputTokens, totalTokens };
|
|
137
|
-
}
|
|
138
|
-
if (msg.response_metadata && typeof msg.response_metadata === "object") {
|
|
139
|
-
const metadata = msg.response_metadata;
|
|
140
|
-
if (metadata.tokenUsage && typeof metadata.tokenUsage === "object") {
|
|
141
|
-
const tokenUsage = metadata.tokenUsage;
|
|
142
|
-
if (typeof tokenUsage.promptTokens === "number") {
|
|
143
|
-
inputTokens = tokenUsage.promptTokens;
|
|
144
|
-
}
|
|
145
|
-
if (typeof tokenUsage.completionTokens === "number") {
|
|
146
|
-
outputTokens = tokenUsage.completionTokens;
|
|
147
|
-
}
|
|
148
|
-
if (typeof tokenUsage.totalTokens === "number") {
|
|
149
|
-
totalTokens = tokenUsage.totalTokens;
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
return { inputTokens, outputTokens, totalTokens };
|
|
122
|
+
const attributes$1 = utils.extractMessageTokenUsageAttributes(message);
|
|
123
|
+
return {
|
|
124
|
+
inputTokens: attributes$1[genAiAttributes.GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE] ?? 0,
|
|
125
|
+
outputTokens: attributes$1[genAiAttributes.GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE] ?? 0,
|
|
126
|
+
totalTokens: attributes$1[genAiAttributes.GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE] ?? 0,
|
|
127
|
+
cacheCreationInputTokens: attributes$1[attributes.GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS],
|
|
128
|
+
cacheReadInputTokens: attributes$1[attributes.GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS]
|
|
129
|
+
};
|
|
154
130
|
}
|
|
155
131
|
function extractModelMetadata(span, message) {
|
|
156
132
|
const msg = message;
|
|
@@ -198,11 +174,19 @@ function setResponseAttributes(span, inputMessages, result) {
|
|
|
198
174
|
let totalInputTokens = 0;
|
|
199
175
|
let totalOutputTokens = 0;
|
|
200
176
|
let totalTokens = 0;
|
|
177
|
+
let cacheCreationInputTokens;
|
|
178
|
+
let cacheReadInputTokens;
|
|
201
179
|
for (const message of newMessages) {
|
|
202
180
|
const tokens = extractTokenUsageFromMessage(message);
|
|
203
181
|
totalInputTokens += tokens.inputTokens;
|
|
204
182
|
totalOutputTokens += tokens.outputTokens;
|
|
205
183
|
totalTokens += tokens.totalTokens;
|
|
184
|
+
if (tokens.cacheCreationInputTokens !== void 0) {
|
|
185
|
+
cacheCreationInputTokens = (cacheCreationInputTokens ?? 0) + tokens.cacheCreationInputTokens;
|
|
186
|
+
}
|
|
187
|
+
if (tokens.cacheReadInputTokens !== void 0) {
|
|
188
|
+
cacheReadInputTokens = (cacheReadInputTokens ?? 0) + tokens.cacheReadInputTokens;
|
|
189
|
+
}
|
|
206
190
|
extractModelMetadata(span, message);
|
|
207
191
|
}
|
|
208
192
|
if (totalInputTokens > 0) {
|
|
@@ -214,6 +198,12 @@ function setResponseAttributes(span, inputMessages, result) {
|
|
|
214
198
|
if (totalTokens > 0) {
|
|
215
199
|
span.setAttribute(genAiAttributes.GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE, totalTokens);
|
|
216
200
|
}
|
|
201
|
+
if (cacheCreationInputTokens !== void 0) {
|
|
202
|
+
span.setAttribute(attributes.GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS, cacheCreationInputTokens);
|
|
203
|
+
}
|
|
204
|
+
if (cacheReadInputTokens !== void 0) {
|
|
205
|
+
span.setAttribute(attributes.GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS, cacheReadInputTokens);
|
|
206
|
+
}
|
|
217
207
|
}
|
|
218
208
|
|
|
219
209
|
exports.extractAgentNameFromParams = extractAgentNameFromParams;
|
|
@@ -33,6 +33,8 @@ function processChatCompletionChunk(chunk, state, recordOutputs) {
|
|
|
33
33
|
state.promptTokens = chunk.usage.prompt_tokens;
|
|
34
34
|
state.completionTokens = chunk.usage.completion_tokens;
|
|
35
35
|
state.totalTokens = chunk.usage.total_tokens;
|
|
36
|
+
state.cacheReadInputTokens = chunk.usage.prompt_tokens_details?.cached_tokens ?? state.cacheReadInputTokens;
|
|
37
|
+
state.cacheCreationInputTokens = chunk.usage.prompt_tokens_details?.cache_write_tokens ?? state.cacheCreationInputTokens;
|
|
36
38
|
}
|
|
37
39
|
for (const choice of chunk.choices ?? []) {
|
|
38
40
|
if (recordOutputs) {
|
|
@@ -86,6 +88,8 @@ function processResponsesApiEvent(streamEvent, state, recordOutputs, span) {
|
|
|
86
88
|
state.promptTokens = response.usage.input_tokens;
|
|
87
89
|
state.completionTokens = response.usage.output_tokens;
|
|
88
90
|
state.totalTokens = response.usage.total_tokens;
|
|
91
|
+
state.cacheReadInputTokens = response.usage.input_tokens_details?.cached_tokens ?? state.cacheReadInputTokens;
|
|
92
|
+
state.cacheCreationInputTokens = response.usage.input_tokens_details?.cache_write_tokens ?? state.cacheCreationInputTokens;
|
|
89
93
|
}
|
|
90
94
|
if (response.status) {
|
|
91
95
|
state.finishReasons.push(response.status);
|
|
@@ -105,6 +109,8 @@ async function* instrumentStream(stream, span, recordOutputs) {
|
|
|
105
109
|
promptTokens: void 0,
|
|
106
110
|
completionTokens: void 0,
|
|
107
111
|
totalTokens: void 0,
|
|
112
|
+
cacheReadInputTokens: void 0,
|
|
113
|
+
cacheCreationInputTokens: void 0,
|
|
108
114
|
chatCompletionToolCalls: {},
|
|
109
115
|
responsesApiToolCalls: []
|
|
110
116
|
};
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
2
|
|
|
3
|
+
const attributes = require('@sentry/conventions/attributes');
|
|
4
|
+
const is = require('../../utils/is.js');
|
|
3
5
|
const genAiAttributes = require('../ai/gen-ai-attributes.js');
|
|
4
6
|
|
|
5
7
|
function isResponsesApiStreamEvent(event) {
|
|
@@ -34,6 +36,15 @@ function addResponseAttributes(span, result, recordOutputs) {
|
|
|
34
36
|
if (typeof usage.total_tokens === "number") {
|
|
35
37
|
attrs[genAiAttributes.GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE] = usage.total_tokens;
|
|
36
38
|
}
|
|
39
|
+
const inputDetails = usage.prompt_tokens_details ?? usage.input_tokens_details;
|
|
40
|
+
if (is.isObjectLike(inputDetails)) {
|
|
41
|
+
if (typeof inputDetails.cached_tokens === "number") {
|
|
42
|
+
attrs[attributes.GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS] = inputDetails.cached_tokens;
|
|
43
|
+
}
|
|
44
|
+
if (typeof inputDetails.cache_write_tokens === "number") {
|
|
45
|
+
attrs[attributes.GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS] = inputDetails.cache_write_tokens;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
37
48
|
}
|
|
38
49
|
if (Array.isArray(response.choices)) {
|
|
39
50
|
const choices = response.choices;
|
|
@@ -113,7 +113,7 @@ function addResponseAttributes(span, result, recordOutputs) {
|
|
|
113
113
|
}
|
|
114
114
|
const response = result;
|
|
115
115
|
if (response.usage) {
|
|
116
|
-
utils.
|
|
116
|
+
span.setAttributes(utils.getTokenUsageAttributes(response.usage.prompt_tokens, response.usage.completion_tokens));
|
|
117
117
|
}
|
|
118
118
|
if (recordOutputs) {
|
|
119
119
|
let responseText;
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
2
|
|
|
3
|
+
function isInternalException(hint) {
|
|
4
|
+
return hint.data?.__sentry__ === true;
|
|
5
|
+
}
|
|
3
6
|
function getPossibleEventMessages(event) {
|
|
4
7
|
const possibleMessages = [];
|
|
5
8
|
if (event.message) {
|
|
@@ -19,4 +22,5 @@ function getPossibleEventMessages(event) {
|
|
|
19
22
|
}
|
|
20
23
|
|
|
21
24
|
exports.getPossibleEventMessages = getPossibleEventMessages;
|
|
25
|
+
exports.isInternalException = isInternalException;
|
|
22
26
|
//# sourceMappingURL=eventUtils.js.map
|
|
@@ -4,6 +4,7 @@ const constants = require('../constants.js');
|
|
|
4
4
|
const eventProcessors = require('../eventProcessors.js');
|
|
5
5
|
const scope = require('../scope.js');
|
|
6
6
|
const debugIds = require('./debug-ids.js');
|
|
7
|
+
const eventUtils = require('./eventUtils.js');
|
|
7
8
|
const misc = require('./misc.js');
|
|
8
9
|
const normalize = require('./normalize.js');
|
|
9
10
|
const scopeData = require('./scopeData.js');
|
|
@@ -43,8 +44,7 @@ function prepareEvent(options, event, hint, scope, client, isolationScope) {
|
|
|
43
44
|
// Run scope event processors _after_ all other processors
|
|
44
45
|
...data.eventProcessors
|
|
45
46
|
];
|
|
46
|
-
const
|
|
47
|
-
const result = isInternalException ? syncpromise.resolvedSyncPromise(prepared) : eventProcessors.notifyEventProcessors(eventProcessors$1, prepared, hint);
|
|
47
|
+
const result = eventUtils.isInternalException(hint) ? syncpromise.resolvedSyncPromise(prepared) : eventProcessors.notifyEventProcessors(eventProcessors$1, prepared, hint);
|
|
48
48
|
return result.then((evt) => {
|
|
49
49
|
if (evt) {
|
|
50
50
|
applyDebugMeta(evt);
|
|
@@ -15,7 +15,7 @@ import { createClientReportEnvelope } from './utils/clientreport.js';
|
|
|
15
15
|
import { debug } from './utils/debug-logger.js';
|
|
16
16
|
import { makeDsn, dsnToString } from './utils/dsn.js';
|
|
17
17
|
import { addItemToEnvelope, createAttachmentEnvelopeItem } from './utils/envelope.js';
|
|
18
|
-
import { getPossibleEventMessages } from './utils/eventUtils.js';
|
|
18
|
+
import { isInternalException, getPossibleEventMessages } from './utils/eventUtils.js';
|
|
19
19
|
import { isParameterizedString, isPrimitive, isObjectLike, isThenable, isPlainObject } from './utils/is.js';
|
|
20
20
|
import { merge } from './utils/merge.js';
|
|
21
21
|
import { uuid4, checkOrSetAlreadyCaught } from './utils/misc.js';
|
|
@@ -331,8 +331,10 @@ class Client {
|
|
|
331
331
|
this.emit("beforeSendEvent", event, hint);
|
|
332
332
|
const genAiSpanItem = extractGenAiSpansFromEvent(event, this);
|
|
333
333
|
let env = createEventEnvelope(event, this._dsn, this._options._metadata, this._options.tunnel);
|
|
334
|
-
|
|
335
|
-
|
|
334
|
+
if (!isInternalException(hint)) {
|
|
335
|
+
for (const attachment of hint.attachments || []) {
|
|
336
|
+
env = addItemToEnvelope(env, createAttachmentEnvelopeItem(attachment));
|
|
337
|
+
}
|
|
336
338
|
}
|
|
337
339
|
if (genAiSpanItem) {
|
|
338
340
|
env = addItemToEnvelope(env, genAiSpanItem);
|
|
@@ -586,8 +588,7 @@ class Client {
|
|
|
586
588
|
this.recordDroppedEvent("event_processor", dataCategory);
|
|
587
589
|
throw _makeDoNotSendEventError("An event processor returned `null`, will not send event.");
|
|
588
590
|
}
|
|
589
|
-
|
|
590
|
-
if (isInternalException) {
|
|
591
|
+
if (isInternalException(hint)) {
|
|
591
592
|
return prepared;
|
|
592
593
|
}
|
|
593
594
|
const result = processBeforeSend(this, options, prepared, hint);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"type":"module","version":"10.76.
|
|
1
|
+
{"type":"module","version":"10.76.2","sideEffects":false}
|