原本是要写工作流设计,但是写过后总觉得有漏洞,先留着,重构后再发。
最近完成了Midjourney对接,这个对接的方法是从一个开源项目获得的,这个项目地址在之前的文章中写过:
感兴趣的伙伴们可以尝试搭建看看。
搭建
引入包
<dependency>
<groupId>net.dv8tion</groupId>
<artifactId>JDA</artifactId>
<version>${jda.version}</version>
<exclusions>
<exclusion>
<groupId>club.minnced</groupId>
<artifactId>opus-java</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>eu.maxschuster</groupId>
<artifactId>dataurl</artifactId>
<version>${dataurl.version}</version>
</dependency>
第一个依赖项是JDA(Java Discord API),它是一个用于Java开发人员开发Discord机器人的库。JDA提供了与Discord API交互所需的所有功能,并且可以轻松地构建聊天机器人、播放音乐和执行其他操作。
在这个依赖项中,还有一个排除部分,排除了club.minnced:opus-java,这是一个用于音频编解码的库,JDA默认使用JDA-NAS(JDA Native Audio System)来处理音频编解码,因此排除了opus-java。
第二个依赖项是dataurl,它是一个Java库,用于处理data:URL格式的数据。data:URL格式是一种在URL中嵌入数据的方式,它可以将数据编码为Base64,并将其嵌入到URL中。dataurl库提供了一些方法来解析和创建data:URL格式的数据。这个库可以用于将图像或其他二进制数据编码为data:URL格式,以便在网络上传输或嵌入到HTML或CSS中。
代码
JAVA代码
代码太多,就不一个一个发了,在功能主流程可以跑通后就会发出来代码。
代码主要分为了三部分:Discord、Task部分、Midjourney部分
Discord:包含DiscordService、DiscordServiceImpl,主要实现对Discord的调用;
Task:包含TaskService、InMemoryTaskServiceImpl、NotifyService、NotifyServiceImpl,主要实现任务发布、任务执行、任务回调等服务。
Midjourney:通过Discord服务调用Midjourney机器人,目前系统中包含对Midjourney的describe、imagine、reset、upscale、variation命令,通过Discord的命令调用规则,编写JSON文件,对应几个命令的数据包。
Task模块设计
以imagin为例,在调用时会创建Task实例,并调用putTask将任务传入队列。
public MessageVO<String> submit(SubmitDTO submitDTO) {
if (submitDTO.getAction() == null) {
return MessageVO.validationError();
}
if ((submitDTO.getAction() == Action.UPSCALE || submitDTO.getAction() == Action.VARIATION)
&& (submitDTO.getIndex() < 1 || submitDTO.getIndex() > 4)) {
return MessageVO.validationError();
}
Task task = new Task();
task.setNotifyHook(CharSequenceUtil.isBlank(submitDTO.getNotifyHook()) ? this.properties.getNotifyHook() : submitDTO.getNotifyHook());
task.setId(RandomUtil.randomNumbers(16));
task.setSubmitTime(System.currentTimeMillis());
task.setState(submitDTO.getState());
task.setAction(submitDTO.getAction());
task.setTaskInstanceCode(submitDTO.getTaskInstanceCode());
task.setTaskNodeInstanceCode(submitDTO.getTaskNodeInstanceCode());
MessageVO<Void> result;
if (Action.IMAGINE.equals(submitDTO.getAction())) {
String prompt = submitDTO.getPrompt();
if (CharSequenceUtil.isBlank(prompt)) {
return MessageVO.validationError();
}
task.setKey(task.getId());
task.setPrompt(prompt);
// String promptEn = this.translateService.translateToEnglish(prompt).trim();
//不调用翻译功能
task.setPromptEn(prompt);
task.setFinalPrompt("[" + task.getId() + "] " + prompt);
task.setDescription("/imagine " + submitDTO.getPrompt());
this.taskService.putTask(task.getId(), task);
result = this.discordService.imagine(task.getFinalPrompt());
}
if (result.getCode() != MessageVO.SUCCESS_CODE) {
this.taskService.removeTask(task.getId());
return MessageVO.of(result.getCode(), result.getDescription());
}
return MessageVO.success(task.getId());
}