Skip to content

Commit 2dbcfed

Browse files
authored
feat(core): Rename vercelai.schema to gen_ai.request.schema (#17850)
Renaming vercelai schema to genai schema for Vercel AI integration.
1 parent a266909 commit 2dbcfed

File tree

3 files changed

+100
-0
lines changed

3 files changed

+100
-0
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import * as Sentry from '@sentry/node';
2+
import { generateObject } from 'ai';
3+
import { MockLanguageModelV1 } from 'ai/test';
4+
import { z } from 'zod';
5+
6+
async function run() {
7+
await Sentry.startSpan({ op: 'function', name: 'main' }, async () => {
8+
// Test generateObject with schema
9+
await generateObject({
10+
model: new MockLanguageModelV1({
11+
defaultObjectGenerationMode: 'json',
12+
doGenerate: async () => ({
13+
rawCall: { rawPrompt: null, rawSettings: {} },
14+
finishReason: 'stop',
15+
usage: { promptTokens: 15, completionTokens: 25 },
16+
text: '{ "name": "John Doe", "age": 30 }',
17+
}),
18+
}),
19+
schema: z.object({
20+
name: z.string().describe('The name of the person'),
21+
age: z.number().describe('The age of the person'),
22+
}),
23+
schemaName: 'Person',
24+
schemaDescription: 'A person with name and age',
25+
prompt: 'Generate a person object',
26+
});
27+
});
28+
}
29+
30+
run();
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import { afterAll, describe, expect } from 'vitest';
2+
import { cleanupChildProcesses, createEsmAndCjsTests } from '../../../utils/runner';
3+
4+
describe('Vercel AI integration - generateObject', () => {
5+
afterAll(() => {
6+
cleanupChildProcesses();
7+
});
8+
9+
const EXPECTED_TRANSACTION = {
10+
transaction: 'main',
11+
spans: expect.arrayContaining([
12+
// generateObject span
13+
expect.objectContaining({
14+
data: expect.objectContaining({
15+
'vercel.ai.model.id': 'mock-model-id',
16+
'vercel.ai.model.provider': 'mock-provider',
17+
'vercel.ai.operationId': 'ai.generateObject',
18+
'vercel.ai.pipeline.name': 'generateObject',
19+
'vercel.ai.streaming': false,
20+
'vercel.ai.settings.mode': 'json',
21+
'vercel.ai.settings.output': 'object',
22+
'gen_ai.request.schema': expect.any(String),
23+
'gen_ai.response.model': 'mock-model-id',
24+
'gen_ai.usage.input_tokens': 15,
25+
'gen_ai.usage.output_tokens': 25,
26+
'gen_ai.usage.total_tokens': 40,
27+
'operation.name': 'ai.generateObject',
28+
'sentry.op': 'gen_ai.invoke_agent',
29+
'sentry.origin': 'auto.vercelai.otel',
30+
}),
31+
description: 'generateObject',
32+
op: 'gen_ai.invoke_agent',
33+
origin: 'auto.vercelai.otel',
34+
status: 'ok',
35+
}),
36+
// generateObject.doGenerate span
37+
expect.objectContaining({
38+
data: expect.objectContaining({
39+
'sentry.origin': 'auto.vercelai.otel',
40+
'sentry.op': 'gen_ai.generate_object',
41+
'operation.name': 'ai.generateObject.doGenerate',
42+
'vercel.ai.operationId': 'ai.generateObject.doGenerate',
43+
'vercel.ai.model.provider': 'mock-provider',
44+
'vercel.ai.model.id': 'mock-model-id',
45+
'vercel.ai.pipeline.name': 'generateObject.doGenerate',
46+
'vercel.ai.streaming': false,
47+
'gen_ai.system': 'mock-provider',
48+
'gen_ai.request.model': 'mock-model-id',
49+
'gen_ai.response.model': 'mock-model-id',
50+
'gen_ai.usage.input_tokens': 15,
51+
'gen_ai.usage.output_tokens': 25,
52+
'gen_ai.usage.total_tokens': 40,
53+
}),
54+
description: 'generate_object mock-model-id',
55+
op: 'gen_ai.generate_object',
56+
origin: 'auto.vercelai.otel',
57+
status: 'ok',
58+
}),
59+
]),
60+
};
61+
62+
createEsmAndCjsTests(__dirname, 'scenario-generate-object.mjs', 'instrument.mjs', (createRunner, test) => {
63+
test('captures generateObject spans with schema attributes', async () => {
64+
await createRunner().expect({ transaction: EXPECTED_TRANSACTION }).start().completed();
65+
});
66+
});
67+
});

packages/core/src/utils/vercel-ai/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
AI_RESPONSE_PROVIDER_METADATA_ATTRIBUTE,
1818
AI_RESPONSE_TEXT_ATTRIBUTE,
1919
AI_RESPONSE_TOOL_CALLS_ATTRIBUTE,
20+
AI_SCHEMA_ATTRIBUTE,
2021
AI_TELEMETRY_FUNCTION_ID_ATTRIBUTE,
2122
AI_TOOL_CALL_ARGS_ATTRIBUTE,
2223
AI_TOOL_CALL_ID_ATTRIBUTE,
@@ -125,6 +126,8 @@ function processEndedVercelAiSpan(span: SpanJSON): void {
125126
renameAttributeKey(attributes, AI_TOOL_CALL_ARGS_ATTRIBUTE, 'gen_ai.tool.input');
126127
renameAttributeKey(attributes, AI_TOOL_CALL_RESULT_ATTRIBUTE, 'gen_ai.tool.output');
127128

129+
renameAttributeKey(attributes, AI_SCHEMA_ATTRIBUTE, 'gen_ai.request.schema');
130+
128131
addProviderMetadataToAttributes(attributes);
129132

130133
// Change attributes namespaced with `ai.X` to `vercel.ai.X`

0 commit comments

Comments
 (0)