Comprehensive developer toolkit providing reusable skills for Java/Spring Boot, TypeScript/NestJS/React/Next.js, Python, PHP, AWS CloudFormation, AI/RAG, DevOps, and more.
82
82%
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Risky
Do not use without reviewing
import dev.langchain4j.model.chat.StreamingChatModel;
import dev.langchain4j.model.chat.response.ChatResponse;
import dev.langchain4j.model.chat.response.StreamingChatResponseHandler;
import org.junit.jupiter.api.Test;
import reactor.core.publisher.Flux;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
class StreamingResponseTest {
@Test
void shouldHandleStreamingResponse() throws Exception {
// Arrange
StreamingChatModel streamingModel = OllamaStreamingChatModel.builder()
.baseUrl("http://localhost:11434")
.modelName("llama2")
.build();
List<String> chunks = new ArrayList<>();
CompletableFuture<ChatResponse> responseFuture = new CompletableFuture<>();
StreamingChatResponseHandler handler = new StreamingChatResponseHandler() {
@Override
public void onPartialResponse(String partialResponse) {
chunks.add(partialResponse);
}
@Override
public void onComplete(ChatResponse completeResponse) {
responseFuture.complete(completeResponse);
}
@Override
public void onError(Throwable error) {
responseFuture.completeExceptionally(error);
}
};
// Act
streamingModel.generate("Count to 5", handler);
ChatResponse response = responseFuture.get(30, java.util.concurrent.TimeUnit.SECONDS);
// Assert
assertNotNull(response);
assertFalse(chunks.isEmpty());
assertTrue(response.content().text().length() > 0);
}
}@Test
void shouldMockStreamingResponse() {
// Arrange
StreamingChatModel mockModel = mock(StreamingChatModel.class);
List<String> chunks = new ArrayList<>();
doAnswer(invocation -> {
StreamingChatResponseHandler handler = invocation.getArgument(1);
handler.onPartialResponse("Hello ");
handler.onPartialResponse("World");
handler.onComplete(Response.from(AiMessage.from("Hello World")));
return null;
}).when(mockModel)
.generate(anyString(), any(StreamingChatResponseHandler.class));
// Act
mockModel.generate("Test", new StreamingChatResponseHandler() {
@Override
public void onPartialResponse(String partialResponse) {
chunks.add(partialResponse);
}
@Override
public void onComplete(ChatResponse response) {}
@Override
public void onError(Throwable error) {}
});
// Assert
assertEquals(2, chunks.size());
assertEquals("Hello World", String.join("", chunks));
}import dev.langchain4j.memory.chat.MessageWindowChatMemory;
class MemoryTest {
@Test
void testChatMemory() {
// Arrange
var memory = MessageWindowChatMemory.withMaxMessages(3);
memory.add(UserMessage.from("Message 1"));
memory.add(AiMessage.from("Response 1"));
memory.add(UserMessage.from("Message 2"));
memory.add(AiMessage.from("Response 2"));
// Assert
List<ChatMessage> messages = memory.messages();
assertEquals(4, messages.size());
// Add more to test window
memory.add(UserMessage.from("Message 3"));
assertEquals(4, memory.messages().size()); // Window size limit
}
@Test
void testMultiUserMemory() {
var memoryProvider =
memoryId -> MessageWindowChatMemory.withMaxMessages(10);
var memory1 = memoryProvider.provide("user1");
var memory2 = memoryProvider.provide("user2");
memory1.add(UserMessage.from("User 1 message"));
memory2.add(UserMessage.from("User 2 message"));
assertEquals(1, memory1.messages().size());
assertEquals(1, memory2.messages().size());
}
}@Test
void testMemorySerialization() throws Exception {
var memory = MessageWindowChatMemory.withMaxMessages(5);
memory.add(UserMessage.from("Test message"));
// Serialize
var bytes = serializeMemory(memory);
// Deserialize
var deserializedMemory = deserializeMemory(bytes);
// Verify
assertEquals(memory.messages().size(), deserializedMemory.messages().size());
}
private byte[] serializeMemory(MessageWindowChatMemory memory) {
// Implement serialization logic
return new byte[0];
}
private MessageWindowChatMemory deserializeMemory(byte[] bytes) {
// Implement deserialization logic
return MessageWindowChatMemory.withMaxMessages(5);
}@Test
void shouldHandleServiceUnavailable() {
// Arrange
ChatModel mockModel = mock(ChatModel.class);
when(mockModel.generate(any()))
.thenThrow(new RuntimeException("Service unavailable"));
var service = AiServices.builder(AiService.class)
.chatModel(mockModel)
.toolExecutionErrorHandler((request, exception) ->
"Service unavailable: " + exception.getMessage()
)
.build();
// Act
String response = service.chat("test");
// Assert
assertTrue(response.contains("Service unavailable"));
}@Test
void shouldHandleRateLimiting() {
// Arrange
ChatModel mockModel = mock(ChatModel.class);
// Simulate rate limiting
when(mockModel.generate(any()))
.thenThrow(new RuntimeException("Rate limit exceeded"));
var service = new AiService(mockModel);
// Act & Assert
assertThrows(RuntimeException.class, () -> service.chat("test"));
}@Test
void shouldHandleConcurrentRequests() throws InterruptedException {
// Arrange
ChatModel mockModel = mock(ChatModel.class);
when(mockModel.generate(any()))
.thenReturn(Response.from(AiMessage.from("Response")));
var service = AiServices.builder(AiService.class)
.chatModel(mockModel)
.build();
int threadCount = 10;
ExecutorService executor = Executors.newFixedThreadPool(threadCount);
List<Future<String>> futures = new ArrayList<>();
// Act
for (int i = 0; i < threadCount; i++) {
futures.add(executor.submit(() -> service.chat("test")));
}
// Assert
for (Future<String> future : futures) {
assertNotNull(future.get());
assertEquals("Response", future.get());
}
executor.shutdown();
}@Test
void shouldHandleLongRunningRequests() {
// Arrange
ChatModel model = OpenAiChatModel.builder()
.apiKey(System.getenv("OPENAI_API_KEY"))
.modelName("gpt-4o")
.timeout(Duration.ofMinutes(2))
.build();
// Act
Instant start = Instant.now();
String response = model.chat("Explain quantum computing in detail");
Duration duration = Duration.between(start, Instant.now());
// Assert
assertTrue(duration.toMinutes() < 1, "Should complete in less than 1 minute");
assertNotNull(response);
assertTrue(response.length() > 100);
}class AIAssertions {
static void assertResponseContains(String response, String... keywords) {
for (String keyword : keywords) {
assertTrue(
response.toLowerCase().contains(keyword.toLowerCase()),
"Response does not contain: " + keyword
);
}
}
static void assertValidJSON(String response) {
try {
new JsonParser().parse(response);
} catch (Exception e) {
fail("Response is not valid JSON: " + e.getMessage());
}
}
static void assertNonEmpty(String response) {
assertNotNull(response);
assertFalse(response.trim().isEmpty());
}
static void assertCoherentResponse(String response, String query) {
assertNotNull(response);
assertFalse(response.trim().isEmpty());
assertFalse(response.contains("error"));
// Additional coherence checks based on domain
}
}
// Usage
@Test
void testResponseQuality() {
String response = assistant.chat("Explain microservices");
AIAssertions.assertNonEmpty(response);
AIAssertions.assertResponseContains(response, "microservices", "architecture");
AIAssertions.assertCoherentResponse(response, "Explain microservices");
}class AiTestFixtures {
public static ChatModel createMockChatModel(
Map<String, String> responses) {
var mock = mock(ChatModel.class);
responses.forEach((input, output) ->
when(mock.chat(contains(input))).thenReturn(output)
);
return mock;
}
public static EmbeddingModel createMockEmbeddingModel(String text) {
var mock = mock(EmbeddingModel.class);
var embedding = new Response<>(
new Embedding(new float[]{0.1f, 0.2f, 0.3f}), null
);
when(mock.embed(text)).thenReturn(embedding);
return mock;
}
public static Document createTestDocument(String content) {
var doc = Document.from(content);
doc.metadata().put("source", "test");
doc.metadata().put("created", Instant.now().toString());
return doc;
}
public static UserMessage createTestMessage(String content) {
return UserMessage.from(content);
}
public static AiService createTestService(ChatModel model) {
return AiServices.builder(AiService.class)
.chatModel(model)
.build();
}
}
// Usage in tests
@Test
void testWithFixtures() {
var chatModel = AiTestFixtures.createMockChatModel(
Map.of("Hello", "Hi!", "Bye", "Goodbye!")
);
var service = AiTestFixtures.createTestService(chatModel);
assertEquals("Hi!", service.chat("Hello"));
}class TestContext {
private static final ThreadLocal<ChatModel> currentModel =
new ThreadLocal<>();
private static final ThreadLocal<EmbeddingStore> currentStore =
new ThreadLocal<>();
public static void setModel(ChatModel model) {
currentModel.set(model);
}
public static ChatModel getModel() {
return currentModel.get();
}
public static void setStore(EmbeddingStore store) {
currentStore.set(store);
}
public static EmbeddingStore getStore() {
return currentStore.get();
}
public static void clear() {
currentModel.remove();
currentStore.remove();
}
}
@BeforeAll
static void setupTestContext() {
var model = createTestModel();
TestContext.setModel(model);
var store = createTestStore();
TestContext.setStore(store);
}
@AfterAll
static void cleanupTestContext() {
TestContext.clear();
}plugins
developer-kit-ai
skills
chunking-strategy
prompt-engineering
developer-kit-aws
skills
aws
aws-cli-beast
aws-cost-optimization
aws-drawio-architecture-diagrams
aws-sam-bootstrap
aws-cloudformation
aws-cloudformation-auto-scaling
references
aws-cloudformation-bedrock
references
aws-cloudformation-cloudfront
references
aws-cloudformation-cloudwatch
references
aws-cloudformation-dynamodb
references
aws-cloudformation-ec2
aws-cloudformation-ecs
references
aws-cloudformation-elasticache
aws-cloudformation-iam
references
aws-cloudformation-lambda
references
aws-cloudformation-rds
aws-cloudformation-s3
references
aws-cloudformation-security
references
aws-cloudformation-task-ecs-deploy-gh
aws-cloudformation-vpc
developer-kit-core
skills
developer-kit-java
skills
aws-lambda-java-integration
aws-rds-spring-boot-integration
aws-sdk-java-v2-bedrock
aws-sdk-java-v2-core
aws-sdk-java-v2-dynamodb
aws-sdk-java-v2-kms
aws-sdk-java-v2-lambda
aws-sdk-java-v2-messaging
aws-sdk-java-v2-rds
aws-sdk-java-v2-s3
aws-sdk-java-v2-secrets-manager
graalvm-native-image
langchain4j
langchain4j-mcp-server-patterns
langchain4j-ai-services-patterns
references
langchain4j-mcp-server-patterns
references
langchain4j-rag-implementation-patterns
references
langchain4j-spring-boot-integration
langchain4j-testing-strategies
langchain4j-tool-function-calling-patterns
langchain4j-vector-stores-configuration
references
qdrant
references
spring-ai-mcp-server-patterns
references
spring-boot-actuator
spring-boot-cache
spring-boot-crud-patterns
spring-boot-dependency-injection
spring-boot-event-driven-patterns
spring-boot-openapi-documentation
spring-boot-project-creator
spring-boot-resilience4j
spring-boot-rest-api-standards
spring-boot-saga-pattern
spring-boot-security-jwt
assets
references
scripts
spring-boot-test-patterns
spring-data-jpa
references
spring-data-neo4j
references
unit-test-application-events
unit-test-bean-validation
unit-test-boundary-conditions
unit-test-caching
unit-test-config-properties
unit-test-controller-layer
unit-test-exception-handler
unit-test-json-serialization
unit-test-mapper-converter
unit-test-parameterized
unit-test-scheduled-async
unit-test-service-layer
unit-test-utility-methods
unit-test-wiremock-rest-api
developer-kit-php
skills
aws-lambda-php-integration
developer-kit-python
skills
aws-lambda-python-integration
developer-kit-tools
developer-kit-typescript
skills
aws-lambda-typescript-integration
better-auth
drizzle-orm-patterns
dynamodb-toolbox-patterns
references
nestjs
nestjs-best-practices
nestjs-code-review
nestjs-drizzle-crud-generator
scripts
nextjs-app-router
nextjs-authentication
nextjs-code-review
nextjs-data-fetching
references
nextjs-deployment
nextjs-performance
nx-monorepo
react-code-review
react-patterns
references
shadcn-ui
tailwind-css-patterns
references
tailwind-design-system
references
turborepo-monorepo
typescript-docs
typescript-security-review
zod-validation-utilities