Spring AI
Spring AI integrates LLMs into enterprise systems. Wrap the underlying LLM client via Spring configuration to normalize and score combined inputs before generation.
Configuration
Section titled “Configuration”import org.springframework.ai.openai.OpenAiChatClient;import org.springframework.ai.openai.OpenAiChatOptions;import org.springframework.ai.openai.api.OpenAiApi;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;
@Configurationpublic class GlitchConfig {
// Bean: Creates the OpenAI API client configured to use Glitch @Bean public OpenAiApi openAiApi() { return new OpenAiApi( "https://api.golabrat.ai/v1", // Glitch base URL System.getenv("GLITCH_API_KEY"), // Your Glitch API key null // Uses default HTTP client ); }
// Bean: Creates the chat client that uses the Glitch-configured API @Bean public OpenAiChatClient openAiChatClient(OpenAiApi openAiApi) { return new OpenAiChatClient(openAiApi, OpenAiChatOptions.builder() .withModel("gpt-4") .build()); }}Basic Example
Section titled “Basic Example”import org.springframework.ai.chat.ChatClient;import org.springframework.ai.chat.prompt.Prompt;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;
@Servicepublic class ChatService {
@Autowired private ChatClient chatClient;
public String chat(String userMessage) { // All LLM calls are automatically secured via Glitch return chatClient.call( new Prompt(userMessage) ).getResult().getOutput().getContent(); }}Pre-screening Content with /v1/detect
Section titled “Pre-screening Content with /v1/detect”For pre-screening content before sending to Spring AI, or when you need structured detection results, use the /v1/detect endpoint:
import org.springframework.web.client.RestClient;import org.springframework.http.ResponseEntity;import java.util.Map;
@Configurationpublic class GlitchRestClientConfig {
@Bean public RestClient glitchRestClient() { return RestClient.builder() .baseUrl("https://api.golabrat.ai/v1") .defaultHeader("Authorization", "Bearer " + System.getenv("GLITCH_API_KEY")) .build(); }
public boolean preScreenContent(String content) { Map<String, Object> requestBody = Map.of( "content", content, "direction", "input" );
ResponseEntity<Map> response = glitchRestClient().post() .uri("/detect") .body(requestBody) .retrieve() .toEntity(Map.class);
Map<String, Object> result = response.getBody(); Boolean blocked = (Boolean) result.get("blocked");
return Boolean.TRUE.equals(blocked); }}Error Handling
Section titled “Error Handling”Handle security blocks in your service layer:
import org.springframework.ai.chat.ChatResponse;import org.springframework.http.HttpStatus;import org.springframework.web.server.ResponseStatusException;
@Servicepublic class ChatService {
@Autowired private ChatClient chatClient;
public String chat(String userMessage) { try { ChatResponse response = chatClient.call(new Prompt(userMessage)); return response.getResult().getOutput().getContent(); } catch (Exception e) { // Check if it's a security block (403) if (e.getMessage() != null && e.getMessage().contains("403")) { throw new ResponseStatusException( HttpStatus.FORBIDDEN, "Request blocked by security policy" ); } throw e; } }}Next Steps
Section titled “Next Steps”- Frameworks Overview — Other framework integrations
- Quick Start — Get running in 5 minutes
- API Reference — Full endpoint documentation