+ * The method can specify {@link Throwable} and/or {@link ToolErrorContext} as parameters. + * The return type of the method must be either {@link String} or {@link ToolErrorHandlerResult} + *
+ * See also: {@link ToolArgumentsErrorHandler} + */ +@Retention(RUNTIME) +@Target({ METHOD }) +public @interface HandleToolArgumentError { +} diff --git a/core/runtime/src/main/java/io/quarkiverse/langchain4j/HandleToolExecutionError.java b/core/runtime/src/main/java/io/quarkiverse/langchain4j/HandleToolExecutionError.java new file mode 100644 index 000000000..240387eb1 --- /dev/null +++ b/core/runtime/src/main/java/io/quarkiverse/langchain4j/HandleToolExecutionError.java @@ -0,0 +1,26 @@ +package io.quarkiverse.langchain4j; + +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import dev.langchain4j.exception.ToolExecutionException; +import dev.langchain4j.service.tool.ToolErrorContext; +import dev.langchain4j.service.tool.ToolErrorHandlerResult; +import dev.langchain4j.service.tool.ToolExecutionErrorHandler; + +/** + * Can be used on a static method of an AI Service interface registered with {@link RegisterAiService} + * to handle {@link ToolExecutionException}. + *
+ * The method can specify {@link Throwable} and/or {@link ToolErrorContext} as parameters. + * The return type of the method must be either {@link String} or {@link ToolErrorHandlerResult} + *
+ * See also: {@link ToolExecutionErrorHandler} + */ +@Retention(RUNTIME) +@Target({ METHOD }) +public @interface HandleToolExecutionError { +} diff --git a/core/runtime/src/main/java/io/quarkiverse/langchain4j/guardrails/ToolGuardrailException.java b/core/runtime/src/main/java/io/quarkiverse/langchain4j/guardrails/ToolGuardrailException.java index e12919844..8bbf39eee 100644 --- a/core/runtime/src/main/java/io/quarkiverse/langchain4j/guardrails/ToolGuardrailException.java +++ b/core/runtime/src/main/java/io/quarkiverse/langchain4j/guardrails/ToolGuardrailException.java @@ -1,5 +1,7 @@ package io.quarkiverse.langchain4j.guardrails; +import io.quarkiverse.langchain4j.runtime.PreventsErrorHandlerExecution; + /** * Exception thrown when tool guardrail validation fails critically. *
@@ -23,7 +25,7 @@
* @see ToolInputGuardrailResult
* @see ToolOutputGuardrailResult
*/
-public class ToolGuardrailException extends RuntimeException {
+public class ToolGuardrailException extends RuntimeException implements PreventsErrorHandlerExecution {
private final boolean fatal;
diff --git a/core/runtime/src/main/java/io/quarkiverse/langchain4j/runtime/AiServicesRecorder.java b/core/runtime/src/main/java/io/quarkiverse/langchain4j/runtime/AiServicesRecorder.java
index e0d7696e9..d388305ec 100644
--- a/core/runtime/src/main/java/io/quarkiverse/langchain4j/runtime/AiServicesRecorder.java
+++ b/core/runtime/src/main/java/io/quarkiverse/langchain4j/runtime/AiServicesRecorder.java
@@ -21,6 +21,8 @@
import dev.langchain4j.model.image.ImageModel;
import dev.langchain4j.model.moderation.ModerationModel;
import dev.langchain4j.rag.RetrievalAugmentor;
+import dev.langchain4j.service.tool.ToolArgumentsErrorHandler;
+import dev.langchain4j.service.tool.ToolExecutionErrorHandler;
import dev.langchain4j.service.tool.ToolProvider;
import io.quarkiverse.langchain4j.ModelName;
import io.quarkiverse.langchain4j.RegisterAiService;
@@ -117,8 +119,7 @@ public Function