Skip to content

Commit 0cd1918

Browse files
author
Yuriy Bezsonov
committed
add demo flow
1 parent da92ee1 commit 0cd1918

15 files changed

Lines changed: 1488 additions & 29 deletions

File tree

samples/spring-ai/assistant/pom.xml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,15 @@
5151
<artifactId>spring-boot-starter-test</artifactId>
5252
<scope>test</scope>
5353
</dependency>
54+
<dependency>
55+
<groupId>org.springframework.boot</groupId>
56+
<artifactId>spring-boot-starter-actuator</artifactId>
57+
</dependency>
5458
<!-- Initial Spring AI dependencies -->
5559
<dependency>
5660
<groupId>org.springframework.ai</groupId>
5761
<artifactId>spring-ai-starter-model-bedrock-converse</artifactId>
5862
</dependency>
59-
<dependency>
60-
<groupId>org.springframework.boot</groupId>
61-
<artifactId>spring-boot-starter-actuator</artifactId>
62-
</dependency>
6363
<!-- Chat memory dependencies -->
6464
<dependency>
6565
<groupId>org.springframework.ai</groupId>

samples/spring-ai/assistant/src/main/java/com/example/assistant/service/ChatService.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@
55
import com.example.assistant.util.RetryUtils;
66

77
import org.springframework.ai.chat.client.ChatClient;
8+
9+
import org.springframework.ai.chat.memory.ChatMemory;
810
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
11+
12+
import org.springframework.ai.vectorstore.VectorStore;
913
import org.springframework.ai.chat.client.advisor.vectorstore.QuestionAnswerAdvisor;
1014

11-
import org.springframework.ai.chat.memory.ChatMemory;
1215
import org.springframework.ai.tool.ToolCallbackProvider;
13-
import org.springframework.ai.vectorstore.VectorStore;
1416

1517
import org.springframework.core.io.ByteArrayResource;
1618
import org.springframework.http.MediaType;
Lines changed: 18 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,27 @@
1-
spring.application.name=assistant
2-
logging.level.org.springframework.ai: DEBUG
3-
41
# Simplified logging pattern - only show the message
52
logging.pattern.console=%msg%n
63

7-
# Amazon Bedrock Configuration
8-
spring.ai.bedrock.aws.region=us-east-1
9-
# spring.ai.bedrock.aws.region=eu-central-1
10-
spring.ai.bedrock.converse.chat.options.max-tokens=10000
11-
12-
# Model Configuration
13-
# spring.ai.bedrock.converse.chat.options.model=us.amazon.nova-lite-v1:0
14-
# spring.ai.bedrock.converse.chat.options.model=amazon.nova-pro-v1:0
15-
spring.ai.bedrock.converse.chat.options.model=us.anthropic.claude-3-7-sonnet-20250219-v1:0
16-
# spring.ai.bedrock.converse.chat.options.model=us.anthropic.claude-sonnet-4-20250514-v1:0
4+
# Debugging
5+
logging.level.org.springframework.ai=DEBUG
6+
spring.ai.chat.observations.log-completion=true
7+
spring.ai.chat.observations.include-error-logging=true
8+
spring.ai.tools.observations.include-content=true
9+
# spring.ai.chat.observations.log-prompt=true
10+
# spring.ai.vectorstore.observations.log-query-response=true
1711

1812
# Thymeleaf Configuration
1913
spring.thymeleaf.cache=false
2014
spring.thymeleaf.prefix=classpath:/templates/
2115
spring.thymeleaf.suffix=.html
2216

