Fix codeblock streaming (#208952)

* Suggestion for microsoft/vscode-copilot-release#983

* Update codeblock when response is done, in case it wasn't rendered

* Clean up
This commit is contained in:
Rob Lourens 2024-03-27 18:23:22 -03:00 committed by GitHub
parent b065dc2b60
commit d948d379b2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 11 additions and 9 deletions

View file

@ -33,7 +33,7 @@ import { IMarkdownRenderResult, MarkdownRenderer } from 'vs/editor/browser/widge
import { Range } from 'vs/editor/common/core/range';
import { IResolvedTextEditorModel, ITextModelService } from 'vs/editor/common/services/resolverService';
import { localize } from 'vs/nls';
import { createActionViewItem, IMenuEntryActionViewItemOptions, MenuEntryActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem';
import { IMenuEntryActionViewItemOptions, MenuEntryActionViewItem, createActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem';
import { MenuWorkbenchToolBar } from 'vs/platform/actions/browser/toolbar';
import { MenuId, MenuItemAction } from 'vs/platform/actions/common/actions';
import { ICommandService } from 'vs/platform/commands/common/commands';
@ -918,17 +918,13 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer<Ch
}
const sessionId = isResponseVM(element) || isRequestVM(element) ? element.sessionId : '';
const modelEntry = this.codeBlockModelCollection.get(sessionId, element, index);
if (!modelEntry) {
console.error('Trying to render code block without model', element.id, index);
return $('div');
}
const modelEntry = this.codeBlockModelCollection.getOrCreate(sessionId, element, index);
vulns = modelEntry.vulns;
textModel = modelEntry.model;
}
const hideToolbar = isResponseVM(element) && element.errorDetails?.responseIsFiltered;
const ref = this.renderCodeBlock({ languageId, textModel, codeBlockIndex: index, element, range, hideToolbar, parentContextKeyService: templateData.contextKeyService, vulns });
const ref = this.renderCodeBlock({ languageId, textModel, codeBlockIndex: index, element, range, hideToolbar, parentContextKeyService: templateData.contextKeyService, vulns }, text);
// Attach this after updating text/layout of the editor, so it should only be fired when the size updates later (horizontal scrollbar, wrapping)
// not during a renderElement OR a progressive render (when we will be firing this event anyway at the end of the render)
@ -975,9 +971,13 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer<Ch
};
}
private renderCodeBlock(data: ICodeBlockData): IDisposableReference<CodeBlockPart> {
private renderCodeBlock(data: ICodeBlockData, text: string): IDisposableReference<CodeBlockPart> {
const ref = this._editorPool.get();
const editorInfo = ref.object;
if (isResponseVM(data.element)) {
this.codeBlockModelCollection.update(data.element.sessionId, data.element, data.codeBlockIndex, { text, languageId: data.languageId });
}
editorInfo.render(data, this._currentLayoutWidth, this.rendererOptions.editableCodeBlock);
return ref;

View file

@ -241,7 +241,9 @@ export class ChatViewModel extends Disposable implements IChatViewModel {
private onAddResponse(responseModel: IChatResponseModel) {
const response = this.instantiationService.createInstance(ChatResponseViewModel, responseModel);
this._register(response.onDidChange(() => {
this.updateCodeBlockTextModels(response);
if (response.isComplete) {
this.updateCodeBlockTextModels(response);
}
return this._onDidChange.fire(null);
}));
this._items.push(response);