diff --git a/spring-ai-core/pom.xml b/spring-ai-core/pom.xml
index 6f7090d8682..3b72c3bae26 100644
--- a/spring-ai-core/pom.xml
+++ b/spring-ai-core/pom.xml
@@ -72,6 +72,12 @@
spring-boot-starter-test
test
+
+ org.springframework
+ spring-context
+ 6.1.0-M3
+ compile
+
diff --git a/spring-ai-core/src/main/java/org/springframework/ai/SpringAiFunctionManager.java b/spring-ai-core/src/main/java/org/springframework/ai/SpringAiFunctionManager.java
new file mode 100644
index 00000000000..dfd6cfdef0f
--- /dev/null
+++ b/spring-ai-core/src/main/java/org/springframework/ai/SpringAiFunctionManager.java
@@ -0,0 +1,61 @@
+package org.springframework.ai;
+
+import org.springframework.ai.annotations.SpringAIFunction;
+import org.springframework.ai.model.AbstractToolFunctionCallback;
+import org.springframework.ai.model.ToolFunctionCallback;
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.context.support.GenericApplicationContext;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Function;
+
+public class SpringAiFunctionManager implements ApplicationContextAware {
+
+ private GenericApplicationContext applicationContext;
+
+ @Override
+ public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+ this.applicationContext = (GenericApplicationContext) applicationContext;
+ }
+
+ public int size() {
+ return this.applicationContext.getBeansWithAnnotation(SpringAIFunction.class).size();
+ }
+
+ /**
+ * @return The list of chat functions
+ */
+ public List getAnnotatedToolFunctionCallbacks() {
+ var beans = this.applicationContext.getBeansWithAnnotation(SpringAIFunction.class);
+ List chatFunctions = new ArrayList<>();
+ beans.forEach((k, v) -> {
+ if (v instanceof Function, ?> function) {
+ SpringAIFunction aiFunction = applicationContext.findAnnotationOnBean(k, SpringAIFunction.class);
+ chatFunctions.add(new AnnotationGeneratedFunctionCallback(aiFunction.name(), aiFunction.description(),
+ aiFunction.classType(), function));
+ }
+ });
+
+ return chatFunctions;
+ }
+
+}
+
+class AnnotationGeneratedFunctionCallback extends AbstractToolFunctionCallback