1
- import { CallbackManagerForLLMRun } from '@langchain/core/callbacks/manager'
2
- import { isSystemMessage } from '@langchain/core/messages'
3
- import { BaseMessage } from '@langchain/core/messages'
4
- import { ChatGenerationChunk , ChatResult } from '@langchain/core/outputs'
1
+ import type { CallbackManagerForLLMRun } from '@langchain/core/callbacks/manager'
2
+ import { AIMessage , AIMessageChunk , type BaseMessage , isHumanMessage , isSystemMessage , isToolMessage } from '@langchain/core/messages'
3
+ import type { ChatGenerationChunk , ChatResult } from '@langchain/core/outputs'
5
4
import { FakeStreamingChatModel } from '@langchain/core/utils/testing'
6
5
import { basicTestContent } from '../../util/azure/mocks/mockContent'
7
6
@@ -17,13 +16,26 @@ export class MockModel extends FakeStreamingChatModel {
17
16
} )
18
17
}
19
18
20
- async _generate ( messages : BaseMessage [ ] , _options : this[ 'ParsedCallOptions' ] , _runManager ?: CallbackManagerForLLMRun ) : Promise < ChatResult > {
21
- const firstMessage = messages [ 0 ]
22
- if ( isSystemMessage ( firstMessage ) && ( firstMessage . content as string ) . startsWith ( 'mocktest' ) ) {
19
+ setupTestResponse ( messages : BaseMessage [ ] ) {
20
+ const firstSystemMessage = messages . find ( isSystemMessage )
21
+ const lastHumanMessage = messages . findLast ( isHumanMessage )
22
+ const toolMessage = isToolMessage ( messages [ messages . length - 1 ] ) ? messages [ messages . length - 1 ] : null
23
+
24
+ if ( toolMessage ) {
25
+ this . chunks = [ new AIMessageChunk ( `Ok! Got some great results from that mock tool call!: "${ toolMessage . content } "` ) ]
26
+ } else if ( firstSystemMessage && ( firstSystemMessage . content as string ) . startsWith ( 'mocktest' ) ) {
27
+ // testing a system message
23
28
// Do nothing. FakeStreamingChatModel echoes the first message.
29
+ } else if ( ( ( lastHumanMessage ?. content ?? '' ) as string ) . startsWith ( 'rag' ) ) {
30
+ // Do a tool call
31
+ this . chunks = toolCallChunks
24
32
} else {
25
- firstMessage . content = basicTestContent
33
+ this . responses = defaultResponse
26
34
}
35
+ }
36
+
37
+ async _generate ( messages : BaseMessage [ ] , _options : this[ 'ParsedCallOptions' ] , _runManager ?: CallbackManagerForLLMRun ) : Promise < ChatResult > {
38
+ this . setupTestResponse ( messages )
27
39
return super . _generate ( messages , _options , _runManager )
28
40
}
29
41
@@ -32,12 +44,22 @@ export class MockModel extends FakeStreamingChatModel {
32
44
_options : this[ 'ParsedCallOptions' ] ,
33
45
runManager ?: CallbackManagerForLLMRun ,
34
46
) : AsyncGenerator < ChatGenerationChunk > {
35
- const firstMessage = messages [ 0 ]
36
- if ( isSystemMessage ( firstMessage ) && ( firstMessage . content as string ) . startsWith ( 'mocktest' ) ) {
37
- // Do nothing. FakeStreamingChatModel echoes the first message.
38
- } else {
39
- firstMessage . content = basicTestContent
40
- }
47
+ this . setupTestResponse ( messages )
41
48
yield * super . _streamResponseChunks ( messages , _options , runManager )
42
49
}
43
50
}
51
+
52
+ const defaultResponse = [ new AIMessage ( basicTestContent ) ]
53
+
54
+ const toolCallChunks = [
55
+ new AIMessageChunk ( {
56
+ content : '' ,
57
+ tool_call_chunks : [
58
+ {
59
+ name : 'mock_document_search' ,
60
+ args : JSON . stringify ( { query : 'mock test query' } ) ,
61
+ id : 'mock_document_search_id' ,
62
+ } ,
63
+ ] ,
64
+ } ) ,
65
+ ]
0 commit comments