@@ -20,10 +20,7 @@ describe('doAttempt', () => {
2020 let mockReader : ReturnType < typeof vi . fn > ;
2121 let mockEvaluator : ReturnType < typeof vi . fn > ;
2222 let mockPrinter : ReturnType < typeof vi . fn > ;
23- let mockLanguageModel : {
24- sample : ReturnType < typeof vi . fn > ;
25- } ;
26- let mockProgress : Progress < string , TestMessage [ ] > ;
23+ let mockLanguageModel : { sample : ReturnType < typeof vi . fn > } ;
2724 let prep : PREP < TestMessage [ ] , TestMessage , TestMessage > ;
2825 let logger : Logger ;
2926
@@ -32,14 +29,11 @@ describe('doAttempt', () => {
3229 mockReader = vi . fn ( ) ;
3330 mockEvaluator = vi . fn ( ) ;
3431 mockPrinter = vi . fn ( ) ;
35- mockLanguageModel = {
36- sample : vi . fn ( ) ,
37- } ;
32+ mockLanguageModel = { sample : vi . fn ( ) } ;
3833 logger = {
3934 info : vi . fn ( ) ,
4035 subLogger : vi . fn ( ( ) => logger ) ,
4136 } as unknown as Logger ;
42-
4337 prep = [
4438 mockPrompter ,
4539 mockReader ,
@@ -48,6 +42,21 @@ describe('doAttempt', () => {
4842 ] as unknown as PREP < TestMessage [ ] , TestMessage , TestMessage > ;
4943 } ) ;
5044
45+ const makeProgress = (
46+ history : TestMessage [ ] ,
47+ isDone : ReturnType < typeof vi . fn > ,
48+ result ?: string ,
49+ ) : Progress < string , TestMessage [ ] > => {
50+ const progress : Progress < string , TestMessage [ ] > = {
51+ history,
52+ isDone,
53+ } ;
54+ if ( result !== undefined ) {
55+ progress . result = result ;
56+ }
57+ return progress ;
58+ } ;
59+
5160 it ( 'returns result when done on first step' , async ( ) => {
5261 const history : TestMessage [ ] = [ ] ;
5362 const action = new TestMessage ( 'action' ) ;
@@ -58,15 +67,14 @@ describe('doAttempt', () => {
5867 mockLanguageModel . sample . mockResolvedValue ( makeTestStream ( [ 'response' ] ) ) ;
5968 mockReader . mockResolvedValue ( action ) ;
6069 mockEvaluator . mockResolvedValue ( observation ) ;
61- mockProgress = {
62- history,
63- isDone : vi . fn ( ( ) => true ) ,
64- result,
65- } ;
6670
6771 const actual = await doAttempt (
6872 prep ,
69- mockProgress ,
73+ makeProgress (
74+ history ,
75+ vi . fn ( ( ) => true ) ,
76+ result ,
77+ ) ,
7078 mockLanguageModel as unknown as LanguageModel <
7179 unknown ,
7280 { response : string }
@@ -75,12 +83,8 @@ describe('doAttempt', () => {
7583 ) ;
7684
7785 expect ( actual ) . toBe ( result ) ;
78- expect ( mockPrompter ) . toHaveBeenCalledTimes ( 1 ) ;
7986 expect ( mockPrompter ) . toHaveBeenCalledWith ( history ) ;
80- expect ( mockLanguageModel . sample ) . toHaveBeenCalledTimes ( 1 ) ;
8187 expect ( mockLanguageModel . sample ) . toHaveBeenCalledWith ( 'test prompt' ) ;
82- expect ( mockReader ) . toHaveBeenCalledTimes ( 1 ) ;
83- expect ( mockEvaluator ) . toHaveBeenCalledTimes ( 1 ) ;
8488 expect ( mockEvaluator ) . toHaveBeenCalledWith ( history , action ) ;
8589 expect ( mockPrinter ) . not . toHaveBeenCalled ( ) ;
8690 expect ( logger . info ) . toHaveBeenCalledWith ( 'Step 1 of 10' ) ;
@@ -107,15 +111,14 @@ describe('doAttempt', () => {
107111 mockEvaluator
108112 . mockResolvedValueOnce ( observation1 )
109113 . mockResolvedValueOnce ( observation2 ) ;
110- mockProgress = {
111- history,
112- isDone : vi . fn ( ( ) => callCount === 2 ) ,
113- result,
114- } ;
115114
116115 const actual = await doAttempt (
117116 prep ,
118- mockProgress ,
117+ makeProgress (
118+ history ,
119+ vi . fn ( ( ) => callCount === 2 ) ,
120+ result ,
121+ ) ,
119122 mockLanguageModel as unknown as LanguageModel <
120123 unknown ,
121124 { response : string }
@@ -125,32 +128,26 @@ describe('doAttempt', () => {
125128
126129 expect ( actual ) . toBe ( result ) ;
127130 expect ( mockPrompter ) . toHaveBeenCalledTimes ( 2 ) ;
128- expect ( mockLanguageModel . sample ) . toHaveBeenCalledTimes ( 2 ) ;
129- expect ( mockReader ) . toHaveBeenCalledTimes ( 2 ) ;
130- expect ( mockEvaluator ) . toHaveBeenCalledTimes ( 2 ) ;
131- expect ( mockPrinter ) . toHaveBeenCalledTimes ( 1 ) ;
132131 expect ( mockPrinter ) . toHaveBeenCalledWith ( action1 , observation1 ) ;
133132 } ) ;
134133
135134 it ( 'passes readerArgs to reader' , async ( ) => {
136135 const history : TestMessage [ ] = [ ] ;
137136 const action = new TestMessage ( 'action' ) ;
138- const observation = new TestMessage ( 'observation' ) ;
139137 const readerArgs = { stop : '</|>' , prefix : 'test' } ;
140138
141139 mockPrompter . mockReturnValue ( { prompt : 'test prompt' , readerArgs } ) ;
142140 mockLanguageModel . sample . mockResolvedValue ( makeTestStream ( [ 'response' ] ) ) ;
143141 mockReader . mockResolvedValue ( action ) ;
144- mockEvaluator . mockResolvedValue ( observation ) ;
145- mockProgress = {
146- history,
147- isDone : vi . fn ( ( ) => true ) ,
148- result : 'result' ,
149- } ;
142+ mockEvaluator . mockResolvedValue ( new TestMessage ( 'observation' ) ) ;
150143
151144 await doAttempt (
152145 prep ,
153- mockProgress ,
146+ makeProgress (
147+ history ,
148+ vi . fn ( ( ) => true ) ,
149+ 'result' ,
150+ ) ,
154151 mockLanguageModel as unknown as LanguageModel <
155152 unknown ,
156153 { response : string }
@@ -166,23 +163,22 @@ describe('doAttempt', () => {
166163 } ) ,
167164 ) ;
168165 } ) ;
166+
169167 it ( 'throws error when maxSteps is exceeded' , async ( ) => {
170168 const history : TestMessage [ ] = [ ] ;
171169 const action = new TestMessage ( 'action' ) ;
172- const observation = new TestMessage ( 'observation' ) ;
173170
174171 mockPrompter . mockReturnValue ( { prompt : 'test prompt' , readerArgs : { } } ) ;
175172 mockLanguageModel . sample . mockResolvedValue ( makeTestStream ( [ 'response' ] ) ) ;
176173 mockReader . mockResolvedValue ( action ) ;
177- mockEvaluator . mockResolvedValue ( observation ) ;
178- mockProgress = {
179- history,
180- isDone : vi . fn ( ( ) => false ) ,
181- } ;
174+ mockEvaluator . mockResolvedValue ( new TestMessage ( 'observation' ) ) ;
182175
183176 const attempt = doAttempt (
184177 prep ,
185- mockProgress ,
178+ makeProgress (
179+ history ,
180+ vi . fn ( ( ) => false ) ,
181+ ) ,
186182 mockLanguageModel as unknown as LanguageModel <
187183 unknown ,
188184 { response : string }
@@ -192,69 +188,9 @@ describe('doAttempt', () => {
192188
193189 await expect ( attempt ) . rejects . toThrow ( 'Invocation budget exceeded' ) ;
194190 expect ( mockPrompter ) . toHaveBeenCalledTimes ( 3 ) ;
195- expect ( mockLanguageModel . sample ) . toHaveBeenCalledTimes ( 3 ) ;
196- expect ( mockReader ) . toHaveBeenCalledTimes ( 3 ) ;
197- expect ( mockEvaluator ) . toHaveBeenCalledTimes ( 3 ) ;
198191 expect ( mockPrinter ) . toHaveBeenCalledTimes ( 3 ) ;
199192 } ) ;
200193
201- it ( 'logs step numbers' , async ( ) => {
202- const history : TestMessage [ ] = [ ] ;
203- const action = new TestMessage ( 'action' ) ;
204- const observation = new TestMessage ( 'observation' ) ;
205-
206- mockPrompter . mockReturnValue ( { prompt : 'test prompt' , readerArgs : { } } ) ;
207- mockLanguageModel . sample . mockResolvedValue ( makeTestStream ( [ 'response' ] ) ) ;
208- mockReader . mockResolvedValue ( action ) ;
209- mockEvaluator . mockResolvedValue ( observation ) ;
210- mockProgress = {
211- history,
212- isDone : vi . fn ( ( ) => true ) ,
213- result : 'result' ,
214- } ;
215-
216- await doAttempt (
217- prep ,
218- mockProgress ,
219- mockLanguageModel as unknown as LanguageModel <
220- unknown ,
221- { response : string }
222- > ,
223- { maxSteps : 5 , logger } ,
224- ) ;
225-
226- expect ( logger . info ) . toHaveBeenCalledWith ( 'Step 1 of 5' ) ;
227- expect ( logger . info ) . toHaveBeenCalledWith ( 'done:' , 'result' ) ;
228- } ) ;
229-
230- it ( 'does not log when logger is not provided' , async ( ) => {
231- const history : TestMessage [ ] = [ ] ;
232- const action = new TestMessage ( 'action' ) ;
233- const observation = new TestMessage ( 'observation' ) ;
234-
235- mockPrompter . mockReturnValue ( { prompt : 'test prompt' , readerArgs : { } } ) ;
236- mockLanguageModel . sample . mockResolvedValue ( makeTestStream ( [ 'response' ] ) ) ;
237- mockReader . mockResolvedValue ( action ) ;
238- mockEvaluator . mockResolvedValue ( observation ) ;
239- mockProgress = {
240- history,
241- isDone : vi . fn ( ( ) => true ) ,
242- result : 'result' ,
243- } ;
244-
245- await doAttempt (
246- prep ,
247- mockProgress ,
248- mockLanguageModel as unknown as LanguageModel <
249- unknown ,
250- { response : string }
251- > ,
252- { maxSteps : 5 } ,
253- ) ;
254-
255- expect ( logger . info ) . not . toHaveBeenCalled ( ) ;
256- } ) ;
257-
258194 it ( 'handles null observation from evaluator' , async ( ) => {
259195 const history : TestMessage [ ] = [ ] ;
260196 const action = new TestMessage ( 'action' ) ;
@@ -263,18 +199,17 @@ describe('doAttempt', () => {
263199 mockLanguageModel . sample . mockResolvedValue ( makeTestStream ( [ 'response' ] ) ) ;
264200 mockReader . mockResolvedValue ( action ) ;
265201 mockEvaluator . mockResolvedValue ( null ) ;
266- mockProgress = {
267- history,
268- isDone : vi
269- . fn ( ( ) => false )
270- . mockReturnValueOnce ( false )
271- . mockReturnValueOnce ( true ) ,
272- result : 'result' ,
273- } ;
274202
275203 await doAttempt (
276204 prep ,
277- mockProgress ,
205+ makeProgress (
206+ history ,
207+ vi
208+ . fn ( ( ) => false )
209+ . mockReturnValueOnce ( false )
210+ . mockReturnValueOnce ( true ) ,
211+ 'result' ,
212+ ) ,
278213 mockLanguageModel as unknown as LanguageModel <
279214 unknown ,
280215 { response : string }
@@ -284,32 +219,4 @@ describe('doAttempt', () => {
284219
285220 expect ( mockPrinter ) . toHaveBeenCalledWith ( action , null ) ;
286221 } ) ;
287-
288- it ( 'uses default maxSteps when not provided' , async ( ) => {
289- const history : TestMessage [ ] = [ ] ;
290- const action = new TestMessage ( 'action' ) ;
291- const observation = new TestMessage ( 'observation' ) ;
292-
293- mockPrompter . mockReturnValue ( { prompt : 'test prompt' , readerArgs : { } } ) ;
294- mockLanguageModel . sample . mockResolvedValue ( makeTestStream ( [ 'response' ] ) ) ;
295- mockReader . mockResolvedValue ( action ) ;
296- mockEvaluator . mockResolvedValue ( observation ) ;
297- mockProgress = {
298- history,
299- isDone : vi . fn ( ( ) => true ) ,
300- result : 'result' ,
301- } ;
302-
303- await doAttempt (
304- prep ,
305- mockProgress ,
306- mockLanguageModel as unknown as LanguageModel <
307- unknown ,
308- { response : string }
309- > ,
310- { } ,
311- ) ;
312-
313- expect ( mockPrompter ) . toHaveBeenCalledTimes ( 1 ) ;
314- } ) ;
315222} ) ;
0 commit comments