Quarkus LangChain4j OpenAI extension provides seamless integration between Quarkus and OpenAI's Large Language Models, enabling developers to easily incorporate LLMs into their applications with support for chat, streaming, embeddings, moderation, and image generation.
JSON-RPC services for testing OpenAI integration in Quarkus Dev UI. These services provide interactive testing interfaces for image generation and content moderation directly from the Quarkus development console without writing code.
The extension includes JSON-RPC services that integrate with Quarkus Dev UI, enabling developers to:
These services are available only in development mode and are automatically registered with the Quarkus Dev UI system.
import io.quarkiverse.langchain4j.openai.runtime.devui.OpenAiImagesJsonRPCService;
import io.quarkiverse.langchain4j.openai.runtime.devui.OpenAiModerationModelsJsonRPCService;
import io.quarkiverse.langchain4j.openai.runtime.config.LangChain4jOpenAiConfig;
import jakarta.inject.Inject;
import jakarta.json.JsonObject;
import jakarta.json.JsonArray;JSON-RPC service for testing DALL-E image generation models from Quarkus Dev UI.
/**
* JSON-RPC service for testing OpenAI image generation in Dev UI.
*
* This service provides an interactive interface in the Quarkus Dev UI for
* testing DALL-E models with different configurations, sizes, qualities,
* and prompts without writing application code.
*
* Access via: Quarkus Dev UI → Extensions → LangChain4j OpenAI → Image Generation
*
* Usage:
* Navigate to Dev UI in development mode (http://localhost:8080/q/dev)
* Find the LangChain4j OpenAI extension card
* Click to access image generation testing interface
*/
public class OpenAiImagesJsonRPCService {
/**
* Runtime configuration injected by CDI.
*
* Provides access to both default and named OpenAI configurations
* defined in application.properties.
*/
@Inject
LangChain4jOpenAiConfig config;
/**
* Generate an image using OpenAI DALL-E models.
*
* Parameters:
* configuration - Configuration name to use ("default" or named config)
* modelName - Model to use (e.g., "dall-e-3", "dall-e-2")
* size - Image size (e.g., "1024x1024", "1792x1024", "1024x1792")
* prompt - Text prompt describing the desired image
* quality - Image quality ("standard" or "hd", DALL-E 3 only)
*
* Returns:
* JsonObject with fields:
* - prompt (String): The original prompt
* - url (String): URL to the generated image (if responseFormat is "url")
* - base64Data (String): Base64-encoded image (if responseFormat is "b64_json")
* - revisedPrompt (String): OpenAI's refined version of the prompt
*
* Example Response:
* {
* "prompt": "A sunset over mountains",
* "url": "https://oaidalleapiprodscus.blob.core.windows.net/private/...",
* "base64Data": null,
* "revisedPrompt": "A breathtaking sunset over majestic mountains..."
* }
*
* Throws:
* RuntimeException if image generation fails or API key is invalid
*
* The service builds a QuarkusOpenAiImageModel using the specified
* configuration and model settings, generates the image, and returns
* the result in a structured JSON format for display in the Dev UI.
*/
public JsonObject generate(
String configuration,
String modelName,
String size,
String prompt,
String quality
);
}JSON-RPC service for testing OpenAI content moderation models from Quarkus Dev UI.
/**
* JSON-RPC service for testing OpenAI content moderation in Dev UI.
*
* This service provides an interactive interface in the Quarkus Dev UI for
* testing OpenAI's content moderation API with different configurations and
* content. It helps developers understand how moderation works and test
* content safety policies before implementation.
*
* Access via: Quarkus Dev UI → Extensions → LangChain4j OpenAI → Content Moderation
*
* Usage:
* Navigate to Dev UI in development mode (http://localhost:8080/q/dev)
* Find the LangChain4j OpenAI extension card
* Click to access content moderation testing interface
*/
public class OpenAiModerationModelsJsonRPCService {
/**
* Runtime configuration injected by CDI.
*
* Provides access to both default and named OpenAI configurations
* defined in application.properties.
*/
@Inject
LangChain4jOpenAiConfig config;
/**
* Moderate content using OpenAI moderation models.
*
* Parameters:
* configuration - Configuration name to use ("default" or named config)
* modelName - Model to use (e.g., "omni-moderation-latest", "text-moderation-latest")
* prompt - Content text to moderate
*
* Returns:
* JsonObject with fields:
* - flagged (boolean): Whether any policy violations were detected
* - categories (JsonArray): Array of moderation category results
*
* Each category object in the array contains:
* - name (String): Category name (e.g., "sexual", "hate", "violence")
* - flagged (boolean): Whether this specific category was flagged
* - score (double): Confidence score (0.0 to 1.0) for this category
*
* Example Response:
* {
* "flagged": false,
* "categories": [
* { "name": "sexual", "flagged": false, "score": 0.00012 },
* { "name": "hate", "flagged": false, "score": 0.00008 },
* { "name": "hate-threatening", "flagged": false, "score": 0.00001 },
* { "name": "self-harm", "flagged": false, "score": 0.00003 },
* { "name": "violence", "flagged": false, "score": 0.00015 },
* { "name": "violence-graphic", "flagged": false, "score": 0.00004 },
* { "name": "sexual-minors", "flagged": false, "score": 0.00002 }
* ]
* }
*
* Supported Categories:
* - sexual: Sexual content
* - hate: Hateful content
* - hate-threatening: Hateful content that includes violence or threats
* - self-harm: Content promoting or describing self-harm
* - violence: Violent content
* - violence-graphic: Graphic violent content
* - sexual-minors: Sexual content involving minors
*
* Throws:
* RuntimeException if moderation fails or API key is invalid
*
* The service builds a moderation model using the specified configuration,
* moderates the content, and returns detailed category scores and flagging
* results in a structured JSON format for display in the Dev UI.
*/
public JsonObject moderate(
String configuration,
String modelName,
String prompt
);
}Start Quarkus in Development Mode:
./mvnw quarkus:devNavigate to Dev UI:
http://localhost:8080/q/devTest Image Generation:
Test Content Moderation:
Dev UI services support testing named configurations:
# application.properties
quarkus.langchain4j.openai.api-key=sk-default-key
# Named configuration for creative images
quarkus.langchain4j.openai.creative.api-key=sk-creative-key
quarkus.langchain4j.openai.creative.image-model.model-name=dall-e-3
quarkus.langchain4j.openai.creative.image-model.quality=hd
quarkus.langchain4j.openai.creative.image-model.style=vivid
# Named configuration for strict moderation
quarkus.langchain4j.openai.strict.api-key=sk-strict-key
quarkus.langchain4j.openai.strict.moderation-model.model-name=omni-moderation-latestThen test these configurations in Dev UI:
Image Generation Response:
{
"prompt": "A futuristic city at night",
"url": "https://oaidalleapiprodscus.blob.core.windows.net/...",
"base64Data": null,
"revisedPrompt": "A stunning futuristic city skyline at night with neon lights..."
}Moderation Response:
{
"flagged": true,
"categories": [
{ "name": "sexual", "flagged": false, "score": 0.00012 },
{ "name": "hate", "flagged": true, "score": 0.89234 },
{ "name": "hate-threatening", "flagged": false, "score": 0.12345 },
{ "name": "self-harm", "flagged": false, "score": 0.00003 },
{ "name": "violence", "flagged": false, "score": 0.00015 },
{ "name": "violence-graphic", "flagged": false, "score": 0.00004 },
{ "name": "sexual-minors", "flagged": false, "score": 0.00002 }
]
}While Dev UI services are for testing, the patterns translate directly to application code:
After testing in Dev UI, implement in code:
import io.quarkiverse.langchain4j.openai.QuarkusOpenAiImageModel;
import dev.langchain4j.model.image.ImageModel;
import dev.langchain4j.data.image.Image;
import dev.langchain4j.model.output.Response;
ImageModel imageModel = QuarkusOpenAiImageModel.builder()
.configName("creative") // Use named config tested in Dev UI
.build();
Response<Image> response = imageModel.generate("A futuristic city at night");
String imageUrl = response.content().url();After testing in Dev UI, implement in code:
import dev.langchain4j.model.moderation.ModerationModel;
import dev.langchain4j.model.moderation.Moderation;
import dev.langchain4j.model.output.Response;
import jakarta.inject.Inject;
@ApplicationScoped
public class ModerationService {
@Inject
ModerationModel moderationModel; // Uses default config
public boolean isSafe(String content) {
Response<Moderation> response = moderationModel.moderate(content);
return !response.content().flagged();
}
}mvn quarkus:dev)Install with Tessl CLI
npx tessl i tessl/maven-io-quarkiverse-langchain4j--quarkus-langchain4j-openai@1.7.0