@@ -764,7 +764,9 @@ export class ChatMLFetcherImpl extends AbstractChatMLFetcher {
764764 turnId ,
765765 conversationId ,
766766 cancellationToken ,
767+ userInitiatedRequest ,
767768 telemetryProperties ,
769+ requestKindOptions ,
768770 ) ;
769771 }
770772
@@ -801,9 +803,33 @@ export class ChatMLFetcherImpl extends AbstractChatMLFetcher {
801803 turnId : string ,
802804 conversationId : string ,
803805 cancellationToken : CancellationToken ,
806+ userInitiatedRequest : boolean | undefined ,
804807 telemetryProperties : TelemetryProperties | undefined ,
808+ requestKindOptions : IBackgroundRequestOptions | ISubagentRequestOptions | undefined ,
805809 ) : Promise < { result : ChatResults | ChatRequestFailed | ChatRequestCanceled } > {
806- const connection = await this . _webSocketManager . getOrCreateConnection ( conversationId , turnId , secretKey ) ;
810+ const intent = locationToIntent ( location ) ;
811+ const agentInteractionType = requestKindOptions ?. kind === 'subagent' ?
812+ 'conversation-subagent' :
813+ requestKindOptions ?. kind === 'background' ?
814+ 'conversation-background' :
815+ intent === 'conversation-agent' ? intent : undefined ;
816+ const additionalHeaders : Record < string , string > = {
817+ 'Authorization' : `Bearer ${ secretKey } ` ,
818+ 'X-Request-Id' : ourRequestId ,
819+ 'OpenAI-Intent' : intent ,
820+ 'X-GitHub-Api-Version' : '2025-05-01' ,
821+ 'X-Interaction-Id' : this . _interactionService . interactionId ,
822+ 'X-Initiator' : userInitiatedRequest ? 'user' : 'agent' ,
823+ ...( chatEndpointInfo . getExtraHeaders ? chatEndpointInfo . getExtraHeaders ( location ) : { } ) ,
824+ } ;
825+ if ( agentInteractionType ) {
826+ additionalHeaders [ 'X-Interaction-Type' ] = agentInteractionType ;
827+ additionalHeaders [ 'X-Agent-Task-Id' ] = ourRequestId ;
828+ }
829+ if ( request . messages ?. some ( ( m : CAPIChatMessage ) => Array . isArray ( m . content ) ? m . content . some ( c => 'image_url' in c ) : false ) && chatEndpointInfo . supportsVision ) {
830+ additionalHeaders [ 'Copilot-Vision-Request' ] = 'true' ;
831+ }
832+ const connection = await this . _webSocketManager . getOrCreateConnection ( conversationId , turnId , additionalHeaders ) ;
807833
808834 // Generate unique ID to link input and output messages
809835 const modelCallId = generateUuid ( ) ;
@@ -818,6 +844,9 @@ export class ChatMLFetcherImpl extends AbstractChatMLFetcher {
818844 maxTokenWindow : chatEndpointInfo . modelMaxPromptTokens
819845 } ) ;
820846
847+ const modelRequestId = getRequestId ( connection . responseHeaders ) ;
848+ telemetryData . extendWithRequestId ( modelRequestId ) ;
849+
821850 for ( const [ key , value ] of Object . entries ( request ) ) {
822851 if ( key === 'messages' || key === 'input' ) {
823852 continue ;
@@ -832,7 +861,7 @@ export class ChatMLFetcherImpl extends AbstractChatMLFetcher {
832861 const handle = connection . sendRequest ( request as Record < string , unknown > , cancellationToken ) ;
833862
834863 const extendedBaseTelemetryData = baseTelemetryData . extendedBy ( { modelCallId } ) ;
835- const processor = this . _instantiationService . createInstance ( OpenAIResponsesProcessor , extendedBaseTelemetryData , ourRequestId , '' ) ;
864+ const processor = this . _instantiationService . createInstance ( OpenAIResponsesProcessor , extendedBaseTelemetryData , modelRequestId . headerRequestId , modelRequestId . gitHubRequestId ) ;
836865
837866 const chatCompletions = new AsyncIterableObject < ChatCompletion > ( async emitter => {
838867 try {
@@ -846,6 +875,7 @@ export class ChatMLFetcherImpl extends AbstractChatMLFetcher {
846875 } ) ;
847876
848877 handle . onError ( error => {
878+ ( error as any ) . gitHubRequestId = modelRequestId . gitHubRequestId ;
849879 if ( isCancellationError ( error ) ) {
850880 reject ( error ) ;
851881 return ;
0 commit comments