Java SDK Tutorial
This tutorial will guide you through using the Cloakr.ai SDK in Java applications, from basic setup to advanced features.
Installation
Prerequisites
- Java 11+
- Maven or Gradle
Maven Dependency
<dependency>
<groupId>ai.cloakr</groupId>
<artifactId>cloakr-sdk</artifactId>
<version>1.0.0</version>
</dependency>
Gradle Dependency
implementation 'ai.cloakr:cloakr-sdk:1.0.0'
Basic Setup
Initialize the Client
import ai.cloakr.CloakrClient;
import ai.cloakr.config.ClientConfig;
public class CloakrExample {
public static void main(String[] args) {
ClientConfig config = ClientConfig.builder()
.apiKey(System.getenv("CLOAKR_API_KEY"))
.encryption(true)
.piiDetection(true)
.retryAttempts(3)
.timeout(Duration.ofSeconds(30))
.build();
CloakrClient client = new CloakrClient(config);
}
}
Environment Variables
Set environment variables in your system or use a .env
file:
CLOAKR_API_KEY=your-api-key-here
CLOAKR_ENCRYPTION_KEY=your-encryption-key-here # Optional
CLOAKR_KEY_ID=your-key-id-here # Optional
Basic Usage
Simple Chat Request
import ai.cloakr.CloakrClient;
import ai.cloakr.models.ChatRequest;
import ai.cloakr.models.ChatResponse;
public class SimpleChatExample {
public static void main(String[] args) {
CloakrClient client = new CloakrClient(
System.getenv("CLOAKR_API_KEY")
);
try {
ChatRequest request = ChatRequest.builder()
.model("gpt-4o")
.prompt("What is Cloakr.ai?")
.maxTokens(1000)
.temperature(0.7)
.build();
ChatResponse response = client.chat(request);
System.out.println(response.getChoices().get(0).getText());
} catch (Exception e) {
System.err.println("Error: " + e.getMessage());
}
}
}
Async Chat Request
import ai.cloakr.CloakrClient;
import ai.cloakr.models.ChatRequest;
import ai.cloakr.models.ChatResponse;
import java.util.concurrent.CompletableFuture;
public class AsyncChatExample {
public static void main(String[] args) {
CloakrClient client = new CloakrClient(
System.getenv("CLOAKR_API_KEY")
);
ChatRequest request = ChatRequest.builder()
.model("gpt-4o")
.prompt("What is Cloakr.ai?")
.build();
CompletableFuture<ChatResponse> future = client.chatAsync(request);
future.thenAccept(response -> {
System.out.println(response.getChoices().get(0).getText());
}).exceptionally(throwable -> {
System.err.println("Error: " + throwable.getMessage());
return null;
});
// Wait for completion
future.join();
}
}
Streaming Responses
import ai.cloakr.CloakrClient;
import ai.cloakr.models.ChatRequest;
import ai.cloakr.models.ChatChunk;
public class StreamingChatExample {
public static void main(String[] args) {
CloakrClient client = new CloakrClient(
System.getenv("CLOAKR_API_KEY")
);
ChatRequest request = ChatRequest.builder()
.model("gpt-4o")
.prompt("Write a story about AI security")
.stream(true)
.build();
try {
client.chatStream(request).forEach(chunk -> {
if (chunk.getChoices().get(0).getDelta() != null &&
chunk.getChoices().get(0).getDelta().getText() != null) {
System.out.print(chunk.getChoices().get(0).getDelta().getText());
}
});
} catch (Exception e) {
System.err.println("Error: " + e.getMessage());
}
}
}
Advanced Features
Custom PII Redaction
import ai.cloakr.CloakrClient;
import ai.cloakr.pii.PIIRedactor;
import ai.cloakr.pii.RedactionRule;
import java.util.Arrays;
public class PIIRedactionExample {
public static void main(String[] args) {
CloakrClient client = new CloakrClient(
System.getenv("CLOAKR_API_KEY")
);
// Custom redaction rules
RedactionRule customRule = RedactionRule.builder()
.type("custom_pattern")
.pattern("CUSTOMER-\\d{6}")
.replacement("[REDACTED_CUSTOMER_ID]")
.build();
RedactionRule emailRule = RedactionRule.builder()
.type("email")
.domains(Arrays.asList("internal.com", "test.com"))
.build();
PIIRedactor redactor = PIIRedactor.builder()
.rules(Arrays.asList(customRule, emailRule))
.build();
client.setPIIRedactor(redactor);
}
}
Encryption Configuration
import ai.cloakr.CloakrClient;
import ai.cloakr.encryption.EncryptionConfig;
public class EncryptionExample {
public static void main(String[] args) {
EncryptionConfig encryptionConfig = EncryptionConfig.builder()
.algorithm("AES-256-GCM")
.keyId(System.getenv("CLOAKR_KEY_ID"))
.keyRotation(true)
.compression(true)
.build();
CloakrClient client = CloakrClient.builder()
.apiKey(System.getenv("CLOAKR_API_KEY"))
.encryption(encryptionConfig)
.build();
}
}
Retry Logic with Exponential Backoff
import ai.cloakr.CloakrClient;
import ai.cloakr.retry.RetryConfig;
import java.time.Duration;
import java.util.Arrays;
public class RetryExample {
public static void main(String[] args) {
RetryConfig retryConfig = RetryConfig.builder()
.maxAttempts(5)
.baseDelay(Duration.ofSeconds(1))
.maxDelay(Duration.ofSeconds(30))
.backoffMultiplier(2.0)
.retryableErrors(Arrays.asList("rate_limit_exceeded", "internal_error"))
.build();
CloakrClient client = CloakrClient.builder()
.apiKey(System.getenv("CLOAKR_API_KEY"))
.retry(retryConfig)
.build();
}
}
Error Handling
Comprehensive Error Handling
import ai.cloakr.CloakrClient;
import ai.cloakr.exceptions.CloakrException;
import ai.cloakr.models.ChatRequest;
import ai.cloakr.models.ChatResponse;
public class ErrorHandlingExample {
public static void main(String[] args) {
CloakrClient client = new CloakrClient(
System.getenv("CLOAKR_API_KEY")
);
try {
ChatRequest request = ChatRequest.builder()
.model("gpt-4o")
.prompt("Hello world")
.build();
ChatResponse response = client.chat(request);
return response;
} catch (CloakrException e) {
switch (e.getCode()) {
case "rate_limit_exceeded":
System.out.println("Rate limited. Retry after " + e.getRetryAfter() + " seconds");
// Implement retry logic
break;
case "invalid_api_key":
System.err.println("Invalid API key. Check your configuration.");
break;
case "content_policy_violation":
System.err.println("Content violates usage policies: " + e.getDetails());
break;
default:
System.err.println("Unexpected error: " + e.getMessage());
}
throw e;
} catch (Exception e) {
System.err.println("Network or other error: " + e.getMessage());
throw e;
}
}
}
Custom Error Handler
import ai.cloakr.exceptions.CloakrException;
import java.time.LocalDateTime;
import java.util.logging.Logger;
public class CustomErrorHandler {
private static final Logger logger = Logger.getLogger(CustomErrorHandler.class.getName());
public static void handle(CloakrException error, String context) {
logger.severe("Cloakr Error: " + Map.of(
"code", error.getCode(),
"message", error.getMessage(),
"context", context,
"timestamp", LocalDateTime.now().toString()
));
// Log to external service
logToExternalService(error, context);
// Notify team if critical
if ("internal_error".equals(error.getCode())) {
notifyTeam(error, context);
}
}
private static void logToExternalService(CloakrException error, String context) {
// Implementation for external logging
}
private static void notifyTeam(CloakrException error, String context) {
// Implementation for team notification
}
}
Performance Optimization
Connection Pooling
import ai.cloakr.CloakrClient;
import ai.cloakr.connection.ConnectionPool;
import java.time.Duration;
public class ConnectionPoolExample {
public static void main(String[] args) {
ConnectionPool pool = ConnectionPool.builder()
.maxConnections(10)
.maxIdleTime(Duration.ofSeconds(30))
.connectionTimeout(Duration.ofSeconds(5))
.build();
CloakrClient client = CloakrClient.builder()
.apiKey(System.getenv("CLOAKR_API_KEY"))
.connectionPool(pool)
.build();
}
}
Request Batching
import ai.cloakr.CloakrClient;
import ai.cloakr.models.ChatRequest;
import ai.cloakr.models.ChatResponse;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
public class BatchRequestExample {
public static void main(String[] args) {
CloakrClient client = new CloakrClient(
System.getenv("CLOAKR_API_KEY")
);
List<String> prompts = Arrays.asList(
"What is AI?",
"What is machine learning?",
"What is deep learning?"
);
List<CompletableFuture<ChatResponse>> futures = prompts.stream()
.map(prompt -> {
ChatRequest request = ChatRequest.builder()
.model("gpt-4o")
.prompt(prompt)
.build();
return client.chatAsync(request);
})
.collect(Collectors.toList());
// Wait for all requests to complete
List<ChatResponse> responses = futures.stream()
.map(CompletableFuture::join)
.collect(Collectors.toList());
responses.forEach(response ->
System.out.println(response.getChoices().get(0).getText())
);
}
}
Caching
import ai.cloakr.CloakrClient;
import ai.cloakr.cache.CacheManager;
import java.time.Duration;
public class CachingExample {
public static void main(String[] args) {
CacheManager cache = CacheManager.builder()
.ttl(Duration.ofHours(1))
.maxSize(1000)
.strategy("lru")
.build();
CloakrClient client = CloakrClient.builder()
.apiKey(System.getenv("CLOAKR_API_KEY"))
.cache(cache)
.build();
}
}
Testing
Unit Tests with JUnit
import ai.cloakr.CloakrClient;
import ai.cloakr.models.ChatRequest;
import ai.cloakr.models.ChatResponse;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.BeforeEach;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;
public class ChatServiceTest {
private CloakrClient client;
@BeforeEach
void setUp() {
client = new CloakrClient("test-key");
}
@Test
void testSuccessfulChatRequest() {
// Mock the client
CloakrClient mockClient = mock(CloakrClient.class);
ChatResponse mockResponse = ChatResponse.builder()
.choices(Arrays.asList(
ChatChoice.builder()
.text("Mock response")
.build()
))
.build();
when(mockClient.chat(any(ChatRequest.class)))
.thenReturn(mockResponse);
ChatRequest request = ChatRequest.builder()
.model("gpt-4o")
.prompt("Test prompt")
.build();
ChatResponse result = mockClient.chat(request);
assertEquals("Mock response", result.getChoices().get(0).getText());
}
@Test
void testRateLimitError() {
CloakrClient mockClient = mock(CloakrClient.class);
CloakrException mockError = new CloakrException("Rate limit exceeded");
mockError.setCode("rate_limit_exceeded");
mockError.setRetryAfter(60);
when(mockClient.chat(any(ChatRequest.class)))
.thenThrow(mockError);
ChatRequest request = ChatRequest.builder()
.model("gpt-4o")
.prompt("Test prompt")
.build();
assertThrows(CloakrException.class, () -> {
mockClient.chat(request);
});
}
}
Integration Tests
import ai.cloakr.CloakrClient;
import ai.cloakr.models.ChatRequest;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.BeforeEach;
import static org.junit.jupiter.api.Assertions.*;
public class CloakrIntegrationTest {
private CloakrClient client;
@BeforeEach
void setUp() {
client = new CloakrClient(System.getenv("CLOAKR_TEST_API_KEY"));
}
@Test
void testChatRequest() {
ChatRequest request = ChatRequest.builder()
.model("gpt-4o")
.prompt("Hello, this is a test")
.maxTokens(50)
.build();
ChatResponse response = client.chat(request);
assertNotNull(response.getChoices());
assertNotNull(response.getChoices().get(0).getText());
assertFalse(response.getChoices().get(0).getText().isEmpty());
}
}
Production Best Practices
Environment Configuration
import ai.cloakr.CloakrClient;
import ai.cloakr.config.ClientConfig;
import java.time.Duration;
public class EnvironmentConfig {
public static ClientConfig getConfig() {
String env = System.getenv("NODE_ENV");
if (env == null) env = "development";
switch (env) {
case "production":
return ClientConfig.builder()
.apiKey(System.getenv("CLOAKR_PROD_API_KEY"))
.encryption(true)
.retryAttempts(3)
.timeout(Duration.ofSeconds(30))
.build();
default: // development
return ClientConfig.builder()
.apiKey(System.getenv("CLOAKR_DEV_API_KEY"))
.encryption(false)
.retryAttempts(1)
.build();
}
}
}
Monitoring and Logging
import ai.cloakr.CloakrClient;
import ai.cloakr.metrics.MetricsCollector;
import java.util.logging.Logger;
public class MonitoringExample {
private static final Logger logger = Logger.getLogger(MonitoringExample.class.getName());
public static void main(String[] args) {
MetricsCollector metrics = new MetricsCollector() {
@Override
public void increment(String metric, int value) {
logger.info("Metric: " + metric + " = " + value);
}
@Override
public void timing(String metric, long duration) {
logger.info("Timing: " + metric + " = " + duration + "ms");
}
};
CloakrClient client = CloakrClient.builder()
.apiKey(System.getenv("CLOAKR_API_KEY"))
.metrics(metrics)
.build();
// Custom metrics
client.onRequest(data -> {
metrics.increment("cloakr.requests.total");
metrics.timing("cloakr.requests.duration", data.getDuration());
});
client.onError(error -> {
metrics.increment("cloakr.errors.total");
metrics.increment("cloakr.errors." + error.getCode());
});
}
}
Security Considerations
import ai.cloakr.CloakrClient;
import java.util.regex.Pattern;
public class SecurityExample {
public static void main(String[] args) {
// Validate API key format
String apiKey = validateApiKey(System.getenv("CLOAKR_API_KEY"));
CloakrClient client = CloakrClient.builder()
.apiKey(apiKey)
.encryption(true)
.piiDetection(true)
.build();
}
private static String validateApiKey(String apiKey) {
if (apiKey == null || apiKey.isEmpty()) {
throw new IllegalArgumentException("API key must be a non-empty string");
}
if (!apiKey.startsWith("cloakr_")) {
throw new IllegalArgumentException("Invalid API key format");
}
return apiKey;
}
}
Spring Boot Integration
import ai.cloakr.CloakrClient;
import ai.cloakr.models.ChatRequest;
import ai.cloakr.models.ChatResponse;
import org.springframework.web.bind.annotation.*;
import org.springframework.stereotype.Service;
@Service
public class ChatService {
private final CloakrClient client;
public ChatService() {
this.client = new CloakrClient(System.getenv("CLOAKR_API_KEY"));
}
public ChatResponse chat(String prompt, String model) {
ChatRequest request = ChatRequest.builder()
.model(model != null ? model : "gpt-4o")
.prompt(prompt)
.maxTokens(1000)
.temperature(0.7)
.build();
return client.chat(request);
}
}
@RestController
@RequestMapping("/api/chat")
public class ChatController {
private final ChatService chatService;
public ChatController(ChatService chatService) {
this.chatService = chatService;
}
@PostMapping
public ChatResponse chat(@RequestBody ChatRequestDto request) {
return chatService.chat(request.getPrompt(), request.getModel());
}
}
class ChatRequestDto {
private String prompt;
private String model;
// Getters and setters
public String getPrompt() { return prompt; }
public void setPrompt(String prompt) { this.prompt = prompt; }
public String getModel() { return model; }
public void setModel(String model) { this.model = model; }
}
Next Steps
- Node.js SDK Tutorial - Learn the Node.js SDK
- Python SDK Tutorial - Learn the Python SDK
- API Reference - Complete API documentation
- Security & Compliance - Enterprise security features