Skip to content

Commit c03cb43

Browse files
authored
Merge pull request #1010 from jmartisk/issue-1009
Don't include tools from removed beans in the ToolsMetadata
2 parents fb8bf24 + 3b236a8 commit c03cb43

File tree

2 files changed

+60
-10
lines changed

2 files changed

+60
-10
lines changed

core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/ToolProcessor.java

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -89,20 +89,13 @@ public void telemetry(Capabilities capabilities, BuildProducer<AdditionalBeanBui
8989
}
9090

9191
@BuildStep
92-
@Record(ExecutionTime.STATIC_INIT)
9392
public void handleTools(CombinedIndexBuildItem indexBuildItem,
94-
ToolsRecorder recorder,
9593
BuildProducer<AdditionalBeanBuildItem> additionalBeanProducer,
96-
RecorderContext recorderContext,
9794
BuildProducer<BytecodeTransformerBuildItem> transformerProducer,
9895
BuildProducer<GeneratedClassBuildItem> generatedClassProducer,
9996
BuildProducer<ReflectiveClassBuildItem> reflectiveClassProducer,
10097
BuildProducer<ValidationPhaseBuildItem.ValidationErrorBuildItem> validation,
101-
BuildProducer<ToolsMetadataBuildItem> toolsMetadataProducer) {
102-
recorderContext.registerSubstitution(ToolSpecification.class, ToolSpecificationObjectSubstitution.Serialized.class,
103-
ToolSpecificationObjectSubstitution.class);
104-
recorderContext.registerSubstitution(ToolParameters.class, ToolParametersObjectSubstitution.Serialized.class,
105-
ToolParametersObjectSubstitution.class);
98+
BuildProducer<ToolsMetadataBeforeRemovalBuildItem> toolsMetadataProducer) {
10699

107100
IndexView index = indexBuildItem.getIndex();
108101

@@ -250,8 +243,38 @@ public void handleTools(CombinedIndexBuildItem indexBuildItem,
250243
.build());
251244
}
252245

253-
toolsMetadataProducer.produce(new ToolsMetadataBuildItem(metadata));
254-
recorder.setMetadata(metadata);
246+
toolsMetadataProducer.produce(new ToolsMetadataBeforeRemovalBuildItem(metadata));
247+
}
248+
249+
/**
250+
* Transforms ToolsMetadataBeforeRemovalBuildItem into ToolsMetadataBuildItem by filtering
251+
* out tools belonging to beans that have been removed by ArC.
252+
*/
253+
@BuildStep
254+
@Record(ExecutionTime.STATIC_INIT)
255+
public ToolsMetadataBuildItem filterOutRemovedTools(ToolsMetadataBeforeRemovalBuildItem beforeRemoval,
256+
ValidationPhaseBuildItem validationPhase,
257+
RecorderContext recorderContext,
258+
ToolsRecorder recorder) {
259+
if (beforeRemoval != null) {
260+
recorderContext.registerSubstitution(ToolSpecification.class, ToolSpecificationObjectSubstitution.Serialized.class,
261+
ToolSpecificationObjectSubstitution.class);
262+
recorderContext.registerSubstitution(ToolParameters.class, ToolParametersObjectSubstitution.Serialized.class,
263+
ToolParametersObjectSubstitution.class);
264+
Map<String, List<ToolMethodCreateInfo>> metadataWithoutRemovedBeans = beforeRemoval.getMetadata().entrySet()
265+
.stream()
266+
.filter(entry -> validationPhase.getContext().removedBeans().stream()
267+
.noneMatch(
268+
retainedBean -> DotName.createSimple(entry.getKey()).equals(retainedBean.getBeanClass())))
269+
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
270+
ToolsMetadataBuildItem toolsMetadata = new ToolsMetadataBuildItem(metadataWithoutRemovedBeans);
271+
recorder.setMetadata(toolsMetadata.getMetadata());
272+
log.debug("Tool classes before filtering out removed beans: " + beforeRemoval.getMetadata().keySet());
273+
log.debug("Tool classes after filtering out removed beans: " + toolsMetadata.getMetadata().keySet());
274+
return toolsMetadata;
275+
} else {
276+
return null;
277+
}
255278
}
256279

257280
private boolean ignoreToolMethod(MethodInfo toolMethod, IndexView indexView) {
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package io.quarkiverse.langchain4j.deployment;
2+
3+
import java.util.List;
4+
import java.util.Map;
5+
6+
import io.quarkiverse.langchain4j.runtime.tool.ToolMethodCreateInfo;
7+
import io.quarkus.builder.item.SimpleBuildItem;
8+
9+
/**
10+
* Holds metadata about tools discovered at build time, but tools belonging
11+
* to beans removed by ArC have not been filtered out yet
12+
* (ToolsMetadataBuildItem is the build item that already has them filtered
13+
* out).
14+
*/
15+
public final class ToolsMetadataBeforeRemovalBuildItem extends SimpleBuildItem {
16+
17+
Map<String, List<ToolMethodCreateInfo>> metadata;
18+
19+
public ToolsMetadataBeforeRemovalBuildItem(Map<String, List<ToolMethodCreateInfo>> metadata) {
20+
this.metadata = metadata;
21+
}
22+
23+
public Map<String, List<ToolMethodCreateInfo>> getMetadata() {
24+
return metadata;
25+
}
26+
27+
}

0 commit comments

Comments
 (0)