diff --git a/MIGRATION.md b/MIGRATION.md index 1f1a7a2422fc..2d8012ad7090 100644 --- a/MIGRATION.md +++ b/MIGRATION.md @@ -264,6 +264,7 @@ Affected SDKs: All SDKs. - The `gen_ai.system` span attribute was renamed to `gen_ai.provider.name` across all AI integrations. - The `gen_ai.request.available_tools` span attribute was renamed to `gen_ai.tool.definitions` across all AI integrations. - The `gen_ai.tool.input` span attribute was renamed to `gen_ai.tool.call.arguments` across all AI integrations. +- The `gen_ai.tool.output` span attribute was renamed to `gen_ai.tool.call.result` across all AI integrations. - Span attributes now use the shared `@sentry/conventions` package under the hood. If you reference these attributes in custom instrumentation, `beforeSendSpan`, dashboards, or alerts, update them to the new names. diff --git a/dev-packages/node-integration-tests/suites/tracing/vercelai/span-streaming-v4/test.ts b/dev-packages/node-integration-tests/suites/tracing/vercelai/span-streaming-v4/test.ts index 17667995f7db..d15024db714f 100644 --- a/dev-packages/node-integration-tests/suites/tracing/vercelai/span-streaming-v4/test.ts +++ b/dev-packages/node-integration-tests/suites/tracing/vercelai/span-streaming-v4/test.ts @@ -7,10 +7,10 @@ import { GEN_AI_REQUEST_MODEL, GEN_AI_RESPONSE_MODEL, GEN_AI_TOOL_CALL_ARGUMENTS, + GEN_AI_TOOL_CALL_RESULT, GEN_AI_TOOL_DEFINITIONS, GEN_AI_TOOL_DESCRIPTION, GEN_AI_TOOL_NAME, - GEN_AI_TOOL_OUTPUT, GEN_AI_TOOL_TYPE, GEN_AI_USAGE_INPUT_TOKENS, GEN_AI_USAGE_OUTPUT_TOKENS, @@ -235,7 +235,7 @@ describe('Vercel AI integration (streaming v4)', () => { [GEN_AI_TOOL_DESCRIPTION]: attr('Get the current weather for a location'), [GEN_AI_TOOL_CALL_ARGUMENTS]: expect.objectContaining({ value: expect.any(String) }), [GEN_AI_TOOL_NAME]: attr('getWeather'), - [GEN_AI_TOOL_OUTPUT]: expect.objectContaining({ value: expect.any(String) }), + [GEN_AI_TOOL_CALL_RESULT]: expect.objectContaining({ value: expect.any(String) }), [GEN_AI_TOOL_TYPE]: attr('function'), [GEN_AI_OPERATION_NAME]: attr('execute_tool'), [SEMANTIC_ATTRIBUTE_SENTRY_OP]: attr('gen_ai.execute_tool'), diff --git a/dev-packages/node-integration-tests/suites/tracing/vercelai/span-streaming-v6/test.ts b/dev-packages/node-integration-tests/suites/tracing/vercelai/span-streaming-v6/test.ts index 69daf114d787..68834bd76153 100644 --- a/dev-packages/node-integration-tests/suites/tracing/vercelai/span-streaming-v6/test.ts +++ b/dev-packages/node-integration-tests/suites/tracing/vercelai/span-streaming-v6/test.ts @@ -7,10 +7,10 @@ import { GEN_AI_REQUEST_MODEL, GEN_AI_RESPONSE_MODEL, GEN_AI_TOOL_CALL_ARGUMENTS, + GEN_AI_TOOL_CALL_RESULT, GEN_AI_TOOL_DEFINITIONS, GEN_AI_TOOL_DESCRIPTION, GEN_AI_TOOL_NAME, - GEN_AI_TOOL_OUTPUT, GEN_AI_TOOL_TYPE, GEN_AI_USAGE_INPUT_TOKENS, GEN_AI_USAGE_OUTPUT_TOKENS, @@ -229,7 +229,7 @@ describe('Vercel AI integration (streaming, v6)', () => { [GEN_AI_TOOL_DESCRIPTION]: attr('Get the current weather for a location'), [GEN_AI_TOOL_CALL_ARGUMENTS]: expect.objectContaining({ value: expect.any(String) }), [GEN_AI_TOOL_NAME]: attr('getWeather'), - [GEN_AI_TOOL_OUTPUT]: expect.objectContaining({ value: expect.any(String) }), + [GEN_AI_TOOL_CALL_RESULT]: expect.objectContaining({ value: expect.any(String) }), [GEN_AI_TOOL_TYPE]: attr('function'), [GEN_AI_OPERATION_NAME]: attr('execute_tool'), [SEMANTIC_ATTRIBUTE_SENTRY_OP]: attr('gen_ai.execute_tool'), diff --git a/dev-packages/node-integration-tests/suites/tracing/vercelai/test.ts b/dev-packages/node-integration-tests/suites/tracing/vercelai/test.ts index 8d445b9ba781..d8dffcadf7a2 100644 --- a/dev-packages/node-integration-tests/suites/tracing/vercelai/test.ts +++ b/dev-packages/node-integration-tests/suites/tracing/vercelai/test.ts @@ -10,10 +10,10 @@ import { GEN_AI_RESPONSE_MODEL, GEN_AI_SYSTEM_INSTRUCTIONS, GEN_AI_TOOL_CALL_ARGUMENTS, + GEN_AI_TOOL_CALL_RESULT, GEN_AI_TOOL_DEFINITIONS, GEN_AI_TOOL_DESCRIPTION, GEN_AI_TOOL_NAME, - GEN_AI_TOOL_OUTPUT, GEN_AI_TOOL_TYPE, GEN_AI_USAGE_INPUT_TOKENS, GEN_AI_USAGE_OUTPUT_TOKENS, @@ -242,7 +242,7 @@ describe('Vercel AI integration (v4)', () => { 'Get the current weather for a location', ); expect(toolExecutionSpan!.attributes[GEN_AI_TOOL_CALL_ARGUMENTS]).toBeDefined(); - expect(toolExecutionSpan!.attributes[GEN_AI_TOOL_OUTPUT]).toBeDefined(); + expect(toolExecutionSpan!.attributes[GEN_AI_TOOL_CALL_RESULT]).toBeDefined(); }, }) .start() diff --git a/dev-packages/node-integration-tests/suites/tracing/vercelai/v5/test.ts b/dev-packages/node-integration-tests/suites/tracing/vercelai/v5/test.ts index 1e063c674914..b5ca50356e64 100644 --- a/dev-packages/node-integration-tests/suites/tracing/vercelai/v5/test.ts +++ b/dev-packages/node-integration-tests/suites/tracing/vercelai/v5/test.ts @@ -7,10 +7,10 @@ import { GEN_AI_REQUEST_MODEL, GEN_AI_RESPONSE_MODEL, GEN_AI_TOOL_CALL_ARGUMENTS, + GEN_AI_TOOL_CALL_RESULT, GEN_AI_TOOL_DEFINITIONS, GEN_AI_TOOL_DESCRIPTION, GEN_AI_TOOL_NAME, - GEN_AI_TOOL_OUTPUT, GEN_AI_TOOL_TYPE, GEN_AI_USAGE_INPUT_TOKENS, GEN_AI_USAGE_OUTPUT_TOKENS, @@ -248,7 +248,7 @@ describe('Vercel AI integration (v5)', () => { 'Get the current weather for a location', ); expect(toolExecutionSpan!.attributes[GEN_AI_TOOL_CALL_ARGUMENTS]).toBeDefined(); - expect(toolExecutionSpan!.attributes[GEN_AI_TOOL_OUTPUT]).toBeDefined(); + expect(toolExecutionSpan!.attributes[GEN_AI_TOOL_CALL_RESULT]).toBeDefined(); }, }) .start() diff --git a/dev-packages/node-integration-tests/suites/tracing/vercelai/v6_v7/test.ts b/dev-packages/node-integration-tests/suites/tracing/vercelai/v6_v7/test.ts index f06e432e5b29..e37a1f8a0643 100644 --- a/dev-packages/node-integration-tests/suites/tracing/vercelai/v6_v7/test.ts +++ b/dev-packages/node-integration-tests/suites/tracing/vercelai/v6_v7/test.ts @@ -11,10 +11,10 @@ import { GEN_AI_RESPONSE_MODEL, GEN_AI_SYSTEM_INSTRUCTIONS, GEN_AI_TOOL_CALL_ARGUMENTS, + GEN_AI_TOOL_CALL_RESULT, GEN_AI_TOOL_DEFINITIONS, GEN_AI_TOOL_DESCRIPTION, GEN_AI_TOOL_NAME, - GEN_AI_TOOL_OUTPUT, GEN_AI_TOOL_TYPE, GEN_AI_USAGE_INPUT_TOKENS, GEN_AI_USAGE_INPUT_TOKENS_CACHED, @@ -151,7 +151,7 @@ describe.each(matrix)('Vercel AI integration (version %s)', (version, vercelAiVe 'Get the current weather for a location', ); expect(toolExecutionSpan.attributes[GEN_AI_TOOL_CALL_ARGUMENTS]).toBeDefined(); - expect(toolExecutionSpan.attributes[GEN_AI_TOOL_OUTPUT]).toBeDefined(); + expect(toolExecutionSpan.attributes[GEN_AI_TOOL_CALL_RESULT]).toBeDefined(); }, }) .start() diff --git a/packages/server-utils/src/ai/langchain/index.ts b/packages/server-utils/src/ai/langchain/index.ts index 4d441ccd8c68..d29533f8be48 100644 --- a/packages/server-utils/src/ai/langchain/index.ts +++ b/packages/server-utils/src/ai/langchain/index.ts @@ -1,4 +1,3 @@ -/* eslint-disable typescript-eslint/no-deprecated */ /* eslint-disable max-lines */ import { captureException, @@ -12,9 +11,9 @@ import { GEN_AI_OPERATION_NAME, GEN_AI_REQUEST_MODEL, GEN_AI_TOOL_CALL_ARGUMENTS, + GEN_AI_TOOL_CALL_RESULT, GEN_AI_TOOL_DEFINITIONS, GEN_AI_TOOL_NAME, - GEN_AI_TOOL_OUTPUT, } from '@sentry/conventions/attributes'; import { resolveAIRecordingOptions, shouldEnableTruncation } from '../core/utils'; import { LANGCHAIN_ORIGIN } from './constants'; @@ -331,7 +330,7 @@ export function createLangChainCallbackHandler(options: LangChainOptions = {}): const content = outputObj && typeof outputObj === 'object' && 'content' in outputObj ? outputObj.content : output; span.setAttributes({ - [GEN_AI_TOOL_OUTPUT]: typeof content === 'string' ? content : JSON.stringify(content), + [GEN_AI_TOOL_CALL_RESULT]: typeof content === 'string' ? content : JSON.stringify(content), }); } exitSpan(runId); diff --git a/packages/server-utils/src/ai/langgraph/utils.ts b/packages/server-utils/src/ai/langgraph/utils.ts index 3b1bf402a614..981f9b0a0b63 100644 --- a/packages/server-utils/src/ai/langgraph/utils.ts +++ b/packages/server-utils/src/ai/langgraph/utils.ts @@ -15,9 +15,9 @@ import { GEN_AI_RESPONSE_TEXT, GEN_AI_RESPONSE_TOOL_CALLS, GEN_AI_TOOL_CALL_ARGUMENTS, + GEN_AI_TOOL_CALL_RESULT, GEN_AI_TOOL_DESCRIPTION, GEN_AI_TOOL_NAME, - GEN_AI_TOOL_OUTPUT, GEN_AI_TOOL_TYPE, GEN_AI_USAGE_INPUT_TOKENS, GEN_AI_USAGE_OUTPUT_TOKENS, @@ -133,7 +133,7 @@ export function wrapToolsWithSpans(tools: unknown[], options: LangGraphOptions, const content = resultObj && typeof resultObj === 'object' && 'content' in resultObj ? resultObj.content : result; span.setAttribute( - GEN_AI_TOOL_OUTPUT, + GEN_AI_TOOL_CALL_RESULT, typeof content === 'string' ? content : JSON.stringify(content), ); } catch { diff --git a/packages/server-utils/src/ai/vercel-ai/index.ts b/packages/server-utils/src/ai/vercel-ai/index.ts index fa15651c7215..06ed34562596 100644 --- a/packages/server-utils/src/ai/vercel-ai/index.ts +++ b/packages/server-utils/src/ai/vercel-ai/index.ts @@ -21,10 +21,10 @@ import { GEN_AI_REQUEST_MODEL, GEN_AI_RESPONSE_MODEL, GEN_AI_TOOL_CALL_ARGUMENTS, + GEN_AI_TOOL_CALL_RESULT, GEN_AI_TOOL_DEFINITIONS, GEN_AI_TOOL_DESCRIPTION, GEN_AI_TOOL_NAME, - GEN_AI_TOOL_OUTPUT, GEN_AI_TOOL_TYPE, GEN_AI_USAGE_INPUT_TOKENS, GEN_AI_USAGE_INPUT_TOKENS_CACHED, @@ -321,7 +321,7 @@ export function processVercelAiSpanAttributes(attributes: Record