Skip to content

Commit 223be4f

Browse files
wuayeewuayee
andauthored
[app-builder] dealing with the problem of empty tools when creating an intelligent agent (#488)
Co-authored-by: wuayee <[email protected]>
1 parent af977c4 commit 223be4f

File tree

3 files changed

+104
-3
lines changed

3 files changed

+104
-3
lines changed

app-builder/plugins/aipp-plugin/src/main/java/modelengine/fit/jober/aipp/service/impl/AgentInfoGenerateServiceImpl.java

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import modelengine.fit.jober.aipp.service.AippModelService;
2626
import modelengine.fit.jober.aipp.util.UUIDUtil;
2727
import modelengine.fitframework.annotation.Component;
28+
import modelengine.fitframework.annotation.Value;
2829
import modelengine.fitframework.log.Logger;
2930
import modelengine.fitframework.util.IoUtils;
3031
import modelengine.fitframework.util.MapBuilder;
@@ -40,6 +41,8 @@
4041
import java.util.HashSet;
4142
import java.util.List;
4243
import java.util.Map;
44+
import java.util.stream.Collectors;
45+
import java.util.stream.Stream;
4346

4447
/**
4548
* 表示 {@link AgentInfoGenerateService} 的默认实现。
@@ -65,13 +68,17 @@ public class AgentInfoGenerateServiceImpl implements AgentInfoGenerateService {
6568

6669
private final String agentNameFormat = "^[\\u4E00-\\u9FA5A-Za-z0-9][\\u4E00-\\u9FA5A-Za-z0-9-_]*$";
6770

71+
private final String systemCreator;
72+
6873
public AgentInfoGenerateServiceImpl(AippModelService aippModelService, AippModelCenter aippModelCenter,
69-
PluginToolService toolService, LocaleService localeService, AppBuilderAppRepository appRepository) {
74+
PluginToolService toolService, LocaleService localeService, AppBuilderAppRepository appRepository,
75+
@Value("${app-engine.plugin.system-creator}") String systemCreator) {
7076
this.aippModelService = aippModelService;
7177
this.aippModelCenter = aippModelCenter;
7278
this.toolService = toolService;
7379
this.localeService = localeService;
7480
this.appRepository = appRepository;
81+
this.systemCreator = systemCreator;
7582
}
7683

7784
@Override
@@ -110,7 +117,9 @@ public List<String> selectTools(String desc, String creator, OperationContext co
110117

111118
private ArrayList<String> getToolsResult(String desc, String creator, OperationContext context) {
112119
StringBuilder toolsCandidate = new StringBuilder();
113-
ListResult<PluginToolData> tools = this.getTools(creator);
120+
ListResult<PluginToolData> creatorTools = this.getTools(creator);
121+
ListResult<PluginToolData> systemTools = this.getTools(this.systemCreator);
122+
ListResult<PluginToolData> tools = this.merge(creatorTools, systemTools);
114123
int count = tools.getCount();
115124
List<PluginToolData> toolData = tools.getData();
116125
for (int i = 0; i < count; i++) {
@@ -136,6 +145,20 @@ private ArrayList<String> getToolsResult(String desc, String creator, OperationC
136145
return toolsResult;
137146
}
138147

148+
private ListResult<PluginToolData> merge(ListResult<PluginToolData> tool1, ListResult<PluginToolData> tools2) {
149+
if (tool1 == null || tool1.getCount() == 0) {
150+
return tools2;
151+
} else if (tools2 == null || tools2.getCount() == 0) {
152+
return tool1;
153+
}
154+
ListResult<PluginToolData> tools = ListResult.create(new ArrayList<>(), 0);
155+
tools.setCount(tool1.getCount() + tools2.getCount());
156+
List<PluginToolData> mergedData = Stream.concat(tool1.getData().stream(), tools2.getData().stream())
157+
.collect(Collectors.toList());
158+
tools.setData(mergedData);
159+
return tools;
160+
}
161+
139162
private ListResult<PluginToolData> getTools(String creator) {
140163
PluginToolQuery pluginQuery = new PluginToolQuery.Builder().toolName(null).includeTags(new HashSet<String>() {{
141164
add("FIT");

app-builder/plugins/aipp-plugin/src/main/resources/application.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ app-engine:
6060
max-length: 20000
6161
user-context:
6262
max-length: 500
63+
plugin:
64+
system-creator: 'system'
6365
elsa:
6466
endpoint:
6567
elsaKey:

app-builder/plugins/aipp-plugin/src/test/java/modelengine/fit/jober/aipp/service/AgentInfoGenerateServiceImplTest.java

Lines changed: 77 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import modelengine.jade.store.service.PluginToolService;
2626

2727
import org.jetbrains.annotations.NotNull;
28+
import org.junit.jupiter.api.Assertions;
2829
import org.junit.jupiter.api.BeforeEach;
2930
import org.junit.jupiter.api.DisplayName;
3031
import org.junit.jupiter.api.Test;
@@ -68,7 +69,7 @@ void beforeAll() {
6869
this.aippModelCenter,
6970
this.toolService,
7071
this.localeService,
71-
this.appRepository);
72+
this.appRepository, "system");
7273
}
7374

7475
@Test
@@ -135,6 +136,81 @@ void shouldOkWhenSelectTools() {
135136
"UNIQUENAME3");
136137
}
137138

139+
@Test
140+
void testMerge_tool1IsNull_returnsTools2() {
141+
ListResult<PluginToolData> tools2 = new ListResult<>(List.of(new PluginToolData()), 1);
142+
ListResult<PluginToolData> result = this.invokeMerge(null, tools2);
143+
Assertions.assertSame(tools2, result);
144+
}
145+
146+
/**
147+
* 测试当 tool1 的 count 为 0 时是否正确返回 tools2
148+
*/
149+
@Test
150+
void testMerge_tool1IsEmpty_returnsTools2() {
151+
ListResult<PluginToolData> tool1 = new ListResult<>(new ArrayList<>(), 0);
152+
ListResult<PluginToolData> tools2 = new ListResult<>(List.of(new PluginToolData()), 1);
153+
ListResult<PluginToolData> result = this.invokeMerge(tool1, tools2);
154+
Assertions.assertSame(tools2, result);
155+
}
156+
157+
/**
158+
* 测试当 tools2 为 null 时是否正确返回 tool1
159+
*/
160+
@Test
161+
void testMerge_tools2IsNull_returnsTool1() {
162+
ListResult<PluginToolData> tool1 = new ListResult<>(List.of(new PluginToolData()), 1);
163+
ListResult<PluginToolData> result = invokeMerge(tool1, null);
164+
Assertions.assertSame(tool1, result);
165+
}
166+
167+
/**
168+
* 测试当 tools2 的 count 为 0 时是否正确返回 tool1
169+
*/
170+
@Test
171+
void testMerge_tools2IsEmpty_returnsTool1() {
172+
ListResult<PluginToolData> tool1 = new ListResult<>(List.of(new PluginToolData()), 1);
173+
ListResult<PluginToolData> tools2 = new ListResult<>(new ArrayList<>(), 0);
174+
ListResult<PluginToolData> result = invokeMerge(tool1, tools2);
175+
Assertions.assertSame(tool1, result);
176+
}
177+
178+
/**
179+
* 测试正常情况下两个列表能否成功合并
180+
*/
181+
@Test
182+
void testMerge_bothValid_mergeCorrectly() {
183+
PluginToolData data1 = new PluginToolData();
184+
PluginToolData data2 = new PluginToolData();
185+
ListResult<PluginToolData> tool1 = new ListResult<>(List.of(data1), 1);
186+
ListResult<PluginToolData> tools2 = new ListResult<>(List.of(data2), 1);
187+
188+
ListResult<PluginToolData> result = invokeMerge(tool1, tools2);
189+
190+
Assertions.assertNotNull(result);
191+
Assertions.assertEquals(2, result.getCount());
192+
Assertions.assertTrue(result.getData().contains(data1));
193+
Assertions.assertTrue(result.getData().contains(data2));
194+
}
195+
196+
/**
197+
* 利用反射机制调用私有方法 merge
198+
*
199+
* @param tool1 第一个 ListResult 参数
200+
* @param tools2 第二个 ListResult 参数
201+
* @return 合并后的 ListResult 结果
202+
*/
203+
private ListResult<PluginToolData> invokeMerge(ListResult<PluginToolData> tool1, ListResult<PluginToolData> tools2) {
204+
try {
205+
var method = AgentInfoGenerateServiceImpl.class.getDeclaredMethod("merge",
206+
ListResult.class, ListResult.class);
207+
method.setAccessible(true);
208+
return (ListResult<PluginToolData>) method.invoke(this.agentInfoGenerateService, tool1, tools2);
209+
} catch (Exception e) {
210+
throw new RuntimeException("Failed to invoke private method 'merge'", e);
211+
}
212+
}
213+
138214
@NotNull
139215
private ModelListDto getModelListDto() {
140216
List<ModelAccessInfo> modelAccessInfos = new ArrayList<>();

0 commit comments

Comments
 (0)