Adds model for Chat Requests to Ollama-API

This commit is contained in:
Markus Klenke 2024-02-09 16:28:27 +00:00
parent 3469bf314b
commit f8cd7bc013
5 changed files with 207 additions and 0 deletions

View File

@ -0,0 +1,40 @@
package io.github.amithkoujalgi.ollama4j.core.models.chat;
import com.fasterxml.jackson.core.JsonProcessingException;
import static io.github.amithkoujalgi.ollama4j.core.utils.Utils.getObjectMapper;
import java.io.File;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
/**
* Defines a single Message to be used inside a chat request against the ollama /api/chat endpoint.
*
* @see https://github.com/ollama/ollama/blob/main/docs/api.md#generate-a-chat-completion
*/
@Data
@AllArgsConstructor
@RequiredArgsConstructor
public class OllamaChatMessage {
@NonNull
private OllamaChatMessageRole role;
@NonNull
private String content;
private List<File> images;
@Override
public String toString() {
try {
return getObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(this);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
}

View File

@ -0,0 +1,16 @@
package io.github.amithkoujalgi.ollama4j.core.models.chat;
/**
* Defines the possible Chat Message roles.
*/
public enum OllamaChatMessageRole {
SYSTEM("system"),
USER("user"),
ASSISTANT("assisstant");
private String roleName;
private OllamaChatMessageRole(String roleName){
this.roleName = roleName;
}
}

View File

@ -0,0 +1,64 @@
package io.github.amithkoujalgi.ollama4j.core.models.chat;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import io.github.amithkoujalgi.ollama4j.core.utils.Options;
/**
* Helper class for creating {@link OllamaChatRequestModel} objects using the builder-pattern.
*/
public class OllamaChatRequestBuilder {
private OllamaChatRequestBuilder(String model, List<OllamaChatMessage> messages){
request = new OllamaChatRequestModel(model, messages);
}
private OllamaChatRequestModel request;
public static OllamaChatRequestBuilder getInstance(String model){
return new OllamaChatRequestBuilder(model, new ArrayList<>());
}
public OllamaChatRequestModel build(){
return request;
}
public OllamaChatRequestBuilder withMessage(OllamaChatMessageRole role, String content, File... images){
List<OllamaChatMessage> messages = this.request.getMessages();
messages.add(new OllamaChatMessage(role,content,List.of(images)));
return this;
}
public OllamaChatRequestBuilder withMessages(List<OllamaChatMessage> messages){
this.request.setMessages(messages);
return this;
}
public OllamaChatRequestBuilder withOptions(Options options){
this.request.setOptions(options);
return this;
}
public OllamaChatRequestBuilder withFormat(String format){
this.request.setFormat(format);
return this;
}
public OllamaChatRequestBuilder withTemplate(String template){
this.request.setTemplate(template);
return this;
}
public OllamaChatRequestBuilder withStreaming(){
this.request.setStream(true);
return this;
}
public OllamaChatRequestBuilder withKeepAlive(String keepAlive){
this.request.setKeepAlive(keepAlive);
return this;
}
}

View File

@ -0,0 +1,61 @@
package io.github.amithkoujalgi.ollama4j.core.models.chat;
import java.net.http.HttpRequest;
import java.net.http.HttpRequest.BodyPublisher;
import java.util.List;
import com.fasterxml.jackson.core.JsonProcessingException;
import io.github.amithkoujalgi.ollama4j.core.utils.OllamaRequestBody;
import io.github.amithkoujalgi.ollama4j.core.utils.Options;
import io.github.amithkoujalgi.ollama4j.core.utils.Utils;
import static io.github.amithkoujalgi.ollama4j.core.utils.Utils.getObjectMapper;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
/**
* Defines a Request to use against the ollama /api/chat endpoint.
*
* @see https://github.com/ollama/ollama/blob/main/docs/api.md#generate-a-chat-completion
*/
@Data
@AllArgsConstructor
@RequiredArgsConstructor
public class OllamaChatRequestModel implements OllamaRequestBody{
@NonNull
private String model;
@NonNull
private List<OllamaChatMessage> messages;
private String format;
private Options options;
private String template;
private boolean stream;
private String keepAlive;
@Override
public String toString() {
try {
return getObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(this);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
@Override
public BodyPublisher getBodyPublisher() {
try {
return HttpRequest.BodyPublishers.ofString(
Utils.getObjectMapper().writeValueAsString(this));
} catch (JsonProcessingException e) {
throw new IllegalArgumentException("Request not Body convertible.",e);
}
}
}

View File

@ -0,0 +1,26 @@
package io.github.amithkoujalgi.ollama4j.core.utils;
import java.net.http.HttpRequest.BodyPublisher;
import java.net.http.HttpRequest.BodyPublishers;
import com.fasterxml.jackson.core.JsonProcessingException;
/**
* Interface to represent a OllamaRequest as HTTP-Request Body via {@link BodyPublishers}.
*/
public interface OllamaRequestBody {
/**
* Transforms the OllamaRequest Object to a JSON Object via Jackson.
*
* @return JSON representation of a OllamaRequest
*/
default BodyPublisher getBodyPublisher(){
try {
return BodyPublishers.ofString(
Utils.getObjectMapper().writeValueAsString(this));
} catch (JsonProcessingException e) {
throw new IllegalArgumentException("Request not Body convertible.",e);
}
}
}