@@ -56,46 +56,36 @@ export function activateChat(context: vscode.ExtensionContext) {
56
56
default :
57
57
stream . progress ( `Building response...` ) ;
58
58
59
+ let messages : vscode . LanguageModelChatMessage [ ] = [ ] ;
60
+
59
61
// get history
60
- let history : Db2ContextItems [ ] | undefined ;
61
62
if ( context . history . length > 0 ) {
62
- history = context . history . map ( ( h ) => {
63
+ messages = context . history . map ( ( h ) => {
63
64
if ( "prompt" in h ) {
64
- return {
65
- name : `reply` ,
66
- description : `reply from Copilot` ,
67
- content : h . prompt ,
68
- type : `assistant` ,
69
- } ;
65
+ return vscode . LanguageModelChatMessage . Assistant ( h . prompt ) ;
70
66
} else {
71
67
const responseContent = h . response
72
68
. filter ( ( r ) => r . value instanceof vscode . MarkdownString )
73
69
. map ( ( r ) => ( r . value as vscode . MarkdownString ) . value )
74
70
. join ( "\n\n" ) ;
75
- return {
76
- name : `message` ,
77
- description : `message from user` ,
78
- content : responseContent ,
79
- type : `assistant` ,
80
- } ;
71
+ return vscode . LanguageModelChatMessage . Assistant ( responseContent ) ;
81
72
}
82
73
} ) ;
83
74
}
84
75
85
76
const contextItems = await getContextItems ( request . prompt , {
86
- history ,
87
- progress : stream . progress
77
+ progress : stream . progress ,
78
+ withDb2Prompt : true
88
79
} ) ;
89
80
90
- let messages = contextItems . context . map ( c => {
91
- if ( c . type === `user` ) {
92
- return vscode . LanguageModelChatMessage . User ( c . content ) ;
93
- } else {
94
- return vscode . LanguageModelChatMessage . Assistant ( c . content ) ;
95
- }
96
- } ) ;
81
+ messages . push ( ... contextItems . context . map ( c => {
82
+ return vscode . LanguageModelChatMessage . Assistant ( c . content ) ;
83
+ } ) ) ;
84
+
85
+ messages . push (
86
+ vscode . LanguageModelChatMessage . User ( request . prompt )
87
+ ) ;
97
88
98
- const tools = vscode . lm . tools . filter ( t => request . toolReferences . some ( r => r . name === t . name ) ) ;
99
89
100
90
const doRequest = ( tools : vscode . LanguageModelToolInformation [ ] = [ ] ) => {
101
91
return copilotRequest (
@@ -110,12 +100,15 @@ export function activateChat(context: vscode.ExtensionContext) {
110
100
) ;
111
101
}
112
102
103
+ // The first request we do can do two things: return either a stream OR return a tool request
104
+ const tools = vscode . lm . tools . filter ( t => request . toolReferences . some ( r => r . name === t . name ) ) ;
113
105
let result = await doRequest ( tools ) ;
114
106
107
+ // Then, if there is a tool request, we do the logic to invoke the tool
115
108
if ( result . toolCalls . length > 0 ) {
116
109
for ( const toolcall of result . toolCalls ) {
117
110
if ( toolcall . name === RUN_SQL_TOOL_ID ) {
118
- const result = await vscode . lm . invokeTool ( toolcall . name , { toolInvocationToken : request . toolInvocationToken , input : toolcall . input } ) ;
111
+ const result = await vscode . lm . invokeTool ( toolcall . name , { toolInvocationToken : request . toolInvocationToken , input : toolcall . input } ) ;
119
112
const resultOut = result . content . map ( c => {
120
113
if ( c instanceof vscode . LanguageModelTextPart ) {
121
114
return c . value ;
0 commit comments