Skip to content

Commit e2ab088

Browse files
committed
Fix tests
1 parent eeb7812 commit e2ab088

17 files changed

Lines changed: 4335 additions & 5337 deletions

File tree

dev-packages/cloudflare-integration-tests/suites/tracing/anthropic-ai/test.ts

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/core';
21
import { expect, it } from 'vitest';
32
import {
43
GEN_AI_OPERATION_NAME_ATTRIBUTE,
@@ -24,27 +23,32 @@ it('traces a basic message creation request', async ({ signal }) => {
2423
const transactionEvent = envelope[1]?.[0]?.[1] as any;
2524

2625
expect(transactionEvent.transaction).toBe('GET /');
27-
expect(transactionEvent.spans).toEqual(
28-
expect.arrayContaining([
29-
expect.objectContaining({
30-
data: expect.objectContaining({
31-
[GEN_AI_OPERATION_NAME_ATTRIBUTE]: 'chat',
32-
[SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'gen_ai.chat',
33-
[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ai.anthropic',
34-
[GEN_AI_SYSTEM_ATTRIBUTE]: 'anthropic',
35-
[GEN_AI_REQUEST_MODEL_ATTRIBUTE]: 'claude-3-haiku-20240307',
36-
[GEN_AI_REQUEST_TEMPERATURE_ATTRIBUTE]: 0.7,
37-
[GEN_AI_RESPONSE_MODEL_ATTRIBUTE]: 'claude-3-haiku-20240307',
38-
[GEN_AI_RESPONSE_ID_ATTRIBUTE]: 'msg_mock123',
39-
[GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE]: 10,
40-
[GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE]: 15,
41-
}),
42-
description: 'chat claude-3-haiku-20240307',
43-
op: 'gen_ai.chat',
44-
origin: 'auto.ai.anthropic',
45-
}),
46-
]),
26+
expect(transactionEvent.spans).toEqual([]);
27+
})
28+
.expect(envelope => {
29+
const container = envelope[1]?.[0]?.[1] as any;
30+
const spans = container.items;
31+
32+
const chatSpan = spans.find(
33+
(s: any) => s.name === 'chat claude-3-haiku-20240307' && s.attributes?.['sentry.op']?.value === 'gen_ai.chat',
4734
);
35+
expect(chatSpan).toBeDefined();
36+
expect(chatSpan).toMatchObject({
37+
name: 'chat claude-3-haiku-20240307',
38+
status: 'ok',
39+
});
40+
expect(chatSpan.attributes).toMatchObject({
41+
[GEN_AI_OPERATION_NAME_ATTRIBUTE]: { type: 'string', value: 'chat' },
42+
'sentry.op': { type: 'string', value: 'gen_ai.chat' },
43+
'sentry.origin': { type: 'string', value: 'auto.ai.anthropic' },
44+
[GEN_AI_SYSTEM_ATTRIBUTE]: { type: 'string', value: 'anthropic' },
45+
[GEN_AI_REQUEST_MODEL_ATTRIBUTE]: { type: 'string', value: 'claude-3-haiku-20240307' },
46+
[GEN_AI_REQUEST_TEMPERATURE_ATTRIBUTE]: { type: 'double', value: 0.7 },
47+
[GEN_AI_RESPONSE_MODEL_ATTRIBUTE]: { type: 'string', value: 'claude-3-haiku-20240307' },
48+
[GEN_AI_RESPONSE_ID_ATTRIBUTE]: { type: 'string', value: 'msg_mock123' },
49+
[GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE]: { type: 'integer', value: 10 },
50+
[GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE]: { type: 'integer', value: 15 },
51+
});
4852
})
4953
.start(signal);
5054
await runner.makeRequest('get', '/');

dev-packages/cloudflare-integration-tests/suites/tracing/google-genai/test.ts

Lines changed: 67 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/core';
21
import { expect, it } from 'vitest';
32
import {
43
GEN_AI_OPERATION_NAME_ATTRIBUTE,
@@ -25,58 +24,74 @@ it('traces Google GenAI chat creation and message sending', async () => {
2524
const transactionEvent = envelope[1]?.[0]?.[1] as any;
2625

2726
expect(transactionEvent.transaction).toBe('GET /');
28-
expect(transactionEvent.spans).toEqual(
29-
expect.arrayContaining([
30-
// chat.sendMessage
31-
expect.objectContaining({
32-
data: expect.objectContaining({
33-
[GEN_AI_OPERATION_NAME_ATTRIBUTE]: 'chat',
34-
[SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'gen_ai.chat',
35-
[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ai.google_genai',
36-
[GEN_AI_SYSTEM_ATTRIBUTE]: 'google_genai',
37-
[GEN_AI_REQUEST_MODEL_ATTRIBUTE]: 'gemini-1.5-pro',
38-
[GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE]: 8,
39-
[GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE]: 12,
40-
[GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE]: 20,
41-
}),
42-
description: 'chat gemini-1.5-pro',
43-
op: 'gen_ai.chat',
44-
origin: 'auto.ai.google_genai',
45-
}),
46-
// models.generateContent
47-
expect.objectContaining({
48-
data: expect.objectContaining({
49-
[GEN_AI_OPERATION_NAME_ATTRIBUTE]: 'generate_content',
50-
[SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'gen_ai.generate_content',
51-
[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ai.google_genai',
52-
[GEN_AI_SYSTEM_ATTRIBUTE]: 'google_genai',
53-
[GEN_AI_REQUEST_MODEL_ATTRIBUTE]: 'gemini-1.5-flash',
54-
[GEN_AI_REQUEST_TEMPERATURE_ATTRIBUTE]: 0.7,
55-
[GEN_AI_REQUEST_TOP_P_ATTRIBUTE]: 0.9,
56-
[GEN_AI_REQUEST_MAX_TOKENS_ATTRIBUTE]: 100,
57-
[GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE]: 8,
58-
[GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE]: 12,
59-
[GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE]: 20,
60-
}),
61-
description: 'generate_content gemini-1.5-flash',
62-
op: 'gen_ai.generate_content',
63-
origin: 'auto.ai.google_genai',
64-
}),
65-
// models.embedContent
66-
expect.objectContaining({
67-
data: expect.objectContaining({
68-
[GEN_AI_OPERATION_NAME_ATTRIBUTE]: 'embeddings',
69-
[SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'gen_ai.embeddings',
70-
[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ai.google_genai',
71-
[GEN_AI_SYSTEM_ATTRIBUTE]: 'google_genai',
72-
[GEN_AI_REQUEST_MODEL_ATTRIBUTE]: 'text-embedding-004',
73-
}),
74-
description: 'embeddings text-embedding-004',
75-
op: 'gen_ai.embeddings',
76-
origin: 'auto.ai.google_genai',
77-
}),
78-
]),
27+
expect(transactionEvent.spans).toEqual([]);
28+
})
29+
.expect(envelope => {
30+
const container = envelope[1]?.[0]?.[1] as any;
31+
const spans = container.items;
32+
33+
// chat.sendMessage
34+
const chatSpan = spans.find(
35+
(s: any) => s.name === 'chat gemini-1.5-pro' && s.attributes?.['sentry.op']?.value === 'gen_ai.chat',
36+
);
37+
expect(chatSpan).toBeDefined();
38+
expect(chatSpan).toMatchObject({
39+
name: 'chat gemini-1.5-pro',
40+
status: 'ok',
41+
});
42+
expect(chatSpan.attributes).toMatchObject({
43+
[GEN_AI_OPERATION_NAME_ATTRIBUTE]: { type: 'string', value: 'chat' },
44+
'sentry.op': { type: 'string', value: 'gen_ai.chat' },
45+
'sentry.origin': { type: 'string', value: 'auto.ai.google_genai' },
46+
[GEN_AI_SYSTEM_ATTRIBUTE]: { type: 'string', value: 'google_genai' },
47+
[GEN_AI_REQUEST_MODEL_ATTRIBUTE]: { type: 'string', value: 'gemini-1.5-pro' },
48+
[GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE]: { type: 'integer', value: 8 },
49+
[GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE]: { type: 'integer', value: 12 },
50+
[GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE]: { type: 'integer', value: 20 },
51+
});
52+
53+
// models.generateContent
54+
const generateSpan = spans.find(
55+
(s: any) =>
56+
s.name === 'generate_content gemini-1.5-flash' &&
57+
s.attributes?.['sentry.op']?.value === 'gen_ai.generate_content',
58+
);
59+
expect(generateSpan).toBeDefined();
60+
expect(generateSpan).toMatchObject({
61+
name: 'generate_content gemini-1.5-flash',
62+
status: 'ok',
63+
});
64+
expect(generateSpan.attributes).toMatchObject({
65+
[GEN_AI_OPERATION_NAME_ATTRIBUTE]: { type: 'string', value: 'generate_content' },
66+
'sentry.op': { type: 'string', value: 'gen_ai.generate_content' },
67+
'sentry.origin': { type: 'string', value: 'auto.ai.google_genai' },
68+
[GEN_AI_SYSTEM_ATTRIBUTE]: { type: 'string', value: 'google_genai' },
69+
[GEN_AI_REQUEST_MODEL_ATTRIBUTE]: { type: 'string', value: 'gemini-1.5-flash' },
70+
[GEN_AI_REQUEST_TEMPERATURE_ATTRIBUTE]: { type: 'double', value: 0.7 },
71+
[GEN_AI_REQUEST_TOP_P_ATTRIBUTE]: { type: 'double', value: 0.9 },
72+
[GEN_AI_REQUEST_MAX_TOKENS_ATTRIBUTE]: { type: 'integer', value: 100 },
73+
[GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE]: { type: 'integer', value: 8 },
74+
[GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE]: { type: 'integer', value: 12 },
75+
[GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE]: { type: 'integer', value: 20 },
76+
});
77+
78+
// models.embedContent
79+
const embedSpan = spans.find(
80+
(s: any) =>
81+
s.name === 'embeddings text-embedding-004' && s.attributes?.['sentry.op']?.value === 'gen_ai.embeddings',
7982
);
83+
expect(embedSpan).toBeDefined();
84+
expect(embedSpan).toMatchObject({
85+
name: 'embeddings text-embedding-004',
86+
status: 'ok',
87+
});
88+
expect(embedSpan.attributes).toMatchObject({
89+
[GEN_AI_OPERATION_NAME_ATTRIBUTE]: { type: 'string', value: 'embeddings' },
90+
'sentry.op': { type: 'string', value: 'gen_ai.embeddings' },
91+
'sentry.origin': { type: 'string', value: 'auto.ai.google_genai' },
92+
[GEN_AI_SYSTEM_ATTRIBUTE]: { type: 'string', value: 'google_genai' },
93+
[GEN_AI_REQUEST_MODEL_ATTRIBUTE]: { type: 'string', value: 'text-embedding-004' },
94+
});
8095
})
8196
.start();
8297
await runner.makeRequest('get', '/');

dev-packages/cloudflare-integration-tests/suites/tracing/langchain/test.ts

Lines changed: 58 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/core';
21
import { expect, it } from 'vitest';
32
import {
43
GEN_AI_OPERATION_NAME_ATTRIBUTE,
@@ -25,50 +24,65 @@ it('traces langchain chat model, chain, and tool invocations', async ({ signal }
2524
const transactionEvent = envelope[1]?.[0]?.[1] as any;
2625

2726
expect(transactionEvent.transaction).toBe('GET /');
28-
expect(transactionEvent.spans).toEqual(
29-
expect.arrayContaining([
30-
// Chat model span
31-
expect.objectContaining({
32-
data: expect.objectContaining({
33-
[GEN_AI_OPERATION_NAME_ATTRIBUTE]: 'chat',
34-
[SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'gen_ai.chat',
35-
[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ai.langchain',
36-
[GEN_AI_SYSTEM_ATTRIBUTE]: 'anthropic',
37-
[GEN_AI_REQUEST_MODEL_ATTRIBUTE]: 'claude-3-5-sonnet-20241022',
38-
[GEN_AI_REQUEST_TEMPERATURE_ATTRIBUTE]: 0.7,
39-
[GEN_AI_REQUEST_MAX_TOKENS_ATTRIBUTE]: 100,
40-
[GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE]: 10,
41-
[GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE]: 15,
42-
[GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE]: 25,
43-
}),
44-
description: 'chat claude-3-5-sonnet-20241022',
45-
op: 'gen_ai.chat',
46-
origin: 'auto.ai.langchain',
47-
}),
48-
// Chain span
49-
expect.objectContaining({
50-
data: expect.objectContaining({
51-
[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ai.langchain',
52-
[SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'gen_ai.invoke_agent',
53-
'langchain.chain.name': 'my_test_chain',
54-
}),
55-
description: 'chain my_test_chain',
56-
op: 'gen_ai.invoke_agent',
57-
origin: 'auto.ai.langchain',
58-
}),
59-
// Tool span
60-
expect.objectContaining({
61-
data: expect.objectContaining({
62-
[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ai.langchain',
63-
[SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'gen_ai.execute_tool',
64-
[GEN_AI_TOOL_NAME_ATTRIBUTE]: 'search_tool',
65-
}),
66-
description: 'execute_tool search_tool',
67-
op: 'gen_ai.execute_tool',
68-
origin: 'auto.ai.langchain',
69-
}),
70-
]),
27+
expect(transactionEvent.spans).toEqual([]);
28+
})
29+
.expect(envelope => {
30+
const container = envelope[1]?.[0]?.[1] as any;
31+
const spans = container.items;
32+
33+
// Chat model span
34+
const chatSpan = spans.find(
35+
(s: any) =>
36+
s.name === 'chat claude-3-5-sonnet-20241022' && s.attributes?.['sentry.op']?.value === 'gen_ai.chat',
37+
);
38+
expect(chatSpan).toBeDefined();
39+
expect(chatSpan).toMatchObject({
40+
name: 'chat claude-3-5-sonnet-20241022',
41+
status: 'ok',
42+
});
43+
expect(chatSpan.attributes).toMatchObject({
44+
[GEN_AI_OPERATION_NAME_ATTRIBUTE]: { type: 'string', value: 'chat' },
45+
'sentry.op': { type: 'string', value: 'gen_ai.chat' },
46+
'sentry.origin': { type: 'string', value: 'auto.ai.langchain' },
47+
[GEN_AI_SYSTEM_ATTRIBUTE]: { type: 'string', value: 'anthropic' },
48+
[GEN_AI_REQUEST_MODEL_ATTRIBUTE]: { type: 'string', value: 'claude-3-5-sonnet-20241022' },
49+
[GEN_AI_REQUEST_TEMPERATURE_ATTRIBUTE]: { type: 'double', value: 0.7 },
50+
[GEN_AI_REQUEST_MAX_TOKENS_ATTRIBUTE]: { type: 'integer', value: 100 },
51+
[GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE]: { type: 'integer', value: 10 },
52+
[GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE]: { type: 'integer', value: 15 },
53+
[GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE]: { type: 'integer', value: 25 },
54+
});
55+
56+
// Chain span
57+
const chainSpan = spans.find(
58+
(s: any) => s.name === 'chain my_test_chain' && s.attributes?.['sentry.op']?.value === 'gen_ai.invoke_agent',
59+
);
60+
expect(chainSpan).toBeDefined();
61+
expect(chainSpan).toMatchObject({
62+
name: 'chain my_test_chain',
63+
status: 'ok',
64+
});
65+
expect(chainSpan.attributes).toMatchObject({
66+
'sentry.origin': { type: 'string', value: 'auto.ai.langchain' },
67+
'sentry.op': { type: 'string', value: 'gen_ai.invoke_agent' },
68+
'langchain.chain.name': { type: 'string', value: 'my_test_chain' },
69+
});
70+
71+
// Tool span
72+
const toolSpan = spans.find(
73+
(s: any) =>
74+
s.name === 'execute_tool search_tool' && s.attributes?.['sentry.op']?.value === 'gen_ai.execute_tool',
7175
);
76+
expect(toolSpan).toBeDefined();
77+
expect(toolSpan).toMatchObject({
78+
name: 'execute_tool search_tool',
79+
status: 'ok',
80+
});
81+
expect(toolSpan.attributes).toMatchObject({
82+
'sentry.origin': { type: 'string', value: 'auto.ai.langchain' },
83+
'sentry.op': { type: 'string', value: 'gen_ai.execute_tool' },
84+
[GEN_AI_TOOL_NAME_ATTRIBUTE]: { type: 'string', value: 'search_tool' },
85+
});
7286
})
7387
.start(signal);
7488
await runner.makeRequest('get', '/');

dev-packages/cloudflare-integration-tests/suites/tracing/langgraph/test.ts

Lines changed: 40 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/core';
21
import { expect, it } from 'vitest';
32
import {
43
GEN_AI_AGENT_NAME_ATTRIBUTE,
@@ -25,44 +24,56 @@ it('traces langgraph compile and invoke operations', async ({ signal }) => {
2524
const transactionEvent = envelope[1]?.[0]?.[1] as any;
2625

2726
expect(transactionEvent.transaction).toBe('GET /');
27+
expect(transactionEvent.spans).toEqual([]);
28+
})
29+
.expect(envelope => {
30+
const container = envelope[1]?.[0]?.[1] as any;
31+
const spans = container.items;
2832

2933
// Check create_agent span
30-
const createAgentSpan = transactionEvent.spans.find((span: any) => span.op === 'gen_ai.create_agent');
34+
const createAgentSpan = spans.find(
35+
(s: any) => s.attributes?.['sentry.op']?.value === 'gen_ai.create_agent',
36+
);
37+
expect(createAgentSpan).toBeDefined();
3138
expect(createAgentSpan).toMatchObject({
32-
data: {
33-
[GEN_AI_OPERATION_NAME_ATTRIBUTE]: 'create_agent',
34-
[SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'gen_ai.create_agent',
35-
[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ai.langgraph',
36-
[GEN_AI_AGENT_NAME_ATTRIBUTE]: 'weather_assistant',
37-
},
38-
description: 'create_agent weather_assistant',
39-
op: 'gen_ai.create_agent',
40-
origin: 'auto.ai.langgraph',
39+
name: 'create_agent weather_assistant',
40+
status: 'ok',
41+
});
42+
expect(createAgentSpan.attributes).toMatchObject({
43+
[GEN_AI_OPERATION_NAME_ATTRIBUTE]: { type: 'string', value: 'create_agent' },
44+
'sentry.op': { type: 'string', value: 'gen_ai.create_agent' },
45+
'sentry.origin': { type: 'string', value: 'auto.ai.langgraph' },
46+
[GEN_AI_AGENT_NAME_ATTRIBUTE]: { type: 'string', value: 'weather_assistant' },
4147
});
4248

4349
// Check invoke_agent span
44-
const invokeAgentSpan = transactionEvent.spans.find((span: any) => span.op === 'gen_ai.invoke_agent');
50+
const invokeAgentSpan = spans.find(
51+
(s: any) => s.attributes?.['sentry.op']?.value === 'gen_ai.invoke_agent',
52+
);
53+
expect(invokeAgentSpan).toBeDefined();
4554
expect(invokeAgentSpan).toMatchObject({
46-
data: expect.objectContaining({
47-
[GEN_AI_OPERATION_NAME_ATTRIBUTE]: 'invoke_agent',
48-
[SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'gen_ai.invoke_agent',
49-
[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ai.langgraph',
50-
[GEN_AI_AGENT_NAME_ATTRIBUTE]: 'weather_assistant',
51-
[GEN_AI_PIPELINE_NAME_ATTRIBUTE]: 'weather_assistant',
52-
[GEN_AI_INPUT_MESSAGES_ATTRIBUTE]: '[{"role":"user","content":"What is the weather in SF?"}]',
53-
[GEN_AI_RESPONSE_MODEL_ATTRIBUTE]: 'mock-model',
54-
[GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE]: 20,
55-
[GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE]: 10,
56-
[GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE]: 30,
57-
}),
58-
description: 'invoke_agent weather_assistant',
59-
op: 'gen_ai.invoke_agent',
60-
origin: 'auto.ai.langgraph',
55+
name: 'invoke_agent weather_assistant',
56+
status: 'ok',
57+
});
58+
expect(invokeAgentSpan.attributes).toMatchObject({
59+
[GEN_AI_OPERATION_NAME_ATTRIBUTE]: { type: 'string', value: 'invoke_agent' },
60+
'sentry.op': { type: 'string', value: 'gen_ai.invoke_agent' },
61+
'sentry.origin': { type: 'string', value: 'auto.ai.langgraph' },
62+
[GEN_AI_AGENT_NAME_ATTRIBUTE]: { type: 'string', value: 'weather_assistant' },
63+
[GEN_AI_PIPELINE_NAME_ATTRIBUTE]: { type: 'string', value: 'weather_assistant' },
64+
[GEN_AI_INPUT_MESSAGES_ATTRIBUTE]: {
65+
type: 'string',
66+
value: '[{"role":"user","content":"What is the weather in SF?"}]',
67+
},
68+
[GEN_AI_RESPONSE_MODEL_ATTRIBUTE]: { type: 'string', value: 'mock-model' },
69+
[GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE]: { type: 'integer', value: 20 },
70+
[GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE]: { type: 'integer', value: 10 },
71+
[GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE]: { type: 'integer', value: 30 },
6172
});
6273

6374
// Verify tools are captured
64-
if (invokeAgentSpan.data[GEN_AI_REQUEST_AVAILABLE_TOOLS_ATTRIBUTE]) {
65-
expect(invokeAgentSpan.data[GEN_AI_REQUEST_AVAILABLE_TOOLS_ATTRIBUTE]).toMatch(/get_weather/);
75+
if (invokeAgentSpan.attributes[GEN_AI_REQUEST_AVAILABLE_TOOLS_ATTRIBUTE]) {
76+
expect(invokeAgentSpan.attributes[GEN_AI_REQUEST_AVAILABLE_TOOLS_ATTRIBUTE].value).toMatch(/get_weather/);
6677
}
6778
})
6879
.start(signal);

0 commit comments

Comments
 (0)