diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
new file mode 100644
index 00000000..0a3af6ca
--- /dev/null
+++ b/.github/pull_request_template.md
@@ -0,0 +1,35 @@
+
+
+## Issue
+
+Closes #
+
+## Change
+
+
+
+## General checklist
+
+- [ ] There are no breaking changes
+- [ ] I have added unit and/or integration tests for my change
+- [ ] The tests cover both positive and negative cases
+- [ ] I have manually run all the unit and integration tests in the module I have added/changed, and they are all green
+
+- [ ] I have added/updated the [documentation](https://github.com/langchain4j/langchain4j/tree/main/docs/docs)
+- [ ] I have added an example in the [examples repo](https://github.com/langchain4j/langchain4j-examples) (only for "big" features)
+
+
+## Checklist for adding new Spring Boot starter
+
+- [ ] I have added my new starter in the root `pom.xml`
+- [ ] I have added a `org.springframework.boot.autoconfigure.AutoConfiguration.imports` file in the `langchain4j-{integration}-spring-boot-starter/src/main/resources/META-INF/spring/` directory
diff --git a/.github/workflows/add_new_pr_to_project.yaml b/.github/workflows/add_new_pr_to_project.yaml
new file mode 100644
index 00000000..dc602533
--- /dev/null
+++ b/.github/workflows/add_new_pr_to_project.yaml
@@ -0,0 +1,17 @@
+name: Add new PR to Project
+
+on:
+ pull_request:
+ types:
+ - opened
+ - reopened
+
+jobs:
+ add-to-project:
+ name: Add PR to Project
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/add-to-project@v0.5.0
+ with:
+ project-url: https://github.com/users/langchain4j/projects/2
+ github-token: ${{ secrets.GH_TOKEN_ADD_NEW_PRS_TO_PROJECT }}
diff --git a/langchain4j-reactor/pom.xml b/langchain4j-reactor/pom.xml
index ffc80663..718767aa 100644
--- a/langchain4j-reactor/pom.xml
+++ b/langchain4j-reactor/pom.xml
@@ -47,7 +47,7 @@
org.assertj
assertj-core
- 3.24.2
+ 3.26.3
test
diff --git a/langchain4j-spring-boot-starter/pom.xml b/langchain4j-spring-boot-starter/pom.xml
index 30440842..7c721efa 100644
--- a/langchain4j-spring-boot-starter/pom.xml
+++ b/langchain4j-spring-boot-starter/pom.xml
@@ -53,6 +53,13 @@
test
+
+ org.springframework.boot
+ spring-boot-starter-aop
+ ${spring.boot.version}
+ test
+
+
dev.langchain4j
langchain4j-core
diff --git a/langchain4j-spring-boot-starter/src/main/java/dev/langchain4j/service/spring/AiServiceFactory.java b/langchain4j-spring-boot-starter/src/main/java/dev/langchain4j/service/spring/AiServiceFactory.java
index e2a2bdfc..d5063192 100644
--- a/langchain4j-spring-boot-starter/src/main/java/dev/langchain4j/service/spring/AiServiceFactory.java
+++ b/langchain4j-spring-boot-starter/src/main/java/dev/langchain4j/service/spring/AiServiceFactory.java
@@ -1,5 +1,7 @@
package dev.langchain4j.service.spring;
+import dev.langchain4j.agent.tool.Tool;
+import dev.langchain4j.agent.tool.ToolSpecification;
import dev.langchain4j.memory.ChatMemory;
import dev.langchain4j.memory.chat.ChatMemoryProvider;
import dev.langchain4j.model.chat.ChatLanguageModel;
@@ -8,11 +10,20 @@
import dev.langchain4j.rag.RetrievalAugmentor;
import dev.langchain4j.rag.content.retriever.ContentRetriever;
import dev.langchain4j.service.AiServices;
+import dev.langchain4j.service.tool.DefaultToolExecutor;
+import dev.langchain4j.service.tool.ToolExecutor;
import org.springframework.beans.factory.FactoryBean;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
+import static dev.langchain4j.agent.tool.ToolSpecifications.toolSpecificationFrom;
import static dev.langchain4j.internal.Utils.isNullOrEmpty;
+import static org.springframework.aop.framework.AopProxyUtils.ultimateTargetClass;
+import static org.springframework.aop.support.AopUtils.isAopProxy;
class AiServiceFactory implements FactoryBean