LangChain4j OpenAI Integration providing Java access to OpenAI APIs including chat models, embeddings, image generation, audio transcription, and moderation.
Language models provide OpenAI's legacy completion interface, primarily for models like gpt-3.5-turbo-instruct. Unlike chat models, language models use a simple text-to-text completion format without conversation context or message structure.
For most use cases, the Chat Models interface is recommended as it provides more features and supports newer models. Language models are maintained for backward compatibility and specific completion use cases.
Synchronous language model for text completion tasks. Generates text continuations from a single prompt string.
public class OpenAiLanguageModel implements LanguageModel {
public static OpenAiLanguageModelBuilder builder();
// Core generation method
public Response<String> generate(String prompt);
// Model information
public String modelName();
}Builder for configuring OpenAiLanguageModel instances with authentication and HTTP settings.
public static class OpenAiLanguageModelBuilder {
// Core configuration
public OpenAiLanguageModelBuilder modelName(String modelName);
public OpenAiLanguageModelBuilder modelName(OpenAiLanguageModelName modelName);
public OpenAiLanguageModelBuilder baseUrl(String baseUrl);
public OpenAiLanguageModelBuilder apiKey(String apiKey);
public OpenAiLanguageModelBuilder organizationId(String organizationId);
public OpenAiLanguageModelBuilder projectId(String projectId);
// Generation parameters
public OpenAiLanguageModelBuilder temperature(Double temperature);
// HTTP configuration
public OpenAiLanguageModelBuilder httpClientBuilder(HttpClientBuilder httpClientBuilder);
public OpenAiLanguageModelBuilder timeout(Duration timeout);
public OpenAiLanguageModelBuilder maxRetries(Integer maxRetries);
public OpenAiLanguageModelBuilder customHeaders(Map<String, String> customHeaders);
public OpenAiLanguageModelBuilder customHeaders(Supplier<Map<String, String>> customHeadersSupplier);
public OpenAiLanguageModelBuilder customQueryParams(Map<String, String> customQueryParams);
// Logging
public OpenAiLanguageModelBuilder logRequests(Boolean logRequests);
public OpenAiLanguageModelBuilder logResponses(Boolean logResponses);
public OpenAiLanguageModelBuilder logger(Logger logger);
// Build
public OpenAiLanguageModel build();
}import dev.langchain4j.model.openai.OpenAiLanguageModel;
import dev.langchain4j.model.openai.OpenAiLanguageModelName;
import dev.langchain4j.model.output.Response;
import java.time.Duration;
// Create language model
OpenAiLanguageModel model = OpenAiLanguageModel.builder()
.apiKey(System.getenv("OPENAI_API_KEY"))
.modelName(OpenAiLanguageModelName.GPT_3_5_TURBO_INSTRUCT)
.temperature(0.7)
.timeout(Duration.ofSeconds(30))
.maxRetries(3)
.build();
// Simple completion
String prompt = "Once upon a time in a distant galaxy,";
Response<String> response = model.generate(prompt);
System.out.println("Generated text: " + response.content());
System.out.println("Tokens used: " + response.tokenUsage().totalTokenCount());
System.out.println("Finish reason: " + response.finishReason());
// Multi-line prompt
String complexPrompt = """
Write a function in Python that calculates the Fibonacci sequence:
def fibonacci(n):
""";
Response<String> codeCompletion = model.generate(complexPrompt);
System.out.println(codeCompletion.content());
// With logging enabled
OpenAiLanguageModel debugModel = OpenAiLanguageModel.builder()
.apiKey(System.getenv("OPENAI_API_KEY"))
.modelName(OpenAiLanguageModelName.GPT_3_5_TURBO_INSTRUCT)
.logRequests(true)
.logResponses(true)
.build();
Response<String> debugResponse = debugModel.generate("Complete this sentence: The best thing about");Streaming language model that returns text completions incrementally as tokens are generated. Useful for providing real-time feedback in user interfaces.
public class OpenAiStreamingLanguageModel implements StreamingLanguageModel {
public static OpenAiStreamingLanguageModelBuilder builder();
// Core streaming method
public void generate(String prompt, StreamingResponseHandler<String> handler);
// Model information
public String modelName();
}Builder for configuring OpenAiStreamingLanguageModel instances.
public static class OpenAiStreamingLanguageModelBuilder {
// Core configuration
public OpenAiStreamingLanguageModelBuilder modelName(String modelName);
public OpenAiStreamingLanguageModelBuilder modelName(OpenAiLanguageModelName modelName);
public OpenAiStreamingLanguageModelBuilder baseUrl(String baseUrl);
public OpenAiStreamingLanguageModelBuilder apiKey(String apiKey);
public OpenAiStreamingLanguageModelBuilder organizationId(String organizationId);
public OpenAiStreamingLanguageModelBuilder projectId(String projectId);
// Generation parameters
public OpenAiStreamingLanguageModelBuilder temperature(Double temperature);
// HTTP configuration
public OpenAiStreamingLanguageModelBuilder httpClientBuilder(HttpClientBuilder httpClientBuilder);
public OpenAiStreamingLanguageModelBuilder timeout(Duration timeout);
public OpenAiStreamingLanguageModelBuilder maxRetries(Integer maxRetries);
public OpenAiStreamingLanguageModelBuilder customHeaders(Map<String, String> customHeaders);
public OpenAiStreamingLanguageModelBuilder customHeaders(Supplier<Map<String, String>> customHeadersSupplier);
public OpenAiStreamingLanguageModelBuilder customQueryParams(Map<String, String> customQueryParams);
// Logging
public OpenAiStreamingLanguageModelBuilder logRequests(Boolean logRequests);
public OpenAiStreamingLanguageModelBuilder logResponses(Boolean logResponses);
public OpenAiStreamingLanguageModelBuilder logger(Logger logger);
// Build
public OpenAiStreamingLanguageModel build();
}import dev.langchain4j.model.openai.OpenAiStreamingLanguageModel;
import dev.langchain4j.model.openai.OpenAiLanguageModelName;
import dev.langchain4j.model.StreamingResponseHandler;
import dev.langchain4j.model.output.Response;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
// Create streaming language model
OpenAiStreamingLanguageModel model = OpenAiStreamingLanguageModel.builder()
.apiKey(System.getenv("OPENAI_API_KEY"))
.modelName(OpenAiLanguageModelName.GPT_3_5_TURBO_INSTRUCT)
.temperature(0.8)
.build();
// Simple streaming with inline handler
System.out.print("Story: ");
model.generate("Once upon a time, there was a brave knight who",
new StreamingResponseHandler<String>() {
@Override
public void onNext(String token) {
System.out.print(token);
}
@Override
public void onComplete(Response<String> response) {
System.out.println("\n\nGeneration complete!");
System.out.println("Total tokens: " + response.tokenUsage().totalTokenCount());
}
@Override
public void onError(Throwable error) {
System.err.println("Error occurred: " + error.getMessage());
}
}
);
// Accumulate streaming output
CompletableFuture<String> future = new CompletableFuture<>();
StringBuilder accumulated = new StringBuilder();
model.generate("Write a haiku about programming:",
new StreamingResponseHandler<String>() {
@Override
public void onNext(String token) {
accumulated.append(token);
// Update UI or process token
processToken(token);
}
@Override
public void onComplete(Response<String> response) {
String fullText = accumulated.toString();
future.complete(fullText);
}
@Override
public void onError(Throwable error) {
future.completeExceptionally(error);
}
}
);
// Wait for completion and get full text
try {
String haiku = future.get(30, TimeUnit.SECONDS);
System.out.println("Complete haiku:\n" + haiku);
} catch (Exception e) {
e.printStackTrace();
}
// Custom handler for progressive processing
class ProgressiveHandler implements StreamingResponseHandler<String> {
private final StringBuilder buffer = new StringBuilder();
private int tokenCount = 0;
@Override
public void onNext(String token) {
buffer.append(token);
tokenCount++;
// Process every 10 tokens
if (tokenCount % 10 == 0) {
System.out.println("Progress: " + tokenCount + " tokens received");
}
}
@Override
public void onComplete(Response<String> response) {
System.out.println("\nFinal text: " + buffer.toString());
System.out.println("Total tokens: " + response.tokenUsage().totalTokenCount());
}
@Override
public void onError(Throwable error) {
System.err.println("Failed after " + tokenCount + " tokens: " + error.getMessage());
}
public String getCurrentText() {
return buffer.toString();
}
}
ProgressiveHandler handler = new ProgressiveHandler();
model.generate("Explain quantum computing in simple terms:", handler);
// Access partial results while streaming
Thread.sleep(1000); // Wait a bit
System.out.println("Partial result: " + handler.getCurrentText());public enum OpenAiLanguageModelName {
GPT_3_5_TURBO_INSTRUCT("gpt-3.5-turbo-instruct");
public String toString();
}public interface LanguageModel {
Response<String> generate(String prompt);
}public interface StreamingLanguageModel {
void generate(String prompt, StreamingResponseHandler<String> handler);
}public interface StreamingResponseHandler<T> {
/**
* Called when a new token is received.
*
* @param token The token text
*/
void onNext(String token);
/**
* Called when generation is complete.
*
* @param response The complete response with metadata
*/
void onComplete(Response<T> response);
/**
* Called when an error occurs during generation.
*
* @param error The error that occurred
*/
void onError(Throwable error);
}public class Response<T> {
public T content();
public TokenUsage tokenUsage();
public FinishReason finishReason();
}public class TokenUsage {
public Integer inputTokenCount();
public Integer outputTokenCount();
public Integer totalTokenCount();
}public enum FinishReason {
STOP, // Natural stop
LENGTH, // Max tokens reached
CONTENT_FILTER, // Content filtered
OTHER; // Other reason
}Controls randomness in text generation. Range: 0.0 to 2.0
Maximum time to wait for the API response
Duration.ofSeconds(), Duration.ofMinutes(), etc.Number of retry attempts on failure
Override the default OpenAI API endpoint
https://api.openai.com/v1/Add custom HTTP headers to requests
Map<String, String>Supplier<Map<String, String>>Add URL query parameters to all requests
Map<String, String>Optional OpenAI organization identifier
org-...Optional OpenAI project identifier
proj-...Language Models are best for:
Chat Models are better for:
Convert language model code to chat model:
// Old: Language Model
OpenAiLanguageModel oldModel = OpenAiLanguageModel.builder()
.apiKey(apiKey)
.modelName(OpenAiLanguageModelName.GPT_3_5_TURBO_INSTRUCT)
.build();
String result = oldModel.generate("What is the capital of France?");
// New: Chat Model
OpenAiChatModel newModel = OpenAiChatModel.builder()
.apiKey(apiKey)
.modelName(OpenAiChatModelName.GPT_3_5_TURBO)
.build();
String result = newModel.generate("What is the capital of France?");For streaming:
// Old: Streaming Language Model
OpenAiStreamingLanguageModel oldStream = OpenAiStreamingLanguageModel.builder()
.apiKey(apiKey)
.modelName(OpenAiLanguageModelName.GPT_3_5_TURBO_INSTRUCT)
.build();
oldStream.generate(prompt, handler);
// New: Streaming Chat Model
OpenAiStreamingChatModel newStream = OpenAiStreamingChatModel.builder()
.apiKey(apiKey)
.modelName(OpenAiChatModelName.GPT_3_5_TURBO)
.build();
newStream.generate(prompt, handler);The chat model interface is backward compatible for simple string prompts, making migration straightforward while providing access to advanced features when needed.
Install with Tessl CLI
npx tessl i tessl/maven-dev-langchain4j--langchain4j-open-ai