Skip to content

Commit 996f29c

Browse files
authored
Merge pull request #1848 from sgdesmet/fix/tool-tracing
Fix tool call instrumentation regression
2 parents 37a459a + da51937 commit 996f29c

File tree

3 files changed

+22
-23
lines changed

3 files changed

+22
-23
lines changed

core/runtime/src/main/java/io/quarkiverse/langchain4j/runtime/tool/QuarkusToolExecutor.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ public record Context(Object tool, String toolInvokerName, String methodName, St
3434

3535
public interface Wrapper {
3636

37-
String wrap(ToolExecutionRequest toolExecutionRequest, Object memoryId,
38-
BiFunction<ToolExecutionRequest, Object, String> fun);
37+
ToolExecutionResult wrap(ToolExecutionRequest toolExecutionRequest, InvocationContext invocationContext,
38+
BiFunction<ToolExecutionRequest, InvocationContext, ToolExecutionResult> fun);
3939
}
4040

4141
public QuarkusToolExecutor(Context context) {
@@ -46,6 +46,7 @@ public ReturnBehavior returnBehavior() {
4646
return context.returnBehavior;
4747
}
4848

49+
@Override
4950
public String execute(ToolExecutionRequest toolExecutionRequest, Object memoryId) {
5051
return executeWithContext(toolExecutionRequest, InvocationContext.builder().chatMemoryId(memoryId).build())
5152
.resultText();

core/runtime/src/main/java/io/quarkiverse/langchain4j/runtime/tool/QuarkusToolExecutorFactory.java

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import jakarta.inject.Singleton;
88

99
import dev.langchain4j.agent.tool.ToolExecutionRequest;
10+
import dev.langchain4j.invocation.InvocationContext;
11+
import dev.langchain4j.service.tool.ToolExecutionResult;
1012
import io.quarkus.arc.All;
1113
import io.quarkus.arc.Unremovable;
1214

@@ -29,27 +31,21 @@ public QuarkusToolExecutor create(QuarkusToolExecutor.Context context) {
2931
final QuarkusToolExecutor originalTool = new QuarkusToolExecutor(context);
3032

3133
@Override
32-
public String execute(ToolExecutionRequest toolExecutionRequest, Object memoryId) {
33-
AtomicReference<BiFunction<ToolExecutionRequest, Object, String>> funRef = new AtomicReference<>(
34-
new BiFunction<>() {
35-
@Override
36-
public String apply(ToolExecutionRequest toolExecutionRequest, Object o) {
37-
return originalTool.execute(toolExecutionRequest, memoryId);
38-
}
39-
});
34+
public ToolExecutionResult executeWithContext(ToolExecutionRequest toolExecutionRequest,
35+
InvocationContext invocationContext) {
36+
37+
AtomicReference<BiFunction<ToolExecutionRequest, InvocationContext, ToolExecutionResult>> funRef = new AtomicReference<>(
38+
originalTool::executeWithContext);
4039

4140
for (QuarkusToolExecutor.Wrapper wrapper : wrappers) {
4241
var currentFun = funRef.get();
43-
BiFunction<ToolExecutionRequest, Object, String> newFunction = new BiFunction<>() {
44-
@Override
45-
public String apply(ToolExecutionRequest toolExecutionRequest, Object memoryId) {
46-
return wrapper.wrap(toolExecutionRequest, memoryId, currentFun);
47-
}
48-
};
42+
BiFunction<ToolExecutionRequest, InvocationContext, ToolExecutionResult> newFunction = (
43+
toolExecutionRequest1,
44+
invocationContext1) -> wrapper.wrap(toolExecutionRequest1, invocationContext1, currentFun);
4945
funRef.set(newFunction);
5046
}
5147

52-
return funRef.get().apply(toolExecutionRequest, memoryId);
48+
return funRef.get().apply(toolExecutionRequest, invocationContext);
5349
}
5450
};
5551
}

core/runtime/src/main/java/io/quarkiverse/langchain4j/runtime/tool/ToolSpanWrapper.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import org.eclipse.microprofile.config.inject.ConfigProperty;
88

99
import dev.langchain4j.agent.tool.ToolExecutionRequest;
10+
import dev.langchain4j.invocation.InvocationContext;
11+
import dev.langchain4j.service.tool.ToolExecutionResult;
1012
import io.opentelemetry.api.trace.Span;
1113
import io.opentelemetry.api.trace.SpanKind;
1214
import io.opentelemetry.api.trace.Tracer;
@@ -29,8 +31,8 @@ public ToolSpanWrapper(Tracer tracer,
2931
}
3032

3133
@Override
32-
public String wrap(ToolExecutionRequest toolExecutionRequest, Object memoryId,
33-
BiFunction<ToolExecutionRequest, Object, String> fun) {
34+
public ToolExecutionResult wrap(ToolExecutionRequest toolExecutionRequest, InvocationContext invocationContext,
35+
BiFunction<ToolExecutionRequest, InvocationContext, ToolExecutionResult> fun) {
3436

3537
// from https://github.com/open-telemetry/semantic-conventions/blob/main/docs/gen-ai/gen-ai-spans.md#execute-tool-span
3638
Span span = tracer.spanBuilder("langchain4j.tools." + toolExecutionRequest.name())
@@ -43,11 +45,11 @@ public String wrap(ToolExecutionRequest toolExecutionRequest, Object memoryId,
4345
if (includeArguments) {
4446
span.setAttribute("gen_ai.tool.call.arguments", toolExecutionRequest.arguments());
4547
}
46-
try (Scope scope = span.makeCurrent()) {
48+
try (Scope ignored = span.makeCurrent()) {
4749
// TODO Handle async method here.
48-
var result = fun.apply(toolExecutionRequest, memoryId);
49-
if (includeResult) {
50-
span.setAttribute("gen_ai.tool.call.result", result);
50+
var result = fun.apply(toolExecutionRequest, invocationContext);
51+
if (includeResult && result != null) {
52+
span.setAttribute("gen_ai.tool.call.result", result.resultText());
5153
}
5254
return result;
5355
} catch (Throwable t) {

0 commit comments

Comments
 (0)