@@ -2,6 +2,7 @@ import { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '
22import type { Event } from '@sentry/node' ;
33import { afterAll , describe , expect } from 'vitest' ;
44import {
5+ GEN_AI_EMBEDDINGS_INPUT_ATTRIBUTE ,
56 GEN_AI_INPUT_MESSAGES_ATTRIBUTE ,
67 GEN_AI_INPUT_MESSAGES_ORIGINAL_LENGTH_ATTRIBUTE ,
78 GEN_AI_OPERATION_NAME_ATTRIBUTE ,
@@ -830,4 +831,140 @@ describe('Vercel AI integration', () => {
830831 } ) ;
831832 } ,
832833 ) ;
834+
835+ createEsmAndCjsTests ( __dirname , 'scenario-embeddings.mjs' , 'instrument.mjs' , ( createRunner , test ) => {
836+ test ( 'creates embedding related spans with sendDefaultPii: false' , async ( ) => {
837+ const expectedTransaction = {
838+ transaction : 'main' ,
839+ spans : expect . arrayContaining ( [
840+ // embed invoke_agent span
841+ expect . objectContaining ( {
842+ data : expect . objectContaining ( {
843+ [ GEN_AI_OPERATION_NAME_ATTRIBUTE ] : 'invoke_agent' ,
844+ [ SEMANTIC_ATTRIBUTE_SENTRY_OP ] : 'gen_ai.invoke_agent' ,
845+ [ SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN ] : 'auto.vercelai.otel' ,
846+ } ) ,
847+ description : 'invoke_agent' ,
848+ op : 'gen_ai.invoke_agent' ,
849+ origin : 'auto.vercelai.otel' ,
850+ status : 'ok' ,
851+ } ) ,
852+ // embed doEmbed span
853+ expect . objectContaining ( {
854+ data : expect . objectContaining ( {
855+ [ GEN_AI_OPERATION_NAME_ATTRIBUTE ] : 'embeddings' ,
856+ [ SEMANTIC_ATTRIBUTE_SENTRY_OP ] : 'gen_ai.embeddings' ,
857+ [ SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN ] : 'auto.vercelai.otel' ,
858+ [ GEN_AI_REQUEST_MODEL_ATTRIBUTE ] : 'mock-model-id' ,
859+ [ GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE ] : 10 ,
860+ [ GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE ] : 10 ,
861+ } ) ,
862+ description : 'embeddings mock-model-id' ,
863+ op : 'gen_ai.embeddings' ,
864+ origin : 'auto.vercelai.otel' ,
865+ status : 'ok' ,
866+ } ) ,
867+ // embedMany invoke_agent span
868+ expect . objectContaining ( {
869+ data : expect . objectContaining ( {
870+ [ GEN_AI_OPERATION_NAME_ATTRIBUTE ] : 'invoke_agent' ,
871+ [ SEMANTIC_ATTRIBUTE_SENTRY_OP ] : 'gen_ai.invoke_agent' ,
872+ [ SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN ] : 'auto.vercelai.otel' ,
873+ } ) ,
874+ description : 'invoke_agent' ,
875+ op : 'gen_ai.invoke_agent' ,
876+ origin : 'auto.vercelai.otel' ,
877+ status : 'ok' ,
878+ } ) ,
879+ // embedMany doEmbed span
880+ expect . objectContaining ( {
881+ data : expect . objectContaining ( {
882+ [ GEN_AI_OPERATION_NAME_ATTRIBUTE ] : 'embeddings' ,
883+ [ SEMANTIC_ATTRIBUTE_SENTRY_OP ] : 'gen_ai.embeddings' ,
884+ [ SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN ] : 'auto.vercelai.otel' ,
885+ [ GEN_AI_REQUEST_MODEL_ATTRIBUTE ] : 'mock-model-id' ,
886+ [ GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE ] : 20 ,
887+ [ GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE ] : 20 ,
888+ } ) ,
889+ description : 'embeddings mock-model-id' ,
890+ op : 'gen_ai.embeddings' ,
891+ origin : 'auto.vercelai.otel' ,
892+ status : 'ok' ,
893+ } ) ,
894+ ] ) ,
895+ } ;
896+
897+ await createRunner ( ) . expect ( { transaction : expectedTransaction } ) . start ( ) . completed ( ) ;
898+ } ) ;
899+ } ) ;
900+
901+ createEsmAndCjsTests ( __dirname , 'scenario-embeddings.mjs' , 'instrument-with-pii.mjs' , ( createRunner , test ) => {
902+ test ( 'creates embedding related spans with sendDefaultPii: true' , async ( ) => {
903+ const expectedTransaction = {
904+ transaction : 'main' ,
905+ spans : expect . arrayContaining ( [
906+ // embed invoke_agent span with input
907+ expect . objectContaining ( {
908+ data : expect . objectContaining ( {
909+ [ GEN_AI_OPERATION_NAME_ATTRIBUTE ] : 'invoke_agent' ,
910+ [ SEMANTIC_ATTRIBUTE_SENTRY_OP ] : 'gen_ai.invoke_agent' ,
911+ [ SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN ] : 'auto.vercelai.otel' ,
912+ [ GEN_AI_EMBEDDINGS_INPUT_ATTRIBUTE ] : 'Embedding test!' ,
913+ } ) ,
914+ description : 'invoke_agent' ,
915+ op : 'gen_ai.invoke_agent' ,
916+ origin : 'auto.vercelai.otel' ,
917+ status : 'ok' ,
918+ } ) ,
919+ // embed doEmbed span with input
920+ expect . objectContaining ( {
921+ data : expect . objectContaining ( {
922+ [ GEN_AI_OPERATION_NAME_ATTRIBUTE ] : 'embeddings' ,
923+ [ SEMANTIC_ATTRIBUTE_SENTRY_OP ] : 'gen_ai.embeddings' ,
924+ [ SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN ] : 'auto.vercelai.otel' ,
925+ [ GEN_AI_REQUEST_MODEL_ATTRIBUTE ] : 'mock-model-id' ,
926+ [ GEN_AI_EMBEDDINGS_INPUT_ATTRIBUTE ] : '["Embedding test!"]' ,
927+ [ GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE ] : 10 ,
928+ [ GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE ] : 10 ,
929+ } ) ,
930+ description : 'embeddings mock-model-id' ,
931+ op : 'gen_ai.embeddings' ,
932+ origin : 'auto.vercelai.otel' ,
933+ status : 'ok' ,
934+ } ) ,
935+ // embedMany invoke_agent span with input
936+ expect . objectContaining ( {
937+ data : expect . objectContaining ( {
938+ [ GEN_AI_OPERATION_NAME_ATTRIBUTE ] : 'invoke_agent' ,
939+ [ SEMANTIC_ATTRIBUTE_SENTRY_OP ] : 'gen_ai.invoke_agent' ,
940+ [ SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN ] : 'auto.vercelai.otel' ,
941+ [ GEN_AI_EMBEDDINGS_INPUT_ATTRIBUTE ] : '["First input","Second input"]' ,
942+ } ) ,
943+ description : 'invoke_agent' ,
944+ op : 'gen_ai.invoke_agent' ,
945+ origin : 'auto.vercelai.otel' ,
946+ status : 'ok' ,
947+ } ) ,
948+ // embedMany doEmbed span with input
949+ expect . objectContaining ( {
950+ data : expect . objectContaining ( {
951+ [ GEN_AI_OPERATION_NAME_ATTRIBUTE ] : 'embeddings' ,
952+ [ SEMANTIC_ATTRIBUTE_SENTRY_OP ] : 'gen_ai.embeddings' ,
953+ [ SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN ] : 'auto.vercelai.otel' ,
954+ [ GEN_AI_REQUEST_MODEL_ATTRIBUTE ] : 'mock-model-id' ,
955+ [ GEN_AI_EMBEDDINGS_INPUT_ATTRIBUTE ] : '["First input","Second input"]' ,
956+ [ GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE ] : 20 ,
957+ [ GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE ] : 20 ,
958+ } ) ,
959+ description : 'embeddings mock-model-id' ,
960+ op : 'gen_ai.embeddings' ,
961+ origin : 'auto.vercelai.otel' ,
962+ status : 'ok' ,
963+ } ) ,
964+ ] ) ,
965+ } ;
966+
967+ await createRunner ( ) . expect ( { transaction : expectedTransaction } ) . start ( ) . completed ( ) ;
968+ } ) ;
969+ } ) ;
833970} ) ;
0 commit comments