Не подтверждена Коммит 69471ed8 создал по автору Johannes Rieken's avatar Johannes Rieken Зафиксировано автором GitHub
Просмотр файлов

Merge pull request #245510 from microsoft/joh/coloured-wasp

show squiggles for tool input
владельцы aa8b30e3 020b767c
......@@ -4,25 +4,29 @@
*--------------------------------------------------------------------------------------------*/
import * as dom from '../../../../../base/browser/dom.js';
import { RunOnceScheduler } from '../../../../../base/common/async.js';
import { Codicon } from '../../../../../base/common/codicons.js';
import { Emitter } from '../../../../../base/common/event.js';
import { IMarkdownString, MarkdownString } from '../../../../../base/common/htmlContent.js';
import { Disposable, DisposableStore, IDisposable, toDisposable } from '../../../../../base/common/lifecycle.js';
import { ThemeIcon } from '../../../../../base/common/themables.js';
import { URI } from '../../../../../base/common/uri.js';
import { generateUuid } from '../../../../../base/common/uuid.js';
import { MarkdownRenderer } from '../../../../../editor/browser/widget/markdownRenderer/browser/markdownRenderer.js';
import { Location } from '../../../../../editor/common/languages.js';
import { ILanguageService } from '../../../../../editor/common/languages/language.js';
import { IModelService } from '../../../../../editor/common/services/model.js';
import { localize } from '../../../../../nls.js';
import { ICommandService } from '../../../../../platform/commands/common/commands.js';
import { IContextKeyService } from '../../../../../platform/contextkey/common/contextkey.js';
import { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';
import { IKeybindingService } from '../../../../../platform/keybinding/common/keybinding.js';
import { IMarkerData, IMarkerService, MarkerSeverity } from '../../../../../platform/markers/common/markers.js';
import { ChatContextKeys } from '../../common/chatContextKeys.js';
import { IChatMarkdownContent, IChatProgressMessage, IChatTerminalToolInvocationData, IChatToolInvocation, IChatToolInvocationSerialized } from '../../common/chatService.js';
import { IChatRendererContent } from '../../common/chatViewModel.js';
import { CodeBlockModelCollection } from '../../common/codeBlockModelCollection.js';
import { createToolInputUri, ILanguageModelToolsService, isToolResultInputOutputDetails, IToolResultInputOutputDetails } from '../../common/languageModelToolsService.js';
import { createToolInputUri, createToolSchemaUri, ILanguageModelToolsService, isToolResultInputOutputDetails, IToolResultInputOutputDetails } from '../../common/languageModelToolsService.js';
import { CancelChatActionId } from '../actions/chatExecuteActions.js';
import { AcceptToolConfirmationActionId } from '../actions/chatToolActions.js';
import { ChatTreeItem, IChatCodeBlockInfo } from '../chat.js';
......@@ -133,7 +137,9 @@ class ChatToolInvocationSubPart extends Disposable {
@IModelService private readonly modelService: IModelService,
@ILanguageService private readonly languageService: ILanguageService,
@IContextKeyService private readonly contextKeyService: IContextKeyService,
@ILanguageModelToolsService private readonly languageModelToolsService: ILanguageModelToolsService
@ILanguageModelToolsService private readonly languageModelToolsService: ILanguageModelToolsService,
@ICommandService private readonly commandService: ICommandService,
@IMarkerService private readonly markerService: IMarkerService,
) {
super();
......@@ -245,6 +251,37 @@ class ChatToolInvocationSubPart extends Disposable {
this.languageService.createById(langId),
createToolInputUri(toolInvocation.toolId)
));
const markerOwner = generateUuid();
const schemaUri = createToolSchemaUri(toolInvocation.toolId);
const validator = new RunOnceScheduler(async () => {
const newMarker: IMarkerData[] = [];
const result = await this.commandService.executeCommand('json.validate', schemaUri, model.getValue());
for (const item of result) {
if (item.range && item.message) {
newMarker.push({
severity: item.severity === 'Error' ? MarkerSeverity.Error : MarkerSeverity.Warning,
message: item.message,
startLineNumber: item.range[0].line + 1,
startColumn: item.range[0].character + 1,
endLineNumber: item.range[1].line + 1,
endColumn: item.range[1].character + 1,
code: item.code ? String(item.code) : undefined
});
}
}
this.markerService.changeOne(markerOwner, model.uri, newMarker);
}, 500);
validator.schedule();
this._register(model.onDidChangeContent(() => validator.schedule()));
this._register(toDisposable(() => this.markerService.remove(markerOwner, [model.uri])));
this._register(validator);
const editor = this._register(this.editorPool.get());
editor.object.render({
codeBlockIndex: this.codeBlockStartIndex,
......
......@@ -14,8 +14,6 @@ import { Iterable } from '../../../../base/common/iterator.js';
import { Lazy } from '../../../../base/common/lazy.js';
import { Disposable, DisposableStore, dispose, IDisposable, toDisposable } from '../../../../base/common/lifecycle.js';
import { LRUCache } from '../../../../base/common/map.js';
import { Schemas } from '../../../../base/common/network.js';
import { URI } from '../../../../base/common/uri.js';
import { localize } from '../../../../nls.js';
import { IAccessibilityService } from '../../../../platform/accessibility/common/accessibility.js';
import { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';
......@@ -33,7 +31,7 @@ import { ChatModel } from '../common/chatModel.js';
import { ChatToolInvocation } from '../common/chatProgressTypes/chatToolInvocation.js';
import { IChatService } from '../common/chatService.js';
import { ChatConfiguration } from '../common/constants.js';
import { CountTokensCallback, ILanguageModelToolsService, IPreparedToolInvocation, IToolData, IToolImpl, IToolInvocation, IToolResult, stringifyPromptTsxPart } from '../common/languageModelToolsService.js';
import { CountTokensCallback, createToolSchemaUri, ILanguageModelToolsService, IPreparedToolInvocation, IToolData, IToolImpl, IToolInvocation, IToolResult, stringifyPromptTsxPart } from '../common/languageModelToolsService.js';
const jsonSchemaRegistry = Registry.as<JSONContributionRegistry.IJSONContributionRegistry>(JSONContributionRegistry.Extensions.JSONContribution);
......@@ -107,7 +105,7 @@ export class LanguageModelToolsService extends Disposable implements ILanguageMo
let store: DisposableStore | undefined;
if (toolData.inputSchema) {
store = new DisposableStore();
const schemaUrl = URI.from({ scheme: Schemas.vscode, authority: 'schemas', path: `/lm/tool/${toolData.id}` }).toString();
const schemaUrl = createToolSchemaUri(toolData.id).toString();
jsonSchemaRegistry.registerSchema(schemaUrl, toolData.inputSchema, store);
store.add(jsonSchemaRegistry.registerSchemaAssociation(schemaUrl, `/lm/tool/${toolData.id}/tool_input.json`));
}
......
......@@ -155,3 +155,10 @@ export function createToolInputUri(toolOrId: IToolData | string): URI {
}
return URI.from({ scheme: Schemas.inMemory, path: `/lm/tool/${toolOrId}/tool_input.json` });
}
export function createToolSchemaUri(toolOrId: IToolData | string): URI {
if (typeof toolOrId !== 'string') {
toolOrId = toolOrId.id;
}
return URI.from({ scheme: Schemas.vscode, authority: 'schemas', path: `/lm/tool/${toolOrId}` });
}
Поддерживает Markdown
0% или .
You are about to add 0 people to the discussion. Proceed with caution.
Сначала завершите редактирование этого сообщения!
Пожалуйста, зарегистрируйтесь или чтобы прокомментировать