@@ -16,14 +16,16 @@ import {
1616 GEN_AI_REQUEST_TEMPERATURE_ATTRIBUTE ,
1717 GEN_AI_REQUEST_TOP_K_ATTRIBUTE ,
1818 GEN_AI_REQUEST_TOP_P_ATTRIBUTE ,
19+ GEN_AI_RESPONSE_MODEL_ATTRIBUTE ,
1920 GEN_AI_RESPONSE_TEXT_ATTRIBUTE ,
2021 GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE ,
2122 GEN_AI_SYSTEM_ATTRIBUTE ,
2223 GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE ,
2324 GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE ,
2425 GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE ,
2526} from '../ai/gen-ai-attributes' ;
26- import { buildMethodPath , getFinalOperationName , getSpanOperation , getTruncatedJsonString } from '../ai/utils' ;
27+ import { truncateGenAiMessages } from '../ai/messageTruncation' ;
28+ import { buildMethodPath , getFinalOperationName , getSpanOperation } from '../ai/utils' ;
2729import { CHAT_PATH , CHATS_CREATE_METHOD , GOOGLE_GENAI_SYSTEM_NAME } from './constants' ;
2830import { instrumentStream } from './streaming' ;
2931import type {
@@ -134,27 +136,52 @@ function extractRequestAttributes(
134136 * Handles different parameter formats for different Google GenAI methods.
135137 */
136138function addPrivateRequestAttributes ( span : Span , params : Record < string , unknown > ) : void {
139+ const messages : unknown [ ] = [ ] ;
140+
141+ // include system prompt if present in config param
142+ if (
143+ 'config' in params &&
144+ params . config &&
145+ typeof params . config === 'object' &&
146+ 'systemInstruction' in params . config
147+ ) {
148+ messages . push ( {
149+ role : 'system' ,
150+ content : params . config . systemInstruction ,
151+ } ) ;
152+ }
153+
137154 // For models.generateContent: ContentListUnion: Content | Content[] | PartUnion | PartUnion[]
138155 if ( 'contents' in params ) {
139- const contents = params . contents ;
140- // For models.generateContent: ContentListUnion: Content | Content[] | PartUnion | PartUnion[]
141- const truncatedContents = getTruncatedJsonString ( contents ) ;
142- span . setAttributes ( { [ GEN_AI_REQUEST_MESSAGES_ATTRIBUTE ] : truncatedContents } ) ;
156+ if ( Array . isArray ( params . contents ) ) {
157+ messages . push ( ...params . contents ) ;
158+ } else {
159+ messages . push ( { role : 'user' , content : params . contents } ) ;
160+ }
143161 }
144162
145163 // For chat.sendMessage: message can be string or Part[]
146164 if ( 'message' in params ) {
147- const message = params . message ;
148- const truncatedMessage = getTruncatedJsonString ( message ) ;
149- span . setAttributes ( { [ GEN_AI_REQUEST_MESSAGES_ATTRIBUTE ] : truncatedMessage } ) ;
165+ if ( Array . isArray ( params . message ) ) {
166+ messages . push ( ...params . message ) ;
167+ } else {
168+ messages . push ( { role : 'user' , content : params . message } ) ;
169+ }
150170 }
151171
152172 // For chats.create: history contains the conversation history
153173 if ( 'history' in params ) {
154- const history = params . history ;
155- const truncatedHistory = getTruncatedJsonString ( history ) ;
156- span . setAttributes ( { [ GEN_AI_REQUEST_MESSAGES_ATTRIBUTE ] : truncatedHistory } ) ;
174+ if ( Array . isArray ( params . history ) ) {
175+ messages . push ( ...params . history ) ;
176+ } else {
177+ messages . push ( { role : 'user' , content : params . history } ) ;
178+ }
157179 }
180+
181+ span . setAttributes ( {
182+ [ GEN_AI_REQUEST_MESSAGES_ATTRIBUTE ] : JSON . stringify ( truncateGenAiMessages ( messages ) ) ,
183+ [ GEN_AI_RESPONSE_MODEL_ATTRIBUTE ] : String ( params . model ) ,
184+ } ) ;
158185}
159186
160187/**
0 commit comments