| // Copyright 2026 The Chromium Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| import * as Root from '../root/root.js'; | |
| import { | |
| type AidaRegisterClientEvent, | |
| type CompletionRequest, | |
| type CompletionResponse, | |
| debugLog, | |
| type DoConversationRequest, | |
| type GenerateCodeRequest, | |
| type GenerateCodeResponse, | |
| } from './AidaClientTypes.js'; | |
| import { | |
| aidaCompletionRequestToGcaRequest, | |
| aidaDoConversationRequestToGcaRequest, | |
| aidaEventToGcaTelemetryRequest, | |
| aidaGenerateCodeRequestToGcaRequest, | |
| gcaResponseToAidaCompletionResponse, | |
| gcaResponseToAidaGenerateCodeResponse, | |
| } from './AidaGcaTranslation.js'; | |
| import * as DispatchHttpRequestClient from './DispatchHttpRequestClient.js'; | |
| import type {GenerateContentRequest, GenerateContentResponse} from './GcaTypes.js'; | |
| import type {AidaClientResult} from './InspectorFrontendHostAPI.js'; | |
| const SERVICE_NAME = 'gcaService'; | |
| const ENDPOINTS = { | |
| CONTENT: '/v1beta:generateContent', | |
| SEND_TELEMETRY: '/v1beta:sendTelemetry', | |
| STREAM_CONTENT: '/v1beta:streamGenerateContent', | |
| }; | |
| export class GcaClient { | |
| enabled(): boolean|undefined { | |
| return Root.Runtime.hostConfig.devToolsUseGcaApi?.enabled; | |
| } | |
| async conversationRequest(request: DoConversationRequest, streamId: number, options?: {signal?: AbortSignal}): | |
| Promise<void> { | |
| try { | |
| const gcaRequest = aidaDoConversationRequestToGcaRequest(request); | |
| const response = await DispatchHttpRequestClient.makeHttpRequest<GenerateContentResponse>( | |
| { | |
| service: SERVICE_NAME, | |
| path: ENDPOINTS.STREAM_CONTENT, | |
| method: 'POST', | |
| body: JSON.stringify(gcaRequest), | |
| streamId, | |
| }, | |
| options); | |
| debugLog('GCA conversation request succeeded:', JSON.stringify(request), JSON.stringify(response)); | |
| } catch (err) { | |
| debugLog('GCA request failed:', JSON.stringify(request), err); | |
| throw err; | |
| } | |
| } | |
| registerClientEvent(clientEvent: AidaRegisterClientEvent): Promise<AidaClientResult> { | |
| const gcaEvent = aidaEventToGcaTelemetryRequest(clientEvent); | |
| const response = DispatchHttpRequestClient.makeHttpRequest({ | |
| service: SERVICE_NAME, | |
| path: ENDPOINTS.SEND_TELEMETRY, | |
| method: 'POST', | |
| body: JSON.stringify(gcaEvent), | |
| }); | |
| return response.then( | |
| result => { | |
| debugLog('GCA register event succeeded:', JSON.stringify(gcaEvent), JSON.stringify(result)); | |
| return {} as AidaClientResult; | |
| }, | |
| err => { | |
| debugLog('GCA register event failed:', JSON.stringify(gcaEvent), err); | |
| return {error: JSON.stringify(err)} as AidaClientResult; | |
| }); | |
| } | |
| async completeCode(request: CompletionRequest): Promise<CompletionResponse> { | |
| const gcaRequest = aidaCompletionRequestToGcaRequest(request); | |
| const result = await this.#requestContent(gcaRequest); | |
| return gcaResponseToAidaCompletionResponse(result); | |
| } | |
| async generateCode(request: GenerateCodeRequest, options?: {signal?: AbortSignal}): Promise<GenerateCodeResponse> { | |
| const gcaRequest = aidaGenerateCodeRequestToGcaRequest(request); | |
| const result = await this.#requestContent(gcaRequest, options); | |
| return gcaResponseToAidaGenerateCodeResponse(result); | |
| } | |
| async #requestContent(request: GenerateContentRequest, | |
| options?: {signal?: AbortSignal}): Promise<GenerateContentResponse> { | |
| try { | |
| const response = await DispatchHttpRequestClient.makeHttpRequest<GenerateContentResponse>( | |
| { | |
| service: SERVICE_NAME, | |
| path: ENDPOINTS.CONTENT, | |
| method: 'POST', | |
| body: JSON.stringify(request), | |
| }, | |
| options); | |
| debugLog('GCA request succeeded:', JSON.stringify(request), JSON.stringify(response)); | |
| return response; | |
| } catch (err) { | |
| debugLog('GCA request failed:', JSON.stringify(request), err); | |
| throw err; | |
| } | |
| } | |
| } |