17+
# Amazon Bedrock Configuration
18+
spring.ai.bedrock.aws.region=us-east-1
19+
spring.ai.bedrock.converse.chat.options.max-tokens=10000
20+
spring.ai.bedrock.converse.chat.options.model=us.anthropic.claude-3-7-sonnet-20250219-v1:0
21+
# spring.ai.bedrock.converse.chat.options.model=us.anthropic.claude-sonnet-4-20250514-v1:0
22+
# spring.ai.bedrock.converse.chat.options.model=us.amazon.nova-lite-v1:0
23+
# spring.ai.bedrock.converse.chat.options.model=amazon.nova-pro-v1:0
24+
2325
# PostgreSQL Configuration
2426
spring.datasource.url=jdbc:postgresql://localhost:5432/assistant_db
2527
spring.datasource.username=postgres
@@ -34,23 +36,16 @@ spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
3436
# JDBC Memory properties
3537
spring.ai.chat.memory.repository.jdbc.initialize-schema=always
3638

37-
# RAG properties
39+
# RAG Configuration
3840
spring.ai.model.embedding=bedrock-titan
3941
spring.ai.bedrock.titan.embedding.model=amazon.titan-embed-text-v2:0
4042
spring.ai.bedrock.titan.embedding.input-type=text
4143

4244
spring.ai.vectorstore.pgvector.initialize-schema=true
4345
spring.ai.vectorstore.pgvector.dimensions=1024
4446

