diff --git a/docker-compose.yml b/docker-compose.yml index 4c5ef6da85132867d93d174fd015fd2437a85e67..fd952ac4fcbf5e6583661860b7dcb53b255eb352 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -38,6 +38,7 @@ services: SPRING_AI_OLLAMA_BASE_URL: http://ollama:11434 SPRING_AI_OLLAMA_CHAT_MODEL: gpt-oss:20b SPRING_AI_OLLAMA_CHAT_TEMPERATURE: 0.7 + SPRING_AI_CHAT_SYSTEM_PROMPT: "You are an OpenSlice AI assistant" # MCP Client Configuration SPRING_AI_MCP_CLIENT_TYPE: SYNC diff --git a/src/main/java/org/etsi/osl/mcp/backend/ChatController.java b/src/main/java/org/etsi/osl/mcp/backend/ChatController.java index 2d9fbcca118d11ba3c94395e9d5619953fcc9176..ff0bc740cb2241fe690db977ab9882fda636bba6 100644 --- a/src/main/java/org/etsi/osl/mcp/backend/ChatController.java +++ b/src/main/java/org/etsi/osl/mcp/backend/ChatController.java @@ -1,27 +1,39 @@ package org.etsi.osl.mcp.backend; import java.util.Map; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor; import org.springframework.ai.tool.ToolCallbackProvider; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.web.bind.annotation.*; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; @RestController public class ChatController { private static final Logger log = LoggerFactory.getLogger(ChatController.class); private final ChatClient chatClient; + private final String systemPrompt; public ChatController(ChatClient.Builder chatClientBuilder, - ToolCallbackProvider tools) { + ToolCallbackProvider tools, + @Value("${spring.ai.chat.system-prompt}") String systemPrompt) { + // Validate that system prompt is not empty + if (systemPrompt == null || systemPrompt.trim().isEmpty()) { + throw new IllegalArgumentException("System prompt cannot be null or empty. Please configure SPRING_AI_CHAT_SYSTEM_PROMPT with a valid value."); + } + + this.systemPrompt = systemPrompt; this.chatClient = chatClientBuilder .defaultAdvisors(new SimpleLoggerAdvisor()) .defaultToolCallbacks(tools) + .defaultSystem(systemPrompt) .build(); + log.info("ChatController initialized with system prompt: {}", systemPrompt); } @PostMapping("/ask") diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 83819de6ff53a1adecd2858ac086e459b8d3250a..a485f68d912af1e7c12e3cd964cd91805d032c60 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -12,6 +12,8 @@ spring: options: model: ${SPRING_AI_OLLAMA_CHAT_MODEL:gpt-oss:20b} temperature: ${SPRING_AI_OLLAMA_CHAT_TEMPERATURE:0.7} + chat: + system-prompt: ${SPRING_AI_CHAT_SYSTEM_PROMPT:You are an OpenSlice AI assistant.} mcp: client: type: ${SPRING_AI_MCP_CLIENT_TYPE:SYNC} # or ASYNC