Path: blob/main/extensions/copilot/src/extension/prompt/node/chatMLFetcherTelemetry.ts
13399 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { ChatFetchError } from '../../../platform/chat/common/commonTypes';6import { isAutoModel } from '../../../platform/endpoint/node/autoChatEndpoint';7import { FetcherId } from '../../../platform/networking/common/fetcherService';8import { IChatEndpoint, IChatRequestTelemetryProperties, IEndpointBody } from '../../../platform/networking/common/networking';9import { ChatCompletion } from '../../../platform/networking/common/openai';10import { ITelemetryService } from '../../../platform/telemetry/common/telemetry';11import { TelemetryData } from '../../../platform/telemetry/common/telemetryData';12import { isBYOKModel } from '../../byok/node/openAIEndpoint';1314export interface IChatMLFetcherSuccessfulData {15chatCompletion: ChatCompletion;16baseTelemetry: TelemetryData;17userInitiatedRequest: boolean | undefined;18chatEndpointInfo: IChatEndpoint | undefined;19requestBody: IEndpointBody;20maxResponseTokens: number;21promptTokenCount: number;22timeToFirstToken: number;23timeToFirstTokenEmitted: number;24hasImageMessages: boolean;25transport: string;26fetcher: FetcherId | undefined;27bytesReceived: number | undefined;28suspendEventSeen: boolean | undefined;29resumeEventSeen: boolean | undefined;30}3132export interface IChatMLFetcherCancellationProperties {33source: string;34requestId: string;35model: string;36apiType: string | undefined;37transport: string;38associatedRequestId?: string;39retryAfterError?: string;40retryAfterErrorGitHubRequestId?: string;41connectivityTestError?: string;42connectivityTestErrorGitHubRequestId?: string;43retryAfterFilterCategory?: string;44fetcher: FetcherId | undefined;45suspendEventSeen: boolean | undefined;46resumeEventSeen: boolean | undefined;47}4849export interface IChatMLFetcherCancellationMeasures {50totalTokenMax: number;51promptTokenCount: number;52tokenCountMax: number;53timeToFirstToken: number | undefined;54timeToFirstTokenEmitted?: number;55timeToCancelled: number;56isVisionRequest: number;57isBYOK: number;58isAuto: number;59bytesReceived: number | undefined;60issuedTime: number;61}6263export interface IChatMLFetcherErrorData {64processed: ChatFetchError;65telemetryProperties: IChatRequestTelemetryProperties | undefined;66chatEndpointInfo: IChatEndpoint;67requestBody: IEndpointBody;68tokenCount: number;69maxResponseTokens: number;70timeToFirstToken: number;71isVisionRequest: boolean;72transport: string;73fetcher: FetcherId | undefined;74bytesReceived: number | undefined;75issuedTime: number;76wasRetried: boolean;77suspendEventSeen: boolean | undefined;78resumeEventSeen: boolean | undefined;79}8081export class ChatMLFetcherTelemetrySender {8283public static sendSuccessTelemetry(84telemetryService: ITelemetryService,85{86chatCompletion,87baseTelemetry,88userInitiatedRequest,89chatEndpointInfo,90requestBody,91maxResponseTokens,92promptTokenCount,93timeToFirstToken,94timeToFirstTokenEmitted,95hasImageMessages,96transport,97fetcher,98bytesReceived,99suspendEventSeen,100resumeEventSeen,101}: IChatMLFetcherSuccessfulData,102) {103/* __GDPR__104"response.success" : {105"owner": "digitarald",106"comment": "Report quality details for a successful service response.",107"reason": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Reason for why a response finished" },108"filterReason": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Reason for why a response was filtered" },109"source": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Source of the initial request" },110"initiatorType": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "Whether the request was initiated by a user or an agent" },111"model": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Model selection for the response" },112"modelInvoked": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Actual model invoked for the response" },113"apiType": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "API type for the response- chat completions or responses" },114"conversationId": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "Id for the current chat conversation." },115"requestId": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Id of the current turn request" },116"gitHubRequestId": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "GitHub request id if available" },117"associatedRequestId": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "Another request ID that this request is associated with (eg, the originating request of a summarization request)." },118"reasoningEffort": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Reasoning effort level" },119"reasoningSummary": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Reasoning summary level" },120"fetcher": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "The fetcher used for the request" },121"transport": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "The transport used for the request (http or websocket)" },122"totalTokenMax": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Maximum total token window", "isMeasurement": true },123"clientPromptTokenCount": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Number of prompt tokens, locally counted", "isMeasurement": true },124"promptTokenCount": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Number of prompt tokens, server side counted", "isMeasurement": true },125"promptCacheTokenCount": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Number of prompt tokens hitting cache as reported by server", "isMeasurement": true },126"tokenCountMax": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Maximum generated tokens", "isMeasurement": true },127"tokenCount": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Number of generated tokens", "isMeasurement": true },128"reasoningTokens": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Number of reasoning tokens", "isMeasurement": true },129"acceptedPredictionTokens": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "Number of tokens in the prediction that appeared in the completion", "isMeasurement": true },130"rejectedPredictionTokens": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "Number of tokens in the prediction that appeared in the completion", "isMeasurement": true },131"completionTokens": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "Number of tokens in the output", "isMeasurement": true },132"timeToFirstToken": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Time to first token", "isMeasurement": true },133"timeToFirstTokenEmitted": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Time to first token emitted (visible text)", "isMeasurement": true },134"timeToComplete": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Time to complete the request", "isMeasurement": true },135"issuedTime": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Timestamp when the request was issued", "isMeasurement": true },136"isVisionRequest": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Whether the request was for a vision model", "isMeasurement": true },137"isBYOK": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "Whether the request was for a BYOK model", "isMeasurement": true },138"isAuto": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "Whether the request was for an Auto model", "isMeasurement": true },139"bytesReceived": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Number of bytes received in the response", "isMeasurement": true },140"retryAfterError": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "Error of the original request." },141"retryAfterErrorGitHubRequestId": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "GitHub request id of the original request if available" },142"connectivityTestError": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "Error of the connectivity test." },143"connectivityTestErrorGitHubRequestId": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "GitHub request id of the connectivity test request if available" },144"retryAfterFilterCategory": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "If the response was filtered and this is a retry attempt, this contains the original filtered content category." },145"suspendEventSeen": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Whether a system suspend event was seen during the request", "isMeasurement": true },146"resumeEventSeen": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Whether a system resume event was seen during the request", "isMeasurement": true }147}148*/149telemetryService.sendTelemetryEvent('response.success', { github: true, microsoft: true }, {150reason: chatCompletion.finishReason,151filterReason: chatCompletion.filterReason,152source: baseTelemetry?.properties.messageSource ?? 'unknown',153initiatorType: userInitiatedRequest ? 'user' : 'agent',154conversationId: baseTelemetry?.properties.conversationId,155model: chatEndpointInfo?.model,156modelInvoked: chatCompletion.model,157apiType: chatEndpointInfo?.apiType,158requestId: chatCompletion.requestId.headerRequestId,159gitHubRequestId: chatCompletion.requestId.gitHubRequestId,160associatedRequestId: baseTelemetry?.properties.associatedRequestId,161reasoningEffort: requestBody.reasoning?.effort ?? requestBody.output_config?.effort,162reasoningSummary: requestBody.reasoning?.summary,163...(fetcher ? { fetcher } : {}),164transport,165...(baseTelemetry?.properties.retryAfterError ? { retryAfterError: baseTelemetry.properties.retryAfterError } : {}),166...(baseTelemetry?.properties.retryAfterErrorGitHubRequestId ? { retryAfterErrorGitHubRequestId: baseTelemetry.properties.retryAfterErrorGitHubRequestId } : {}),167...(baseTelemetry?.properties.connectivityTestError ? { connectivityTestError: baseTelemetry.properties.connectivityTestError } : {}),168...(baseTelemetry?.properties.connectivityTestErrorGitHubRequestId ? { connectivityTestErrorGitHubRequestId: baseTelemetry.properties.connectivityTestErrorGitHubRequestId } : {}),169...(baseTelemetry?.properties.retryAfterFilterCategory ? { retryAfterFilterCategory: baseTelemetry.properties.retryAfterFilterCategory } : {}),170}, {171totalTokenMax: chatEndpointInfo?.modelMaxPromptTokens ?? -1,172tokenCountMax: maxResponseTokens,173promptTokenCount: chatCompletion.usage?.prompt_tokens,174promptCacheTokenCount: chatCompletion.usage?.prompt_tokens_details?.cached_tokens,175clientPromptTokenCount: promptTokenCount,176tokenCount: chatCompletion.usage?.total_tokens,177reasoningTokens: chatCompletion.usage?.completion_tokens_details?.reasoning_tokens,178acceptedPredictionTokens: chatCompletion.usage?.completion_tokens_details?.accepted_prediction_tokens,179rejectedPredictionTokens: chatCompletion.usage?.completion_tokens_details?.rejected_prediction_tokens,180completionTokens: chatCompletion.usage?.completion_tokens,181timeToFirstToken,182timeToFirstTokenEmitted,183timeToComplete: Date.now() - baseTelemetry.issuedTime,184issuedTime: baseTelemetry.issuedTime,185isVisionRequest: hasImageMessages ? 1 : -1,186isBYOK: isBYOKModel(chatEndpointInfo),187isAuto: isAutoModel(chatEndpointInfo),188bytesReceived,189suspendEventSeen: suspendEventSeen ? 1 : 0,190resumeEventSeen: resumeEventSeen ? 1 : 0,191});192}193194public static sendCancellationTelemetry(195telemetryService: ITelemetryService,196{197source,198requestId,199model,200apiType,201transport,202associatedRequestId,203retryAfterError,204retryAfterErrorGitHubRequestId,205connectivityTestError,206connectivityTestErrorGitHubRequestId,207retryAfterFilterCategory,208fetcher,209suspendEventSeen,210resumeEventSeen,211}: IChatMLFetcherCancellationProperties,212{213totalTokenMax,214promptTokenCount,215tokenCountMax,216timeToFirstToken,217timeToFirstTokenEmitted,218timeToCancelled,219isVisionRequest,220isBYOK,221isAuto,222bytesReceived,223issuedTime,224}: IChatMLFetcherCancellationMeasures225) {226/* __GDPR__227"response.cancelled" : {228"owner": "digitarald",229"comment": "Report canceled service responses for quality.",230"model": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Model selection for the response" },231"apiType": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "API type for the response- chat completions or responses" },232"source": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Source for why the request was made" },233"requestId": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Id of the request" },234"associatedRequestId": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "Another request ID that this request is associated with (eg, the originating request of a summarization request)." },235"fetcher": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "The fetcher used for the request" },236"transport": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "The transport used for the request (http or websocket)" },237"totalTokenMax": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Maximum total token window", "isMeasurement": true },238"promptTokenCount": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Number of prompt tokens", "isMeasurement": true },239"tokenCountMax": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Maximum generated tokens", "isMeasurement": true },240"timeToFirstToken": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Time to first token", "isMeasurement": true },241"timeToFirstTokenEmitted": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Time to first token emitted (visible text)", "isMeasurement": true },242"timeToCancelled": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Time to cancellation", "isMeasurement": true },243"timeToComplete": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Time to complete the request", "isMeasurement": true },244"issuedTime": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Timestamp when the request was issued", "isMeasurement": true },245"isVisionRequest": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Whether the request was for a vision model", "isMeasurement": true },246"isBYOK": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "Whether the request was for a BYOK model", "isMeasurement": true },247"isAuto": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "Whether the request was for an Auto model", "isMeasurement": true },248"bytesReceived": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Number of bytes received before cancellation", "isMeasurement": true },249"retryAfterError": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "Error of the original request." },250"retryAfterErrorGitHubRequestId": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "GitHub request id of the original request if available" },251"connectivityTestError": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "Error of the connectivity test." },252"connectivityTestErrorGitHubRequestId": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "GitHub request id of the connectivity test request if available" },253"retryAfterFilterCategory": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "If the response was filtered and this is a retry attempt, this contains the original filtered content category." },254"suspendEventSeen": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Whether a system suspend event was seen during the request", "isMeasurement": true },255"resumeEventSeen": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Whether a system resume event was seen during the request", "isMeasurement": true }256}257*/258telemetryService.sendTelemetryEvent('response.cancelled', { github: true, microsoft: true }, {259apiType,260source,261requestId,262model,263associatedRequestId,264...(fetcher ? { fetcher } : {}),265transport,266...(retryAfterError ? { retryAfterError } : {}),267...(retryAfterErrorGitHubRequestId ? { retryAfterErrorGitHubRequestId } : {}),268...(connectivityTestError ? { connectivityTestError } : {}),269...(connectivityTestErrorGitHubRequestId ? { connectivityTestErrorGitHubRequestId } : {}),270...(retryAfterFilterCategory ? { retryAfterFilterCategory } : {})271}, {272totalTokenMax,273promptTokenCount,274tokenCountMax,275timeToFirstToken,276timeToFirstTokenEmitted,277timeToCancelled,278timeToComplete: timeToCancelled,279issuedTime,280isVisionRequest,281isBYOK,282isAuto,283bytesReceived,284suspendEventSeen: suspendEventSeen ? 1 : 0,285resumeEventSeen: resumeEventSeen ? 1 : 0,286});287}288289public static sendResponseErrorTelemetry(290telemetryService: ITelemetryService,291{292processed,293telemetryProperties,294chatEndpointInfo,295requestBody,296tokenCount,297maxResponseTokens,298timeToFirstToken,299isVisionRequest,300transport,301fetcher,302bytesReceived,303issuedTime,304wasRetried,305suspendEventSeen,306resumeEventSeen,307}: IChatMLFetcherErrorData,308) {309/* __GDPR__310"response.error" : {311"owner": "digitarald",312"comment": "Report quality issue for when a service response failed.",313"type": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Type of issue" },314"reason": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Reason of issue" },315"model": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Model selection for the response" },316"apiType": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "API type for the response- chat completions or responses" },317"source": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Source for why the request was made" },318"requestId": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Id of the request" },319"gitHubRequestId": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "GitHub request id if available" },320"associatedRequestId": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "Another request ID that this request is associated with (eg, the originating request of a summarization request)." },321"reasoningEffort": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Reasoning effort level" },322"reasoningSummary": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Reasoning summary level" },323"fetcher": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "The fetcher used for the request" },324"transport": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "The transport used for the request (http or websocket)" },325"totalTokenMax": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Maximum total token window", "isMeasurement": true },326"promptTokenCount": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Number of prompt tokens", "isMeasurement": true },327"tokenCountMax": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Maximum generated tokens", "isMeasurement": true },328"timeToFirstToken": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Time to first token", "isMeasurement": true },329"timeToFirstTokenEmitted": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Time to first token emitted (visible text)", "isMeasurement": true },330"timeToComplete": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Time to complete the request", "isMeasurement": true },331"issuedTime": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Timestamp when the request was issued", "isMeasurement": true },332"isVisionRequest": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Whether the request was for a vision model", "isMeasurement": true },333"isBYOK": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "Whether the request was for a BYOK model", "isMeasurement": true },334"isAuto": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "Whether the request was for an Auto model", "isMeasurement": true },335"wasRetried": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Whether the error will be retried", "isMeasurement": true },336"bytesReceived": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Number of bytes received before the error", "isMeasurement": true },337"retryAfterError": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "Error of the original request." },338"retryAfterErrorGitHubRequestId": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "GitHub request id of the original request if available" },339"connectivityTestError": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "Error of the connectivity test." },340"connectivityTestErrorGitHubRequestId": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "GitHub request id of the connectivity test request if available" },341"retryAfterFilterCategory": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "If the response was filtered and this is a retry attempt, this contains the original filtered content category." },342"suspendEventSeen": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Whether a system suspend event was seen during the request", "isMeasurement": true },343"resumeEventSeen": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth", "comment": "Whether a system resume event was seen during the request", "isMeasurement": true }344}345*/346telemetryService.sendTelemetryEvent('response.error', { github: true, microsoft: true }, {347type: processed.type,348reason: processed.reasonDetail || processed.reason,349source: telemetryProperties?.messageSource ?? 'unknown',350requestId: processed.requestId,351gitHubRequestId: processed.serverRequestId,352model: chatEndpointInfo.model,353apiType: chatEndpointInfo.apiType,354reasoningEffort: requestBody.reasoning?.effort ?? requestBody.output_config?.effort,355reasoningSummary: requestBody.reasoning?.summary,356...(fetcher ? { fetcher } : {}),357transport,358associatedRequestId: telemetryProperties?.associatedRequestId,359...(telemetryProperties?.retryAfterError ? { retryAfterError: telemetryProperties.retryAfterError } : {}),360...(telemetryProperties?.retryAfterErrorGitHubRequestId ? { retryAfterErrorGitHubRequestId: telemetryProperties.retryAfterErrorGitHubRequestId } : {}),361...(telemetryProperties?.connectivityTestError ? { connectivityTestError: telemetryProperties.connectivityTestError } : {}),362...(telemetryProperties?.connectivityTestErrorGitHubRequestId ? { connectivityTestErrorGitHubRequestId: telemetryProperties.connectivityTestErrorGitHubRequestId } : {}),363...(telemetryProperties?.retryAfterFilterCategory ? { retryAfterFilterCategory: telemetryProperties.retryAfterFilterCategory } : {})364}, {365totalTokenMax: chatEndpointInfo.modelMaxPromptTokens ?? -1,366promptTokenCount: tokenCount,367tokenCountMax: maxResponseTokens,368timeToFirstToken,369timeToComplete: Date.now() - issuedTime,370issuedTime,371isVisionRequest: isVisionRequest ? 1 : -1,372isBYOK: isBYOKModel(chatEndpointInfo),373isAuto: isAutoModel(chatEndpointInfo),374wasRetried: wasRetried ? 1 : 0,375bytesReceived,376suspendEventSeen: suspendEventSeen ? 1 : 0,377resumeEventSeen: resumeEventSeen ? 1 : 0,378});379}380}381382383