在 vanilla langchain4j 中,我们可以以编程方式提供工具 https://docs.langchain4j.dev/tutorials/tools#specifying-tools-programmatically
我似乎没有找到一种方法可以对 quarkus-langchain4j 执行相同的操作,唯一的示例是动态工具,这是不同的。
我有我的 ToolSpecification 生成器
private ToolSpecification createToolFromAction(Action action) {
var toolname = action.name();
var toolDescription = action.description();
Map<String, JsonSchemaElement> params = new HashMap<>();
action.parameters().forEach(parameter -> {
params.put(parameter.name(), JsonStringSchema.builder().description(parameter.name()).build());
});
return ToolSpecification.builder()
.name(toolname)
.description(toolDescription)
.parameters(JsonObjectSchema.builder().properties(params).build())
.build();
}
public List<ToolSpecification> createToolSpecificationsFromActions() {
return actionsRepository.listActions().stream()
.map(this::createToolFromAction)
.toList();
}
我还可以提供 ToolExecutor,但是我不知道如何将它与带有 @RegisterAiService 注释的 AiService 一起提供。
好吧,在深入研究代码库之后,我发现了一个测试,它展示了如何使用您自己的 ToolSpecification 和 ToolExecutor。
@Override
public ToolProviderResult provideTools(ToolProviderRequest request) {
assertNotNull(myServiceWithoutTools);
ToolSpecification toolSpecification = ToolSpecification.builder()
.name("get_booking_details")
.description("Returns booking details")
.build();
ToolExecutor toolExecutor = (t, m) -> "0";
return ToolProviderResult.builder()
.add(toolSpecification, toolExecutor)
.build();
}