Path: blob/main/extensions/copilot/src/extension/byok/vscode-node/xAIProvider.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*--------------------------------------------------------------------------------------------*/4import { IConfigurationService } from '../../../platform/configuration/common/configurationService';5import { ILogService } from '../../../platform/log/common/logService';6import { IFetcherService } from '../../../platform/networking/common/fetcherService';7import { IExperimentationService } from '../../../platform/telemetry/common/nullExperimentationService';8import { IInstantiationService } from '../../../util/vs/platform/instantiation/common/instantiation';9import { BYOKKnownModels, BYOKModelCapabilities } from '../common/byokProvider';10import { AbstractOpenAICompatibleLMProvider } from './abstractLanguageModelChatProvider';11import { IBYOKStorageService } from './byokStorageService';1213// https://docs.x.ai/docs/api-reference#list-language-models14interface XAIModelData {15id: string;16fingerprint: string;17created: number;18object: string;19owned_by: string;20input_modalities: string[];21output_modalities: string[];22prompt_text_token_price: number;23cached_prompt_text_token_price: number;24prompt_image_token_price: number;25completion_text_token_price: number;26search_price?: number;27version: string;28aliases: string[];29}3031export class XAIBYOKLMProvider extends AbstractOpenAICompatibleLMProvider {3233public static readonly providerName = 'xAI';3435constructor(36knownModels: BYOKKnownModels,37byokStorageService: IBYOKStorageService,38@IFetcherService fetcherService: IFetcherService,39@ILogService logService: ILogService,40@IInstantiationService instantiationService: IInstantiationService,41@IConfigurationService configurationService: IConfigurationService,42@IExperimentationService expService: IExperimentationService43) {44super(45XAIBYOKLMProvider.providerName.toLowerCase(),46XAIBYOKLMProvider.providerName,47knownModels,48byokStorageService,49fetcherService,50logService,51instantiationService,52configurationService,53expService54);55}5657protected getModelsBaseUrl(): string | undefined {58return 'https://api.x.ai/v1';59}6061protected override getModelsDiscoveryUrl(modelsBaseUrl: string): string {62return `${modelsBaseUrl}/language-models`;63}6465protected override resolveModelCapabilities(modelData: unknown): BYOKModelCapabilities | undefined {66const xaiModelData = modelData as XAIModelData;67// Add new model with reasonable defaults68let maxInputTokens;69let maxOutputTokens;7071// Coding models and Grok 4+ models have larger context windows72const parsedVersion = this.parseXAIModelVersion(xaiModelData.id) ?? 0;73if (xaiModelData.id.startsWith('grok-code') || parsedVersion >= 4) {74maxInputTokens = 120000;75maxOutputTokens = 120000;76} else {77maxInputTokens = 80000;78maxOutputTokens = 30000;79}8081return {82name: this.humanizeXAIModelId(xaiModelData.id),83toolCalling: true,84vision: xaiModelData.input_modalities.includes('image'),85maxInputTokens,86maxOutputTokens,87};88}8990private parseXAIModelVersion(modelId: string): number | undefined {91const match = modelId.match(/^grok-(\d+)/);92return match ? parseInt(match[1], 10) : undefined;93}9495private humanizeXAIModelId(modelId: string): string {96const parts = modelId.split('-').filter(p => p.length > 0);97return parts.map(p => {98if (/^\d+$/.test(p)) {99return p; // keep pure numbers as-is100}101return p.charAt(0).toUpperCase() + p.slice(1);102}).join(' ');103}104}105106107