@@ -728,101 +728,42 @@ describe('conversationMessages utilities', () => {
728728 expect ( assistantMessages ) . toHaveLength ( 2 ) ;
729729 } ) ;
730730
731- it ( 'includes agentName from gen_ai.agent.name' , ( ) => {
731+ function assistantFromAttributes ( attributes : Record < string , string > ) {
732732 const turns = [
733733 makeTurn ( {
734734 generation : {
735735 id : 'gen-1' ,
736736 value : { start_timestamp : 1000 , end_timestamp : 1100 } ,
737- attributes : {
738- [ SpanFields . GEN_AI_AGENT_NAME ] : 'my-agent' ,
739- } ,
740- } as any ,
741- userContent : 'Hello' ,
742- assistantContent : 'Hi' ,
743- } ) ,
744- ] ;
745-
746- const messages = turnsToMessages ( turns ) ;
747- const assistant = messages . find ( m => m . role === 'assistant' ) ;
748- expect ( assistant ?. agentName ) . toBe ( 'my-agent' ) ;
749- } ) ;
750-
751- it ( 'falls back agentName to gen_ai.function_id' , ( ) => {
752- const turns = [
753- makeTurn ( {
754- generation : {
755- id : 'gen-1' ,
756- value : { start_timestamp : 1000 , end_timestamp : 1100 } ,
757- attributes : {
758- [ SpanFields . GEN_AI_FUNCTION_ID ] : 'vercel-func' ,
759- } ,
760- } as any ,
761- userContent : 'Hello' ,
762- assistantContent : 'Hi' ,
763- } ) ,
764- ] ;
765-
766- const messages = turnsToMessages ( turns ) ;
767- const assistant = messages . find ( m => m . role === 'assistant' ) ;
768- expect ( assistant ?. agentName ) . toBe ( 'vercel-func' ) ;
769- } ) ;
770-
771- it ( 'prefers gen_ai.agent.name over gen_ai.function_id for agentName' , ( ) => {
772- const turns = [
773- makeTurn ( {
774- generation : {
775- id : 'gen-1' ,
776- value : { start_timestamp : 1000 , end_timestamp : 1100 } ,
777- attributes : {
778- [ SpanFields . GEN_AI_AGENT_NAME ] : 'preferred-agent' ,
779- [ SpanFields . GEN_AI_FUNCTION_ID ] : 'fallback-func' ,
780- } ,
781- } as any ,
782- userContent : 'Hello' ,
783- assistantContent : 'Hi' ,
784- } ) ,
785- ] ;
786-
787- const messages = turnsToMessages ( turns ) ;
788- const assistant = messages . find ( m => m . role === 'assistant' ) ;
789- expect ( assistant ?. agentName ) . toBe ( 'preferred-agent' ) ;
790- } ) ;
791-
792- it ( 'includes modelName from gen_ai.response.model' , ( ) => {
793- const turns = [
794- makeTurn ( {
795- generation : {
796- id : 'gen-1' ,
797- value : { start_timestamp : 1000 , end_timestamp : 1100 } ,
798- attributes : {
799- [ SpanFields . GEN_AI_RESPONSE_MODEL ] : 'gpt-4o' ,
800- } ,
737+ attributes,
801738 } as any ,
802739 userContent : 'Hello' ,
803740 assistantContent : 'Hi' ,
804741 } ) ,
805742 ] ;
806-
807- const messages = turnsToMessages ( turns ) ;
808- const assistant = messages . find ( m => m . role === 'assistant' ) ;
809- expect ( assistant ?. modelName ) . toBe ( 'gpt-4o' ) ;
810- } ) ;
811-
812- it ( 'leaves agentName and modelName undefined when not set' , ( ) => {
813- const turns = [
814- makeTurn ( {
815- generation : {
816- id : 'gen-1' ,
817- value : { start_timestamp : 1000 , end_timestamp : 1100 } ,
818- } as any ,
819- userContent : 'Hello' ,
820- assistantContent : 'Hi' ,
821- } ) ,
822- ] ;
823-
824- const messages = turnsToMessages ( turns ) ;
825- const assistant = messages . find ( m => m . role === 'assistant' ) ;
743+ return turnsToMessages ( turns ) . find ( m => m . role === 'assistant' ) ;
744+ }
745+
746+ it ( 'resolves agentName from agent.name, then function_id, preferring agent.name' , ( ) => {
747+ expect (
748+ assistantFromAttributes ( { [ SpanFields . GEN_AI_AGENT_NAME ] : 'my-agent' } ) ?. agentName
749+ ) . toBe ( 'my-agent' ) ;
750+ expect (
751+ assistantFromAttributes ( { [ SpanFields . GEN_AI_FUNCTION_ID ] : 'vercel-func' } )
752+ ?. agentName
753+ ) . toBe ( 'vercel-func' ) ;
754+ expect (
755+ assistantFromAttributes ( {
756+ [ SpanFields . GEN_AI_AGENT_NAME ] : 'preferred-agent' ,
757+ [ SpanFields . GEN_AI_FUNCTION_ID ] : 'fallback-func' ,
758+ } ) ?. agentName
759+ ) . toBe ( 'preferred-agent' ) ;
760+ } ) ;
761+
762+ it ( 'resolves modelName from gen_ai.response.model, undefined when unset' , ( ) => {
763+ expect (
764+ assistantFromAttributes ( { [ SpanFields . GEN_AI_RESPONSE_MODEL ] : 'gpt-4o' } ) ?. modelName
765+ ) . toBe ( 'gpt-4o' ) ;
766+ const assistant = assistantFromAttributes ( { } ) ;
826767 expect ( assistant ?. agentName ) . toBeUndefined ( ) ;
827768 expect ( assistant ?. modelName ) . toBeUndefined ( ) ;
828769 } ) ;
@@ -961,20 +902,6 @@ describe('conversationMessages utilities', () => {
961902 const assistant = turnsToMessages ( turns ) . find ( m => m . role === 'assistant' ) ;
962903 expect ( assistant ?. reasoning ) . toBe ( 'Let me think step by step...' ) ;
963904 } ) ;
964-
965- it ( 'attaches reasoning to tool-call-only turns without text' , ( ) => {
966- const turns = [
967- makeTurn ( {
968- userContent : 'Question' ,
969- toolCalls : [ { name : 'search' , nodeId : 'tool-1' , hasError : false } ] ,
970- reasoning : 'Thinking out loud' ,
971- } ) ,
972- ] ;
973-
974- const assistant = turnsToMessages ( turns ) . find ( m => m . role === 'assistant' ) ;
975- expect ( assistant ?. content ) . toBe ( '' ) ;
976- expect ( assistant ?. reasoning ) . toBe ( 'Thinking out loud' ) ;
977- } ) ;
978905 } ) ;
979906
980907 describe ( 'extractMessagesFromNodes (integration)' , ( ) => {
@@ -1211,34 +1138,6 @@ describe('conversationMessages utilities', () => {
12111138 } ) ;
12121139 } ) ;
12131140
1214- describe ( 'reasoning in extractMessagesFromNodes' , ( ) => {
1215- it ( 'includes reasoning on assistant messages' , ( ) => {
1216- const outputMessages = JSON . stringify ( [
1217- {
1218- role : 'assistant' ,
1219- parts : [
1220- { type : 'reasoning' , content : 'Thinking...' } ,
1221- { type : 'text' , text : 'Answer' } ,
1222- ] ,
1223- } ,
1224- ] ) ;
1225- const inputMessages = JSON . stringify ( [ { role : 'user' , content : 'Question' } ] ) ;
1226- const node = createMockNode ( {
1227- id : 'span-1' ,
1228- startTimestamp : 1000 ,
1229- attributes : {
1230- [ SpanFields . GEN_AI_INPUT_MESSAGES ] : inputMessages ,
1231- [ SpanFields . GEN_AI_OUTPUT_MESSAGES ] : outputMessages ,
1232- } ,
1233- } ) ;
1234-
1235- const messages = extractMessagesFromNodes ( [ node as any ] ) ;
1236- const assistant = messages . find ( m => m . role === 'assistant' ) ;
1237- expect ( assistant ?. content ) . toBe ( 'Answer' ) ;
1238- expect ( assistant ?. reasoning ) . toBe ( 'Thinking...' ) ;
1239- } ) ;
1240- } ) ;
1241-
12421141 describe ( 'messagesToMarkdown' , ( ) => {
12431142 it ( 'formats user messages with email' , ( ) => {
12441143 const result = messagesToMarkdown ( [
0 commit comments