@theia/ai-chat 1.59.0-next.72 → 1.60.0-next.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/browser/frontend-chat-service.d.ts +1 -1
- package/lib/browser/frontend-chat-service.d.ts.map +1 -1
- package/lib/browser/frontend-chat-service.js +2 -2
- package/lib/browser/frontend-chat-service.js.map +1 -1
- package/lib/common/chat-request-parser.d.ts +18 -7
- package/lib/common/chat-request-parser.d.ts.map +1 -1
- package/lib/common/chat-request-parser.js +54 -7
- package/lib/common/chat-request-parser.js.map +1 -1
- package/lib/common/chat-request-parser.spec.js +81 -13
- package/lib/common/chat-request-parser.spec.js.map +1 -1
- package/lib/common/chat-service.d.ts.map +1 -1
- package/lib/common/chat-service.js +9 -15
- package/lib/common/chat-service.js.map +1 -1
- package/lib/common/parsed-chat-request.d.ts +2 -2
- package/lib/common/parsed-chat-request.d.ts.map +1 -1
- package/lib/common/parsed-chat-request.js.map +1 -1
- package/package.json +11 -11
- package/src/browser/frontend-chat-service.ts +2 -2
- package/src/common/chat-request-parser.spec.ts +95 -16
- package/src/common/chat-request-parser.ts +68 -11
- package/src/common/chat-service.ts +9 -18
- package/src/common/parsed-chat-request.ts +2 -2
|
@@ -10,6 +10,6 @@ export declare class FrontendChatServiceImpl extends ChatServiceImpl {
|
|
|
10
10
|
protected getAgent(parsedRequest: ParsedChatRequest, session: ChatSession): ChatAgent | undefined;
|
|
11
11
|
protected initialAgentSelection(parsedRequest: ParsedChatRequest): ChatAgent | undefined;
|
|
12
12
|
protected getConfiguredDefaultChatAgent(): ChatAgent | undefined;
|
|
13
|
-
createSession(location?: ChatAgentLocation, options?: SessionOptions): ChatSession;
|
|
13
|
+
createSession(location?: ChatAgentLocation, options?: SessionOptions, pinnedAgent?: ChatAgent): ChatSession;
|
|
14
14
|
}
|
|
15
15
|
//# sourceMappingURL=frontend-chat-service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frontend-chat-service.d.ts","sourceRoot":"","sources":["../../src/browser/frontend-chat-service.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAa,SAAS,EAAE,iBAAiB,EAAE,eAAe,EAAE,WAAW,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACrI,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE;;GAEG;AACH,qBACa,uBAAwB,SAAQ,eAAe;IAGxD,SAAS,CAAC,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;IAGxD,SAAS,CAAC,QAAQ,CAAC,oBAAoB,EAAE,oBAAoB,CAAC;cAE3C,QAAQ,CAAC,aAAa,EAAE,iBAAiB,EAAE,OAAO,EAAE,WAAW,GAAG,SAAS,GAAG,SAAS;cAavF,qBAAqB,CAAC,aAAa,EAAE,iBAAiB,GAAG,SAAS,GAAG,SAAS;IAWjG,SAAS,CAAC,6BAA6B,IAAI,SAAS,GAAG,SAAS;IASvD,aAAa,CAAC,QAAQ,CAAC,EAAE,iBAAiB,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,WAAW;
|
|
1
|
+
{"version":3,"file":"frontend-chat-service.d.ts","sourceRoot":"","sources":["../../src/browser/frontend-chat-service.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAa,SAAS,EAAE,iBAAiB,EAAE,eAAe,EAAE,WAAW,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACrI,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE;;GAEG;AACH,qBACa,uBAAwB,SAAQ,eAAe;IAGxD,SAAS,CAAC,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;IAGxD,SAAS,CAAC,QAAQ,CAAC,oBAAoB,EAAE,oBAAoB,CAAC;cAE3C,QAAQ,CAAC,aAAa,EAAE,iBAAiB,EAAE,OAAO,EAAE,WAAW,GAAG,SAAS,GAAG,SAAS;cAavF,qBAAqB,CAAC,aAAa,EAAE,iBAAiB,GAAG,SAAS,GAAG,SAAS;IAWjG,SAAS,CAAC,6BAA6B,IAAI,SAAS,GAAG,SAAS;IASvD,aAAa,CAAC,QAAQ,CAAC,EAAE,iBAAiB,EAAE,OAAO,CAAC,EAAE,cAAc,EAAE,WAAW,CAAC,EAAE,SAAS,GAAG,WAAW;CAYvH"}
|
|
@@ -58,8 +58,8 @@ let FrontendChatServiceImpl = class FrontendChatServiceImpl extends common_1.Cha
|
|
|
58
58
|
}
|
|
59
59
|
return configuredDefaultChatAgent;
|
|
60
60
|
}
|
|
61
|
-
createSession(location, options) {
|
|
62
|
-
const session = super.createSession(location, options);
|
|
61
|
+
createSession(location, options, pinnedAgent) {
|
|
62
|
+
const session = super.createSession(location, options, pinnedAgent);
|
|
63
63
|
session.model.onDidChange(event => {
|
|
64
64
|
const changeSet = event.changeSet;
|
|
65
65
|
if (event.kind === 'removeChangeSet') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frontend-chat-service.js","sourceRoot":"","sources":["../../src/browser/frontend-chat-service.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;;AAEhF,4DAAkE;AAClE,sCAAqI;AACrI,qDAA4D;AAC5D,+DAAqF;AACrF,uEAAiE;AAEjE;;GAEG;AAEI,IAAM,uBAAuB,GAA7B,MAAM,uBAAwB,SAAQ,wBAAe;IAQrC,QAAQ,CAAC,aAAgC,EAAE,OAAoB;;QAC9E,IAAI,KAAK,GAAG,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;QACtD,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAU,yCAAmB,CAAC,EAAE,CAAC;YAC5D,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,KAAK,IAAI,KAAK,CAAC,EAAE,MAAK,MAAA,IAAI,CAAC,kBAAkB,0CAAE,EAAE,CAAA,EAAE,CAAC;YAC5E,OAAO,CAAC,WAAW,GAAG,KAAK,CAAC;QAChC,CAAC;aAAM,IAAI,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,KAAK,SAAS,EAAE,CAAC;YACpF,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC;QAChC,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAEkB,qBAAqB,CAAC,aAAgC;QACrE,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;QACxD,IAAI,CAAC,SAAS,EAAE,CAAC;YACb,MAAM,0BAA0B,GAAG,IAAI,CAAC,6BAA6B,EAAE,CAAC;YACxE,IAAI,0BAA0B,EAAE,CAAC;gBAC7B,OAAO,0BAA0B,CAAC;YACtC,CAAC;QACL,CAAC;QACD,OAAO,KAAK,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;IACtD,CAAC;IAES,6BAA6B;QACnC,MAAM,4BAA4B,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAS,6CAAuB,EAAE,SAAS,CAAC,CAAC;QAC5G,MAAM,0BAA0B,GAAG,4BAA4B,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,4BAA4B,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3I,IAAI,4BAA4B,IAAI,CAAC,0BAA0B,EAAE,CAAC;YAC9D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8CAA8C,4BAA4B,mBAAmB,CAAC,CAAC;QACpH,CAAC;QACD,OAAO,0BAA0B,CAAC;IACtC,CAAC;IAEQ,aAAa,CAAC,QAA4B,EAAE,OAAwB;
|
|
1
|
+
{"version":3,"file":"frontend-chat-service.js","sourceRoot":"","sources":["../../src/browser/frontend-chat-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +1,31 @@
|
|
|
1
1
|
import { ChatAgentService } from './chat-agent-service';
|
|
2
2
|
import { ChatAgentLocation } from './chat-agents';
|
|
3
|
-
import { ChatRequest } from './chat-model';
|
|
4
|
-
import { ParsedChatRequest } from './parsed-chat-request';
|
|
5
|
-
import { AIVariableService, ToolInvocationRegistry } from '@theia/ai-core';
|
|
3
|
+
import { ChatContext, ChatRequest } from './chat-model';
|
|
4
|
+
import { ParsedChatRequest, ParsedChatRequestPart } from './parsed-chat-request';
|
|
5
|
+
import { AIVariable, AIVariableService, ToolInvocationRegistry, ToolRequest } from '@theia/ai-core';
|
|
6
|
+
import { ILogger } from '@theia/core';
|
|
6
7
|
export declare const ChatRequestParser: unique symbol;
|
|
7
8
|
export interface ChatRequestParser {
|
|
8
|
-
parseChatRequest(request: ChatRequest, location: ChatAgentLocation): ParsedChatRequest
|
|
9
|
+
parseChatRequest(request: ChatRequest, location: ChatAgentLocation, context: ChatContext): Promise<ParsedChatRequest>;
|
|
9
10
|
}
|
|
10
11
|
export declare class ChatRequestParserImpl {
|
|
11
12
|
private readonly agentService;
|
|
12
13
|
private readonly variableService;
|
|
13
14
|
private readonly toolInvocationRegistry;
|
|
14
|
-
|
|
15
|
-
|
|
15
|
+
private readonly logger;
|
|
16
|
+
constructor(agentService: ChatAgentService, variableService: AIVariableService, toolInvocationRegistry: ToolInvocationRegistry, logger: ILogger);
|
|
17
|
+
parseChatRequest(request: ChatRequest, location: ChatAgentLocation, context: ChatContext): Promise<ParsedChatRequest>;
|
|
18
|
+
protected parseParts(request: ChatRequest, location: ChatAgentLocation): {
|
|
19
|
+
parts: ParsedChatRequestPart[];
|
|
20
|
+
toolRequests: Map<string, ToolRequest>;
|
|
21
|
+
variables: Map<string, AIVariable>;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Parse text for tool requests and add them to the given map
|
|
25
|
+
*/
|
|
26
|
+
private parseFunctionsFromVariableText;
|
|
16
27
|
private tryToParseAgent;
|
|
17
28
|
private tryToParseVariable;
|
|
18
|
-
private
|
|
29
|
+
private tryToParseFunction;
|
|
19
30
|
}
|
|
20
31
|
//# sourceMappingURL=chat-request-parser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-request-parser.d.ts","sourceRoot":"","sources":["../../src/common/chat-request-parser.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"chat-request-parser.d.ts","sourceRoot":"","sources":["../../src/common/chat-request-parser.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EASH,iBAAiB,EACjB,qBAAqB,EACxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAA2D,sBAAsB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7J,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAOtC,eAAO,MAAM,iBAAiB,eAA8B,CAAC;AAC7D,MAAM,WAAW,iBAAiB;IAC9B,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,iBAAiB,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACzH;AAQD,qBACa,qBAAqB;IAEA,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC5B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAC3B,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IACtD,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAHG,YAAY,EAAE,gBAAgB,EAC7B,eAAe,EAAE,iBAAiB,EAC7B,sBAAsB,EAAE,sBAAsB,EAC7D,MAAM,EAAE,OAAO;IAG/C,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,iBAAiB,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAiC3H,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,iBAAiB,GAAG;QACrE,KAAK,EAAE,qBAAqB,EAAE,CAAC;QAC/B,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACvC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;KACtC;IAyED;;OAEG;IACH,OAAO,CAAC,8BAA8B;IAetC,OAAO,CAAC,eAAe;IAiDvB,OAAO,CAAC,kBAAkB;IAiB1B,OAAO,CAAC,kBAAkB;CAiB7B"}
|
|
@@ -26,8 +26,10 @@ const inversify_1 = require("@theia/core/shared/inversify");
|
|
|
26
26
|
const chat_agent_service_1 = require("./chat-agent-service");
|
|
27
27
|
const parsed_chat_request_1 = require("./parsed-chat-request");
|
|
28
28
|
const ai_core_1 = require("@theia/ai-core");
|
|
29
|
+
const core_1 = require("@theia/core");
|
|
29
30
|
const agentReg = /^@([\w_\-\.]+)(?=(\s|$|\b))/i; // An @-agent
|
|
30
31
|
const functionReg = /^~([\w_\-\.]+)(?=(\s|$|\b))/i; // A ~ tool function
|
|
32
|
+
const functionPromptFormatReg = /^\~\{\s*(.*?)\s*\}/i; // A ~{} prompt-format tool function
|
|
31
33
|
const variableReg = /^#([\w_\-]+)(?::([\w_\-_\/\\.:]+))?(?=(\s|$|\b))/i; // A #-variable with an optional : arg (#file:workspace/path/name.ext)
|
|
32
34
|
exports.ChatRequestParser = Symbol('ChatRequestParser');
|
|
33
35
|
function offsetRange(start, endExclusive) {
|
|
@@ -37,12 +39,39 @@ function offsetRange(start, endExclusive) {
|
|
|
37
39
|
return { start, endExclusive };
|
|
38
40
|
}
|
|
39
41
|
let ChatRequestParserImpl = class ChatRequestParserImpl {
|
|
40
|
-
constructor(agentService, variableService, toolInvocationRegistry) {
|
|
42
|
+
constructor(agentService, variableService, toolInvocationRegistry, logger) {
|
|
41
43
|
this.agentService = agentService;
|
|
42
44
|
this.variableService = variableService;
|
|
43
45
|
this.toolInvocationRegistry = toolInvocationRegistry;
|
|
46
|
+
this.logger = logger;
|
|
44
47
|
}
|
|
45
|
-
parseChatRequest(request, location) {
|
|
48
|
+
async parseChatRequest(request, location, context) {
|
|
49
|
+
// Parse the request into parts
|
|
50
|
+
const { parts, toolRequests } = this.parseParts(request, location);
|
|
51
|
+
// Resolve all variables and add them to the variable parts.
|
|
52
|
+
// Parse resolved variable texts again for tool requests.
|
|
53
|
+
// These are not added to parts as they are not visible in the initial chat message.
|
|
54
|
+
// However, they need to be added to the result to be considered by the executing agent.
|
|
55
|
+
const variableCache = (0, ai_core_1.createAIResolveVariableCache)();
|
|
56
|
+
for (const part of parts) {
|
|
57
|
+
if (part instanceof parsed_chat_request_1.ParsedChatRequestVariablePart) {
|
|
58
|
+
const resolvedVariable = await this.variableService.resolveVariable({ variable: part.variableName, arg: part.variableArg }, context, variableCache);
|
|
59
|
+
if (resolvedVariable) {
|
|
60
|
+
part.resolution = resolvedVariable;
|
|
61
|
+
// Resolve tool requests in resolved variables
|
|
62
|
+
this.parseFunctionsFromVariableText(resolvedVariable.value, toolRequests);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
this.logger.warn(`Failed to resolve variable ${part.variableName} for ${location}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Get resolved variables from variable cache after all variables have been resolved.
|
|
70
|
+
// We want to return all recursilvely resolved variables, thus use the whole cache.
|
|
71
|
+
const resolvedVariables = await (0, ai_core_1.getAllResolvedAIVariables)(variableCache);
|
|
72
|
+
return { request, parts, toolRequests, variables: resolvedVariables };
|
|
73
|
+
}
|
|
74
|
+
parseParts(request, location) {
|
|
46
75
|
var _a, _b;
|
|
47
76
|
const parts = [];
|
|
48
77
|
const variables = new Map();
|
|
@@ -54,7 +83,7 @@ let ChatRequestParserImpl = class ChatRequestParserImpl {
|
|
|
54
83
|
let newPart;
|
|
55
84
|
if (previousChar.match(/\s/) || i === 0) {
|
|
56
85
|
if (char === parsed_chat_request_1.chatFunctionLeader) {
|
|
57
|
-
const functionPart = this.
|
|
86
|
+
const functionPart = this.tryToParseFunction(message.slice(i), i);
|
|
58
87
|
newPart = functionPart;
|
|
59
88
|
if (functionPart) {
|
|
60
89
|
toolRequests.set(functionPart.toolRequest.id, functionPart.toolRequest);
|
|
@@ -89,7 +118,23 @@ let ChatRequestParserImpl = class ChatRequestParserImpl {
|
|
|
89
118
|
if (lastPartEnd < message.length) {
|
|
90
119
|
parts.push(new parsed_chat_request_1.ParsedChatRequestTextPart(offsetRange(lastPartEnd, message.length), message.slice(lastPartEnd, message.length)));
|
|
91
120
|
}
|
|
92
|
-
return {
|
|
121
|
+
return { parts, toolRequests, variables };
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Parse text for tool requests and add them to the given map
|
|
125
|
+
*/
|
|
126
|
+
parseFunctionsFromVariableText(text, toolRequests) {
|
|
127
|
+
for (let i = 0; i < text.length; i++) {
|
|
128
|
+
const char = text.charAt(i);
|
|
129
|
+
// Check for function markers at start of words
|
|
130
|
+
if (char === parsed_chat_request_1.chatFunctionLeader) {
|
|
131
|
+
const functionPart = this.tryToParseFunction(text.slice(i), i);
|
|
132
|
+
if (functionPart) {
|
|
133
|
+
// Add the found tool request to the given map
|
|
134
|
+
toolRequests.set(functionPart.toolRequest.id, functionPart.toolRequest);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
93
138
|
}
|
|
94
139
|
tryToParseAgent(message, offset, parts, location) {
|
|
95
140
|
const nextAgentMatch = message.match(agentReg);
|
|
@@ -133,8 +178,9 @@ let ChatRequestParserImpl = class ChatRequestParserImpl {
|
|
|
133
178
|
const varRange = offsetRange(offset, offset + full.length);
|
|
134
179
|
return new parsed_chat_request_1.ParsedChatRequestVariablePart(varRange, name, variableArg);
|
|
135
180
|
}
|
|
136
|
-
|
|
137
|
-
|
|
181
|
+
tryToParseFunction(message, offset) {
|
|
182
|
+
// Support both the and chat and prompt formats for functions
|
|
183
|
+
const nextFunctionMatch = message.match(functionPromptFormatReg) || message.match(functionReg);
|
|
138
184
|
if (!nextFunctionMatch) {
|
|
139
185
|
return;
|
|
140
186
|
}
|
|
@@ -153,6 +199,7 @@ exports.ChatRequestParserImpl = ChatRequestParserImpl = tslib_1.__decorate([
|
|
|
153
199
|
tslib_1.__param(0, (0, inversify_1.inject)(chat_agent_service_1.ChatAgentService)),
|
|
154
200
|
tslib_1.__param(1, (0, inversify_1.inject)(ai_core_1.AIVariableService)),
|
|
155
201
|
tslib_1.__param(2, (0, inversify_1.inject)(ai_core_1.ToolInvocationRegistry)),
|
|
156
|
-
tslib_1.
|
|
202
|
+
tslib_1.__param(3, (0, inversify_1.inject)(core_1.ILogger)),
|
|
203
|
+
tslib_1.__metadata("design:paramtypes", [Object, Object, Object, Object])
|
|
157
204
|
], ChatRequestParserImpl);
|
|
158
205
|
//# sourceMappingURL=chat-request-parser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-request-parser.js","sourceRoot":"","sources":["../../src/common/chat-request-parser.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;AAChF;;;gGAGgG;AAChG,oKAAoK;;;;AAEpK,4DAAkE;AAClE,6DAAwD;AAGxD,+DAW+B;AAC/B,
|
|
1
|
+
{"version":3,"file":"chat-request-parser.js","sourceRoot":"","sources":["../../src/common/chat-request-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,26 +21,35 @@ const chat_request_parser_1 = require("./chat-request-parser");
|
|
|
21
21
|
const chat_agents_1 = require("./chat-agents");
|
|
22
22
|
const chai_1 = require("chai");
|
|
23
23
|
const ai_core_1 = require("@theia/ai-core");
|
|
24
|
+
const core_1 = require("@theia/core");
|
|
25
|
+
const parsed_chat_request_1 = require("./parsed-chat-request");
|
|
24
26
|
describe('ChatRequestParserImpl', () => {
|
|
25
27
|
const chatAgentService = sinon.createStubInstance(chat_agent_service_1.ChatAgentServiceImpl);
|
|
26
28
|
const variableService = sinon.createStubInstance(ai_core_1.DefaultAIVariableService);
|
|
27
29
|
const toolInvocationRegistry = sinon.createStubInstance(ai_core_1.ToolInvocationRegistryImpl);
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
+
const logger = sinon.createStubInstance(core_1.Logger);
|
|
31
|
+
const parser = new chat_request_parser_1.ChatRequestParserImpl(chatAgentService, variableService, toolInvocationRegistry, logger);
|
|
32
|
+
beforeEach(() => {
|
|
33
|
+
// Reset our stubs before each test
|
|
34
|
+
sinon.reset();
|
|
35
|
+
});
|
|
36
|
+
it('parses simple text', async () => {
|
|
30
37
|
const req = {
|
|
31
38
|
text: 'What is the best pizza topping?'
|
|
32
39
|
};
|
|
33
|
-
const
|
|
40
|
+
const context = { variables: [] };
|
|
41
|
+
const result = await parser.parseChatRequest(req, chat_agents_1.ChatAgentLocation.Panel, context);
|
|
34
42
|
(0, chai_1.expect)(result.parts).to.deep.contain({
|
|
35
43
|
text: 'What is the best pizza topping?',
|
|
36
44
|
range: { start: 0, endExclusive: 31 }
|
|
37
45
|
});
|
|
38
46
|
});
|
|
39
|
-
it('parses text with variable name', () => {
|
|
47
|
+
it('parses text with variable name', async () => {
|
|
40
48
|
const req = {
|
|
41
49
|
text: 'What is the #best pizza topping?'
|
|
42
50
|
};
|
|
43
|
-
const
|
|
51
|
+
const context = { variables: [] };
|
|
52
|
+
const result = await parser.parseChatRequest(req, chat_agents_1.ChatAgentLocation.Panel, context);
|
|
44
53
|
(0, chai_1.expect)(result).to.deep.contain({
|
|
45
54
|
parts: [{
|
|
46
55
|
text: 'What is the ',
|
|
@@ -55,11 +64,12 @@ describe('ChatRequestParserImpl', () => {
|
|
|
55
64
|
}]
|
|
56
65
|
});
|
|
57
66
|
});
|
|
58
|
-
it('parses text with variable name with argument', () => {
|
|
67
|
+
it('parses text with variable name with argument', async () => {
|
|
59
68
|
const req = {
|
|
60
69
|
text: 'What is the #best:by-poll pizza topping?'
|
|
61
70
|
};
|
|
62
|
-
const
|
|
71
|
+
const context = { variables: [] };
|
|
72
|
+
const result = await parser.parseChatRequest(req, chat_agents_1.ChatAgentLocation.Panel, context);
|
|
63
73
|
(0, chai_1.expect)(result).to.deep.contain({
|
|
64
74
|
parts: [{
|
|
65
75
|
text: 'What is the ',
|
|
@@ -74,35 +84,93 @@ describe('ChatRequestParserImpl', () => {
|
|
|
74
84
|
}]
|
|
75
85
|
});
|
|
76
86
|
});
|
|
77
|
-
it('parses text with variable name with numeric argument', () => {
|
|
87
|
+
it('parses text with variable name with numeric argument', async () => {
|
|
78
88
|
const req = {
|
|
79
89
|
text: '#size-class:2'
|
|
80
90
|
};
|
|
81
|
-
const
|
|
91
|
+
const context = { variables: [] };
|
|
92
|
+
const result = await parser.parseChatRequest(req, chat_agents_1.ChatAgentLocation.Panel, context);
|
|
82
93
|
(0, chai_1.expect)(result.parts[0]).to.contain({
|
|
83
94
|
variableName: 'size-class',
|
|
84
95
|
variableArg: '2'
|
|
85
96
|
});
|
|
86
97
|
});
|
|
87
|
-
it('parses text with variable name with POSIX path argument', () => {
|
|
98
|
+
it('parses text with variable name with POSIX path argument', async () => {
|
|
88
99
|
const req = {
|
|
89
100
|
text: '#file:/path/to/file.ext'
|
|
90
101
|
};
|
|
91
|
-
const
|
|
102
|
+
const context = { variables: [] };
|
|
103
|
+
const result = await parser.parseChatRequest(req, chat_agents_1.ChatAgentLocation.Panel, context);
|
|
92
104
|
(0, chai_1.expect)(result.parts[0]).to.contain({
|
|
93
105
|
variableName: 'file',
|
|
94
106
|
variableArg: '/path/to/file.ext'
|
|
95
107
|
});
|
|
96
108
|
});
|
|
97
|
-
it('parses text with variable name with Win32 path argument', () => {
|
|
109
|
+
it('parses text with variable name with Win32 path argument', async () => {
|
|
98
110
|
const req = {
|
|
99
111
|
text: '#file:c:\\path\\to\\file.ext'
|
|
100
112
|
};
|
|
101
|
-
const
|
|
113
|
+
const context = { variables: [] };
|
|
114
|
+
const result = await parser.parseChatRequest(req, chat_agents_1.ChatAgentLocation.Panel, context);
|
|
102
115
|
(0, chai_1.expect)(result.parts[0]).to.contain({
|
|
103
116
|
variableName: 'file',
|
|
104
117
|
variableArg: 'c:\\path\\to\\file.ext'
|
|
105
118
|
});
|
|
106
119
|
});
|
|
120
|
+
it('resolves variable and extracts tool functions from resolved variable', async () => {
|
|
121
|
+
// Set up two test tool requests that will be referenced in the variable content
|
|
122
|
+
const testTool1 = {
|
|
123
|
+
id: 'testTool1',
|
|
124
|
+
name: 'Test Tool 1',
|
|
125
|
+
handler: async () => undefined
|
|
126
|
+
};
|
|
127
|
+
const testTool2 = {
|
|
128
|
+
id: 'testTool2',
|
|
129
|
+
name: 'Test Tool 2',
|
|
130
|
+
handler: async () => undefined
|
|
131
|
+
};
|
|
132
|
+
// Configure the tool registry to return our test tools
|
|
133
|
+
toolInvocationRegistry.getFunction.withArgs(testTool1.id).returns(testTool1);
|
|
134
|
+
toolInvocationRegistry.getFunction.withArgs(testTool2.id).returns(testTool2);
|
|
135
|
+
// Set up the test variable to include in the request
|
|
136
|
+
const testVariable = {
|
|
137
|
+
id: 'testVariable',
|
|
138
|
+
name: 'testVariable',
|
|
139
|
+
description: 'A test variable',
|
|
140
|
+
};
|
|
141
|
+
// Configure the variable service to return our test variable
|
|
142
|
+
// One tool reference uses chat format and one uses prompt format because the parser needs to handle both.
|
|
143
|
+
variableService.getVariable.withArgs(testVariable.name).returns(testVariable);
|
|
144
|
+
variableService.resolveVariable.withArgs({ variable: testVariable.name, arg: 'myarg' }, sinon.match.any).resolves({
|
|
145
|
+
variable: testVariable,
|
|
146
|
+
arg: 'myarg',
|
|
147
|
+
value: 'This is a test with ~testTool1 and **~{testTool2}** and more text.',
|
|
148
|
+
});
|
|
149
|
+
// Create a request with the test variable
|
|
150
|
+
const req = {
|
|
151
|
+
text: 'Test with #testVariable:myarg'
|
|
152
|
+
};
|
|
153
|
+
const context = { variables: [] };
|
|
154
|
+
// Parse the request
|
|
155
|
+
const result = await parser.parseChatRequest(req, chat_agents_1.ChatAgentLocation.Panel, context);
|
|
156
|
+
// Verify the variable part contains the correct properties
|
|
157
|
+
(0, chai_1.expect)(result.parts.length).to.equal(2);
|
|
158
|
+
(0, chai_1.expect)(result.parts[0] instanceof parsed_chat_request_1.ParsedChatRequestTextPart).to.be.true;
|
|
159
|
+
(0, chai_1.expect)(result.parts[1] instanceof parsed_chat_request_1.ParsedChatRequestVariablePart).to.be.true;
|
|
160
|
+
const variablePart = result.parts[1];
|
|
161
|
+
(0, chai_1.expect)(variablePart).to.have.property('resolution');
|
|
162
|
+
(0, chai_1.expect)(variablePart.resolution).to.deep.equal({
|
|
163
|
+
variable: testVariable,
|
|
164
|
+
arg: 'myarg',
|
|
165
|
+
value: 'This is a test with ~testTool1 and **~{testTool2}** and more text.',
|
|
166
|
+
});
|
|
167
|
+
// Verify both tool functions were extracted from the variable content
|
|
168
|
+
(0, chai_1.expect)(result.toolRequests.size).to.equal(2);
|
|
169
|
+
(0, chai_1.expect)(result.toolRequests.has(testTool1.id)).to.be.true;
|
|
170
|
+
(0, chai_1.expect)(result.toolRequests.has(testTool2.id)).to.be.true;
|
|
171
|
+
// Verify the result contains the tool requests returned by the registry
|
|
172
|
+
(0, chai_1.expect)(result.toolRequests.get(testTool1.id)).to.deep.equal(testTool1);
|
|
173
|
+
(0, chai_1.expect)(result.toolRequests.get(testTool2.id)).to.deep.equal(testTool2);
|
|
174
|
+
});
|
|
107
175
|
});
|
|
108
176
|
//# sourceMappingURL=chat-request-parser.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-request-parser.spec.js","sourceRoot":"","sources":["../../src/common/chat-request-parser.spec.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;AAEhF,+BAA+B;AAC/B,6DAA4D;AAC5D,+DAA8D;AAC9D,+CAAkD;AAElD,+BAA8B;AAC9B,
|
|
1
|
+
{"version":3,"file":"chat-request-parser.spec.js","sourceRoot":"","sources":["../../src/common/chat-request-parser.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-service.d.ts","sourceRoot":"","sources":["../../src/common/chat-service.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,2BAA2B,EAAE,iBAAiB,EAA6B,MAAM,gBAAgB,CAAC;AAC3G,OAAO,EAAE,OAAO,EAAE,OAAO,EAAgB,MAAM,aAAa,CAAC;AAE7D,OAAO,EAAE,KAAK,EAAE,MAAM,mDAAmD,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACjF,OAAO,EACH,SAAS,EACT,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EAEjB,WAAW,EACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,0BAA0B,
|
|
1
|
+
{"version":3,"file":"chat-service.d.ts","sourceRoot":"","sources":["../../src/common/chat-service.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,2BAA2B,EAAE,iBAAiB,EAA6B,MAAM,gBAAgB,CAAC;AAC3G,OAAO,EAAE,OAAO,EAAE,OAAO,EAAgB,MAAM,aAAa,CAAC;AAE7D,OAAO,EAAE,KAAK,EAAE,MAAM,mDAAmD,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACjF,OAAO,EACH,SAAS,EACT,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EAEjB,WAAW,EACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAEtF,MAAM,WAAW,qBAAqB;IAClC;;OAEG;IACH,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC5C;;OAEG;IACH,eAAe,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC5C;;OAEG;IACH,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,WAAW;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,SAAS,CAAC;CAC3B;AAED,MAAM,WAAW,yBAAyB;IACtC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,eAA+B,CAAC;AAC/D,MAAM,WAAW,kBAAkB;IAC/B,EAAE,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB,eAAgC,CAAC;AACjE,MAAM,WAAW,mBAAmB;IAChC,EAAE,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,YAAY,eAAyB,CAAC;AACnD,MAAM,MAAM,YAAY,GAAG,OAAO,CAAC;AAEnC,eAAO,MAAM,WAAW,eAAwB,CAAC;AACjD,MAAM,WAAW,WAAW;IACxB,sBAAsB,EAAE,KAAK,CAAC,yBAAyB,CAAC,CAAA;IAExD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC;IAChD,WAAW,IAAI,WAAW,EAAE,CAAC;IAC7B,aAAa,CAAC,QAAQ,CAAC,EAAE,iBAAiB,EAAE,OAAO,CAAC,EAAE,cAAc,EAAE,WAAW,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC;IAC5G,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IAEpE,WAAW,CACP,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,WAAW,GACrB,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CAAC;IAE9C,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAE/D,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtE;AAED,UAAU,mBAAoB,SAAQ,WAAW;IAC7C,KAAK,EAAE,gBAAgB,CAAC;CAC3B;AAED,qBACa,eAAgB,YAAW,WAAW;IAC/C,SAAS,CAAC,QAAQ,CAAC,6BAA6B,qCAA4C;IAC5F,sBAAsB,yDAA4C;IAGlE,SAAS,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAG7C,SAAS,CAAC,kBAAkB,EAAE,kBAAkB,GAAG,SAAS,CAAC;IAG7D,SAAS,CAAC,mBAAmB,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAG/D,SAAS,CAAC,YAAY,EAAE,OAAO,GAAG,SAAS,CAAC;IAG5C,SAAS,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;IAG/C,SAAS,CAAC,eAAe,EAAE,iBAAiB,CAAC;IAG7C,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC;IAE1B,SAAS,CAAC,SAAS,EAAE,mBAAmB,EAAE,CAAM;IAEhD,WAAW,IAAI,mBAAmB,EAAE;IAIpC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS;IAIvD,aAAa,CAAC,QAAQ,oBAA0B,EAAE,OAAO,CAAC,EAAE,cAAc,EAAE,WAAW,CAAC,EAAE,SAAS,GAAG,WAAW;IAajH,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAYtC,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,IAAI;IAOzE,WAAW,CACb,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,WAAW,GACrB,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;cAyD7B,kBAAkB,CAC9B,kBAAkB,EAAE,SAAS,2BAA2B,EAAE,EAC1D,OAAO,EAAE,kBAAkB,GAC5B,OAAO,CAAC,WAAW,CAAC;IAcjB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxE,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,iBAAiB,EAAE,OAAO,EAAE,WAAW,GAAG,SAAS,GAAG,SAAS;IAajG,SAAS,CAAC,qBAAqB,CAAC,aAAa,EAAE,iBAAiB,GAAG,SAAS,GAAG,SAAS;IAmBxF,SAAS,CAAC,iBAAiB,CAAC,aAAa,EAAE,iBAAiB,GAAG,0BAA0B,GAAG,SAAS;IAIrG,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIxC,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;CAOjE"}
|
|
@@ -90,7 +90,9 @@ let ChatServiceImpl = class ChatServiceImpl {
|
|
|
90
90
|
return undefined;
|
|
91
91
|
}
|
|
92
92
|
session.title = request.text;
|
|
93
|
-
const
|
|
93
|
+
const resolutionContext = { model: session.model };
|
|
94
|
+
const resolvedContext = await this.resolveChatContext(session.model.context.getVariables(), resolutionContext);
|
|
95
|
+
const parsedRequest = await this.chatRequestParser.parseChatRequest(request, session.model.location, resolvedContext);
|
|
94
96
|
const agent = this.getAgent(parsedRequest, session);
|
|
95
97
|
if (agent === undefined) {
|
|
96
98
|
const error = 'No ChatAgents available to handle request!';
|
|
@@ -102,21 +104,8 @@ let ChatServiceImpl = class ChatServiceImpl {
|
|
|
102
104
|
responseCompleted: Promise.resolve(chatResponseModel),
|
|
103
105
|
};
|
|
104
106
|
}
|
|
105
|
-
const resolutionContext = { model: session.model };
|
|
106
|
-
const resolvedContext = await this.resolveChatContext(session.model.context.getVariables(), resolutionContext);
|
|
107
107
|
const requestModel = session.model.addRequest(parsedRequest, agent === null || agent === void 0 ? void 0 : agent.id, resolvedContext);
|
|
108
108
|
resolutionContext.request = requestModel;
|
|
109
|
-
for (const part of parsedRequest.parts) {
|
|
110
|
-
if (part instanceof parsed_chat_request_1.ParsedChatRequestVariablePart) {
|
|
111
|
-
const resolvedVariable = await this.variableService.resolveVariable({ variable: part.variableName, arg: part.variableArg }, resolutionContext);
|
|
112
|
-
if (resolvedVariable) {
|
|
113
|
-
part.resolution = resolvedVariable;
|
|
114
|
-
}
|
|
115
|
-
else {
|
|
116
|
-
this.logger.warn(`Failed to resolve variable ${part.variableName} for ${session.model.location}`);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
109
|
let resolveResponseCreated;
|
|
121
110
|
let resolveResponseCompleted;
|
|
122
111
|
const invocation = {
|
|
@@ -146,6 +135,7 @@ let ChatServiceImpl = class ChatServiceImpl {
|
|
|
146
135
|
return invocation;
|
|
147
136
|
}
|
|
148
137
|
async resolveChatContext(resolutionRequests, context) {
|
|
138
|
+
// TODO use a common cache to resolve variables and return recursively resolved variables?
|
|
149
139
|
const resolvedVariables = await Promise.all(resolutionRequests.map(async (contextVariable) => {
|
|
150
140
|
const resolvedVariable = await this.variableService.resolveVariable(contextVariable, context);
|
|
151
141
|
if (ai_core_1.ResolvedAIContextVariable.is(resolvedVariable)) {
|
|
@@ -200,8 +190,12 @@ let ChatServiceImpl = class ChatServiceImpl {
|
|
|
200
190
|
(_a = this.getSession(sessionId)) === null || _a === void 0 ? void 0 : _a.model.removeChangeSet();
|
|
201
191
|
}
|
|
202
192
|
deleteChangeSetElement(sessionId, index) {
|
|
203
|
-
var _a, _b;
|
|
193
|
+
var _a, _b, _c, _d;
|
|
204
194
|
(_b = (_a = this.getSession(sessionId)) === null || _a === void 0 ? void 0 : _a.model.changeSet) === null || _b === void 0 ? void 0 : _b.removeElements(index);
|
|
195
|
+
const elements = (_d = (_c = this.getSession(sessionId)) === null || _c === void 0 ? void 0 : _c.model.changeSet) === null || _d === void 0 ? void 0 : _d.getElements();
|
|
196
|
+
if ((elements === null || elements === void 0 ? void 0 : elements.length) === 0) {
|
|
197
|
+
this.deleteChangeSet(sessionId);
|
|
198
|
+
}
|
|
205
199
|
}
|
|
206
200
|
};
|
|
207
201
|
exports.ChatServiceImpl = ChatServiceImpl;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-service.js","sourceRoot":"","sources":["../../src/common/chat-service.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;AAChF;;;gGAGgG;AAChG,8JAA8J;;;;AAE9J,4CAA2G;AAC3G,sCAA6D;AAC7D,4DAA4E;AAE5E,6DAAwD;AACxD,+CAAiF;AACjF,6CAQsB;AACtB,+DAA0D;AAC1D,+
|
|
1
|
+
{"version":3,"file":"chat-service.js","sourceRoot":"","sources":["../../src/common/chat-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ResolvedAIVariable, ToolRequest } from '@theia/ai-core';
|
|
2
2
|
import { ChatRequest } from './chat-model';
|
|
3
3
|
export declare const chatVariableLeader = "#";
|
|
4
4
|
export declare const chatAgentLeader = "@";
|
|
@@ -15,7 +15,7 @@ export interface ParsedChatRequest {
|
|
|
15
15
|
readonly request: ChatRequest;
|
|
16
16
|
readonly parts: ParsedChatRequestPart[];
|
|
17
17
|
readonly toolRequests: Map<string, ToolRequest>;
|
|
18
|
-
readonly variables:
|
|
18
|
+
readonly variables: ResolvedAIVariable[];
|
|
19
19
|
}
|
|
20
20
|
export interface ParsedChatRequestPart {
|
|
21
21
|
readonly kind: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parsed-chat-request.d.ts","sourceRoot":"","sources":["../../src/common/parsed-chat-request.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"parsed-chat-request.d.ts","sourceRoot":"","sources":["../../src/common/parsed-chat-request.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAA2B,MAAM,gBAAgB,CAAC;AAC1F,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,eAAO,MAAM,kBAAkB,MAAM,CAAC;AACtC,eAAO,MAAM,eAAe,MAAM,CAAC;AACnC,eAAO,MAAM,kBAAkB,MAAM,CAAC;AACtC,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAExC;;wBAEwB;AAExB,MAAM,WAAW,WAAW;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,qBAAqB,EAAE,CAAC;IACxC,QAAQ,CAAC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAChD,QAAQ,CAAC,SAAS,EAAE,kBAAkB,EAAE,CAAC;CAC5C;AAED,MAAM,WAAW,qBAAqB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;CAC/B;AAED,qBAAa,yBAA0B,YAAW,qBAAqB;IAGvD,QAAQ,CAAC,KAAK,EAAE,WAAW;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM;IAF9D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAED,KAAK,EAAE,WAAW,EAAW,IAAI,EAAE,MAAM;IAE9D,IAAI,UAAU,IAAI,MAAM,CAEvB;CACJ;AAED,qBAAa,6BAA8B,YAAW,qBAAqB;IAK3D,QAAQ,CAAC,KAAK,EAAE,WAAW;IAAE,QAAQ,CAAC,YAAY,EAAE,MAAM;IAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS;IAJhH,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAEd,UAAU,EAAE,kBAAkB,CAAC;gBAEjB,KAAK,EAAE,WAAW,EAAW,YAAY,EAAE,MAAM,EAAW,WAAW,EAAE,MAAM,GAAG,SAAS;IAEhH,IAAI,IAAI,IAAI,MAAM,CAGjB;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;CACJ;AAED,qBAAa,6BAA8B,YAAW,qBAAqB;IAE3D,QAAQ,CAAC,KAAK,EAAE,WAAW;IAAE,QAAQ,CAAC,WAAW,EAAE,WAAW;IAD1E,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;gBACL,KAAK,EAAE,WAAW,EAAW,WAAW,EAAE,WAAW;IAE1E,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;CACJ;AAED,qBAAa,0BAA2B,YAAW,qBAAqB;IAExD,QAAQ,CAAC,KAAK,EAAE,WAAW;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM;IAAE,QAAQ,CAAC,SAAS,EAAE,MAAM;IAD7F,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;gBACF,KAAK,EAAE,WAAW,EAAW,OAAO,EAAE,MAAM,EAAW,SAAS,EAAE,MAAM;IAE7F,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;CACJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parsed-chat-request.js","sourceRoot":"","sources":["../../src/common/parsed-chat-request.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;AAChF;;;gGAGgG;AAChG,kKAAkK;AAClK,mJAAmJ;;;AAEnJ,
|
|
1
|
+
{"version":3,"file":"parsed-chat-request.js","sourceRoot":"","sources":["../../src/common/parsed-chat-request.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;AAChF;;;gGAGgG;AAChG,kKAAkK;AAClK,mJAAmJ;;;AAEnJ,4CAA0F;AAG7E,QAAA,kBAAkB,GAAG,GAAG,CAAC;AACzB,QAAA,eAAe,GAAG,GAAG,CAAC;AACtB,QAAA,kBAAkB,GAAG,GAAG,CAAC;AACzB,QAAA,oBAAoB,GAAG,GAAG,CAAC;AAgCxC,MAAa,yBAAyB;IAGlC,YAAqB,KAAkB,EAAW,IAAY;QAAzC,UAAK,GAAL,KAAK,CAAa;QAAW,SAAI,GAAJ,IAAI,CAAQ;IAAI,CAAC;IAEnE,IAAI,UAAU;QACV,OAAO,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;CACJ;AARD,8DAQC;AAED,MAAa,6BAA6B;IAKtC,YAAqB,KAAkB,EAAW,YAAoB,EAAW,WAA+B;QAA3F,UAAK,GAAL,KAAK,CAAa;QAAW,iBAAY,GAAZ,YAAY,CAAQ;QAAW,gBAAW,GAAX,WAAW,CAAoB;IAAI,CAAC;IAErH,IAAI,IAAI;QACJ,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,OAAO,GAAG,0BAAkB,GAAG,IAAI,CAAC,YAAY,GAAG,OAAO,EAAE,CAAC;IACjE,CAAC;IAED,IAAI,UAAU;;QACV,OAAO,MAAA,MAAA,IAAI,CAAC,UAAU,0CAAE,KAAK,mCAAI,IAAI,CAAC,IAAI,CAAC;IAC/C,CAAC;CACJ;AAfD,sEAeC;AAED,MAAa,6BAA6B;IAEtC,YAAqB,KAAkB,EAAW,WAAwB;QAArD,UAAK,GAAL,KAAK,CAAa;QAAW,gBAAW,GAAX,WAAW,CAAa;IAAI,CAAC;IAE/E,IAAI,IAAI;QACJ,OAAO,GAAG,0BAAkB,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC;IACzD,CAAC;IAED,IAAI,UAAU;QACV,OAAO,IAAA,iCAAuB,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACrD,CAAC;CACJ;AAXD,sEAWC;AAED,MAAa,0BAA0B;IAEnC,YAAqB,KAAkB,EAAW,OAAe,EAAW,SAAiB;QAAxE,UAAK,GAAL,KAAK,CAAa;QAAW,YAAO,GAAP,OAAO,CAAQ;QAAW,cAAS,GAAT,SAAS,CAAQ;IAAI,CAAC;IAElG,IAAI,IAAI;QACJ,OAAO,GAAG,uBAAe,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IACjD,CAAC;IAED,IAAI,UAAU;QACV,OAAO,EAAE,CAAC;IACd,CAAC;CACJ;AAXD,gEAWC"}
|
package/package.json
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@theia/ai-chat",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.60.0-next.43+2a13720d2",
|
|
4
4
|
"description": "Theia - AI Chat Extension",
|
|
5
5
|
"dependencies": {
|
|
6
|
-
"@theia/ai-core": "1.
|
|
7
|
-
"@theia/ai-history": "1.
|
|
8
|
-
"@theia/core": "1.
|
|
9
|
-
"@theia/editor": "1.
|
|
10
|
-
"@theia/file-search": "1.
|
|
11
|
-
"@theia/filesystem": "1.
|
|
12
|
-
"@theia/monaco": "1.
|
|
6
|
+
"@theia/ai-core": "1.60.0-next.43+2a13720d2",
|
|
7
|
+
"@theia/ai-history": "1.60.0-next.43+2a13720d2",
|
|
8
|
+
"@theia/core": "1.60.0-next.43+2a13720d2",
|
|
9
|
+
"@theia/editor": "1.60.0-next.43+2a13720d2",
|
|
10
|
+
"@theia/file-search": "1.60.0-next.43+2a13720d2",
|
|
11
|
+
"@theia/filesystem": "1.60.0-next.43+2a13720d2",
|
|
12
|
+
"@theia/monaco": "1.60.0-next.43+2a13720d2",
|
|
13
13
|
"@theia/monaco-editor-core": "1.96.302",
|
|
14
|
-
"@theia/workspace": "1.
|
|
14
|
+
"@theia/workspace": "1.60.0-next.43+2a13720d2",
|
|
15
15
|
"minimatch": "^5.1.0",
|
|
16
16
|
"tslib": "^2.6.2"
|
|
17
17
|
},
|
|
@@ -49,10 +49,10 @@
|
|
|
49
49
|
"watch": "theiaext watch"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
|
-
"@theia/ext-scripts": "1.
|
|
52
|
+
"@theia/ext-scripts": "1.59.0"
|
|
53
53
|
},
|
|
54
54
|
"nyc": {
|
|
55
55
|
"extends": "../../configs/nyc.json"
|
|
56
56
|
},
|
|
57
|
-
"gitHead": "
|
|
57
|
+
"gitHead": "2a13720d2d41d8ae6ee4e34cd2dee1c656a18018"
|
|
58
58
|
}
|
|
@@ -65,8 +65,8 @@ export class FrontendChatServiceImpl extends ChatServiceImpl {
|
|
|
65
65
|
return configuredDefaultChatAgent;
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
-
override createSession(location?: ChatAgentLocation, options?: SessionOptions): ChatSession {
|
|
69
|
-
const session = super.createSession(location, options);
|
|
68
|
+
override createSession(location?: ChatAgentLocation, options?: SessionOptions, pinnedAgent?: ChatAgent): ChatSession {
|
|
69
|
+
const session = super.createSession(location, options, pinnedAgent);
|
|
70
70
|
session.model.onDidChange(event => {
|
|
71
71
|
const changeSet = (event as { changeSet?: ChangeSet }).changeSet;
|
|
72
72
|
if (event.kind === 'removeChangeSet') {
|
|
@@ -18,32 +18,42 @@ import * as sinon from 'sinon';
|
|
|
18
18
|
import { ChatAgentServiceImpl } from './chat-agent-service';
|
|
19
19
|
import { ChatRequestParserImpl } from './chat-request-parser';
|
|
20
20
|
import { ChatAgentLocation } from './chat-agents';
|
|
21
|
-
import { ChatRequest } from './chat-model';
|
|
21
|
+
import { ChatContext, ChatRequest } from './chat-model';
|
|
22
22
|
import { expect } from 'chai';
|
|
23
|
-
import { DefaultAIVariableService,
|
|
23
|
+
import { AIVariable, DefaultAIVariableService, ResolvedAIVariable, ToolInvocationRegistryImpl, ToolRequest } from '@theia/ai-core';
|
|
24
|
+
import { ILogger, Logger } from '@theia/core';
|
|
25
|
+
import { ParsedChatRequestTextPart, ParsedChatRequestVariablePart } from './parsed-chat-request';
|
|
24
26
|
|
|
25
27
|
describe('ChatRequestParserImpl', () => {
|
|
26
28
|
const chatAgentService = sinon.createStubInstance(ChatAgentServiceImpl);
|
|
27
29
|
const variableService = sinon.createStubInstance(DefaultAIVariableService);
|
|
28
|
-
const toolInvocationRegistry
|
|
29
|
-
const
|
|
30
|
+
const toolInvocationRegistry = sinon.createStubInstance(ToolInvocationRegistryImpl);
|
|
31
|
+
const logger: ILogger = sinon.createStubInstance(Logger);
|
|
32
|
+
const parser = new ChatRequestParserImpl(chatAgentService, variableService, toolInvocationRegistry, logger);
|
|
30
33
|
|
|
31
|
-
|
|
34
|
+
beforeEach(() => {
|
|
35
|
+
// Reset our stubs before each test
|
|
36
|
+
sinon.reset();
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('parses simple text', async () => {
|
|
32
40
|
const req: ChatRequest = {
|
|
33
41
|
text: 'What is the best pizza topping?'
|
|
34
42
|
};
|
|
35
|
-
const
|
|
43
|
+
const context: ChatContext = { variables: [] };
|
|
44
|
+
const result = await parser.parseChatRequest(req, ChatAgentLocation.Panel, context);
|
|
36
45
|
expect(result.parts).to.deep.contain({
|
|
37
46
|
text: 'What is the best pizza topping?',
|
|
38
47
|
range: { start: 0, endExclusive: 31 }
|
|
39
48
|
});
|
|
40
49
|
});
|
|
41
50
|
|
|
42
|
-
it('parses text with variable name', () => {
|
|
51
|
+
it('parses text with variable name', async () => {
|
|
43
52
|
const req: ChatRequest = {
|
|
44
53
|
text: 'What is the #best pizza topping?'
|
|
45
54
|
};
|
|
46
|
-
const
|
|
55
|
+
const context: ChatContext = { variables: [] };
|
|
56
|
+
const result = await parser.parseChatRequest(req, ChatAgentLocation.Panel, context);
|
|
47
57
|
expect(result).to.deep.contain({
|
|
48
58
|
parts: [{
|
|
49
59
|
text: 'What is the ',
|
|
@@ -59,11 +69,12 @@ describe('ChatRequestParserImpl', () => {
|
|
|
59
69
|
});
|
|
60
70
|
});
|
|
61
71
|
|
|
62
|
-
it('parses text with variable name with argument', () => {
|
|
72
|
+
it('parses text with variable name with argument', async () => {
|
|
63
73
|
const req: ChatRequest = {
|
|
64
74
|
text: 'What is the #best:by-poll pizza topping?'
|
|
65
75
|
};
|
|
66
|
-
const
|
|
76
|
+
const context: ChatContext = { variables: [] };
|
|
77
|
+
const result = await parser.parseChatRequest(req, ChatAgentLocation.Panel, context);
|
|
67
78
|
expect(result).to.deep.contain({
|
|
68
79
|
parts: [{
|
|
69
80
|
text: 'What is the ',
|
|
@@ -79,11 +90,12 @@ describe('ChatRequestParserImpl', () => {
|
|
|
79
90
|
});
|
|
80
91
|
});
|
|
81
92
|
|
|
82
|
-
it('parses text with variable name with numeric argument', () => {
|
|
93
|
+
it('parses text with variable name with numeric argument', async () => {
|
|
83
94
|
const req: ChatRequest = {
|
|
84
95
|
text: '#size-class:2'
|
|
85
96
|
};
|
|
86
|
-
const
|
|
97
|
+
const context: ChatContext = { variables: [] };
|
|
98
|
+
const result = await parser.parseChatRequest(req, ChatAgentLocation.Panel, context);
|
|
87
99
|
expect(result.parts[0]).to.contain(
|
|
88
100
|
{
|
|
89
101
|
variableName: 'size-class',
|
|
@@ -92,11 +104,12 @@ describe('ChatRequestParserImpl', () => {
|
|
|
92
104
|
);
|
|
93
105
|
});
|
|
94
106
|
|
|
95
|
-
it('parses text with variable name with POSIX path argument', () => {
|
|
107
|
+
it('parses text with variable name with POSIX path argument', async () => {
|
|
96
108
|
const req: ChatRequest = {
|
|
97
109
|
text: '#file:/path/to/file.ext'
|
|
98
110
|
};
|
|
99
|
-
const
|
|
111
|
+
const context: ChatContext = { variables: [] };
|
|
112
|
+
const result = await parser.parseChatRequest(req, ChatAgentLocation.Panel, context);
|
|
100
113
|
expect(result.parts[0]).to.contain(
|
|
101
114
|
{
|
|
102
115
|
variableName: 'file',
|
|
@@ -105,11 +118,12 @@ describe('ChatRequestParserImpl', () => {
|
|
|
105
118
|
);
|
|
106
119
|
});
|
|
107
120
|
|
|
108
|
-
it('parses text with variable name with Win32 path argument', () => {
|
|
121
|
+
it('parses text with variable name with Win32 path argument', async () => {
|
|
109
122
|
const req: ChatRequest = {
|
|
110
123
|
text: '#file:c:\\path\\to\\file.ext'
|
|
111
124
|
};
|
|
112
|
-
const
|
|
125
|
+
const context: ChatContext = { variables: [] };
|
|
126
|
+
const result = await parser.parseChatRequest(req, ChatAgentLocation.Panel, context);
|
|
113
127
|
expect(result.parts[0]).to.contain(
|
|
114
128
|
{
|
|
115
129
|
variableName: 'file',
|
|
@@ -117,4 +131,69 @@ describe('ChatRequestParserImpl', () => {
|
|
|
117
131
|
}
|
|
118
132
|
);
|
|
119
133
|
});
|
|
134
|
+
|
|
135
|
+
it('resolves variable and extracts tool functions from resolved variable', async () => {
|
|
136
|
+
// Set up two test tool requests that will be referenced in the variable content
|
|
137
|
+
const testTool1: ToolRequest = {
|
|
138
|
+
id: 'testTool1',
|
|
139
|
+
name: 'Test Tool 1',
|
|
140
|
+
handler: async () => undefined
|
|
141
|
+
};
|
|
142
|
+
const testTool2: ToolRequest = {
|
|
143
|
+
id: 'testTool2',
|
|
144
|
+
name: 'Test Tool 2',
|
|
145
|
+
handler: async () => undefined
|
|
146
|
+
};
|
|
147
|
+
// Configure the tool registry to return our test tools
|
|
148
|
+
toolInvocationRegistry.getFunction.withArgs(testTool1.id).returns(testTool1);
|
|
149
|
+
toolInvocationRegistry.getFunction.withArgs(testTool2.id).returns(testTool2);
|
|
150
|
+
|
|
151
|
+
// Set up the test variable to include in the request
|
|
152
|
+
const testVariable: AIVariable = {
|
|
153
|
+
id: 'testVariable',
|
|
154
|
+
name: 'testVariable',
|
|
155
|
+
description: 'A test variable',
|
|
156
|
+
};
|
|
157
|
+
// Configure the variable service to return our test variable
|
|
158
|
+
// One tool reference uses chat format and one uses prompt format because the parser needs to handle both.
|
|
159
|
+
variableService.getVariable.withArgs(testVariable.name).returns(testVariable);
|
|
160
|
+
variableService.resolveVariable.withArgs(
|
|
161
|
+
{ variable: testVariable.name, arg: 'myarg' },
|
|
162
|
+
sinon.match.any
|
|
163
|
+
).resolves({
|
|
164
|
+
variable: testVariable,
|
|
165
|
+
arg: 'myarg',
|
|
166
|
+
value: 'This is a test with ~testTool1 and **~{testTool2}** and more text.',
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
// Create a request with the test variable
|
|
170
|
+
const req: ChatRequest = {
|
|
171
|
+
text: 'Test with #testVariable:myarg'
|
|
172
|
+
};
|
|
173
|
+
const context: ChatContext = { variables: [] };
|
|
174
|
+
|
|
175
|
+
// Parse the request
|
|
176
|
+
const result = await parser.parseChatRequest(req, ChatAgentLocation.Panel, context);
|
|
177
|
+
|
|
178
|
+
// Verify the variable part contains the correct properties
|
|
179
|
+
expect(result.parts.length).to.equal(2);
|
|
180
|
+
expect(result.parts[0] instanceof ParsedChatRequestTextPart).to.be.true;
|
|
181
|
+
expect(result.parts[1] instanceof ParsedChatRequestVariablePart).to.be.true;
|
|
182
|
+
const variablePart = result.parts[1] as ParsedChatRequestVariablePart;
|
|
183
|
+
expect(variablePart).to.have.property('resolution');
|
|
184
|
+
expect(variablePart.resolution).to.deep.equal({
|
|
185
|
+
variable: testVariable,
|
|
186
|
+
arg: 'myarg',
|
|
187
|
+
value: 'This is a test with ~testTool1 and **~{testTool2}** and more text.',
|
|
188
|
+
} satisfies ResolvedAIVariable);
|
|
189
|
+
|
|
190
|
+
// Verify both tool functions were extracted from the variable content
|
|
191
|
+
expect(result.toolRequests.size).to.equal(2);
|
|
192
|
+
expect(result.toolRequests.has(testTool1.id)).to.be.true;
|
|
193
|
+
expect(result.toolRequests.has(testTool2.id)).to.be.true;
|
|
194
|
+
|
|
195
|
+
// Verify the result contains the tool requests returned by the registry
|
|
196
|
+
expect(result.toolRequests.get(testTool1.id)).to.deep.equal(testTool1);
|
|
197
|
+
expect(result.toolRequests.get(testTool2.id)).to.deep.equal(testTool2);
|
|
198
|
+
});
|
|
120
199
|
});
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
import { inject, injectable } from '@theia/core/shared/inversify';
|
|
23
23
|
import { ChatAgentService } from './chat-agent-service';
|
|
24
24
|
import { ChatAgentLocation } from './chat-agents';
|
|
25
|
-
import { ChatRequest } from './chat-model';
|
|
25
|
+
import { ChatContext, ChatRequest } from './chat-model';
|
|
26
26
|
import {
|
|
27
27
|
chatAgentLeader,
|
|
28
28
|
chatFunctionLeader,
|
|
@@ -35,15 +35,17 @@ import {
|
|
|
35
35
|
ParsedChatRequest,
|
|
36
36
|
ParsedChatRequestPart,
|
|
37
37
|
} from './parsed-chat-request';
|
|
38
|
-
import { AIVariable, AIVariableService, ToolInvocationRegistry, ToolRequest } from '@theia/ai-core';
|
|
38
|
+
import { AIVariable, AIVariableService, createAIResolveVariableCache, getAllResolvedAIVariables, ToolInvocationRegistry, ToolRequest } from '@theia/ai-core';
|
|
39
|
+
import { ILogger } from '@theia/core';
|
|
39
40
|
|
|
40
41
|
const agentReg = /^@([\w_\-\.]+)(?=(\s|$|\b))/i; // An @-agent
|
|
41
42
|
const functionReg = /^~([\w_\-\.]+)(?=(\s|$|\b))/i; // A ~ tool function
|
|
43
|
+
const functionPromptFormatReg = /^\~\{\s*(.*?)\s*\}/i; // A ~{} prompt-format tool function
|
|
42
44
|
const variableReg = /^#([\w_\-]+)(?::([\w_\-_\/\\.:]+))?(?=(\s|$|\b))/i; // A #-variable with an optional : arg (#file:workspace/path/name.ext)
|
|
43
45
|
|
|
44
46
|
export const ChatRequestParser = Symbol('ChatRequestParser');
|
|
45
47
|
export interface ChatRequestParser {
|
|
46
|
-
parseChatRequest(request: ChatRequest, location: ChatAgentLocation): ParsedChatRequest
|
|
48
|
+
parseChatRequest(request: ChatRequest, location: ChatAgentLocation, context: ChatContext): Promise<ParsedChatRequest>;
|
|
47
49
|
}
|
|
48
50
|
|
|
49
51
|
function offsetRange(start: number, endExclusive: number): OffsetRange {
|
|
@@ -57,10 +59,48 @@ export class ChatRequestParserImpl {
|
|
|
57
59
|
constructor(
|
|
58
60
|
@inject(ChatAgentService) private readonly agentService: ChatAgentService,
|
|
59
61
|
@inject(AIVariableService) private readonly variableService: AIVariableService,
|
|
60
|
-
@inject(ToolInvocationRegistry) private readonly toolInvocationRegistry: ToolInvocationRegistry
|
|
62
|
+
@inject(ToolInvocationRegistry) private readonly toolInvocationRegistry: ToolInvocationRegistry,
|
|
63
|
+
@inject(ILogger) private readonly logger: ILogger
|
|
61
64
|
) { }
|
|
62
65
|
|
|
63
|
-
parseChatRequest(request: ChatRequest, location: ChatAgentLocation): ParsedChatRequest {
|
|
66
|
+
async parseChatRequest(request: ChatRequest, location: ChatAgentLocation, context: ChatContext): Promise<ParsedChatRequest> {
|
|
67
|
+
// Parse the request into parts
|
|
68
|
+
const { parts, toolRequests } = this.parseParts(request, location);
|
|
69
|
+
|
|
70
|
+
// Resolve all variables and add them to the variable parts.
|
|
71
|
+
// Parse resolved variable texts again for tool requests.
|
|
72
|
+
// These are not added to parts as they are not visible in the initial chat message.
|
|
73
|
+
// However, they need to be added to the result to be considered by the executing agent.
|
|
74
|
+
const variableCache = createAIResolveVariableCache();
|
|
75
|
+
for (const part of parts) {
|
|
76
|
+
if (part instanceof ParsedChatRequestVariablePart) {
|
|
77
|
+
const resolvedVariable = await this.variableService.resolveVariable(
|
|
78
|
+
{ variable: part.variableName, arg: part.variableArg },
|
|
79
|
+
context,
|
|
80
|
+
variableCache
|
|
81
|
+
);
|
|
82
|
+
if (resolvedVariable) {
|
|
83
|
+
part.resolution = resolvedVariable;
|
|
84
|
+
// Resolve tool requests in resolved variables
|
|
85
|
+
this.parseFunctionsFromVariableText(resolvedVariable.value, toolRequests);
|
|
86
|
+
} else {
|
|
87
|
+
this.logger.warn(`Failed to resolve variable ${part.variableName} for ${location}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Get resolved variables from variable cache after all variables have been resolved.
|
|
93
|
+
// We want to return all recursilvely resolved variables, thus use the whole cache.
|
|
94
|
+
const resolvedVariables = await getAllResolvedAIVariables(variableCache);
|
|
95
|
+
|
|
96
|
+
return { request, parts, toolRequests, variables: resolvedVariables };
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
protected parseParts(request: ChatRequest, location: ChatAgentLocation): {
|
|
100
|
+
parts: ParsedChatRequestPart[];
|
|
101
|
+
toolRequests: Map<string, ToolRequest>;
|
|
102
|
+
variables: Map<string, AIVariable>;
|
|
103
|
+
} {
|
|
64
104
|
const parts: ParsedChatRequestPart[] = [];
|
|
65
105
|
const variables = new Map<string, AIVariable>();
|
|
66
106
|
const toolRequests = new Map<string, ToolRequest>();
|
|
@@ -72,7 +112,7 @@ export class ChatRequestParserImpl {
|
|
|
72
112
|
|
|
73
113
|
if (previousChar.match(/\s/) || i === 0) {
|
|
74
114
|
if (char === chatFunctionLeader) {
|
|
75
|
-
const functionPart = this.
|
|
115
|
+
const functionPart = this.tryToParseFunction(
|
|
76
116
|
message.slice(i),
|
|
77
117
|
i
|
|
78
118
|
);
|
|
@@ -107,8 +147,7 @@ export class ChatRequestParserImpl {
|
|
|
107
147
|
if (i !== 0) {
|
|
108
148
|
// Insert a part for all the text we passed over, then insert the new parsed part
|
|
109
149
|
const previousPart = parts.at(-1);
|
|
110
|
-
const previousPartEnd =
|
|
111
|
-
previousPart?.range.endExclusive ?? 0;
|
|
150
|
+
const previousPartEnd = previousPart?.range.endExclusive ?? 0;
|
|
112
151
|
parts.push(
|
|
113
152
|
new ParsedChatRequestTextPart(
|
|
114
153
|
offsetRange(previousPartEnd, i),
|
|
@@ -131,8 +170,25 @@ export class ChatRequestParserImpl {
|
|
|
131
170
|
)
|
|
132
171
|
);
|
|
133
172
|
}
|
|
173
|
+
return { parts, toolRequests, variables };
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Parse text for tool requests and add them to the given map
|
|
178
|
+
*/
|
|
179
|
+
private parseFunctionsFromVariableText(text: string, toolRequests: Map<string, ToolRequest>): void {
|
|
180
|
+
for (let i = 0; i < text.length; i++) {
|
|
181
|
+
const char = text.charAt(i);
|
|
134
182
|
|
|
135
|
-
|
|
183
|
+
// Check for function markers at start of words
|
|
184
|
+
if (char === chatFunctionLeader) {
|
|
185
|
+
const functionPart = this.tryToParseFunction(text.slice(i), i);
|
|
186
|
+
if (functionPart) {
|
|
187
|
+
// Add the found tool request to the given map
|
|
188
|
+
toolRequests.set(functionPart.toolRequest.id, functionPart.toolRequest);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
136
192
|
}
|
|
137
193
|
|
|
138
194
|
private tryToParseAgent(
|
|
@@ -201,8 +257,9 @@ export class ChatRequestParserImpl {
|
|
|
201
257
|
return new ParsedChatRequestVariablePart(varRange, name, variableArg);
|
|
202
258
|
}
|
|
203
259
|
|
|
204
|
-
private
|
|
205
|
-
|
|
260
|
+
private tryToParseFunction(message: string, offset: number): ParsedChatRequestFunctionPart | undefined {
|
|
261
|
+
// Support both the and chat and prompt formats for functions
|
|
262
|
+
const nextFunctionMatch = message.match(functionPromptFormatReg) || message.match(functionReg);
|
|
206
263
|
if (!nextFunctionMatch) {
|
|
207
264
|
return;
|
|
208
265
|
}
|
|
@@ -35,7 +35,7 @@ import {
|
|
|
35
35
|
ChatContext,
|
|
36
36
|
} from './chat-model';
|
|
37
37
|
import { ChatRequestParser } from './chat-request-parser';
|
|
38
|
-
import { ParsedChatRequest, ParsedChatRequestAgentPart
|
|
38
|
+
import { ParsedChatRequest, ParsedChatRequestAgentPart } from './parsed-chat-request';
|
|
39
39
|
|
|
40
40
|
export interface ChatRequestInvocation {
|
|
41
41
|
/**
|
|
@@ -191,7 +191,9 @@ export class ChatServiceImpl implements ChatService {
|
|
|
191
191
|
}
|
|
192
192
|
session.title = request.text;
|
|
193
193
|
|
|
194
|
-
const
|
|
194
|
+
const resolutionContext: ChatSessionContext = { model: session.model };
|
|
195
|
+
const resolvedContext = await this.resolveChatContext(session.model.context.getVariables(), resolutionContext);
|
|
196
|
+
const parsedRequest = await this.chatRequestParser.parseChatRequest(request, session.model.location, resolvedContext);
|
|
195
197
|
const agent = this.getAgent(parsedRequest, session);
|
|
196
198
|
|
|
197
199
|
if (agent === undefined) {
|
|
@@ -205,25 +207,9 @@ export class ChatServiceImpl implements ChatService {
|
|
|
205
207
|
};
|
|
206
208
|
}
|
|
207
209
|
|
|
208
|
-
const resolutionContext: ChatSessionContext = { model: session.model };
|
|
209
|
-
const resolvedContext = await this.resolveChatContext(session.model.context.getVariables(), resolutionContext);
|
|
210
210
|
const requestModel = session.model.addRequest(parsedRequest, agent?.id, resolvedContext);
|
|
211
211
|
resolutionContext.request = requestModel;
|
|
212
212
|
|
|
213
|
-
for (const part of parsedRequest.parts) {
|
|
214
|
-
if (part instanceof ParsedChatRequestVariablePart) {
|
|
215
|
-
const resolvedVariable = await this.variableService.resolveVariable(
|
|
216
|
-
{ variable: part.variableName, arg: part.variableArg },
|
|
217
|
-
resolutionContext
|
|
218
|
-
);
|
|
219
|
-
if (resolvedVariable) {
|
|
220
|
-
part.resolution = resolvedVariable;
|
|
221
|
-
} else {
|
|
222
|
-
this.logger.warn(`Failed to resolve variable ${part.variableName} for ${session.model.location}`);
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
|
|
227
213
|
let resolveResponseCreated: (responseModel: ChatResponseModel) => void;
|
|
228
214
|
let resolveResponseCompleted: (responseModel: ChatResponseModel) => void;
|
|
229
215
|
const invocation: ChatRequestInvocation = {
|
|
@@ -259,6 +245,7 @@ export class ChatServiceImpl implements ChatService {
|
|
|
259
245
|
resolutionRequests: readonly AIVariableResolutionRequest[],
|
|
260
246
|
context: ChatSessionContext,
|
|
261
247
|
): Promise<ChatContext> {
|
|
248
|
+
// TODO use a common cache to resolve variables and return recursively resolved variables?
|
|
262
249
|
const resolvedVariables = await Promise.all(
|
|
263
250
|
resolutionRequests.map(async contextVariable => {
|
|
264
251
|
const resolvedVariable = await this.variableService.resolveVariable(contextVariable, context);
|
|
@@ -317,5 +304,9 @@ export class ChatServiceImpl implements ChatService {
|
|
|
317
304
|
|
|
318
305
|
deleteChangeSetElement(sessionId: string, index: number): void {
|
|
319
306
|
this.getSession(sessionId)?.model.changeSet?.removeElements(index);
|
|
307
|
+
const elements = this.getSession(sessionId)?.model.changeSet?.getElements();
|
|
308
|
+
if (elements?.length === 0) {
|
|
309
|
+
this.deleteChangeSet(sessionId);
|
|
310
|
+
}
|
|
320
311
|
}
|
|
321
312
|
}
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
// Partially copied from https://github.com/microsoft/vscode/blob/a2cab7255c0df424027be05d58e1b7b941f4ea60/src/vs/workbench/contrib/chat/common/chatParserTypes.ts
|
|
21
21
|
// Partially copied from https://github.com/microsoft/vscode/blob/a2cab7255c0df424027be05d58e1b7b941f4ea60/src/vs/editor/common/core/offsetRange.ts
|
|
22
22
|
|
|
23
|
-
import {
|
|
23
|
+
import { ResolvedAIVariable, ToolRequest, toolRequestToPromptText } from '@theia/ai-core';
|
|
24
24
|
import { ChatRequest } from './chat-model';
|
|
25
25
|
|
|
26
26
|
export const chatVariableLeader = '#';
|
|
@@ -41,7 +41,7 @@ export interface ParsedChatRequest {
|
|
|
41
41
|
readonly request: ChatRequest;
|
|
42
42
|
readonly parts: ParsedChatRequestPart[];
|
|
43
43
|
readonly toolRequests: Map<string, ToolRequest>;
|
|
44
|
-
readonly variables:
|
|
44
|
+
readonly variables: ResolvedAIVariable[];
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
export interface ParsedChatRequestPart {
|