45-
# MCP Client properties
47+
# MCP Client Configuration
4648
spring.ai.mcp.client.toolcallback.enabled=true
47-
# SPRING_AI_MCP_CLIENT_SSE_CONNECTIONS_SERVER1_URL=http://localhost:8081
49+
# via env var SPRING_AI_MCP_CLIENT_SSE_CONNECTIONS_SERVER1_URL=http://localhost:8081
4850
spring.ai.mcp.client.sse.connections.server1.url=http://localhost:8081
4951
spring.ai.mcp.client.sse.connections.server2.url=http://localhost:8082
50-
51-
# Debugging
52-
# spring.ai.chat.observations.log-prompt=true
53-
spring.ai.chat.observations.log-completion=true
54-
spring.ai.chat.observations.include-error-logging=true
55-
spring.ai.tools.observations.include-content=true
56-
# spring.ai.vectorstore.observations.log-query-response=true
Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
#!/bin/bash
2+
3+
# Script to download and setup Spring Boot CLI
4+
5+
# Check if spring-boot-cli directory exists and remove it if it does
6+
if [ -d "spring-boot-cli" ]; then
7+
echo "Found existing spring-boot-cli directory, removing it..."
8+
rm -rf spring-boot-cli
9+
fi
10+
11+
echo "Downloading Spring Boot CLI 3.5.0..."
12+
curl -L https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-cli/3.5.0/spring-boot-cli-3.5.0-bin.zip -o spring-boot-cli-3.5.0-bin.zip
13+
14+
echo "Creating spring-boot-cli directory..."
15+
mkdir -p spring-boot-cli
16+
17+
echo "Extracting Spring Boot CLI to spring-boot-cli folder..."
18+
unzip -q spring-boot-cli-3.5.0-bin.zip -d spring-boot-cli
19+
20+
echo "Cleaning up zip file..."
21+
rm spring-boot-cli-3.5.0-bin.zip
22+
23+
echo "Spring Boot CLI setup complete!"
24+
echo "You can find the CLI in the spring-boot-cli directory."
25+
26+
# Check if assistant directory exists and remove it if it does
27+
if [ -d "assistant" ]; then
28+
echo "Found existing assistant directory, removing it..."
29+
rm -rf assistant
30+
fi
31+
32+
echo ""
33+
echo "About to initialize Spring Boot project with the following command:"
34+
echo -e "\033[1m./spring-boot-cli/spring-3.5.0/bin/spring init --java-version=21 \033[0m"
35+
echo " --build=maven \\"
36+
echo " --packaging=jar \\"
37+
echo " --type=maven-project \\"
38+
echo " --artifact-id=assistant \\"
39+
echo " --name=assistant \\"
40+
echo " --group-id=com.example \\"
41+
echo -e " \033[1m--dependencies=web,thymeleaf,spring-ai-bedrock-converse \033[0m\\"
42+
echo " --extract \\"
43+
echo " assistant"
44+
45+
echo ""
46+
echo "Press any key to continue with Spring initialization..."
47+
read -n 1 -s
48+
49+
echo ""
50+
echo "Initializing Spring Boot project..."
51+
./spring-boot-cli/spring-3.5.0/bin/spring init --java-version=21 \
52+
--build=maven \
53+
--packaging=jar \
54+
--type=maven-project \
55+
--artifact-id=assistant \
56+
--name=assistant \
57+
--group-id=com.example \
58+
--dependencies=web,thymeleaf,spring-ai-bedrock-converse \
59+
--extract \
60+
assistant
61+
62+
echo ""
63+
echo "Configuring application.properties..."
64+
cd assistant
65+
cat > src/main/resources/application.properties << 'EOL'
66+
# Simplified logging pattern - only show the message
67+
logging.pattern.console=%msg%n
68+
69+
# Debugging
70+
logging.level.org.springframework.ai=DEBUG
71+
spring.ai.chat.observations.log-completion=true
72+
spring.ai.chat.observations.include-error-logging=true
73+
spring.ai.tools.observations.include-content=true
74+
75+
# Thymeleaf Configuration
76+
spring.thymeleaf.cache=false
77+
spring.thymeleaf.prefix=classpath:/templates/
78+
spring.thymeleaf.suffix=.html
79+
80+
# Amazon Bedrock Configuration
81+
spring.ai.bedrock.aws.region=us-east-1
82+
spring.ai.bedrock.converse.chat.options.max-tokens=10000
83+
spring.ai.bedrock.converse.chat.options.model=us.anthropic.claude-3-7-sonnet-20250219-v1:0
84+
EOL
85+
86+
echo ""
87+
echo "Opening files in VS Code..."
88+
code pom.xml
89+
code src/main/java/com/example/assistant/AssistantApplication.java
90+
code src/main/resources/application.properties
91+
92+
echo ""
93+
echo "Press any key to continue with updating AssistantApplication.java..."
94+
read -n 1 -s
95+
96+
echo ""
97+
echo "Updating AssistantApplication.java with CommandLineRunner..."
98+
cat > src/main/java/com/example/assistant/AssistantApplication.java << 'EOL'
99+
package com.example.assistant;
100+
101+
import org.springframework.boot.SpringApplication;
102+
import org.springframework.boot.autoconfigure.SpringBootApplication;
103+
104+
import org.springframework.ai.chat.client.ChatClient;
105+
import org.springframework.boot.CommandLineRunner;
106+
import org.springframework.context.annotation.Bean;
107+
import java.util.Scanner;
108+
109+
@SpringBootApplication
110+
public class AssistantApplication {
111+
112+
public static void main(String[] args) {
113+
SpringApplication.run(AssistantApplication.class, args);
114+
}
115+
116+
@Bean
117+
public CommandLineRunner cli(ChatClient.Builder chatClientBuilder) {
118+
return args -> {
119+
var chatClient = chatClientBuilder
120+
.defaultSystem("You are a AI Assistant, expert in all sorts of things related to travel and expenses management.")
121+
.build();
122+
123+
System.out.println("\nI am your AI Assistant.\n");
124+
try (Scanner scanner = new Scanner(System.in)) {
125+
while (true) {
126+
System.out.print("\nUSER: ");
127+
System.out.println("\nASSISTANT: " +
128+
chatClient.prompt(scanner.nextLine()) // Get the user input
129+
.call()
130+
.content());
131+
}
132+
}
133+
};
134+
}
135+
}
136+
EOL
137+
138+
echo ""
139+
echo "Building the project with Maven..."
140+
./mvnw spring-boot:run -Dspring-boot.run.arguments="--logging.level.org.springframework.ai=INFO"
141+
142+
echo ""
143+
echo "Press any key after you've exited the application..."
144+
read -n 1 -s
145+
146+
echo ""
147+
echo "Reverting AssistantApplication.java to original state..."
148+
cat > src/main/java/com/example/assistant/AssistantApplication.java << 'EOL'
149+
package com.example.assistant;
150+
151+
import org.springframework.boot.SpringApplication;
152+
import org.springframework.boot.autoconfigure.SpringBootApplication;
153+
154+
@SpringBootApplication
155+
public class AssistantApplication {
156+
157+
public static void main(String[] args) {
158+
SpringApplication.run(AssistantApplication.class, args);
159+
}
160+
}
161+
EOL
162+
163+
echo ""
164+
echo "Initializing Git repository..."
165+
git init
166+
git add .
167+
git commit -m "Create project"
168+
169+
cd ..
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
#!/bin/bash
2+
3+
# Script to copy template and Java files to the assistant app
4+
5+
# Set the source folder path
6+
SOURCES_FOLDER="/Users/bezsonov/sources/workshops/java-on-aws/samples/spring-ai"
7+
8+
# Check if source folder exists
9+
if [ ! -d "$SOURCES_FOLDER" ]; then
10+
echo "Error: Source folder $SOURCES_FOLDER does not exist."
11+
exit 1
12+
fi
13+
14+
# Check if assistant folder exists
15+
if [ ! -d "assistant" ]; then
16+
echo "Error: assistant folder not found in current directory."
17+
echo "Please run this script from the directory containing the assistant folder."
18+
exit 1
19+
fi
20+
21+
echo "Creating necessary directories..."
22+
# Create templates directory if it doesn't exist
23+
mkdir -p assistant/src/main/resources/templates
24+
25+
# Create package directories if they don't exist
26+
mkdir -p assistant/src/main/java/com/example/assistant
27+
mkdir -p assistant/src/main/java/com/example/assistant/config
28+
mkdir -p assistant/src/main/java/com/example/assistant/controller
29+
mkdir -p assistant/src/main/java/com/example/assistant/model
30+
mkdir -p assistant/src/main/java/com/example/assistant/service
31+
mkdir -p assistant/src/main/java/com/example/assistant/util
32+
33+
echo "Copying template file..."
34+
# Copy template file - check if it exists first
35+
if [ -f "$SOURCES_FOLDER/assistant/templates/chat.html" ]; then
36+
cp "$SOURCES_FOLDER/assistant/templates/chat.html" assistant/src/main/resources/templates/
37+
elif [ -f "$SOURCES_FOLDER/assistant/src/main/resources/templates/chat.html" ]; then
38+
cp "$SOURCES_FOLDER/assistant/src/main/resources/templates/chat.html" assistant/src/main/resources/templates/
39+
else
40+
echo "Warning: chat.html not found in expected locations. Skipping."
41+
fi
42+
43+
echo "Copying Java files..."
44+
# Copy Java files - check each possible location
45+
46+
# PromptConfig.java
47+
if [ -f "$SOURCES_FOLDER/assistant/src/main/java/com/example/assistant/config/PromptConfig.java" ]; then
48+
cp "$SOURCES_FOLDER/assistant/src/main/java/com/example/assistant/config/PromptConfig.java" assistant/src/main/java/com/example/assistant/config/
49+
elif [ -f "$SOURCES_FOLDER/assistant/src/main/java/com/example/assistant/PromptConfig.java" ]; then
50+
cp "$SOURCES_FOLDER/assistant/src/main/java/com/example/assistant/PromptConfig.java" assistant/src/main/java/com/example/assistant/
51+
else
52+
echo "Warning: PromptConfig.java not found in expected locations. Skipping."
53+
fi
54+
55+
# ChatController.java
56+
if [ -f "$SOURCES_FOLDER/assistant/src/main/java/com/example/assistant/controller/ChatController.java" ]; then
57+
cp "$SOURCES_FOLDER/assistant/src/main/java/com/example/assistant/controller/ChatController.java" assistant/src/main/java/com/example/assistant/controller/
58+
elif [ -f "$SOURCES_FOLDER/assistant/src/main/java/com/example/assistant/ChatController.java" ]; then
59+
cp "$SOURCES_FOLDER/assistant/src/main/java/com/example/assistant/ChatController.java" assistant/src/main/java/com/example/assistant/
60+
else
61+
echo "Warning: ChatController.java not found in expected locations. Skipping."
62+
fi
63+
64+
# WebViewController.java
65+
if [ -f "$SOURCES_FOLDER/assistant/src/main/java/com/example/assistant/controller/WebViewController.java" ]; then
66+
cp "$SOURCES_FOLDER/assistant/src/main/java/com/example/assistant/controller/WebViewController.java" assistant/src/main/java/com/example/assistant/controller/
67+
elif [ -f "$SOURCES_FOLDER/assistant/src/main/java/com/example/assistant/WebViewController.java" ]; then
68+
cp "$SOURCES_FOLDER/assistant/src/main/java/com/example/assistant/WebViewController.java" assistant/src/main/java/com/example/assistant/
69+
else
70+
echo "Warning: WebViewController.java not found in expected locations. Skipping."
71+
fi
72+
73+
# ChatRequest.java
74+
if [ -f "$SOURCES_FOLDER/assistant/src/main/java/com/example/assistant/model/ChatRequest.java" ]; then
75+
cp "$SOURCES_FOLDER/assistant/src/main/java/com/example/assistant/model/ChatRequest.java" assistant/src/main/java/com/example/assistant/model/
76+
elif [ -f "$SOURCES_FOLDER/assistant/src/main/java/com/example/assistant/ChatRequest.java" ]; then
77+
cp "$SOURCES_FOLDER/assistant/src/main/java/com/example/assistant/ChatRequest.java" assistant/src/main/java/com/example/assistant/
78+
else
79+
echo "Warning: ChatRequest.java not found in expected locations. Skipping."
80+
fi
81+
82+
# RetryUtils.java
83+
if [ -f "$SOURCES_FOLDER/assistant/src/main/java/com/example/assistant/util/RetryUtils.java" ]; then
84+
cp "$SOURCES_FOLDER/assistant/src/main/java/com/example/assistant/util/RetryUtils.java" assistant/src/main/java/com/example/assistant/util/
85+
elif [ -f "$SOURCES_FOLDER/assistant/src/main/java/com/example/assistant/RetryUtils.java" ]; then
86+
cp "$SOURCES_FOLDER/assistant/src/main/java/com/example/assistant/RetryUtils.java" assistant/src/main/java/com/example/assistant/
87+
else
88+
echo "Warning: RetryUtils.java not found in expected locations. Skipping."
89+
fi
90+
91+
# ChatService.java - Copy from the specific location only
92+
echo "Copying ChatService.java from demo-scripts folder..."
93+
if [ -f "$SOURCES_FOLDER/demo-scripts/ChatService/ChatService.java.2" ]; then
94+
cp "$SOURCES_FOLDER/demo-scripts/ChatService/ChatService.java.2" assistant/src/main/java/com/example/assistant/service/ChatService.java
95+
echo "ChatService.java copied successfully."
96+
97+
# Open ChatService.java in VS Code
98+
echo "Opening ChatService.java in VS Code..."
99+
code assistant/src/main/java/com/example/assistant/service/ChatService.java
100+
else
101+
echo "Error: ChatService.java.2 not found at $SOURCES_FOLDER/demo-scripts/ChatService/."
102+
echo "Please ensure the file exists at the specified location."
103+
exit 1
104+
fi
105+
106+
echo "Files copied successfully."
107+
108+
# Show git status
109+
echo ""
110+
echo "Git status:"
111+
git status
112+
113+
echo ""
114+
echo "Done!"

0 commit comments

Comments
 (0)