diff --git a/packages/ai-openai/src/browser/openai-frontend-application-contribution.ts b/packages/ai-openai/src/browser/openai-frontend-application-contribution.ts index b16f80aa0ef90..3f917c77ed1ee 100644 --- a/packages/ai-openai/src/browser/openai-frontend-application-contribution.ts +++ b/packages/ai-openai/src/browser/openai-frontend-application-contribution.ts @@ -63,8 +63,13 @@ export class OpenAiFrontendApplicationContribution implements FrontendApplicatio const newModels = createCustomModelDescriptionsFromPreferences(event.newValue); const modelsToRemove = oldModels.filter(model => !newModels.some(newModel => newModel.id === model.id)); - const modelsToAddOrUpdate = newModels.filter(newModel => !oldModels.some(model => - model.id === newModel.id && model.model === newModel.model && model.url === newModel.url && model.apiKey === newModel.apiKey)); + const modelsToAddOrUpdate = newModels.filter(newModel => + !oldModels.some(model => + model.id === newModel.id && + model.model === newModel.model && + model.url === newModel.url && + model.apiKey === newModel.apiKey && + model.enableStreaming === newModel.enableStreaming)); this.manager.removeLanguageModels(...modelsToRemove.map(model => model.id)); this.manager.createOrUpdateLanguageModels(...modelsToAddOrUpdate); @@ -74,11 +79,14 @@ export class OpenAiFrontendApplicationContribution implements FrontendApplicatio } } +const openAIModelsWithDisabledStreaming = ['o1-preview']; + function createOpenAIModelDescription(modelId: string): OpenAiModelDescription { return { id: `openai/${modelId}`, model: modelId, - apiKey: true + apiKey: true, + enableStreaming: !openAIModelsWithDisabledStreaming.includes(modelId) }; } @@ -93,7 +101,8 @@ function createCustomModelDescriptionsFromPreferences(preferences: Partial string | undefined, public url: string | undefined) { } + constructor(public readonly id: string, public model: string, public enableStreaming: boolean, public apiKey: () => string | undefined, public url: string | undefined) { } async request(request: LanguageModelRequest, cancellationToken?: CancellationToken): Promise { const openai = this.initializeOpenAi(); @@ -152,8 +154,8 @@ export class OpenAiModel implements LanguageModel { }; } - protected isNonStreamingModel(model: string): boolean { - return ['o1-preview'].includes(model); + protected isNonStreamingModel(_model: string): boolean { + return !this.enableStreaming; } protected supportsStructuredOutput(): boolean { diff --git a/packages/ai-openai/src/node/openai-language-models-manager-impl.ts b/packages/ai-openai/src/node/openai-language-models-manager-impl.ts index cfc81ba3b8adb..4ccf77b0cc9f9 100644 --- a/packages/ai-openai/src/node/openai-language-models-manager-impl.ts +++ b/packages/ai-openai/src/node/openai-language-models-manager-impl.ts @@ -57,9 +57,12 @@ export class OpenAiLanguageModelsManagerImpl implements OpenAiLanguageModelsMana } model.url = modelDescription.url; model.model = modelDescription.model; + model.enableStreaming = modelDescription.enableStreaming; model.apiKey = apiKeyProvider; } else { - this.languageModelRegistry.addLanguageModels([new OpenAiModel(modelDescription.id, modelDescription.model, apiKeyProvider, modelDescription.url)]); + this.languageModelRegistry.addLanguageModels([ + new OpenAiModel(modelDescription.id, modelDescription.model, modelDescription.enableStreaming, apiKeyProvider, modelDescription.url) + ]); } } }