The development of this JAVA-based AI SDK is primarily aimed at addressing the lack of adequate support for the JAVA environment in the SDK provided by mainstream model manufacturers, or the difficulties encountered when integrating them into existing business systems.
The project mainly involves encapsulating the REST API provided by model manufacturers, making it convenient for JAVA developers to use. It also introduces only a minimal number of dependency packages to avoid conflicts.
The SDK currently supports historical context. Simply pass in the corresponding historical data when calling the interface. For specific examples, please refer to the multi-turn dialogue in the example below.
<dependency>
<groupId>org.liurb.ai.sdk</groupId>
<artifactId>java-ai-sdk</artifactId>
<version>${version}</version>
</dependency>You can get the version here:Maven Central
For more information about the REST API, please refer to the official documentation. Gemini API Overview
- Text and image input : It only supports the Gemini 1.5 model or the Gemini 1.0 Pro model.
- Text only input
- Multi-turn conversations (chat)
- Streamed responses
Configure the API KEY through the ModelAccount settings. If you need to use a reverse proxy, you can configure the BASE_URL.
ModelAccount account = ModelAccount.builder().apiKey(apiKey).baseUrl(baseUrl).build();Build a request client
public GeminiClient(ModelAccount account) Chat
@Test
public void chatTest() throws IOException {
ModelAccount account = ModelAccount.builder().apiKey(apiKey).baseUrl(baseUrl).build();
GenerationConfig generationConfig = GenerationConfig.builder().temperature(0.3).build();
GeminiClient client = new GeminiClient(account);
// By default, use the models/gemini-1.5-flash model, or customize the configuration.
// client.chat("models/gemini-1.5-pro", who are you", generationConfig);
AiChatResponse chatResponse = client.chat("who are you", generationConfig);
System.out.println(chatResponse);
}Multi-turn Chat
@Test
public void multiTurnChatTest() throws IOException {
ModelAccount account = ModelAccount.builder().apiKey(apiKey).baseUrl(baseUrl).build();
GenerationConfig generationConfig = GenerationConfig.builder().temperature(0.3).build();
GeminiClient client = new GeminiClient(account);
AiChatResponse chatResponse1 = client.chat("Do you know something about Yao Ming", generationConfig);
System.out.println(chatResponse1);
// round one history data
List<ChatHistory> history1 = chatResponse1.getHistory();
AiChatResponse chatResponse2 = client.chat("who is his wife", generationConfig, history1);
System.out.println(chatResponse2);
// round two history data
List<ChatHistory> history2 = chatResponse2.getHistory();
AiChatResponse chatResponse3 = client.chat("who is his daughter", generationConfig, history2);
System.out.println(chatResponse3);
}Multimodal (with context)
@Test
public void chatMultiModalTest() throws IOException {
ModelAccount account = ModelAccount.builder().apiKey(apiKey).baseUrl(baseUrl).build();
GenerationConfig generationConfig = GenerationConfig.builder().temperature(0.3).build();
GeminiClient client = new GeminiClient(GeminiModelEnum.GEMINI_PRO.getName(), account);
// image url
String imageUrl = "https://pic.qqtn.com/uploadfiles/2009-6/2009614181816.jpg";
// Convert the image to base64
String base64 = Base64Util.imageUrlToBase64(imageUrl);
MediaData mediaData = MediaData.builder().type("image/jpeg").url(base64).build();
String message = "What is this picture";
AiChatResponse chatResponse1 = client.chat(message, mediaData, generationConfig, null);
System.out.println(chatResponse1);
// history data
List<ChatHistory> history = chatResponse1.getHistory();
AiChatResponse chatResponse2 = client.chat("How many dog are there", generationConfig, history);
System.out.println(chatResponse2);
}Stream Chat
ModelAccount account = ModelAccount.builder().apiKey(apiKey).baseUrl(baseUrl).build();
GenerationConfig generationConfig = GenerationConfig.builder().temperature(0.3).build();
List<ChatHistory> history = new ArrayList<>();
GeminiClient client = new GeminiClient(account);
client.stream("Do you know something about Yao Ming", generationConfig, history, new AiStreamResponseListener() {
@Override
public void accept(AiStreamMessage streamMessage) {
System.out.println("accept1:" + streamMessage.getContent());
}
});In the chat methods, the function of automatically implementing historical records has been realized. The caller can obtain the history through the returned AiChatResponse object.
@Data
public class AiChatResponse {
private ChatMessage message;
private MediaData media;
private List<ChatHistory> history;
}For streaming conversations, it is necessary to pass in a list of historical records from the outside.
List<ChatHistory> history = new ArrayList<>();
client.stream("ask something", generationConfig, history, new AiStreamResponseListener() {
//...
});For more information about the REST API, please refer to the official documentation.API Overview
- Multi-turn conversations
- Vision
- Streamed responses
The usage is similar to Google Gemini. For specific examples, please refer to the samples in the Test package.
Currently, it is compatible with some free API interfaces, meaning any interface that is compatible with /v1/chat/completions can be used. Simply replace apiKey and baseUrl as needed.
In the future, I plan to create a Spring version, or look at which model SDKs are currently difficult to use and will be added to this project.