Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import modelengine.fit.jober.aipp.service.AippModelService;
import modelengine.fit.jober.aipp.util.UUIDUtil;
import modelengine.fitframework.annotation.Component;
import modelengine.fitframework.annotation.Value;
import modelengine.fitframework.log.Logger;
import modelengine.fitframework.util.IoUtils;
import modelengine.fitframework.util.MapBuilder;
Expand All @@ -40,6 +41,8 @@
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

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

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

private final String systemCreator;

public AgentInfoGenerateServiceImpl(AippModelService aippModelService, AippModelCenter aippModelCenter,
PluginToolService toolService, LocaleService localeService, AppBuilderAppRepository appRepository) {
PluginToolService toolService, LocaleService localeService, AppBuilderAppRepository appRepository,
@Value("${app-engine.plugin.system-creator}") String systemCreator) {
this.aippModelService = aippModelService;
this.aippModelCenter = aippModelCenter;
this.toolService = toolService;
this.localeService = localeService;
this.appRepository = appRepository;
this.systemCreator = systemCreator;
}

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

private ArrayList<String> getToolsResult(String desc, String creator, OperationContext context) {
StringBuilder toolsCandidate = new StringBuilder();
ListResult<PluginToolData> tools = this.getTools(creator);
ListResult<PluginToolData> creatorTools = this.getTools(creator);
ListResult<PluginToolData> systemTools = this.getTools(this.systemCreator);
ListResult<PluginToolData> tools = this.merge(creatorTools, systemTools);
int count = tools.getCount();
List<PluginToolData> toolData = tools.getData();
for (int i = 0; i < count; i++) {
Expand All @@ -136,6 +145,20 @@ private ArrayList<String> getToolsResult(String desc, String creator, OperationC
return toolsResult;
}

private ListResult<PluginToolData> merge(ListResult<PluginToolData> tool1, ListResult<PluginToolData> tools2) {
if (tool1 == null || tool1.getCount() == 0) {
return tools2;
} else if (tools2 == null || tools2.getCount() == 0) {
return tool1;
}
ListResult<PluginToolData> tools = ListResult.create(new ArrayList<>(), 0);
tools.setCount(tool1.getCount() + tools2.getCount());
List<PluginToolData> mergedData = Stream.concat(tool1.getData().stream(), tools2.getData().stream())
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

image 这里是否需要考虑去重,从业务上将,两个人查出来的工具是有可能重复的吧

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这边调用的地方,是不同创建者创造的插件,从业务上讲不会重复,所以不需要去重

.collect(Collectors.toList());
tools.setData(mergedData);
return tools;
}

private ListResult<PluginToolData> getTools(String creator) {
PluginToolQuery pluginQuery = new PluginToolQuery.Builder().toolName(null).includeTags(new HashSet<String>() {{
add("FIT");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ app-engine:
max-length: 20000
user-context:
max-length: 500
plugin:
system-creator: 'system'
elsa:
endpoint:
elsaKey:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import modelengine.jade.store.service.PluginToolService;

import org.jetbrains.annotations.NotNull;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
Expand Down Expand Up @@ -68,7 +69,7 @@ void beforeAll() {
this.aippModelCenter,
this.toolService,
this.localeService,
this.appRepository);
this.appRepository, "system");
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

image 建议增加下测试会使用系统工具的场景

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

单测已增加

}

@Test
Expand Down Expand Up @@ -135,6 +136,81 @@ void shouldOkWhenSelectTools() {
"UNIQUENAME3");
}

@Test
void testMerge_tool1IsNull_returnsTools2() {
ListResult<PluginToolData> tools2 = new ListResult<>(List.of(new PluginToolData()), 1);
ListResult<PluginToolData> result = this.invokeMerge(null, tools2);
Assertions.assertSame(tools2, result);
}

/**
* 测试当 tool1 的 count 为 0 时是否正确返回 tools2
*/
@Test
void testMerge_tool1IsEmpty_returnsTools2() {
ListResult<PluginToolData> tool1 = new ListResult<>(new ArrayList<>(), 0);
ListResult<PluginToolData> tools2 = new ListResult<>(List.of(new PluginToolData()), 1);
ListResult<PluginToolData> result = this.invokeMerge(tool1, tools2);
Assertions.assertSame(tools2, result);
}

/**
* 测试当 tools2 为 null 时是否正确返回 tool1
*/
@Test
void testMerge_tools2IsNull_returnsTool1() {
ListResult<PluginToolData> tool1 = new ListResult<>(List.of(new PluginToolData()), 1);
ListResult<PluginToolData> result = invokeMerge(tool1, null);
Assertions.assertSame(tool1, result);
}

/**
* 测试当 tools2 的 count 为 0 时是否正确返回 tool1
*/
@Test
void testMerge_tools2IsEmpty_returnsTool1() {
ListResult<PluginToolData> tool1 = new ListResult<>(List.of(new PluginToolData()), 1);
ListResult<PluginToolData> tools2 = new ListResult<>(new ArrayList<>(), 0);
ListResult<PluginToolData> result = invokeMerge(tool1, tools2);
Assertions.assertSame(tool1, result);
}

/**
* 测试正常情况下两个列表能否成功合并
*/
@Test
void testMerge_bothValid_mergeCorrectly() {
PluginToolData data1 = new PluginToolData();
PluginToolData data2 = new PluginToolData();
ListResult<PluginToolData> tool1 = new ListResult<>(List.of(data1), 1);
ListResult<PluginToolData> tools2 = new ListResult<>(List.of(data2), 1);

ListResult<PluginToolData> result = invokeMerge(tool1, tools2);

Assertions.assertNotNull(result);
Assertions.assertEquals(2, result.getCount());
Assertions.assertTrue(result.getData().contains(data1));
Assertions.assertTrue(result.getData().contains(data2));
}

/**
* 利用反射机制调用私有方法 merge
*
* @param tool1 第一个 ListResult 参数
* @param tools2 第二个 ListResult 参数
* @return 合并后的 ListResult 结果
*/
private ListResult<PluginToolData> invokeMerge(ListResult<PluginToolData> tool1, ListResult<PluginToolData> tools2) {
try {
var method = AgentInfoGenerateServiceImpl.class.getDeclaredMethod("merge",
ListResult.class, ListResult.class);
method.setAccessible(true);
return (ListResult<PluginToolData>) method.invoke(this.agentInfoGenerateService, tool1, tools2);
} catch (Exception e) {
throw new RuntimeException("Failed to invoke private method 'merge'", e);
}
}

@NotNull
private ModelListDto getModelListDto() {
List<ModelAccessInfo> modelAccessInfos = new ArrayList<>();
Expand Down