If a mode has no tools specified, it should include all tools (#253843)

This commit is contained in:
Martin Aeschlimann
2025-07-03 11:59:42 +02:00
committed by GitHub
parent 0f58db7480
commit 908f0803ba
6 changed files with 14 additions and 8 deletions
@@ -124,7 +124,7 @@ export class ChatSelectedTools extends Disposable {
let currentMap = this._sessionStates.get(currentMode.id);
let defaultEnablement = false;
if (!currentMap && currentMode.kind === ChatModeKind.Agent && currentMode.customTools) {
currentMap = this._toolsService.toToolAndToolSetEnablementMap(new Set(currentMode.customTools.read(r)));
currentMap = this._toolsService.toToolAndToolSetEnablementMap(currentMode.customTools.read(r));
}
if (!currentMap) {
currentMap = this._selectedTools.read(r);
@@ -1909,7 +1909,7 @@ export class ChatWidget extends Disposable implements IChatWidget {
// if not tools to enable are present, we are done
if (tools !== undefined && this.input.currentModeKind === ChatModeKind.Agent) {
const enablementMap = this.toolsService.toToolAndToolSetEnablementMap(new Set(tools));
const enablementMap = this.toolsService.toToolAndToolSetEnablementMap(tools);
this.input.selectedToolsModel.set(enablementMap, true);
}
@@ -484,13 +484,19 @@ export class LanguageModelToolsService extends Disposable implements ILanguageMo
return result;
}
toToolAndToolSetEnablementMap(toolOrToolSetNames: Set<string>): Map<ToolSet | IToolData, boolean> {
/**
* Create a map that contains all tools and toolsets with their enablement state.
* @param toolOrToolSetNames A list of tool or toolset names to check for enablement. If undefined, all tools and toolsets are enabled.
* @returns A map of tool or toolset instances to their enablement state.
*/
toToolAndToolSetEnablementMap(enabledToolOrToolSetNames: readonly string[] | undefined): Map<ToolSet | IToolData, boolean> {
const toolOrToolSetNames = enabledToolOrToolSetNames ? new Set(enabledToolOrToolSetNames) : undefined;
const result = new Map<ToolSet | IToolData, boolean>();
for (const tool of this._tools.values()) {
result.set(tool.data, tool.data.toolReferenceName !== undefined && toolOrToolSetNames.has(tool.data.toolReferenceName));
result.set(tool.data, tool.data.toolReferenceName !== undefined && (toolOrToolSetNames === undefined || toolOrToolSetNames.has(tool.data.toolReferenceName)));
}
for (const toolSet of this._toolSets) {
result.set(toolSet, toolOrToolSetNames.has(toolSet.referenceName));
result.set(toolSet, (toolOrToolSetNames === undefined || toolOrToolSetNames.has(toolSet.referenceName)));
}
return result;
}
@@ -78,7 +78,7 @@ class PromptToolsCodeLensProvider extends Disposable implements CodeLensProvider
private async updateTools(model: ITextModel, tools: PromptToolsMetadata) {
const selectedToolsNow = tools.value ? this.languageModelToolsService.toToolAndToolSetEnablementMap(new Set(tools.value)) : new Map();
const selectedToolsNow = tools.value ? this.languageModelToolsService.toToolAndToolSetEnablementMap(tools.value) : new Map();
const newSelectedAfter = await this.instantiationService.invokeFunction(showToolsPicker, localize('placeholder', "Select tools"), undefined, selectedToolsNow);
if (!newSelectedAfter) {
return;
@@ -275,7 +275,7 @@ export interface ILanguageModelToolsService {
resetToolAutoConfirmation(): void;
cancelToolCallsForRequest(requestId: string): void;
toToolEnablementMap(toolOrToolSetNames: Set<string>): Record<string, boolean>;
toToolAndToolSetEnablementMap(toolOrToolSetNames: Set<string>): IToolAndToolSetEnablementMap;
toToolAndToolSetEnablementMap(toolOrToolSetNames: readonly string[] | undefined): IToolAndToolSetEnablementMap;
readonly toolSets: IObservable<Iterable<ToolSet>>;
getToolSet(id: string): ToolSet | undefined;
@@ -76,7 +76,7 @@ export class MockLanguageModelToolsService implements ILanguageModelToolsService
throw new Error('Method not implemented.');
}
toToolAndToolSetEnablementMap(toolOrToolSetNames: Set<string>): Map<ToolSet | IToolData, boolean> {
toToolAndToolSetEnablementMap(toolOrToolSetNames: readonly string[] | undefined): Map<ToolSet | IToolData, boolean> {
throw new Error('Method not implemented.');
}
}