From 290bb439d1e06b2b3a81ed3d128f8d7ad6ffcb70 Mon Sep 17 00:00:00 2001 From: Oded Shopen Date: Tue, 10 Sep 2024 19:43:06 +0300 Subject: [PATCH] Chatbot for Spring Petclinic. Supports quering the owners, also guides the user through adding a pet to an owner --- .gitignore | 1 + .tanzu/config/httproute.yml | 25 ++++ .tanzu/config/spring-petclinic.yml | 18 +++ build.gradle | 11 +- pom.xml | 18 ++- readme.md | 23 ++++ spring-ai.png | Bin 0 -> 109210 bytes .../petclinic/PetClinicApplication.java | 4 - .../genai/AIFunctionConfiguration.java | 72 +++++++++++ .../petclinic/genai/LoggingAdvisor.java | 25 ++++ .../genai/PetclinicAIConfiguration.java | 29 +++++ .../petclinic/genai/PetclinicAIProvider.java | 51 ++++++++ .../petclinic/genai/PetclinicChatClient.java | 62 ++++++++++ .../genai/PetclinicDisabledChatClient.java | 25 ++++ .../resources/application-openai.properties | 15 +++ src/main/resources/application.properties | 6 + src/main/resources/creds-template.yaml | 17 +++ .../static/resources/css/petclinic.css | 116 +++++++++++++++++- .../resources/templates/fragments/layout.html | 114 ++++++++++++++++- src/main/scss/chatbot.scss | 88 +++++++++++++ src/main/scss/petclinic.scss | 1 + tanzu.yml | 6 + 22 files changed, 719 insertions(+), 8 deletions(-) create mode 100644 .tanzu/config/httproute.yml create mode 100644 .tanzu/config/spring-petclinic.yml create mode 100644 spring-ai.png create mode 100644 src/main/java/org/springframework/samples/petclinic/genai/AIFunctionConfiguration.java create mode 100644 src/main/java/org/springframework/samples/petclinic/genai/LoggingAdvisor.java create mode 100644 src/main/java/org/springframework/samples/petclinic/genai/PetclinicAIConfiguration.java create mode 100644 src/main/java/org/springframework/samples/petclinic/genai/PetclinicAIProvider.java create mode 100644 src/main/java/org/springframework/samples/petclinic/genai/PetclinicChatClient.java create mode 100644 src/main/java/org/springframework/samples/petclinic/genai/PetclinicDisabledChatClient.java create mode 100644 src/main/resources/application-openai.properties create mode 100644 src/main/resources/creds-template.yaml create mode 100644 src/main/scss/chatbot.scss create mode 100644 tanzu.yml diff --git a/.gitignore b/.gitignore index af0cb9bb0..e8b58c9db 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ build/* _site/ *.css !petclinic.css +**/creds.yaml \ No newline at end of file diff --git a/.tanzu/config/httproute.yml b/.tanzu/config/httproute.yml new file mode 100644 index 000000000..42f6fb724 --- /dev/null +++ b/.tanzu/config/httproute.yml @@ -0,0 +1,25 @@ +apiVersion: gateway.networking.k8s.io/v1beta1 +kind: HTTPRoute +metadata: + name: petclinic-route + annotations: + healthcheck.gslb.tanzu.vmware.com/service: spring-petclinic + healthcheck.gslb.tanzu.vmware.com/path: / + healthcheck.gslb.tanzu.vmware.com/port: "80" +spec: + parentRefs: + - group: gateway.networking.k8s.io + kind: Gateway + name: default-gateway + sectionName: http-petclinic + rules: + - backendRefs: + - group: "" + kind: Service + name: spring-petclinic + port: 8080 + weight: 1 + matches: + - path: + type: PathPrefix + value: / diff --git a/.tanzu/config/spring-petclinic.yml b/.tanzu/config/spring-petclinic.yml new file mode 100644 index 000000000..26c47b519 --- /dev/null +++ b/.tanzu/config/spring-petclinic.yml @@ -0,0 +1,18 @@ +apiVersion: apps.tanzu.vmware.com/v1 +kind: ContainerApp +metadata: + creationTimestamp: null + name: spring-petclinic +spec: + nonSecretEnv: + - name: SPRING_PROFILES_ACTIVE + value: openai + build: + buildpacks: {} + nonSecretEnv: + - name: BP_JVM_VERSION + value: "17" + path: ../.. + ports: + - name: main + port: 8080 diff --git a/build.gradle b/build.gradle index 397f898bc..cf3ea5681 100644 --- a/build.gradle +++ b/build.gradle @@ -23,12 +23,15 @@ java { repositories { mavenCentral() + maven { url 'https://repo.spring.io/milestone' } } ext.webjarsFontawesomeVersion = "4.7.0" ext.webjarsBootstrapVersion = "5.3.3" +ext.springAiVersion = "1.0.0-M2" dependencies { + implementation 'org.springframework.ai:spring-ai-azure-openai-spring-boot-starter' implementation 'org.springframework.boot:spring-boot-starter-cache' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' @@ -53,6 +56,12 @@ dependencies { checkstyle 'com.puppycrawl.tools:checkstyle:10.16.0' } +dependencyManagement { + imports { + mavenBom "org.springframework.ai:spring-ai-bom:${springAiVersion}" + } +} + tasks.named('test') { useJUnitPlatform() } @@ -80,4 +89,4 @@ checkFormatAot.enabled = false checkFormatAotTest.enabled = false formatAot.enabled = false -formatAotTest.enabled = false +formatAotTest.enabled = false \ No newline at end of file diff --git a/pom.xml b/pom.xml index c948f9e33..3070fa75c 100644 --- a/pom.xml +++ b/pom.xml @@ -34,11 +34,15 @@ 3.3.1 0.0.11 0.0.41 - + 1.0.0-M2 + + org.springframework.ai + spring-ai-azure-openai-spring-boot-starter + org.springframework.boot spring-boot-starter-actuator @@ -141,6 +145,18 @@ + + + + org.springframework.ai + spring-ai-bom + ${spring-ai.version} + pom + import + + + + diff --git a/readme.md b/readme.md index 9dea4591b..057e923a1 100644 --- a/readme.md +++ b/readme.md @@ -75,6 +75,29 @@ or ```bash docker-compose --profile postgres up ``` +## Integrating the Spring AI Chatbot + +Spring Petclinic integrates a Chatbot that allows you to interact with the application in a natural language. Here are some examples of what you could ask: + +1. Please list the owners that come to the clinic. +2. How many vets are there? +3. Is there an owner named Betty? +4. Which owners have dogs? +5. Add a dog for Betty. Its name is Moopsie. + +![alt text](spring-ai.png) + +By default, The Spring AI Chatbot is disabled and will return the message `Chat is currently unavailable. Please try again later.`. + +Spring Petclinic currently supports OpenAI or Azure's OpenAI as the LLM provider. +In order to enable Spring AI, perform the following steps: + +1. Decide which provider you want to use. By default, the `spring-ai-azure-openai-spring-boot-starter` dependency is enabled. You can change it to `spring-ai-openai-spring-boot-starter`in either`pom.xml` or in `build.gradle`, depending on your build tool of choice. +2. Copy `src/main/resources/creds-template.yaml` into `src/main/resources/creds.yaml`, and edit its contents with your API key and API endpoint. Refer to OpenAI's or Azure's documentation for further information on how to obtain these. You only need to populate the provider you're using - either openai, or azure-openai. +3. Boot your application with the `openai` profile. This profile will work for both LLM providers. You can boot the application with that profile using any of the following: +- For maven: `mvn -Dspring-boot.run.profiles=openai spring-boot:run` +- For Gradle: `./gradlew bootRun --args='--spring.profiles.active=openai'` +- For a standard jar file: `SPRING_PROFILES_ACTIVE=openai java -jar build/libs/spring-petclinic-3.3.0.jar` or `SPRING_PROFILES_ACTIVE=openai java -jar target/spring-petclinic-3.3.0-SNAPSHOT.jar`. ## Test Applications diff --git a/spring-ai.png b/spring-ai.png new file mode 100644 index 0000000000000000000000000000000000000000..441de4220f83b07c5d67b711cd01f8739cefe8f0 GIT binary patch literal 109210 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
abzO$4Nf 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 il06LQ`SEw)S>(wN{ND_rF!x)yM@Pdzy listOwners(PetclinicAIProvider petclinicAiProvider) { + return request -> { + return petclinicAiProvider.getAllOwners(); + }; + } + + @Bean + @Description("List the veterinarians that the pet clinic has") + public Function listVets(PetclinicAIProvider petclinicAiProvider) { + return request -> { + return petclinicAiProvider.getAllVets(); + }; + } + + @Bean + @Description("Add a pet with the specified petTypeId, " + "to an owner identified by the ownerId. " + + "The allowed Pet types IDs are only: " + "1 - cat" + "2 - dog" + "3 - lizard" + "4 - snake" + "5 - bird" + + "6 - hamster") + public Function addPetToOwner(PetclinicAIProvider petclinicAiProvider) { + return request -> { + return petclinicAiProvider.addPetToOwner(request); + }; + } + +} + +record AddPetRequest(Pet pet, String petType, Integer ownerId) { +}; + +record OwnerRequest(Owner owner) { +}; + +record OwnersResponse(List owners) { +}; + +record AddedPetResponse(Owner owner) { +}; + +record VetResponse(List vet) { +}; + +record VetRequest(Vet vet) { + +} \ No newline at end of file diff --git a/src/main/java/org/springframework/samples/petclinic/genai/LoggingAdvisor.java b/src/main/java/org/springframework/samples/petclinic/genai/LoggingAdvisor.java new file mode 100644 index 000000000..19d828bd7 --- /dev/null +++ b/src/main/java/org/springframework/samples/petclinic/genai/LoggingAdvisor.java @@ -0,0 +1,25 @@ +package org.springframework.samples.petclinic.genai; + +import java.util.Map; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.ai.chat.client.AdvisedRequest; +import org.springframework.ai.chat.client.RequestResponseAdvisor; + +/** + * A ChatClient Advisor that adds logs on the requests being sent to the LLM. + * + * @author Oded Shopen + */ +public class LoggingAdvisor implements RequestResponseAdvisor { + + private static final Log log = LogFactory.getLog(LoggingAdvisor.class); + + @Override + public AdvisedRequest adviseRequest(AdvisedRequest request, Map context) { + log.info("Received Spring AI Request: " + request); + return request; + } + +} \ No newline at end of file diff --git a/src/main/java/org/springframework/samples/petclinic/genai/PetclinicAIConfiguration.java b/src/main/java/org/springframework/samples/petclinic/genai/PetclinicAIConfiguration.java new file mode 100644 index 000000000..4a7c344cf --- /dev/null +++ b/src/main/java/org/springframework/samples/petclinic/genai/PetclinicAIConfiguration.java @@ -0,0 +1,29 @@ +package org.springframework.samples.petclinic.genai; + +import org.springframework.ai.chat.memory.ChatMemory; +import org.springframework.ai.chat.memory.InMemoryChatMemory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import org.springframework.web.client.RestClient; + +/** + * A Configuration class for beans used by the Chat Client. + * + * @author Oded Shopen + */ +@Configuration +@Profile("openai") +public class PetclinicAIConfiguration { + + @Bean + public RestClient restClient() { + return RestClient.create(); + } + + @Bean + public ChatMemory chatMemory() { + return new InMemoryChatMemory(); + } + +} diff --git a/src/main/java/org/springframework/samples/petclinic/genai/PetclinicAIProvider.java b/src/main/java/org/springframework/samples/petclinic/genai/PetclinicAIProvider.java new file mode 100644 index 000000000..420f6a12a --- /dev/null +++ b/src/main/java/org/springframework/samples/petclinic/genai/PetclinicAIProvider.java @@ -0,0 +1,51 @@ +package org.springframework.samples.petclinic.genai; + +import org.springframework.context.annotation.Profile; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.samples.petclinic.owner.Owner; +import org.springframework.samples.petclinic.owner.OwnerRepository; +import org.springframework.samples.petclinic.vet.Vet; +import org.springframework.samples.petclinic.vet.VetRepository; +import org.springframework.stereotype.Service; + +/** + * Functions that are invoked by the LLM will use this bean to query the system of record + * for information such as listing owners and vers, or adding pets to an owner. + * + * @author Oded Shopen + */ +@Service +@Profile("openai") +public class PetclinicAIProvider { + + OwnerRepository ownerRepository; + + VetRepository vetRepository; + + public PetclinicAIProvider(OwnerRepository ownerRepository, VetRepository vetRepository) { + this.ownerRepository = ownerRepository; + this.vetRepository = vetRepository; + } + + public OwnersResponse getAllOwners() { + Pageable pageable = PageRequest.of(0, Integer.MAX_VALUE); + Page ownerPage = ownerRepository.findAll(pageable); + return new OwnersResponse(ownerPage.getContent()); + } + + public VetResponse getAllVets() { + Pageable pageable = PageRequest.of(0, Integer.MAX_VALUE); + Page vetsPage = vetRepository.findAll(pageable); + return new VetResponse(vetsPage.getContent()); + } + + public AddedPetResponse addPetToOwner(AddPetRequest request) { + Owner owner = ownerRepository.findById(request.ownerId()); + owner.addPet(request.pet()); + this.ownerRepository.save(owner); + return new AddedPetResponse(owner); + } + +} diff --git a/src/main/java/org/springframework/samples/petclinic/genai/PetclinicChatClient.java b/src/main/java/org/springframework/samples/petclinic/genai/PetclinicChatClient.java new file mode 100644 index 000000000..b39ad13a0 --- /dev/null +++ b/src/main/java/org/springframework/samples/petclinic/genai/PetclinicChatClient.java @@ -0,0 +1,62 @@ +package org.springframework.samples.petclinic.genai; + +import static org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor.DEFAULT_CHAT_MEMORY_CONVERSATION_ID; + +import org.springframework.ai.chat.client.ChatClient; +import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor; +import org.springframework.ai.chat.memory.ChatMemory; +import org.springframework.context.annotation.Profile; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * This REST controller is being invoked by the in order to interact with the LLM + * + * @author Oded Shopen + */ +@RestController +@RequestMapping("/") +@Profile("openai") +public class PetclinicChatClient { + + // ChatModel is the primary interfaces for interacting with an LLM + // it is a request/response interface that implements the ModelModel + // interface. Make suer to visit the source code of the ChatModel and + // checkout the interfaces in the core spring ai package. + private final ChatClient chatClient; + + public PetclinicChatClient(ChatClient.Builder builder, ChatMemory chatMemory) { + // @formatter:off + this.chatClient = builder + .defaultSystem(""" + You are a friendly AI assistant designed to help with the management of a veterinarian pet clinic called Spring Petclinic. + Your job is to answer questions about the existing veterinarians and to perform actions on the customer's behalf, mainly around + pet owners, their pets and their visits. + You are required to answer an a professional manner. If you don't know the answer, politely tell the customer + you don't know the answer, then ask the customer a followup qusetion to try and clarify the question they are asking. + If you do know the answer, provide the answer but do not provide any additional helpful followup questions. + """) + .defaultAdvisors( + // Chat memory helps us keep context when using the chatbot for up to 10 previous messages. + new MessageChatMemoryAdvisor(chatMemory, DEFAULT_CHAT_MEMORY_CONVERSATION_ID, 10), // CHAT MEMORY + new LoggingAdvisor() + ) + .build(); + } + + @PostMapping("/chatclient") + public String exchange(@RequestBody String query) { + //All chatbot messages go through this endpoint and are passed to the LLM + return + this.chatClient + .prompt() + .user( + u -> + u.text(query) + ) + .call() + .content(); + } +} diff --git a/src/main/java/org/springframework/samples/petclinic/genai/PetclinicDisabledChatClient.java b/src/main/java/org/springframework/samples/petclinic/genai/PetclinicDisabledChatClient.java new file mode 100644 index 000000000..eaf0660ee --- /dev/null +++ b/src/main/java/org/springframework/samples/petclinic/genai/PetclinicDisabledChatClient.java @@ -0,0 +1,25 @@ +package org.springframework.samples.petclinic.genai; + +import org.springframework.context.annotation.Profile; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * This REST controller implements a default behavior for the chat client when AI profile + * is not in use. It will return a default message that chat is not available. + * + * @author Oded Shopen + */ +@RestController +@RequestMapping("/") +@Profile("!openai") +public class PetclinicDisabledChatClient { + + @PostMapping("/chatclient") + public String exchange(@RequestBody String query) { + return "Chat is currently unavailable. Please try again later."; + } + +} diff --git a/src/main/resources/application-openai.properties b/src/main/resources/application-openai.properties new file mode 100644 index 000000000..ff9561a17 --- /dev/null +++ b/src/main/resources/application-openai.properties @@ -0,0 +1,15 @@ +spring.config.import=optional:classpath:/creds.yaml + +#These apply when using spring-ai-azure-openai-spring-boot-starter +spring.ai.azure.openai.chat.options.functions=listOwners,listVets,addPetToOwner +spring.ai.azure.openai.chat.options.temperature: 0.7 + +#These apply when using spring-ai-openai-spring-boot-starter +spring.ai.openai.chat.options.functions=listOwners,listVets,addPetToOwner +spring.ai.openai.chat.options.temperature: 0.7 + +#Enable Spring AI by default +spring.ai.chat.client.enabled=true + + + diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 5d3eeed32..bd16242bc 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -23,3 +23,9 @@ logging.level.org.springframework=INFO # Maximum time static resources should be cached spring.web.resources.cache.cachecontrol.max-age=12h + +#Disable Spring AI by default +spring.ai.chat.client.enabled=false +#Currently these properties require dummy values when a spring AI is in the classpath, even when chat is disabled. +spring.ai.azure.openai.api-key=dummy +spring.ai.azure.openai.endpoint=dummy diff --git a/src/main/resources/creds-template.yaml b/src/main/resources/creds-template.yaml new file mode 100644 index 000000000..efa0c15c7 --- /dev/null +++ b/src/main/resources/creds-template.yaml @@ -0,0 +1,17 @@ +spring: + ai: + #These parameters only apply when using the spring-ai-azure-openai-spring-boot-starter dependency: + azure: + openai: + api-key: "" + endpoint: "" + chat: + options: + deployment-name: "gpt-4o" + #These parameters only apply when using the spring-ai-openai-spring-boot-starter dependency: + openai: + api-key: "" + endpoint: "" + chat: + options: + deployment-name: "gpt-4o" \ No newline at end of file diff --git a/src/main/resources/static/resources/css/petclinic.css b/src/main/resources/static/resources/css/petclinic.css index bbf3f0dbb..4cb124baf 100644 --- a/src/main/resources/static/resources/css/petclinic.css +++ b/src/main/resources/static/resources/css/petclinic.css @@ -9517,4 +9517,118 @@ strong { margin-top: 10px; margin-bottom: 30px; } } -/*# sourceMappingURL=../../../../../../target/petclinic.css.map */ \ No newline at end of file +/*# sourceMappingURL=../../../../../../target/petclinic.css.map */ + + + +/* Chatbox container */ +.chatbox { + position: fixed; + bottom: 10px; + right: 10px; + width: 300px; + background-color: #f1f1f1; + border-radius: 10px; + box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1); + display: flex; + flex-direction: column; +} + +/* Header styling */ +.chatbox-header { + background-color: #075E54; + color: white; + padding: 10px; + text-align: center; + border-top-left-radius: 10px; + border-top-right-radius: 10px; + cursor: pointer; +} + +/* Chatbox content styling */ +.chatbox-content { + display: flex; + flex-direction: column; + height: 400px; /* Adjust to desired height */ + overflow: hidden; /* Hide overflow to make it scrollable */ +} + +/* Minimize style */ +.chatbox.minimized .chatbox-content { + height: 40px; /* Height when minimized (header only) */ +} + +.chatbox.minimized .chatbox-messages, +.chatbox.minimized .chatbox-footer { + display: none; +} + +.chatbox-messages { + flex-grow: 1; + overflow-y: auto; /* Allows vertical scrolling */ + padding: 10px; +} + +/* Chat bubbles styling */ +.chat-bubble { + max-width: 80%; + padding: 10px; + border-radius: 20px; + margin-bottom: 10px; + position: relative; + word-wrap: break-word; + font-size: 14px; +} + +/* Ensure bold and italic styles are handled */ +.chat-bubble strong { + font-weight: bold; +} + +.chat-bubble em { + font-style: italic; +} + +.chat-bubble.user { + background-color: #dcf8c6; /* WhatsApp-style light green */ + margin-left: auto; + text-align: right; + border-bottom-right-radius: 0; +} + +.chat-bubble.bot { + background-color: #ffffff; + margin-right: auto; + text-align: left; + border-bottom-left-radius: 0; + border: 1px solid #e1e1e1; +} + +/* Input field and button */ +.chatbox-footer { + padding: 10px; + background-color: #f9f9f9; + display: flex; +} + +.chatbox-footer input { + flex-grow: 1; + padding: 10px; + border-radius: 20px; + border: 1px solid #ccc; + margin-right: 10px; + outline: none; +} + +.chatbox-footer button { + background-color: #075E54; + color: white; + border: none; + padding: 10px; + border-radius: 50%; + cursor: pointer; +} + +.chatbox-footer button:hover { + background-color: #128C7E; +} diff --git a/src/main/resources/templates/fragments/layout.html b/src/main/resources/templates/fragments/layout.html index 3e9bc398b..83622b0bf 100755 --- a/src/main/resources/templates/fragments/layout.html +++ b/src/main/resources/templates/fragments/layout.html @@ -70,6 +70,7 @@ +
@@ -87,7 +88,118 @@
- + +
+
+ Chat with Us! +
+
+
+ +
+ +
+
+ + + + + + + + + + + + + diff --git a/src/main/scss/chatbot.scss b/src/main/scss/chatbot.scss new file mode 100644 index 000000000..fbce21b19 --- /dev/null +++ b/src/main/scss/chatbot.scss @@ -0,0 +1,88 @@ +.chatbox { + position: fixed; + bottom: 0; + right: 0; + width: 300px; + border-radius: 10px 10px 0 0; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); + font-family: Arial, sans-serif; + background-color: #f0f0f0; + overflow: hidden; + + &.minimized { + height: 40px; + } + + &-header { + background-color: $spring-green; + color: white; + padding: 10px; + cursor: pointer; + font-weight: bold; + text-align: center; + } + + &-content { + height: 400px; + display: flex; + flex-direction: column; + justify-content: space-between; + background-color: white; + transition: height 0.3s ease; + } + + &-messages { + padding: 10px; + overflow-y: auto; + height: 90%; + display: flex; + flex-direction: column; + gap: 10px; + + .chat-bubble { + padding: 10px; + border-radius: 15px; + max-width: 70%; + word-wrap: break-word; + + &.user { + background-color: $spring-brown; + color: white; + align-self: flex-end; + } + + &.bot { + background-color: $spring-grey; + color: black; + align-self: flex-start; + } + } + } + + &-footer { + display: flex; + padding: 10px; + background-color: $spring-light-grey; + + input { + flex: 1; + padding: 10px; + border-radius: 5px; + border: 1px solid $spring-brown; + } + + button { + margin-left: 10px; + padding: 10px 20px; + background-color: $spring-green; + color: white; + border: none; + border-radius: 5px; + cursor: pointer; + + &:hover { + background-color: darken($spring-green, 10%); + } + } + } +} diff --git a/src/main/scss/petclinic.scss b/src/main/scss/petclinic.scss index 7f3e64ed2..527719487 100644 --- a/src/main/scss/petclinic.scss +++ b/src/main/scss/petclinic.scss @@ -212,3 +212,4 @@ hr { @import "typography.scss"; @import "header.scss"; @import "responsive.scss"; +@import "chatbot.scss"; \ No newline at end of file diff --git a/tanzu.yml b/tanzu.yml new file mode 100644 index 000000000..ca7b3ffe2 --- /dev/null +++ b/tanzu.yml @@ -0,0 +1,6 @@ +apiVersion: config.tanzu.vmware.com/v1 +configuration: + dev: + paths: + - .tanzu/config/ +kind: TanzuConfig