Update invokeTool to support Language

This commit is contained in:
bhavyaus
2025-11-24 17:33:37 -08:00
parent 5925b35321
commit 6d7b8fc9ef
5 changed files with 26 additions and 20 deletions

View File

@@ -101,4 +101,8 @@ export class MainThreadLanguageModelTools extends Disposable implements MainThre
$unregisterTool(name: string): void {
this._tools.deleteAndDispose(name);
}
$supportsModel(toolId: string, modelId: string, token: CancellationToken): Promise<boolean | undefined> {
return this._languageModelToolsService.supportsModel(toolId, modelId, token);
}
}

View File

@@ -1594,8 +1594,11 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I
registerTool<T>(name: string, tool: vscode.LanguageModelTool<T>) {
return extHostLanguageModelTools.registerTool(extension, name, tool);
},
invokeTool<T>(name: string, parameters: vscode.LanguageModelToolInvocationOptions<T>, token?: vscode.CancellationToken) {
return extHostLanguageModelTools.invokeTool(extension, name, parameters, token);
invokeTool<T>(nameOrInfo: string | vscode.LanguageModelToolInformation, parameters: vscode.LanguageModelToolInvocationOptions<T>, token?: vscode.CancellationToken) {
if (typeof nameOrInfo !== 'string') {
checkProposedApiEnabled(extension, 'chatParticipantAdditions');
}
return extHostLanguageModelTools.invokeTool(extension, nameOrInfo, parameters, token);
},
get tools() {
return extHostLanguageModelTools.getTools(extension);

View File

@@ -1463,6 +1463,7 @@ export interface MainThreadLanguageModelToolsShape extends IDisposable {
$countTokensForInvocation(callId: string, input: string, token: CancellationToken): Promise<number>;
$registerTool(id: string): void;
$unregisterTool(name: string): void;
$supportsModel(toolId: string, modelId: string, token: CancellationToken): Promise<boolean | undefined>;
}
export type IChatRequestVariableValueDto = Dto<IChatRequestVariableValue>;

View File

@@ -101,7 +101,8 @@ export class ExtHostLanguageModelTools implements ExtHostLanguageModelToolsShape
return await fn(input, token);
}
async invokeTool(extension: IExtensionDescription, toolId: string, options: vscode.LanguageModelToolInvocationOptions<any>, token?: CancellationToken): Promise<vscode.LanguageModelToolResult> {
async invokeTool(extension: IExtensionDescription, toolIdOrInfo: string | vscode.LanguageModelToolInformation, options: vscode.LanguageModelToolInvocationOptions<any>, token?: CancellationToken): Promise<vscode.LanguageModelToolResult> {
const toolId = typeof toolIdOrInfo === 'string' ? toolIdOrInfo : toolIdOrInfo.name;
const callId = generateUuid();
if (options.tokenizationOptions) {
this._tokenCountFuncs.set(callId, options.tokenizationOptions.countTokens);
@@ -176,21 +177,7 @@ export class ExtHostLanguageModelTools implements ExtHostLanguageModelToolsShape
* @returns `true` if supported, `false` if not, `undefined` if no supportsModel implementation (treat as supported)
*/
async supportsModel(toolId: string, modelId: string, token: CancellationToken): Promise<boolean | undefined> {
const item = this._registeredTools.get(toolId);
if (!item) {
// Tool is not registered in this extension host, assume it supports all models
return undefined;
}
// supportsModel is a proposed API
const supportsModelFn = item.tool.supportsModel;
if (supportsModelFn) {
const result = await supportsModelFn(modelId);
return result ?? undefined;
}
// No supportsModel method means tool supports all models
return undefined;
return this._proxy.$supportsModel(toolId, modelId, token);
}
async $invokeTool(dto: Dto<IToolInvocation>, token: CancellationToken): Promise<Dto<IToolResult> | SerializableObjectWithBuffers<Dto<IToolResult>>> {
@@ -309,8 +296,7 @@ export class ExtHostLanguageModelTools implements ExtHostLanguageModelToolsShape
// supportsModel is a proposed API
const supportsModelFn = item.tool.supportsModel;
if (supportsModelFn) {
const result = await supportsModelFn(modelId);
return result ?? undefined;
return supportsModelFn(modelId);
}
return undefined;

View File

@@ -410,6 +410,18 @@ declare module 'vscode' {
* Fired when the set of tools on a chat request changes.
*/
export const onDidChangeChatRequestTools: Event<ChatRequest>;
/**
* Invoke a tool by its full information object rather than just name.
* This allows disambiguation when multiple tools have the same name
* (e.g., from different MCP servers or model-specific implementations).
*
* @param tool The tool information object, typically obtained from {@link lm.tools}.
* @param options The options to use when invoking the tool.
* @param token A cancellation token.
* @returns The result of the tool invocation.
*/
export function invokeTool(tool: LanguageModelToolInformation, options: LanguageModelToolInvocationOptions<object>, token?: CancellationToken): Thenable<LanguageModelToolResult>;
}
export class LanguageModelToolExtensionSource {