Skip to content

Commit

Permalink
Added DALL-E
Browse files Browse the repository at this point in the history
  • Loading branch information
cjmalloy committed Oct 5, 2023
1 parent 1ebd4f2 commit 5669cb2
Show file tree
Hide file tree
Showing 2 changed files with 163 additions and 0 deletions.
25 changes: 25 additions & 0 deletions src/main/java/jasper/component/OpenAi.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
import com.theokanning.openai.completion.chat.ChatCompletionResult;
import com.theokanning.openai.completion.chat.ChatMessage;
import com.theokanning.openai.finetune.FineTuneRequest;
import com.theokanning.openai.image.CreateImageRequest;
import com.theokanning.openai.image.ImageResult;
import com.theokanning.openai.service.OpenAiService;
import jasper.client.dto.RefDto;
import jasper.config.Props;
Expand Down Expand Up @@ -217,6 +219,24 @@ public ChatCompletionResult chatCompletion(String systemPrompt, String prompt) {
}
}


public ImageResult dale(String prompt, DalleConfig config) {
var key = refRepository.findAll(selector("_openai/key" + props.getLocalOrigin()).refSpec());
if (key.isEmpty()) {
throw new NotFoundException("requires openai api key");
}
var service = new OpenAiService(key.get(0).getComment(), Duration.ofSeconds(200));
var imageRequest = CreateImageRequest.builder()
.prompt(prompt)
.size(config.size)
.build();
try {
return service.createImage(imageRequest);
} catch (OpenAiHttpException e) {
throw e;
}
}

public CompletionResult fineTunedCompletion(List<ChatMessage> messages) {
var key = refRepository.findAll(selector("_openai/key" + props.getLocalOrigin()).refSpec());
if (key.isEmpty()) {
Expand Down Expand Up @@ -331,4 +351,9 @@ public static class AiConfig {
public String ftId;
public String fineTunedModel;
}

public static class DalleConfig {
public String size = "1024x1024";
}

}
138 changes: 138 additions & 0 deletions src/main/java/jasper/component/delta/Dalle.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
package jasper.component.delta;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import jasper.component.Ingest;
import jasper.component.OpenAi;
import jasper.component.scheduler.Async;
import jasper.domain.Ext;
import jasper.domain.Plugin;
import jasper.domain.Ref;
import jasper.domain.Template;
import jasper.domain.User;
import jasper.errors.NotFoundException;
import jasper.repository.PluginRepository;
import jasper.repository.RefRepository;
import jasper.repository.TemplateRepository;
import lombok.Getter;
import lombok.Setter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

@Profile("ai")
@Component
public class Dalle implements Async.AsyncRunner {
private static final Logger logger = LoggerFactory.getLogger(Dalle.class);

@Autowired
Async async;

@Autowired
Ingest ingest;

@Autowired
OpenAi openAi;

@Autowired
RefRepository refRepository;

@Autowired
PluginRepository pluginRepository;

@Autowired
TemplateRepository templateRepository;

@Autowired
ObjectMapper objectMapper;

@Autowired
RefMapper refMapper;

@PostConstruct
void init() {
async.addAsyncResponse("plugin/inbox/dalle", this);
}

@Override
public String signature() {
return "+plugin/dalle";
}

@Override
public void run(Ref ref) throws JsonProcessingException {
logger.debug("AI replying to {} ({})", ref.getTitle(), ref.getUrl());
var author = ref.getTags().stream().filter(User::isUser).findFirst().orElse(null);
var dallePlugin = pluginRepository.findByTagAndOrigin("+plugin/dalle", ref.getOrigin())
.orElseThrow(() -> new NotFoundException("+plugin/dalle"));
var config = objectMapper.convertValue(dallePlugin.getConfig(), OpenAi.DalleConfig.class);
var response = new Ref();
try {
var res = openAi.dale(ref.getTitle() + ": " + ref.getComment(), config);
response.setTitle("Re: " + ref.getTitle());
response.setUrl(res.getData().get(0).getUrl());
} catch (Exception e) {
response.setComment("Error invoking DALL-E. " + e.getMessage());
response.setUrl("internal:" + UUID.randomUUID());
}
if (ref.getTags().contains("public")) response.addTag("public");
if (ref.getTags().contains("internal")) response.addTag("internal");
if (ref.getTags().contains("dm")) response.addTag("dm");
if (ref.getTags().contains("dm")) response.addTag("plugin/thread");
if (ref.getTags().contains("plugin/email")) response.addTag("plugin/email");
if (ref.getTags().contains("plugin/email")) response.addTag("plugin/thread");
if (ref.getTags().contains("plugin/comment")) response.addTag("plugin/comment");
if (ref.getTags().contains("plugin/comment")) response.addTag("plugin/thread");
if (ref.getTags().contains("plugin/thread")) response.addTag("plugin/thread");
response.addTag("plugin/image");
var chat = false;
for (var t : ref.getTags()) {
if (t.startsWith("chat/") || t.equals("chat")) {
chat = true;
response.addTag(t);
}
}
if (!chat) {
if (author != null) response.addTag("plugin/inbox/" + author.substring(1));
for (var t : ref.getTags()) {
if (t.startsWith("plugin/inbox/") || t.startsWith("plugin/outbox/")) {
response.addTag(t);
}
}
}
response.addTag("+plugin/dalle");
response.getTags().remove("plugin/inbox/dalle");
var sources = new ArrayList<>(List.of(ref.getUrl()));
if (response.getTags().contains("plugin/thread")) {
// Add top comment source
if (ref.getSources() != null && ref.getSources().size() > 0) {
if (ref.getSources().size() > 1) {
sources.add(ref.getSources().get(1));
} else {
sources.add(ref.getSources().get(0));
}
}
}
response.setSources(sources);
response.setOrigin(ref.getOrigin());
ingest.ingest(response, false);
logger.debug("DALL-E reply sent ({})", response.getUrl());
}

@Getter
@Setter
private static class AiReply {
private Ref[] ref;
private Ext[] ext;
private Plugin[] plugin;
private Template[] template;
private User[] user;
}
}

0 comments on commit 5669cb2

Please sign in to comment.