Path: blob/main/extensions/copilot/src/platform/endpoint/common/capiClient.ts
13401 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 { CAPIClient, MakeRequestOptions, RequestMetadata, RequestType } from '@vscode/copilot-api';6import { createServiceIdentifier } from '../../../util/common/services';7import { IEnvService } from '../../env/common/envService';8import { IFetcherService, NO_FETCH_TELEMETRY } from '../../networking/common/fetcherService';9import { LICENSE_AGREEMENT } from './licenseAgreement';1011/**12* Interface for CAPI client service13*/14export interface ICAPIClientService extends CAPIClient {15readonly _serviceBrand: undefined;16abExpContext: string | undefined;17}1819export abstract class BaseCAPIClientService extends CAPIClient implements ICAPIClientService {20readonly _serviceBrand: undefined;21public abExpContext: string | undefined;2223constructor(24hmac: string | undefined,25integrationId: string | undefined,26fetcherService: IFetcherService,27envService: IEnvService28) {29super({30machineId: envService.machineId,31deviceId: envService.devDeviceId,32sessionId: envService.sessionId,33vscodeVersion: envService.vscodeVersion,34buildType: envService.getBuildType(),35name: envService.getName(),36version: envService.getVersion(),37}, LICENSE_AGREEMENT, fetcherService, hmac, integrationId);38}3940override makeRequest<T>(request: MakeRequestOptions, requestMetadata: RequestMetadata): Promise<T> {41// Inject AB Exp Context headers (legacy VScode-ABExpContext and new standardized X-Copilot-Client-Exp-Assignment-Context) if available42if (this.abExpContext) {43if (!request.headers) {44request.headers = {};45}46request.headers['VScode-ABExpContext'] = this.abExpContext;47request.headers['X-Copilot-Client-Exp-Assignment-Context'] = this.abExpContext;48}49// Expected high request volume events that we don't need to collect fetch telemetry for50if (51requestMetadata.type === RequestType.Telemetry ||52requestMetadata.type === RequestType.ChatCompletions ||53requestMetadata.type === RequestType.ChatMessages ||54requestMetadata.type === RequestType.ChatResponses55) {56request.callSite = NO_FETCH_TELEMETRY;57}58return super.makeRequest<T>(request, requestMetadata);59}60}61export const ICAPIClientService = createServiceIdentifier<ICAPIClientService>('ICAPIClientService');6263