@@ -6,7 +6,7 @@ describe('OpenAI integration', () => {
66 cleanupChildProcesses ( ) ;
77 } ) ;
88
9- const EXPECTED_TRANSACTION_DEFAULT_PII_FALSE = {
9+ const EXPECTED_TRANSACTION_DEFAULT_PII_FALSE_CHAT = {
1010 transaction : 'main' ,
1111 spans : expect . arrayContaining ( [
1212 // First span - basic chat completion without PII
@@ -147,7 +147,7 @@ describe('OpenAI integration', () => {
147147 ] ) ,
148148 } ;
149149
150- const EXPECTED_TRANSACTION_DEFAULT_PII_TRUE = {
150+ const EXPECTED_TRANSACTION_DEFAULT_PII_TRUE_CHAT = {
151151 transaction : 'main' ,
152152 spans : expect . arrayContaining ( [
153153 // First span - basic chat completion with PII
@@ -321,27 +321,27 @@ describe('OpenAI integration', () => {
321321 ] ) ,
322322 } ;
323323
324- createEsmAndCjsTests ( __dirname , 'scenario.mjs' , 'instrument.mjs' , ( createRunner , test ) => {
324+ createEsmAndCjsTests ( __dirname , 'scenario-chat .mjs' , 'instrument.mjs' , ( createRunner , test ) => {
325325 test ( 'creates openai related spans with sendDefaultPii: false' , async ( ) => {
326326 await createRunner ( )
327327 . ignore ( 'event' )
328- . expect ( { transaction : EXPECTED_TRANSACTION_DEFAULT_PII_FALSE } )
328+ . expect ( { transaction : EXPECTED_TRANSACTION_DEFAULT_PII_FALSE_CHAT } )
329329 . start ( )
330330 . completed ( ) ;
331331 } ) ;
332332 } ) ;
333333
334- createEsmAndCjsTests ( __dirname , 'scenario.mjs' , 'instrument-with-pii.mjs' , ( createRunner , test ) => {
334+ createEsmAndCjsTests ( __dirname , 'scenario-chat .mjs' , 'instrument-with-pii.mjs' , ( createRunner , test ) => {
335335 test ( 'creates openai related spans with sendDefaultPii: true' , async ( ) => {
336336 await createRunner ( )
337337 . ignore ( 'event' )
338- . expect ( { transaction : EXPECTED_TRANSACTION_DEFAULT_PII_TRUE } )
338+ . expect ( { transaction : EXPECTED_TRANSACTION_DEFAULT_PII_TRUE_CHAT } )
339339 . start ( )
340340 . completed ( ) ;
341341 } ) ;
342342 } ) ;
343343
344- createEsmAndCjsTests ( __dirname , 'scenario.mjs' , 'instrument-with-options.mjs' , ( createRunner , test ) => {
344+ createEsmAndCjsTests ( __dirname , 'scenario-chat .mjs' , 'instrument-with-options.mjs' , ( createRunner , test ) => {
345345 test ( 'creates openai related spans with custom options' , async ( ) => {
346346 await createRunner ( )
347347 . ignore ( 'event' )
@@ -351,6 +351,109 @@ describe('OpenAI integration', () => {
351351 } ) ;
352352 } ) ;
353353
354+ const EXPECTED_TRANSACTION_DEFAULT_PII_FALSE_EMBEDDINGS = {
355+ transaction : 'main' ,
356+ spans : expect . arrayContaining ( [
357+ // First span - embeddings API
358+ expect . objectContaining ( {
359+ data : {
360+ 'gen_ai.operation.name' : 'embeddings' ,
361+ 'sentry.op' : 'gen_ai.embeddings' ,
362+ 'sentry.origin' : 'auto.ai.openai' ,
363+ 'gen_ai.system' : 'openai' ,
364+ 'gen_ai.request.model' : 'text-embedding-3-small' ,
365+ 'gen_ai.request.encoding_format' : 'float' ,
366+ 'gen_ai.request.dimensions' : 1536 ,
367+ 'gen_ai.response.model' : 'text-embedding-3-small' ,
368+ 'gen_ai.usage.input_tokens' : 10 ,
369+ 'gen_ai.usage.total_tokens' : 10 ,
370+ 'openai.response.model' : 'text-embedding-3-small' ,
371+ 'openai.usage.prompt_tokens' : 10 ,
372+ } ,
373+ description : 'embeddings text-embedding-3-small' ,
374+ op : 'gen_ai.embeddings' ,
375+ origin : 'auto.ai.openai' ,
376+ status : 'ok' ,
377+ } ) ,
378+ // Second span - embeddings API error model
379+ expect . objectContaining ( {
380+ data : {
381+ 'gen_ai.operation.name' : 'embeddings' ,
382+ 'sentry.op' : 'gen_ai.embeddings' ,
383+ 'sentry.origin' : 'auto.ai.openai' ,
384+ 'gen_ai.system' : 'openai' ,
385+ 'gen_ai.request.model' : 'error-model' ,
386+ } ,
387+ description : 'embeddings error-model' ,
388+ op : 'gen_ai.embeddings' ,
389+ origin : 'auto.ai.openai' ,
390+ status : 'internal_error' ,
391+ } ) ,
392+ ] ) ,
393+ } ;
394+
395+ const EXPECTED_TRANSACTION_DEFAULT_PII_TRUE_EMBEDDINGS = {
396+ transaction : 'main' ,
397+ spans : expect . arrayContaining ( [
398+ // First span - embeddings API with PII
399+ expect . objectContaining ( {
400+ data : {
401+ 'gen_ai.operation.name' : 'embeddings' ,
402+ 'sentry.op' : 'gen_ai.embeddings' ,
403+ 'sentry.origin' : 'auto.ai.openai' ,
404+ 'gen_ai.system' : 'openai' ,
405+ 'gen_ai.request.model' : 'text-embedding-3-small' ,
406+ 'gen_ai.request.encoding_format' : 'float' ,
407+ 'gen_ai.request.dimensions' : 1536 ,
408+ 'gen_ai.request.messages' : 'Embedding test!' ,
409+ 'gen_ai.response.model' : 'text-embedding-3-small' ,
410+ 'gen_ai.usage.input_tokens' : 10 ,
411+ 'gen_ai.usage.total_tokens' : 10 ,
412+ 'openai.response.model' : 'text-embedding-3-small' ,
413+ 'openai.usage.prompt_tokens' : 10 ,
414+ } ,
415+ description : 'embeddings text-embedding-3-small' ,
416+ op : 'gen_ai.embeddings' ,
417+ origin : 'auto.ai.openai' ,
418+ status : 'ok' ,
419+ } ) ,
420+ // Second span - embeddings API error model with PII
421+ expect . objectContaining ( {
422+ data : {
423+ 'gen_ai.operation.name' : 'embeddings' ,
424+ 'sentry.op' : 'gen_ai.embeddings' ,
425+ 'sentry.origin' : 'auto.ai.openai' ,
426+ 'gen_ai.system' : 'openai' ,
427+ 'gen_ai.request.model' : 'error-model' ,
428+ 'gen_ai.request.messages' : 'Error embedding test!' ,
429+ } ,
430+ description : 'embeddings error-model' ,
431+ op : 'gen_ai.embeddings' ,
432+ origin : 'auto.ai.openai' ,
433+ status : 'internal_error' ,
434+ } ) ,
435+ ] ) ,
436+ } ;
437+ createEsmAndCjsTests ( __dirname , 'scenario-embeddings.mjs' , 'instrument.mjs' , ( createRunner , test ) => {
438+ test ( 'creates openai related spans with sendDefaultPii: false' , async ( ) => {
439+ await createRunner ( )
440+ . ignore ( 'event' )
441+ . expect ( { transaction : EXPECTED_TRANSACTION_DEFAULT_PII_FALSE_EMBEDDINGS } )
442+ . start ( )
443+ . completed ( ) ;
444+ } ) ;
445+ } ) ;
446+
447+ createEsmAndCjsTests ( __dirname , 'scenario-embeddings.mjs' , 'instrument-with-pii.mjs' , ( createRunner , test ) => {
448+ test ( 'creates openai related spans with sendDefaultPii: true' , async ( ) => {
449+ await createRunner ( )
450+ . ignore ( 'event' )
451+ . expect ( { transaction : EXPECTED_TRANSACTION_DEFAULT_PII_TRUE_EMBEDDINGS } )
452+ . start ( )
453+ . completed ( ) ;
454+ } ) ;
455+ } ) ;
456+
354457 createEsmAndCjsTests ( __dirname , 'scenario-root-span.mjs' , 'instrument.mjs' , ( createRunner , test ) => {
355458 test ( 'it works without a wrapping span' , async ( ) => {
356459 await createRunner ( )
@@ -400,7 +503,7 @@ describe('OpenAI integration', () => {
400503
401504 createEsmAndCjsTests (
402505 __dirname ,
403- 'scenario-message-truncation-completions.mjs' ,
506+ 'truncation/ scenario-message-truncation-completions.mjs' ,
404507 'instrument-with-pii.mjs' ,
405508 ( createRunner , test ) => {
406509 test ( 'truncates messages when they exceed byte limit - keeps only last message and crops it' , async ( ) => {
@@ -436,7 +539,7 @@ describe('OpenAI integration', () => {
436539
437540 createEsmAndCjsTests (
438541 __dirname ,
439- 'scenario-message-truncation-responses.mjs' ,
542+ 'truncation/ scenario-message-truncation-responses.mjs' ,
440543 'instrument-with-pii.mjs' ,
441544 ( createRunner , test ) => {
442545 test ( 'truncates string inputs when they exceed byte limit' , async ( ) => {
@@ -469,4 +572,30 @@ describe('OpenAI integration', () => {
469572 } ) ;
470573 } ,
471574 ) ;
575+
576+ createEsmAndCjsTests (
577+ __dirname ,
578+ 'truncation/scenario-message-truncation-embeddings.mjs' ,
579+ 'instrument-with-pii.mjs' ,
580+ ( createRunner , test ) => {
581+ test ( 'truncates messages when they exceed byte limit - keeps only last message and crops it' , async ( ) => {
582+ await createRunner ( )
583+ . ignore ( 'event' )
584+ . expect ( {
585+ transaction : {
586+ transaction : 'main' ,
587+ spans : expect . arrayContaining ( [
588+ expect . objectContaining ( {
589+ data : expect . objectContaining ( {
590+ 'gen_ai.operation.name' : 'embeddings' ,
591+ } ) ,
592+ } ) ,
593+ ] ) ,
594+ } ,
595+ } )
596+ . start ( )
597+ . completed ( ) ;
598+ } ) ;
599+ } ,
600+ ) ;
472601} ) ;
0 commit comments