mirror of
https://github.com/jeecgboot/JeecgBoot.git
synced 2026-02-01 08:05:19 +08:00
v3.9.1 发布(AI应用首页,加入 Chat2BI 和 AI绘图)
This commit is contained in:
File diff suppressed because one or more lines are too long
@ -56,7 +56,12 @@ public class AiAppConsts {
|
||||
|
||||
|
||||
/**
|
||||
* AI写作的应用id
|
||||
* AI写作的流程id
|
||||
*/
|
||||
public static final String WRITER_APP_ID = "2010634128233779202";
|
||||
public static final String ARTICLE_WRITER_FLOW_ID = "2011769909807579138";
|
||||
|
||||
/**
|
||||
* AI写作redis请求前缀
|
||||
*/
|
||||
public static final String ARTICLE_WRITER_KEY = "airag:chat:article:write:{}";
|
||||
}
|
||||
|
||||
@ -168,4 +168,9 @@ public class Prompts {
|
||||
*/
|
||||
public static final String AI_REPLY_PROMPT = "请针对如下内容:[{}] 做个回复。回复内容参考:[{}], 回复格式:{},语气:{},语言:{},长度:{}。";
|
||||
|
||||
/**
|
||||
* ai润色提提示词
|
||||
*/
|
||||
public static final String AI_TOUCHE_PROMPT = "请针对如下内容:[{}] 进行润色。 回复格式:{},语气:{},语言:{},长度:{}。";
|
||||
|
||||
}
|
||||
|
||||
@ -16,11 +16,14 @@ import org.jeecg.modules.airag.app.consts.AiAppConsts;
|
||||
import org.jeecg.modules.airag.app.entity.AiragApp;
|
||||
import org.jeecg.modules.airag.app.service.IAiragAppService;
|
||||
import org.jeecg.modules.airag.app.service.IAiragChatService;
|
||||
import org.jeecg.modules.airag.app.vo.AiArticleWriteVersionVo;
|
||||
import org.jeecg.modules.airag.app.vo.AppDebugParams;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
|
||||
/**
|
||||
@ -190,4 +193,31 @@ public class AiragAppController extends JeecgController<AiragApp, IAiragAppServi
|
||||
return (SseEmitter) airagAppService.generateMemoryByAppId(variables, memoryId,false);
|
||||
}
|
||||
|
||||
/**
|
||||
* 写作保存
|
||||
*/
|
||||
@PostMapping("/save/article/write")
|
||||
public Result<String> saveArticleWrite(@RequestBody AiArticleWriteVersionVo aiWriteVersionVo) {
|
||||
airagAppService.saveArticleWrite(aiWriteVersionVo);
|
||||
return Result.OK("保存成功!");
|
||||
}
|
||||
|
||||
/**
|
||||
* 写作删除
|
||||
*/
|
||||
@DeleteMapping("/delete/article/write")
|
||||
public Result<String> deleteArticleWrite(@RequestParam(name = "version") String version) {
|
||||
AssertUtils.assertNotEmpty("版本号不能为空", version);
|
||||
airagAppService.deleteArticleWrite(version);
|
||||
return Result.OK("删除成功!");
|
||||
}
|
||||
|
||||
/**
|
||||
* 写作查询
|
||||
*/
|
||||
@GetMapping("/list/article/write")
|
||||
public Result<List<AiArticleWriteVersionVo>> listArticleWrite() {
|
||||
List<AiArticleWriteVersionVo> list = airagAppService.listArticleWrite();
|
||||
return Result.OK(list);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2,6 +2,8 @@ package org.jeecg.modules.airag.app.service;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import org.jeecg.modules.airag.app.entity.AiragApp;
|
||||
import org.jeecg.modules.airag.app.vo.AiArticleWriteVersionVo;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Description: AI应用
|
||||
@ -30,4 +32,26 @@ public interface IAiragAppService extends IService<AiragApp> {
|
||||
* @return
|
||||
*/
|
||||
Object generateMemoryByAppId(String variables, String memoryId, boolean blocking);
|
||||
|
||||
/**
|
||||
* 写作保存
|
||||
*
|
||||
* @param aiWriteVersionVo
|
||||
*/
|
||||
void saveArticleWrite(AiArticleWriteVersionVo aiWriteVersionVo);
|
||||
|
||||
/**
|
||||
* 写作列表
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
List<AiArticleWriteVersionVo> listArticleWrite();
|
||||
|
||||
/**
|
||||
* 写作删除
|
||||
*
|
||||
* @param version
|
||||
*/
|
||||
void deleteArticleWrite(String version);
|
||||
|
||||
}
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
package org.jeecg.modules.airag.app.service.impl;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
@ -10,15 +11,19 @@ import dev.langchain4j.data.message.UserMessage;
|
||||
import dev.langchain4j.model.output.FinishReason;
|
||||
import dev.langchain4j.service.TokenStream;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.shiro.SecurityUtils;
|
||||
import org.jeecg.common.api.vo.Result;
|
||||
import org.jeecg.common.exception.JeecgBootBizTipException;
|
||||
import org.jeecg.common.system.vo.LoginUser;
|
||||
import org.jeecg.common.util.AssertUtils;
|
||||
import org.jeecg.common.util.UUIDGenerator;
|
||||
import org.jeecg.common.util.oConvertUtils;
|
||||
import org.jeecg.modules.airag.app.consts.AiAppConsts;
|
||||
import org.jeecg.modules.airag.app.consts.Prompts;
|
||||
import org.jeecg.modules.airag.app.entity.AiragApp;
|
||||
import org.jeecg.modules.airag.app.mapper.AiragAppMapper;
|
||||
import org.jeecg.modules.airag.app.service.IAiragAppService;
|
||||
import org.jeecg.modules.airag.app.vo.AiArticleWriteVersionVo;
|
||||
import org.jeecg.modules.airag.app.vo.AppVariableVo;
|
||||
import org.jeecg.modules.airag.common.consts.AiragConsts;
|
||||
import org.jeecg.modules.airag.common.handler.AIChatParams;
|
||||
@ -30,14 +35,18 @@ import org.jeecg.modules.airag.common.vo.event.EventMessageData;
|
||||
import org.jeecg.modules.airag.llm.entity.AiragKnowledge;
|
||||
import org.jeecg.modules.airag.llm.service.IAiragKnowledgeService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.data.redis.core.RedisTemplate;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @Description: AI应用
|
||||
@ -54,6 +63,9 @@ public class AiragAppServiceImpl extends ServiceImpl<AiragAppMapper, AiragApp> i
|
||||
|
||||
@Autowired
|
||||
private IAiragKnowledgeService airagKnowledgeService;
|
||||
|
||||
@Autowired
|
||||
private RedisTemplate redisTemplate;
|
||||
|
||||
@Override
|
||||
public Object generatePrompt(String prompt, boolean blocking) {
|
||||
@ -247,4 +259,68 @@ public class AiragAppServiceImpl extends ServiceImpl<AiragAppMapper, AiragApp> i
|
||||
emitter.complete();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 写作列表
|
||||
*/
|
||||
@Override
|
||||
public List<AiArticleWriteVersionVo> listArticleWrite() {
|
||||
LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
|
||||
String redisKey = StrUtil.format(AiAppConsts.ARTICLE_WRITER_KEY, loginUser.getUsername());
|
||||
Object data = redisTemplate.opsForValue().get(redisKey);
|
||||
if (data == null) {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
List<AiArticleWriteVersionVo> aiWriteViewVoList = (List<AiArticleWriteVersionVo>) data;
|
||||
Collections.reverse(aiWriteViewVoList);
|
||||
return aiWriteViewVoList;
|
||||
}
|
||||
|
||||
/**
|
||||
* 写作报错
|
||||
*/
|
||||
@Override
|
||||
public void saveArticleWrite(AiArticleWriteVersionVo aiWriteVersionVo) {
|
||||
LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
|
||||
String redisKey = StrUtil.format(AiAppConsts.ARTICLE_WRITER_KEY, loginUser.getUsername());
|
||||
//先查看redis中是否存在
|
||||
Object data = redisTemplate.opsForValue().get(redisKey);
|
||||
if(null != data){
|
||||
List<AiArticleWriteVersionVo> aiWriteVersionVos = (List<AiArticleWriteVersionVo>) data;
|
||||
aiWriteVersionVo.setVersion("V"+(aiWriteVersionVos.size() + 1));
|
||||
aiWriteVersionVos.add(aiWriteVersionVo);
|
||||
redisTemplate.opsForValue().set(redisKey, aiWriteVersionVos);
|
||||
}else{
|
||||
List<AiArticleWriteVersionVo> aiWriteVersionVos = new ArrayList<>();
|
||||
aiWriteVersionVo.setVersion("V1");
|
||||
aiWriteVersionVos.add(aiWriteVersionVo);
|
||||
redisTemplate.opsForValue().set(redisKey, aiWriteVersionVos);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 写作删除
|
||||
*/
|
||||
@Override
|
||||
public void deleteArticleWrite(String version) {
|
||||
LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
|
||||
String redisKey = StrUtil.format(AiAppConsts.ARTICLE_WRITER_KEY, loginUser.getUsername());
|
||||
Object data = redisTemplate.opsForValue().get(redisKey);
|
||||
if (data == null) {
|
||||
return;
|
||||
}
|
||||
List<AiArticleWriteVersionVo> aiWriteVersionVos = (List<AiArticleWriteVersionVo>) data;
|
||||
if (aiWriteVersionVos.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
List<AiArticleWriteVersionVo> newList = aiWriteVersionVos.stream()
|
||||
.filter(vo -> !version.equals(vo.getVersion()))
|
||||
.collect(Collectors.toList());
|
||||
if (newList.isEmpty()) {
|
||||
redisTemplate.delete(redisKey);
|
||||
} else {
|
||||
redisTemplate.opsForValue().set(redisKey, newList);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -933,21 +933,32 @@ public class AiragChatServiceImpl implements IAiragChatService {
|
||||
private SseEmitter genImageChat(SseEmitter emitter, ChatSendParams sendParams, String requestId, List<ChatMessage> messages, ChatConversation chatConversation, String topicId) {
|
||||
AssertUtils.assertNotEmpty("请选择绘画模型", sendParams.getDrawModelId());
|
||||
AIChatParams aiChatParams = new AIChatParams();
|
||||
try {
|
||||
List<String> images = sendParams.getImages();
|
||||
List<Map<String, Object>> imageList = new ArrayList<>();
|
||||
if(CollectionUtils.isEmpty(images)) {
|
||||
//生成图片
|
||||
imageList = aiChatHandler.imageGenerate(sendParams.getDrawModelId(), sendParams.getContent(), aiChatParams);
|
||||
} else {
|
||||
//图生图
|
||||
imageList = aiChatHandler.imageEdit(sendParams.getDrawModelId(), sendParams.getContent(), images, aiChatParams);
|
||||
}
|
||||
// 记录历史消息
|
||||
String imageMarkdown = imageList.stream().map(map -> {
|
||||
String newUrl = this.uploadImage(map);
|
||||
return "";
|
||||
}).collect(Collectors.joining("\n"));
|
||||
//update-begin---author:wangshuai---date:2026-01-26---for: 【QQYUN-14615】应用门户加入新工具:取绘画id---
|
||||
String drawModelId = sendParams.getDrawModelId();
|
||||
if(oConvertUtils.isEmpty(sendParams.getDrawModelId())){
|
||||
AiragApp app = chatConversation.getApp();
|
||||
String metadata = app.getMetadata();
|
||||
if(oConvertUtils.isNotEmpty(metadata) && metadata.contains("drawModelId")){
|
||||
drawModelId = JSONObject.parseObject(drawModelId).getString("drawModelId");
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
List<String> images = sendParams.getImages();
|
||||
List<Map<String, Object>> imageList;
|
||||
if(CollectionUtils.isEmpty(images)) {
|
||||
//生成图片
|
||||
imageList = aiChatHandler.imageGenerate(drawModelId, sendParams.getContent(), aiChatParams);
|
||||
} else {
|
||||
//图生图
|
||||
imageList = aiChatHandler.imageEdit(drawModelId, sendParams.getContent(), images, aiChatParams);
|
||||
}
|
||||
// 记录历史消息
|
||||
String imageMarkdown = imageList.stream().map(map -> {
|
||||
String newUrl = this.uploadImage(map);
|
||||
return "";
|
||||
}).collect(Collectors.joining("\n"));
|
||||
//update-end---author:wangshuai---date:2026-01-26---for:【QQYUN-14615】应用门户加入新工具:取绘画id---
|
||||
AiMessage aiMessage = new AiMessage(imageMarkdown);
|
||||
appendMessage(messages, aiMessage, chatConversation, topicId);
|
||||
// 处理绘画结果并通过SSE返回给客户端
|
||||
@ -1868,18 +1879,46 @@ public class AiragChatServiceImpl implements IAiragChatService {
|
||||
@Override
|
||||
public SseEmitter genAiWriter(AiWriteGenerateVo aiWriteGenerateVo) {
|
||||
String activeMode = "compose";
|
||||
String reply = "reply";
|
||||
ChatSendParams sendParams = new ChatSendParams();
|
||||
sendParams.setAppId(AiAppConsts.WRITER_APP_ID);
|
||||
sendParams.setAppId(AiAppConsts.ARTICLE_WRITER_FLOW_ID);
|
||||
String content = "";
|
||||
//写作
|
||||
if (activeMode.equals(aiWriteGenerateVo.getActiveMode())) {
|
||||
content = StrUtil.format(Prompts.AI_WRITER_PROMPT, aiWriteGenerateVo.getPrompt(), aiWriteGenerateVo.getFormat(), aiWriteGenerateVo.getTone(), aiWriteGenerateVo.getLanguage(), aiWriteGenerateVo.getLength());
|
||||
} else {
|
||||
} else if(reply.equals(aiWriteGenerateVo.getActiveMode())){
|
||||
//回复
|
||||
content = StrUtil.format(Prompts.AI_REPLY_PROMPT, aiWriteGenerateVo.getPrompt(), aiWriteGenerateVo.getOriginalContent(), aiWriteGenerateVo.getFormat(), aiWriteGenerateVo.getTone(), aiWriteGenerateVo.getLanguage(), aiWriteGenerateVo.getLength());
|
||||
} else {
|
||||
content = StrUtil.format(Prompts.AI_TOUCHE_PROMPT, aiWriteGenerateVo.getPrompt(), aiWriteGenerateVo.getFormat(), aiWriteGenerateVo.getTone(), aiWriteGenerateVo.getLanguage(), aiWriteGenerateVo.getLength());
|
||||
}
|
||||
sendParams.setContent(content);
|
||||
sendParams.setIzSaveSession(false);
|
||||
return this.send(sendParams);
|
||||
//组装会话
|
||||
String requestId = UUIDGenerator.generate();
|
||||
String topicId = UUIDGenerator.generate();
|
||||
String conversationId = UUIDGenerator.generate();
|
||||
ChatConversation chatConversation = new ChatConversation();
|
||||
chatConversation.setId(conversationId);
|
||||
chatConversation.setMessages(new ArrayList<>());
|
||||
Map<String,Object> flowInputs = new HashMap<>();
|
||||
flowInputs.put("type", aiWriteGenerateVo.getActiveMode());
|
||||
flowInputs.put("version", "V1");
|
||||
chatConversation.setFlowInputs(flowInputs);
|
||||
SseEmitter emitter = createSSE(requestId);
|
||||
// 缓存emitter
|
||||
AiragLocalCache.put(AiragConsts.CACHE_TYPE_SSE, requestId, emitter);
|
||||
// 缓存开始发送时间
|
||||
log.info("[AI-CHAT]开始发送消息,requestId:{}", requestId);
|
||||
AiragLocalCache.put(AiragConsts.CACHE_TYPE_SSE_SEND_TIME, requestId, System.currentTimeMillis());
|
||||
// 初始化历史消息缓存
|
||||
AiragLocalCache.put(AiragConsts.CACHE_TYPE_SSE_HISTORY_MSG, requestId, new CopyOnWriteArrayList<>());
|
||||
|
||||
// 发送就绪消息
|
||||
EventData eventRequestId = new EventData(requestId, null, EventData.EVENT_INIT_REQUEST_ID, chatConversation.getId(), topicId);
|
||||
eventRequestId.setData(EventMessageData.builder().message("").build());
|
||||
sendMessage2Client(emitter, eventRequestId);
|
||||
|
||||
sendWithFlow(requestId, AiAppConsts.ARTICLE_WRITER_FLOW_ID, chatConversation, topicId, new ArrayList<>(), sendParams);
|
||||
return emitter;
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,23 @@
|
||||
package org.jeecg.modules.airag.app.vo;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @Description: AI写作版本号
|
||||
*
|
||||
* @author: wangshuai
|
||||
* @date: 2026/1/16 11:57
|
||||
*/
|
||||
@Data
|
||||
public class AiArticleWriteVersionVo {
|
||||
|
||||
/**
|
||||
* 当前版本号
|
||||
*/
|
||||
private String version;
|
||||
|
||||
/**
|
||||
* 写作内容
|
||||
*/
|
||||
private String content;
|
||||
}
|
||||
@ -25,7 +25,7 @@ spring:
|
||||
# lazy-initialization: true
|
||||
flyway:
|
||||
# 是否启用flyway
|
||||
enabled: false
|
||||
enabled: true
|
||||
# 迁移sql脚本存放路径
|
||||
locations: classpath:flyway/sql/mysql
|
||||
# 是否关闭要清除已有库下的表功能,生产环境必须为true,否则会删库,非常重要!!!
|
||||
|
||||
@ -0,0 +1,3 @@
|
||||
INSERT INTO `airag_app` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`, `name`, `descr`, `icon`, `type`, `prologue`, `prompt`, `model_id`, `knowledge_ids`, `flow_id`, `status`, `msg_num`, `metadata`, `preset_question`, `quick_command`, `plugins`, `memory_id`, `variables`, `iz_open_memory`, `memory_prompt`) VALUES ('2008090512835629057', 'admin', '2026-01-05 16:17:41', 'admin', '2026-01-26 10:36:57', 'A05A01A01', NULL, '绘画_示例', NULL, NULL, 'chatSimple', NULL, '# 角色:文生图创意引擎\n你是一位精通视觉艺术与AI绘画的创意引擎,能将抽象的文字描述转化为精准、高质量、富有艺术感的图像提示词。\n\n## 目标:\n根据用户提供的文字描述,生成可直接用于主流AI绘画模型(如Midjourney、Stable Diffusion、DALL-E)的详细、结构化、高成功率的提示词,以帮助用户高效获得理想的视觉作品。\n\n## 技能:\n1. **深度语义理解**:准确解析用户描述的意图、核心元素、氛围和情感。\n2. **视觉元素拆解与重构**:将抽象概念分解为具体的视觉构成要素(主体、环境、风格、构图、光影、材质等)。\n3. **提示词工程优化**:精通各类AI绘画模型的语法规则,熟练运用权重分配、负面提示、参数设置等技巧。\n4. **艺术风格知识库**:掌握从古典到现代,从写实到抽象的各种艺术流派、画家风格、电影摄影术语。\n5. **多方案生成与评估**:能针对同一需求提供不同侧重点的提示词变体,并简要说明其预期效果差异。\n\n## 工作流:\n1. **需求澄清与细化**:首先与用户确认其描述中的模糊点(如“好看”具体指什么风格?),并主动询问关键细节(如画幅比例、主要色彩倾向、是否包含特定艺术家风格)。\n2. **结构化提示词构建**:按照“主体描述 + 环境/背景 + 艺术风格/媒介 + 构图/视角 + 光照/色彩 + 画质/参数 + (负面提示)”的逻辑结构构建提示词。\n3. **优化与变体提供**:生成一个主推的、最符合描述的详细提示词。同时,提供1-2个在风格或侧重点上略有不同的变体选项,供用户选择或组合。\n4. **使用建议**:简要说明该提示词在目标平台(如Midjourney)中可能需要调整的参数建议(如 `--ar 16:9`, `--v 6.0`)。\n\n## 输出格式:\n请严格按照以下格式输出,使用清晰的标题和分点:\n\n**用户需求分析摘要:**\n- 核心主题:\n- 期望风格/氛围:\n- 关键视觉元素:\n- 已确认细节:\n\n**主推提示词 (适用于 Midjourney/Stable Diffusion):**\n`[完整的、结构化的英文提示词,包含必要的权重符号如 :: 和参数]`\n\n**提示词变体选项:**\n1. **[变体名称,如“更写实风格”]**:`[变体提示词]`\n * *效果说明:此变体侧重于...*\n2. **[变体名称,如“更抽象表现”]**:`[变体提示词]`\n * *效果说明:此变体侧重于...*\n\n**使用建议:**\n- **平台参数**:建议添加 `--ar [比例] --s [风格化值] --v [版本]` (根据分析给出具体建议)。\n- **调整建议**:如需更...效果,可尝试在提示词中加入“...”关键词;如需避免...,可在负面提示中添加“...”。\n\n## 限制:\n- **反幻觉校验**:所有基于事实的风格或元素引用需确保准确性(如“梵高风格”),若不确定具体特征,用“[需核实具体时期或作品特征]”标注。\n- **伦理与合规**:自动过滤涉及现实人物肖像权争议、暴力血腥、成人内容、特定商标版权等敏感描述。若用户需求涉及潜在风险,应引导至合规表达(如“一个风格化的卡通英雄形象”代替具体超级英雄)。\n- **聚焦提示词本身**:不生成实际图像,不解释AI绘画原理,所有输出必须围绕“生成更好的图像提示词”这一核心任务。\n- **清晰简洁**:在保证信息完整的前提下,提示词和说明应尽可能精炼,避免冗长堆砌关键词。', '1897481367743143938', '', NULL, 'enable', 1, '{\"modelInfo\":{\"provider\":\"DEEPSEEK\",\"modelType\":\"LLM\",\"modelName\":\"deepseek-chat\"},\"izDraw\":\"1\",\"drawModelId\":\"2008060119398899713\"}', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||
|
||||
INSERT INTO `airag_model` (`id`, `create_by`, `create_time`, `update_by`, `update_time`, `sys_org_code`, `tenant_id`, `name`, `provider`, `model_name`, `credential`, `base_url`, `model_type`, `model_params`, `activate_flag`) VALUES ('2008060119398899713', 'admin', '2026-01-05 14:16:55', 'admin', '2026-01-27 20:11:51', 'A05A01A01', NULL, '智普图片生成', 'ZHIPU', 'glm-image', '{\"apiKey\":\"76ca78587074479d8939a13\"}', 'https://open.bigmodel.cn', 'IMAGE', NULL, 1);
|
||||
@ -546,7 +546,7 @@
|
||||
<dependency>
|
||||
<groupId>org.jeecgframework.boot3</groupId>
|
||||
<artifactId>jeecg-boot-starter-chatgpt</artifactId>
|
||||
<version>3.9.1</version>
|
||||
<version>3.9.1.1</version>
|
||||
</dependency>
|
||||
<!--flyway 支持 mysql5.7+、MariaDB10.3.16-->
|
||||
<!--mysql5.6,需要把版本号改成5.2.1-->
|
||||
|
||||
Reference in New Issue
Block a user