* tools: add support for model-specific tool registration
This PR goes with https://github.com/microsoft/vscode/pull/287666
This allows the registration of tools that are scoped to specific
language models. These tools can be registered at runtime with
definitions derived from e.g. the server.
I think we should adopt this and go away from the current
`alternativeDefinitions` pattern which we have used previously.
Example of having tools specific for GPT 4.1 vs 4o:
```ts
ToolRegistry.registerModelSpecificTool(
{
name: 'gpt41_get_time',
inputSchema: {},
description: 'Get the current date and time (4.1)',
displayName: 'Get Time (GPT 4.1)',
toolReferenceName: 'get_time',
source: undefined,
tags: [],
models: [{ id: 'gpt-4.1' }],
},
class implements ICopilotTool<unknown> {
invoke() {
return new vscode.LanguageModelToolResult([new vscode.LanguageModelTextPart('Current year is 2041 (GPT 4.1)')]);
}
}
);
ToolRegistry.registerModelSpecificTool(
{
name: 'gpt4o_get_time',
inputSchema: {},
description: 'Get the current date and time (4o)',
displayName: 'Get Time (GPT 4o)',
toolReferenceName: 'get_time',
source: undefined,
tags: [],
models: [{ id: 'gpt-4o' }],
},
class implements ICopilotTool<unknown> {
invoke() {
return new vscode.LanguageModelToolResult([new vscode.LanguageModelTextPart('Current year is 2040 (GPT 4o)')]);
}
}
);
```
* demo
* fix
* overrides
* add overridesTool
* fix inverted logic
* test fixes and back compat
* make memory tool model specific
* fix tests and contribute memory to the vscode toolset
* verison
* fix unit tests
* rm config
* fix missing askquestions
---------
Co-authored-by: bhavyaus <bhavyau@microsoft.com>
After talking to Kai, we decided that the rare case of sensitive files edits should just use our standard confirmation UI instead of adding more variances to the base chat experience.
* Use lineNumberStyle for FileVariable
* vitest
* update test files with no baseline...
* Update baseline scores for toolCalling tests to reflect recent changes
* tests
* Update baseline
---------
Co-authored-by: Ulugbek Abdullaev <ulugbekna@gmail.com>
Refs https://github.com/microsoft/vscode/issues/257379
I hypothesize that what's happening is the model tries to make an edit
with an invalid `oldString`. We then go to healing and the healing
process incorrectly causes the `newString` to no-op. This makes a
couple changes:
- Explicitly throw if oldString===newString, which we will get in telemetry
- Only do the `unescapeStringForGeminiBug` for Gemini, not Claude. Claude
may not have this issue and is generally really good at self-correcting,
I strongly suspect this code path is where things go awry.
* test implementation of gemini-inspired model based healing
* rationalize types in string replace tools
* cleanup and add telemetry for string_replace healing
* prompting improvements
* add failsafe for string-replace healing
* update snapshot