feat(core): Integrate remote experiments configuration (#12539)

This commit is contained in:
Shreya Keshive
2025-11-04 15:09:53 -08:00
committed by GitHub
parent 53c7646ed7
commit da3da19844
11 changed files with 173 additions and 43 deletions
@@ -5,7 +5,7 @@
*/
import { getReleaseChannel } from '../../utils/channel.js';
import type { ClientMetadata, Platform } from './types.js';
import type { ClientMetadata, ClientMetadataPlatform } from '../types.js';
import { fileURLToPath } from 'node:url';
import path from 'node:path';
@@ -15,7 +15,7 @@ const __dirname = path.dirname(__filename);
// Cache all client metadata.
let clientMetadataPromise: Promise<ClientMetadata> | undefined;
function getPlatform(): Platform {
function getPlatform(): ClientMetadataPlatform {
const platform = process.platform;
const arch = process.arch;
@@ -45,10 +45,10 @@ function getPlatform(): Platform {
export async function getClientMetadata(): Promise<ClientMetadata> {
if (!clientMetadataPromise) {
clientMetadataPromise = (async () => ({
ide_type: 'GEMINI_CLI',
ide_version: process.env['CLI_VERSION'] || process.version,
ideName: 'GEMINI_CLI',
ideVersion: process.env['CLI_VERSION'] || process.version,
platform: getPlatform(),
update_channel: await getReleaseChannel(__dirname),
updateChannel: await getReleaseChannel(__dirname),
}))();
}
return await clientMetadataPromise;
@@ -44,6 +44,6 @@ function parseExperiments(response: ListExperimentsResponse): Experiments {
}
return {
flags,
experimentIds: response.experiment_ids ?? [],
experimentIds: response.experimentIds ?? [],
};
}
@@ -4,26 +4,28 @@
* SPDX-License-Identifier: Apache-2.0
*/
import type { ClientMetadata } from '../types.js';
export interface ListExperimentsRequest {
project: string;
metadata?: ClientMetadata;
}
export interface ListExperimentsResponse {
experiment_ids?: number[];
experimentIds?: number[];
flags?: Flag[];
filtered_flags?: FilteredFlag[];
debug_string?: string;
filteredFlags?: FilteredFlag[];
debugString?: string;
}
export interface Flag {
name?: string;
bool_value?: boolean;
float_value?: number;
int_value?: string; // int64
string_value?: string;
int32_list_value?: Int32List;
string_list_value?: StringList;
boolValue?: boolean;
floatValue?: number;
intValue?: string; // int64
stringValue?: string;
int32ListValue?: Int32List;
stringListValue?: StringList;
}
export interface Int32List {
@@ -38,21 +40,3 @@ export interface FilteredFlag {
name?: string;
reason?: string;
}
export interface ClientMetadata {
ide_type?: IdeType;
ide_version?: string;
platform?: Platform;
update_channel?: 'nightly' | 'preview' | 'stable';
duet_project?: string;
}
export type IdeType = 'GEMINI_CLI';
export type Platform =
| 'PLATFORM_UNSPECIFIED'
| 'DARWIN_AMD64'
| 'DARWIN_ARM64'
| 'LINUX_AMD64'
| 'LINUX_ARM64'
| 'WINDOWS_AMD64';
+2 -2
View File
@@ -268,13 +268,13 @@ describe('CodeAssistServer', () => {
vi.spyOn(server, 'requestPost').mockResolvedValue(mockResponse);
const metadata = {
ide_version: 'v0.1.0',
ideVersion: 'v0.1.0',
};
const response = await server.listExperiments(metadata);
expect(server.requestPost).toHaveBeenCalledWith('listExperiments', {
project: 'test-project',
metadata: { ide_version: 'v0.1.0', duet_project: 'test-project' },
metadata: { ideVersion: 'v0.1.0', duetProject: 'test-project' },
});
expect(response).toEqual(mockResponse);
});
+2 -2
View File
@@ -13,11 +13,11 @@ import type {
LongRunningOperationResponse,
OnboardUserRequest,
SetCodeAssistGlobalUserSettingRequest,
ClientMetadata,
} from './types.js';
import type {
ListExperimentsRequest,
ListExperimentsResponse,
ClientMetadata,
} from './experiments/types.js';
import type {
CountTokensParameters,
@@ -163,7 +163,7 @@ export class CodeAssistServer implements ContentGenerator {
const projectId = this.projectId;
const req: ListExperimentsRequest = {
project: projectId,
metadata: { ...metadata, duet_project: projectId },
metadata: { ...metadata, duetProject: projectId },
};
return await this.requestPost<ListExperimentsResponse>(
'listExperiments',
+2 -1
View File
@@ -21,7 +21,8 @@ export type ClientMetadataIdeType =
| 'INTELLIJ'
| 'VSCODE_CLOUD_WORKSTATION'
| 'INTELLIJ_CLOUD_WORKSTATION'
| 'CLOUD_SHELL';
| 'CLOUD_SHELL'
| 'GEMINI_CLI';
export type ClientMetadataPlatform =
| 'PLATFORM_UNSPECIFIED'
| 'DARWIN_AMD64'