1+ /*---------------------------------------------------------------------------------------------
2+ * Copyright (c) 2025 Huawei Technologies Co., Ltd. All rights reserved.
3+ * This file is a part of the ModelEngine Project.
4+ * Licensed under the MIT License. See License.txt in the project root for license information.
5+ *--------------------------------------------------------------------------------------------*/
6+
7+ package modelengine .fel .engine .operators .models ;
8+
9+ import modelengine .fel .core .chat .ChatMessage ;
10+ import modelengine .fel .core .chat .Prompt ;
11+ import modelengine .fel .core .chat .support .AiMessage ;
12+ import modelengine .fel .core .chat .support .ChatMessages ;
13+ import modelengine .fel .core .memory .Memory ;
14+ import modelengine .fel .core .tool .ToolCall ;
15+ import modelengine .fel .engine .util .StateKey ;
16+ import modelengine .fit .waterflow .domain .context .FlowSession ;
17+ import modelengine .fitframework .flowable .Choir ;
18+ import modelengine .fitframework .util .StringUtils ;
19+
20+ import org .junit .jupiter .api .Test ;
21+ import org .mockito .ArgumentCaptor ;
22+ import org .mockito .Mockito ;
23+
24+ import java .util .Arrays ;
25+ import java .util .Collections ;
26+ import java .util .List ;
27+
28+ import static org .junit .jupiter .api .Assertions .*;
29+
30+ /**
31+ * 表示 {@link LlmEmitter} 的测试。
32+ *
33+ * @author 宋永坦
34+ * @since 2025-07-05
35+ */
36+ class LlmEmitterTest {
37+ @ Test
38+ void shouldAddMemoryWhenCompleteGivenLlmOutput () {
39+ String output = "data1" ;
40+ Prompt prompt = ChatMessages .fromList (Collections .emptyList ());
41+ Choir <ChatMessage > dataSource = Choir .create (emitter -> {
42+ emitter .emit (new AiMessage (output ));
43+ emitter .complete ();
44+ });
45+ FlowSession flowSession = new FlowSession ();
46+ Memory mockMemory = Mockito .mock (Memory .class );
47+ ArgumentCaptor <ChatMessage > captor = ArgumentCaptor .forClass (ChatMessage .class );
48+ Mockito .doNothing ().when (mockMemory ).add (captor .capture ());
49+ flowSession .setInnerState (StateKey .HISTORY , mockMemory );
50+
51+ LlmEmitter <ChatMessage > llmEmitter = new LlmEmitter <>(dataSource , prompt , flowSession );
52+ llmEmitter .start (flowSession );
53+
54+ List <ChatMessage > captured = captor .getAllValues ();
55+ assertEquals (2 , captured .size ());
56+ assertEquals (StringUtils .EMPTY , captured .get (0 ).text ());
57+ assertEquals (output , captured .get (1 ).text ());
58+ }
59+
60+ @ Test
61+ void shouldNotAddMemoryWhenCompleteGivenLlmToolCallOutput () {
62+ String output = "data1" ;
63+ Prompt prompt = ChatMessages .fromList (Collections .emptyList ());
64+ Choir <ChatMessage > dataSource = Choir .create (emitter -> {
65+ emitter .emit (new AiMessage (output , Arrays .asList (ToolCall .custom ().id ("id1" ).build ())));
66+ emitter .complete ();
67+ });
68+ FlowSession flowSession = new FlowSession ();
69+ Memory mockMemory = Mockito .mock (Memory .class );
70+ flowSession .setInnerState (StateKey .HISTORY , mockMemory );
71+
72+ LlmEmitter <ChatMessage > llmEmitter = new LlmEmitter <>(dataSource , prompt , flowSession );
73+ llmEmitter .start (flowSession );
74+
75+ Mockito .verify (mockMemory , Mockito .times (0 )).add (Mockito .any ());
76+ }
77+ }
0 commit comments