1
1
import {
2
2
Context ,
3
+ HandlerContext ,
3
4
StartEvent ,
4
5
StopEvent ,
5
6
Workflow ,
6
7
WorkflowEvent ,
7
- } from "@llamaindex/core/ workflow" ;
8
+ } from "@llamaindex/workflow" ;
8
9
import {
9
10
BaseToolWithCall ,
10
11
ChatMemoryBuffer ,
11
12
ChatMessage ,
13
+ ChatResponseChunk ,
14
+ MessageContent ,
12
15
Settings ,
13
16
ToolCall ,
14
17
ToolCallLLM ,
@@ -38,7 +41,11 @@ If there is no query engine tool or the gathered information has many N/A values
38
41
You can make multiple tool calls at once but only call with the same tool.
39
42
` ;
40
43
41
- export class FormFillingWorkflow extends Workflow {
44
+ export class FormFillingWorkflow extends Workflow <
45
+ null ,
46
+ string | MessageContent ,
47
+ ChatResponseChunk
48
+ > {
42
49
llm : ToolCallLLM ;
43
50
memory : ChatMemoryBuffer ;
44
51
extractorTool : BaseToolWithCall ;
@@ -75,31 +82,58 @@ export class FormFillingWorkflow extends Workflow {
75
82
} ) ;
76
83
77
84
// Add steps
78
- this . addStep ( StartEvent < AgentInput > , this . prepareChatHistory , {
79
- outputs : InputEvent ,
80
- } ) ;
81
- this . addStep ( InputEvent , this . handleLLMInput , {
82
- outputs : [
83
- InputEvent ,
84
- ExtractMissingCellsEvent ,
85
- FindAnswersEvent ,
86
- FillMissingCellsEvent ,
87
- StopEvent ,
88
- ] ,
89
- } ) ;
90
- this . addStep ( ExtractMissingCellsEvent , this . handleExtractMissingCells , {
91
- outputs : InputEvent ,
92
- } ) ;
93
- this . addStep ( FindAnswersEvent , this . handleFindAnswers , {
94
- outputs : InputEvent ,
95
- } ) ;
96
- this . addStep ( FillMissingCellsEvent , this . handleFillMissingCells , {
97
- outputs : InputEvent ,
98
- } ) ;
85
+ this . addStep (
86
+ {
87
+ inputs : [ StartEvent < AgentInput > ] ,
88
+ outputs : [ InputEvent ] ,
89
+ } ,
90
+ this . prepareChatHistory . bind ( this ) ,
91
+ ) ;
92
+
93
+ this . addStep (
94
+ {
95
+ inputs : [ InputEvent ] ,
96
+ outputs : [
97
+ InputEvent ,
98
+ ExtractMissingCellsEvent ,
99
+ FindAnswersEvent ,
100
+ FillMissingCellsEvent ,
101
+ StopEvent ,
102
+ ] ,
103
+ } ,
104
+ this . handleLLMInput . bind ( this ) ,
105
+ ) ;
106
+
107
+ this . addStep (
108
+ {
109
+ inputs : [ ExtractMissingCellsEvent ] ,
110
+ outputs : [ InputEvent ] ,
111
+ } ,
112
+ this . handleExtractMissingCells . bind ( this ) ,
113
+ ) ;
114
+
115
+ this . addStep (
116
+ {
117
+ inputs : [ FindAnswersEvent ] ,
118
+ outputs : [ InputEvent ] ,
119
+ } ,
120
+ this . handleFindAnswers . bind ( this ) ,
121
+ ) ;
122
+
123
+ this . addStep (
124
+ {
125
+ inputs : [ FillMissingCellsEvent ] ,
126
+ outputs : [ InputEvent ] ,
127
+ } ,
128
+ this . handleFillMissingCells . bind ( this ) ,
129
+ ) ;
99
130
}
100
131
101
- private async prepareChatHistory ( ctx : Context , ev : StartEvent < AgentInput > ) {
102
- const message = ev . data . input . message ;
132
+ private async prepareChatHistory (
133
+ ctx : HandlerContext < null > ,
134
+ ev : StartEvent < AgentInput > ,
135
+ ) {
136
+ const message = ev . data ;
103
137
104
138
if ( this . systemPrompt ) {
105
139
this . memory . put ( { role : "system" , content : this . systemPrompt } ) ;
@@ -109,7 +143,7 @@ export class FormFillingWorkflow extends Workflow {
109
143
return new InputEvent ( { input : this . memory . getMessages ( ) } ) ;
110
144
}
111
145
112
- private async handleLLMInput ( ctx : Context , ev : InputEvent ) {
146
+ private async handleLLMInput ( ctx : HandlerContext < null > , ev : InputEvent ) {
113
147
const chatHistory = ev . data . input ;
114
148
115
149
const tools = [ this . extractorTool , this . fillMissingCellsTool ] ;
@@ -150,14 +184,16 @@ export class FormFillingWorkflow extends Workflow {
150
184
return new FindAnswersEvent ( {
151
185
toolCalls : toolCallResponse . toolCalls ,
152
186
} ) ;
187
+ default :
188
+ throw new Error ( `Unknown tool: ${ toolCallResponse . toolName ( ) } ` ) ;
153
189
}
154
190
}
155
191
156
192
private async handleExtractMissingCells (
157
193
ctx : Context ,
158
194
ev : ExtractMissingCellsEvent ,
159
195
) {
160
- ctx . writeEventToStream (
196
+ ctx . sendEvent (
161
197
new AgentRunEvent ( {
162
198
name : "CSVExtractor" ,
163
199
text : "Extracting missing cells" ,
@@ -182,7 +218,7 @@ export class FormFillingWorkflow extends Workflow {
182
218
if ( ! this . queryEngineTool ) {
183
219
throw new Error ( "Query engine tool is not available" ) ;
184
220
}
185
- ctx . writeEventToStream (
221
+ ctx . sendEvent (
186
222
new AgentRunEvent ( {
187
223
name : "Researcher" ,
188
224
text : "Finding answers" ,
@@ -203,7 +239,7 @@ export class FormFillingWorkflow extends Workflow {
203
239
}
204
240
205
241
private async handleFillMissingCells (
206
- ctx : Context ,
242
+ ctx : HandlerContext < null > ,
207
243
ev : FillMissingCellsEvent ,
208
244
) {
209
245
const { toolCalls } = ev . data ;
0 commit comments