diff --git a/connectors/OpenaiConnector/src/main/java/de/l3s/interweb/connector/openai/OpenaiConnector.java b/connectors/OpenaiConnector/src/main/java/de/l3s/interweb/connector/openai/OpenaiConnector.java index edec4cd6..ec76b97e 100644 --- a/connectors/OpenaiConnector/src/main/java/de/l3s/interweb/connector/openai/OpenaiConnector.java +++ b/connectors/OpenaiConnector/src/main/java/de/l3s/interweb/connector/openai/OpenaiConnector.java @@ -65,6 +65,8 @@ public Uni complete(CompletionQuery query) throws ConnectorEx results.setCreated(response.getCreated()); results.setChoices(response.getChoices()); results.setUsage(response.getUsage()); + results.setObject(response.getObject()); + results.setSystemFingerprint(response.getSystemFingerprint()); return results; }); } diff --git a/connectors/OpenaiConnector/src/main/java/de/l3s/interweb/connector/openai/entity/CompletionBody.java b/connectors/OpenaiConnector/src/main/java/de/l3s/interweb/connector/openai/entity/CompletionBody.java index 53b77e32..a66be014 100644 --- a/connectors/OpenaiConnector/src/main/java/de/l3s/interweb/connector/openai/entity/CompletionBody.java +++ b/connectors/OpenaiConnector/src/main/java/de/l3s/interweb/connector/openai/entity/CompletionBody.java @@ -2,13 +2,16 @@ import java.util.List; -import com.fasterxml.jackson.annotation.JsonProperty; - import io.quarkus.runtime.annotations.RegisterForReflection; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; + import de.l3s.interweb.core.completion.CompletionQuery; +import de.l3s.interweb.core.completion.ResponseFormat; @RegisterForReflection +@JsonInclude(JsonInclude.Include.NON_NULL) public final class CompletionBody { private List messages; @@ -27,6 +30,24 @@ public final class CompletionBody { @JsonProperty("max_tokens") private Integer maxTokens; + /** + * How many completions to generate for each prompt. Minimum of 1 (default) and maximum of 128 allowed. + * Note: Because this parameter generates many completions, it can quickly consume your token quota. + */ + private Integer n; + + /** + * If specified, our system will make the best effort to sample deterministically, + * such that repeated requests with the same seed and parameters should return the same result. + * Determinism isn't guaranteed, and you should refer to the system_fingerprint response parameter to monitor changes in the backend. + */ + private Integer seed; + + @JsonProperty("response_format") + private ResponseFormat responseFormat; + + private String[] stop; + public CompletionBody(CompletionQuery query) { this.messages = query.getMessages().stream().map(CompletionMessage::new).toList(); this.temperature = query.getTemperature(); @@ -34,6 +55,10 @@ public CompletionBody(CompletionQuery query) { this.frequencyPenalty = query.getPresencePenalty(); this.presencePenalty = query.getPresencePenalty(); this.maxTokens = query.getMaxTokens(); + this.n = query.getN(); + this.seed = query.getSeed(); + this.responseFormat = query.getResponseFormat(); + this.stop = query.getStop(); } public List getMessages() { @@ -59,4 +84,20 @@ public Double getPresencePenalty() { public Integer getMaxTokens() { return maxTokens; } + + public Integer getN() { + return n; + } + + public Integer getSeed() { + return seed; + } + + public ResponseFormat getResponseFormat() { + return responseFormat; + } + + public String[] getStop() { + return stop; + } } diff --git a/connectors/OpenaiConnector/src/main/java/de/l3s/interweb/connector/openai/entity/CompletionResponse.java b/connectors/OpenaiConnector/src/main/java/de/l3s/interweb/connector/openai/entity/CompletionResponse.java index de98fe9d..a9b6fab3 100644 --- a/connectors/OpenaiConnector/src/main/java/de/l3s/interweb/connector/openai/entity/CompletionResponse.java +++ b/connectors/OpenaiConnector/src/main/java/de/l3s/interweb/connector/openai/entity/CompletionResponse.java @@ -5,6 +5,8 @@ import io.quarkus.runtime.annotations.RegisterForReflection; +import com.fasterxml.jackson.annotation.JsonProperty; + import de.l3s.interweb.core.completion.Choice; import de.l3s.interweb.core.completion.Usage; @@ -14,6 +16,8 @@ public class CompletionResponse { private String object; private String model; private Usage usage; + @JsonProperty("system_fingerprint") + private String systemFingerprint; private Instant created; private List choices; @@ -41,14 +45,6 @@ public void setModel(String model) { this.model = model; } - public List getChoices() { - return choices; - } - - public void setChoices(List choices) { - this.choices = choices; - } - public Usage getUsage() { return usage; } @@ -57,6 +53,14 @@ public void setUsage(Usage usage) { this.usage = usage; } + public String getSystemFingerprint() { + return systemFingerprint; + } + + public void setSystemFingerprint(String systemFingerprint) { + this.systemFingerprint = systemFingerprint; + } + public Instant getCreated() { return created; } @@ -64,4 +68,12 @@ public Instant getCreated() { public void setCreated(Instant created) { this.created = created; } + + public List getChoices() { + return choices; + } + + public void setChoices(List choices) { + this.choices = choices; + } } diff --git a/interweb-core/src/main/java/de/l3s/interweb/core/completion/CompletionQuery.java b/interweb-core/src/main/java/de/l3s/interweb/core/completion/CompletionQuery.java index 20d4cb6c..0fda8d6c 100644 --- a/interweb-core/src/main/java/de/l3s/interweb/core/completion/CompletionQuery.java +++ b/interweb-core/src/main/java/de/l3s/interweb/core/completion/CompletionQuery.java @@ -10,6 +10,7 @@ import io.quarkus.runtime.annotations.RegisterForReflection; +import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonProperty; @RegisterForReflection @@ -98,6 +99,30 @@ public class CompletionQuery { @JsonProperty(value = "generate_title") private boolean generateTitle; + /** + * How many completions to generate for each prompt. Minimum of 1 (default) and maximum of 128 allowed. + * Note: Because this parameter generates many completions, it can quickly consume your token quota. + */ + private Integer n; + + /** + * If specified, our system will make the best effort to sample deterministically, + * such that repeated requests with the same seed and parameters should return the same result. + * Determinism isn't guaranteed, and you should refer to the system_fingerprint response parameter to monitor changes in the backend. + */ + private Integer seed; + + /** + * An object specifying the format that the model must output. Used to enable JSON mode. + */ + private ResponseFormat responseFormat; + + /** + * Up to 4 sequences where the API will stop generating further tokens. + */ + @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY) + private String[] stop; + public String getModel() { return model; } @@ -185,4 +210,36 @@ public boolean isGenerateTitle() { public void setGenerateTitle(boolean generateTitle) { this.generateTitle = generateTitle; } + + public void setN(Integer n) { + this.n = n; + } + + public Integer getN() { + return n; + } + + public void setSeed(Integer seed) { + this.seed = seed; + } + + public Integer getSeed() { + return seed; + } + + public void setResponseFormat(ResponseFormat responseFormat) { + this.responseFormat = responseFormat; + } + + public ResponseFormat getResponseFormat() { + return responseFormat; + } + + public void setStop(String[] stop) { + this.stop = stop; + } + + public String[] getStop() { + return stop; + } } diff --git a/interweb-core/src/main/java/de/l3s/interweb/core/completion/CompletionResults.java b/interweb-core/src/main/java/de/l3s/interweb/core/completion/CompletionResults.java index ad81202e..aaa2ed37 100644 --- a/interweb-core/src/main/java/de/l3s/interweb/core/completion/CompletionResults.java +++ b/interweb-core/src/main/java/de/l3s/interweb/core/completion/CompletionResults.java @@ -15,15 +15,18 @@ @RegisterForReflection @JsonIgnoreProperties("results") -@JsonPropertyOrder({"id", "title", "model", "choices", "usage", "cost", "elapsed_time", "created"}) +@JsonPropertyOrder({"id", "object", "title", "model", "choices", "usage", "cost", "elapsed_time", "system_fingerprint", "created"}) public class CompletionResults extends Results { @JsonProperty(value = "id") private UUID chatId; @JsonProperty(value = "title") private String chatTitle; + private String object; private String model; private Usage usage; private UsageCost cost; + @JsonProperty(value = "system_fingerprint") + private String systemFingerprint; private Instant created; public UUID getChatId() { @@ -42,6 +45,14 @@ public void setChatTitle(String chatTitle) { this.chatTitle = chatTitle; } + public String getObject() { + return this.object; + } + + public void setObject(String object) { + this.object = object; + } + public String getModel() { return model; } @@ -81,6 +92,14 @@ public UsageCost getCost() { return cost; } + public String getSystemFingerprint() { + return systemFingerprint; + } + + public void setSystemFingerprint(String systemFingerprint) { + this.systemFingerprint = systemFingerprint; + } + public Instant getCreated() { return created; } diff --git a/interweb-core/src/main/java/de/l3s/interweb/core/completion/ResponseFormat.java b/interweb-core/src/main/java/de/l3s/interweb/core/completion/ResponseFormat.java new file mode 100644 index 00000000..bca51bff --- /dev/null +++ b/interweb-core/src/main/java/de/l3s/interweb/core/completion/ResponseFormat.java @@ -0,0 +1,29 @@ +package de.l3s.interweb.core.completion; + +import io.quarkus.runtime.annotations.RegisterForReflection; + +@RegisterForReflection +public class ResponseFormat { + + public enum ResponseType { + json_object, + text + } + + private ResponseType type; + + public ResponseFormat() { + } + + public ResponseFormat(ResponseType type) { + this.type = type; + } + + public ResponseType getType() { + return type; + } + + public void setType(ResponseType type) { + this.type = type; + } +}