Add ChatAgentResult2#metadata (#204851)

* Support serializable metadata on 'result' object from chat agent

* Fix 'errorDetails' on the VM

* Fix acceptAction, get rid of generic parameter on ChatAgent

* Use result metadata for followups

* Use serialized result for history

* Don't share metadata between agents

* Add a test for result metadata

* Fix build
This commit is contained in:
Rob Lourens
2024-02-10 10:40:01 -03:00
committed by GitHub
parent 56c54e7fef
commit b49c1c1170
22 changed files with 215 additions and 165 deletions

View File

@@ -5,7 +5,7 @@
import * as assert from 'assert';
import 'mocha';
import { CancellationToken, chat, ChatAgentRequest, ChatVariableLevel, Disposable, interactive, InteractiveSession, ProviderResult } from 'vscode';
import { CancellationToken, chat, ChatAgentRequest, ChatAgentResult2, ChatVariableLevel, Disposable, interactive, InteractiveSession, ProviderResult } from 'vscode';
import { assertNoRpc, closeAllEditors, DeferredPromise, disposeAll } from '../utils';
suite('chat', () => {
@@ -67,4 +67,37 @@ suite('chat', () => {
assert.strictEqual(request.prompt, 'hi [#myVar](values:myVar)');
assert.strictEqual(request.variables['myVar'][0].value, 'myValue');
});
test('result metadata is returned to the followup provider', async () => {
disposables.push(interactive.registerInteractiveSessionProvider('provider', {
prepareSession: (_token: CancellationToken): ProviderResult<InteractiveSession> => {
return {
requester: { name: 'test' },
responder: { name: 'test' },
};
},
}));
const deferred = new DeferredPromise<ChatAgentResult2>();
const agent = chat.createChatAgent('agent', (_request, _context, _progress, _token) => {
return { metadata: { key: 'value' } };
});
agent.isDefault = true;
agent.subCommandProvider = {
provideSubCommands: (_token) => {
return [{ name: 'hello', description: 'Hello' }];
}
};
agent.followupProvider = {
provideFollowups(result, _token) {
deferred.complete(result);
return [];
},
};
disposables.push(agent);
interactive.sendInteractiveRequestToProvider('provider', { message: '@agent /hello friend' });
const result = await deferred.p;
assert.deepStrictEqual(result.metadata, { key: 'value' });
});
});