@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
|
@@ -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,
|
|
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,
|
|
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
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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,
|
|
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,
|
|
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
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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")
|
|
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,
|
|
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
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
if (typeof usage.
|
|
126
|
-
span.
|
|
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.
|
|
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 {
|
|
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
|
|
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 (
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
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
|
|
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
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
|
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);
|
|
@@ -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
|
-
*
|
|
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
|
|
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
|
|
53
|
-
cache_read_input_tokens
|
|
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
|