Loading docker-compose.yml +1 −0 Original line number Diff line number Diff line Loading @@ -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 Loading src/main/java/org/etsi/osl/mcp/backend/ChatController.java +16 −4 Original line number Diff line number Diff line 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") Loading src/main/resources/application.yaml +2 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading
docker-compose.yml +1 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
src/main/java/org/etsi/osl/mcp/backend/ChatController.java +16 −4 Original line number Diff line number Diff line 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") Loading
src/main/resources/application.yaml +2 −0 Original line number Diff line number Diff line Loading @@ -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 Loading