parent
9bfbd3674d
commit
f0337024f1
@ -0,0 +1,23 @@
|
|||||||
|
package xyz.wbsite.achat;
|
||||||
|
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 门户入口
|
||||||
|
*
|
||||||
|
* @author wangbing
|
||||||
|
* @version 0.0.1
|
||||||
|
* @since 1.8
|
||||||
|
*/
|
||||||
|
@RestController
|
||||||
|
public class HelloController {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 门户
|
||||||
|
*/
|
||||||
|
@GetMapping("/")
|
||||||
|
public String chat() {
|
||||||
|
return "AChat is running!";
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,86 @@
|
|||||||
|
package xyz.wbsite.achat;
|
||||||
|
|
||||||
|
import org.springframework.web.bind.annotation.DeleteMapping;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
import xyz.wbsite.achat.core.session.Result;
|
||||||
|
import xyz.wbsite.achat.core.session.Session;
|
||||||
|
import xyz.wbsite.achat.core.session.SessionService;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 会话服务接口
|
||||||
|
* 提供会话、消息的创建、删除、查询等功能
|
||||||
|
*
|
||||||
|
* @author wangbing
|
||||||
|
* @version 0.0.1
|
||||||
|
* @since 1.8
|
||||||
|
*/
|
||||||
|
@RestController
|
||||||
|
public class SessionController {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private SessionService sessionService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建会话
|
||||||
|
*
|
||||||
|
* @param uid 用户标识
|
||||||
|
* @return 创建会话响应
|
||||||
|
*/
|
||||||
|
@PostMapping("/{uid}/session")
|
||||||
|
public Result<Session> createSession(@PathVariable("uid") String uid) {
|
||||||
|
return sessionService.createSession(uid);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除会话
|
||||||
|
*
|
||||||
|
* @param uid 用户标识
|
||||||
|
* @param sid 会话ID
|
||||||
|
* @return 删除会话响应
|
||||||
|
*/
|
||||||
|
@DeleteMapping("/{uid}/session/{sid}")
|
||||||
|
public Result<Void> deleteSession(@PathVariable("uid") String uid, @PathVariable("sid") String sid) {
|
||||||
|
return sessionService.deleteSession(uid, sid);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 会话详情
|
||||||
|
*
|
||||||
|
* @param uid 用户标识
|
||||||
|
* @param sid 会话ID
|
||||||
|
* @return 删除会话响应
|
||||||
|
*/
|
||||||
|
@GetMapping("/{uid}/session/{sid}")
|
||||||
|
public Result<Session> getSession(@PathVariable("uid") String uid, @PathVariable("sid") String sid) {
|
||||||
|
return sessionService.getSession(uid, sid);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取会话列表
|
||||||
|
*
|
||||||
|
* @param uid 用户标识
|
||||||
|
* @return 会话列表响应
|
||||||
|
*/
|
||||||
|
@GetMapping("/{uid}/session/list")
|
||||||
|
public Result<List<Session>> listSession(@PathVariable("uid") String uid) {
|
||||||
|
return sessionService.listSessions(uid);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除会话历史消息
|
||||||
|
*
|
||||||
|
* @param uid 用户标识
|
||||||
|
* @param sid 会话ID
|
||||||
|
* @return 删除会话响应
|
||||||
|
*/
|
||||||
|
@DeleteMapping("/{uid}/session/{sid}/messages/{mid}")
|
||||||
|
public Result<Void> deleteMessage(@PathVariable("uid") String uid, @PathVariable("sid") String sid, @PathVariable("mid") String mid) {
|
||||||
|
return sessionService.deleteMessage(uid, sid, mid);
|
||||||
|
}
|
||||||
|
}
|
@ -1,30 +0,0 @@
|
|||||||
//package xyz.wbsite.achat.core;
|
|
||||||
//
|
|
||||||
///**
|
|
||||||
// * 附件
|
|
||||||
// *
|
|
||||||
// * @author wangbing
|
|
||||||
// * @version 0.0.1
|
|
||||||
// * @since 1.8
|
|
||||||
// */
|
|
||||||
//public class Attachment {
|
|
||||||
// private String filename;
|
|
||||||
//
|
|
||||||
// private String fid;
|
|
||||||
//
|
|
||||||
// public String getFilename() {
|
|
||||||
// return filename;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void setFilename(String filename) {
|
|
||||||
// this.filename = filename;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public String getFid() {
|
|
||||||
// return fid;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void setFid(String fid) {
|
|
||||||
// this.fid = fid;
|
|
||||||
// }
|
|
||||||
//}
|
|
@ -1,75 +0,0 @@
|
|||||||
//package xyz.wbsite.achat.core;
|
|
||||||
//
|
|
||||||
///**
|
|
||||||
// * 服务器推送事件
|
|
||||||
// *
|
|
||||||
// * @author wangbing
|
|
||||||
// * @version 0.0.1
|
|
||||||
// * @since 1.8
|
|
||||||
// */
|
|
||||||
//public class Event {
|
|
||||||
//
|
|
||||||
// private String id;
|
|
||||||
//
|
|
||||||
// private String object;
|
|
||||||
//
|
|
||||||
// private String model;
|
|
||||||
//
|
|
||||||
// private Long created;
|
|
||||||
//
|
|
||||||
// private String sid;
|
|
||||||
//
|
|
||||||
// private String uid;
|
|
||||||
//
|
|
||||||
// public Event() {
|
|
||||||
// this.created = System.currentTimeMillis();
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public String getId() {
|
|
||||||
// return id;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void setId(String id) {
|
|
||||||
// this.id = id;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public String getObject() {
|
|
||||||
// return object;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void setObject(String object) {
|
|
||||||
// this.object = object;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public String getModel() {
|
|
||||||
// return model;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void setModel(String model) {
|
|
||||||
// this.model = model;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public Long getCreated() {
|
|
||||||
// return created;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void setCreated(Long created) {
|
|
||||||
// this.created = created;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public String getSid() {
|
|
||||||
// return sid;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void setSid(String sid) {
|
|
||||||
// this.sid = sid;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public String getUid() {
|
|
||||||
// return uid;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void setUid(String uid) {
|
|
||||||
// this.uid = uid;
|
|
||||||
// }
|
|
||||||
//}
|
|
@ -1,17 +0,0 @@
|
|||||||
//package xyz.wbsite.achat.core;
|
|
||||||
//
|
|
||||||
//public class Prompt {
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * 提示词
|
|
||||||
// */
|
|
||||||
// private String prompt;
|
|
||||||
//
|
|
||||||
// public String getPrompt() {
|
|
||||||
// return prompt;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void setPrompt(String prompt) {
|
|
||||||
// this.prompt = prompt;
|
|
||||||
// }
|
|
||||||
//}
|
|
@ -1,126 +0,0 @@
|
|||||||
//package xyz.wbsite.achat.core;
|
|
||||||
//
|
|
||||||
//
|
|
||||||
///**
|
|
||||||
// * 会话
|
|
||||||
// *
|
|
||||||
// * @author wangbing
|
|
||||||
// * @version 0.0.1
|
|
||||||
// * @since 1.8
|
|
||||||
// */
|
|
||||||
//public class Session {
|
|
||||||
// /**
|
|
||||||
// * 主键
|
|
||||||
// */
|
|
||||||
// private String id;
|
|
||||||
// /**
|
|
||||||
// * 用户ID
|
|
||||||
// */
|
|
||||||
// private String uid;
|
|
||||||
// private String title;
|
|
||||||
// private String model;
|
|
||||||
// private String prompt;
|
|
||||||
// private String temperature;
|
|
||||||
// private String topP;
|
|
||||||
// private String frequencyPenalty;
|
|
||||||
// private String presencePenalty;
|
|
||||||
// private String maxTokens;
|
|
||||||
// private String lastTime;
|
|
||||||
// private String lastMessage;
|
|
||||||
//
|
|
||||||
// public String getId() {
|
|
||||||
// return id;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void setId(String id) {
|
|
||||||
// this.id = id;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public String getUid() {
|
|
||||||
// return uid;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void setUid(String uid) {
|
|
||||||
// this.uid = uid;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public String getTitle() {
|
|
||||||
// return title;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void setTitle(String title) {
|
|
||||||
// this.title = title;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public String getModel() {
|
|
||||||
// return model;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void setModel(String model) {
|
|
||||||
// this.model = model;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public String getPrompt() {
|
|
||||||
// return prompt;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void setPrompt(String prompt) {
|
|
||||||
// this.prompt = prompt;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public String getTemperature() {
|
|
||||||
// return temperature;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void setTemperature(String temperature) {
|
|
||||||
// this.temperature = temperature;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public String getTopP() {
|
|
||||||
// return topP;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void setTopP(String topP) {
|
|
||||||
// this.topP = topP;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public String getFrequencyPenalty() {
|
|
||||||
// return frequencyPenalty;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void setFrequencyPenalty(String frequencyPenalty) {
|
|
||||||
// this.frequencyPenalty = frequencyPenalty;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public String getPresencePenalty() {
|
|
||||||
// return presencePenalty;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void setPresencePenalty(String presencePenalty) {
|
|
||||||
// this.presencePenalty = presencePenalty;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public String getMaxTokens() {
|
|
||||||
// return maxTokens;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void setMaxTokens(String maxTokens) {
|
|
||||||
// this.maxTokens = maxTokens;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public String getLastTime() {
|
|
||||||
// return lastTime;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void setLastTime(String lastTime) {
|
|
||||||
// this.lastTime = lastTime;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public String getLastMessage() {
|
|
||||||
// return lastMessage;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void setLastMessage(String lastMessage) {
|
|
||||||
// this.lastMessage = lastMessage;
|
|
||||||
// }
|
|
||||||
//}
|
|
@ -1,103 +0,0 @@
|
|||||||
//package xyz.wbsite.achat.core.event;
|
|
||||||
//
|
|
||||||
//import xyz.wbsite.achat.core.Event;
|
|
||||||
//
|
|
||||||
///**
|
|
||||||
// * 完成事件
|
|
||||||
// * 用于标识流式响应的结束
|
|
||||||
// *
|
|
||||||
// * @author wangbing
|
|
||||||
// * @version 0.0.1
|
|
||||||
// * @since 1.8
|
|
||||||
// */
|
|
||||||
//public class CompleteEvent extends Event {
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * 完整响应内容
|
|
||||||
// */
|
|
||||||
// private String content;
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * 构造函数
|
|
||||||
// *
|
|
||||||
// * @param sid 会话ID
|
|
||||||
// */
|
|
||||||
// public CompleteEvent(String sid) {
|
|
||||||
// super();
|
|
||||||
// this.setSid(sid);
|
|
||||||
// this.setObject("chat.completion");
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * 生成的令牌总数
|
|
||||||
// */
|
|
||||||
// private Integer completionTokens;
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * 提示词的令牌数量
|
|
||||||
// */
|
|
||||||
// private Integer promptTokens;
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * 总令牌数量
|
|
||||||
// */
|
|
||||||
// private Integer totalTokens;
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * 完成状态
|
|
||||||
// */
|
|
||||||
// private String finishReason;
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * 生成用时(毫秒)
|
|
||||||
// */
|
|
||||||
// private Long generationTime;
|
|
||||||
//
|
|
||||||
// public String getContent() {
|
|
||||||
// return content;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void setContent(String content) {
|
|
||||||
// this.content = content;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public Integer getCompletionTokens() {
|
|
||||||
// return completionTokens;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void setCompletionTokens(Integer completionTokens) {
|
|
||||||
// this.completionTokens = completionTokens;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public Integer getPromptTokens() {
|
|
||||||
// return promptTokens;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void setPromptTokens(Integer promptTokens) {
|
|
||||||
// this.promptTokens = promptTokens;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public Integer getTotalTokens() {
|
|
||||||
// return totalTokens;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void setTotalTokens(Integer totalTokens) {
|
|
||||||
// this.totalTokens = totalTokens;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public String getFinishReason() {
|
|
||||||
// return finishReason;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void setFinishReason(String finishReason) {
|
|
||||||
// this.finishReason = finishReason;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public Long getGenerationTime() {
|
|
||||||
// return generationTime;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void setGenerationTime(Long generationTime) {
|
|
||||||
// this.generationTime = generationTime;
|
|
||||||
// }
|
|
||||||
//}
|
|
@ -1,66 +0,0 @@
|
|||||||
//package xyz.wbsite.achat.core.event;
|
|
||||||
//
|
|
||||||
//import xyz.wbsite.achat.core.Event;
|
|
||||||
//
|
|
||||||
///**
|
|
||||||
// * 开始推送事件
|
|
||||||
// * 用于标识流式响应的开始
|
|
||||||
// *
|
|
||||||
// * @author wangbing
|
|
||||||
// * @version 0.0.1
|
|
||||||
// * @since 1.8
|
|
||||||
// */
|
|
||||||
//public class StartEvent extends Event {
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * 提示词令牌数量
|
|
||||||
// */
|
|
||||||
// private Integer promptTokens;
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * 最大令牌数量限制
|
|
||||||
// */
|
|
||||||
// private Integer maxTokens;
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * 温度参数
|
|
||||||
// */
|
|
||||||
// private Double temperature;
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * 随机种子
|
|
||||||
// */
|
|
||||||
// private Integer seed;
|
|
||||||
//
|
|
||||||
// public Integer getPromptTokens() {
|
|
||||||
// return promptTokens;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void setPromptTokens(Integer promptTokens) {
|
|
||||||
// this.promptTokens = promptTokens;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public Integer getMaxTokens() {
|
|
||||||
// return maxTokens;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void setMaxTokens(Integer maxTokens) {
|
|
||||||
// this.maxTokens = maxTokens;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public Double getTemperature() {
|
|
||||||
// return temperature;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void setTemperature(Double temperature) {
|
|
||||||
// this.temperature = temperature;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public Integer getSeed() {
|
|
||||||
// return seed;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void setSeed(Integer seed) {
|
|
||||||
// this.seed = seed;
|
|
||||||
// }
|
|
||||||
//}
|
|
@ -1,105 +0,0 @@
|
|||||||
//package xyz.wbsite.achat.core.prompt;
|
|
||||||
//
|
|
||||||
//import xyz.wbsite.achat.core.chat.Message;
|
|
||||||
//import xyz.wbsite.achat.core.Prompt;
|
|
||||||
//import xyz.wbsite.achat.core.message.UserMessage;
|
|
||||||
//
|
|
||||||
//import java.util.List;
|
|
||||||
//import java.util.Map;
|
|
||||||
//import java.util.stream.Collectors;
|
|
||||||
//
|
|
||||||
//public class MessagePrompt extends Prompt {
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * 模型
|
|
||||||
// */
|
|
||||||
// private String model;
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * 消息列表
|
|
||||||
// */
|
|
||||||
// private List<Message> messages;
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * 是否流式返回
|
|
||||||
// */
|
|
||||||
// private Boolean stream;
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * 最大token数
|
|
||||||
// */
|
|
||||||
// private Integer maxTokens;
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * 温度参
|
|
||||||
// */
|
|
||||||
// private Double temperature;
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * 额外参数
|
|
||||||
// */
|
|
||||||
// private Map<String, Object> extraParams;
|
|
||||||
//
|
|
||||||
// public String getModel() {
|
|
||||||
// return model;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void setModel(String model) {
|
|
||||||
// this.model = model;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public List<Message> getMessages() {
|
|
||||||
// return messages;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void setMessages(List<Message> messages) {
|
|
||||||
// this.messages = messages;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public Boolean getStream() {
|
|
||||||
// return stream;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void setStream(Boolean stream) {
|
|
||||||
// this.stream = stream;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public Integer getMaxTokens() {
|
|
||||||
// return maxTokens;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void setMaxTokens(Integer maxTokens) {
|
|
||||||
// this.maxTokens = maxTokens;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public Double getTemperature() {
|
|
||||||
// return temperature;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void setTemperature(Double temperature) {
|
|
||||||
// this.temperature = temperature;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public Map<String, Object> getExtraParams() {
|
|
||||||
// return extraParams;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public void setExtraParams(Map<String, Object> extraParams) {
|
|
||||||
// this.extraParams = extraParams;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public UserMessage getLastUserMessage() {
|
|
||||||
// List<Message> messageList = messages.stream().filter(message -> message instanceof UserMessage).collect(Collectors.toList());
|
|
||||||
// UserMessage userMessage = (UserMessage)messageList.get(messageList.size() - 1);
|
|
||||||
// return userMessage;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public String getUid() {
|
|
||||||
// return getLastUserMessage().getUid();
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public String getSid(){
|
|
||||||
// return getLastUserMessage().getSid();
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
//}
|
|
@ -1,18 +0,0 @@
|
|||||||
package xyz.wbsite.achat.core.service;
|
|
||||||
|
|
||||||
import xyz.wbsite.achat.core.chat.ChatCompletionRequest;
|
|
||||||
import xyz.wbsite.achat.core.chat.StreamEmitter;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 推理生成器
|
|
||||||
* <p>
|
|
||||||
* 抽象出来用于生成消息的实现层
|
|
||||||
*
|
|
||||||
* @author wangbing
|
|
||||||
* @version 0.0.1
|
|
||||||
* @since 1.8
|
|
||||||
*/
|
|
||||||
public interface ChatCompletionGenerator {
|
|
||||||
|
|
||||||
void on(StreamEmitter emitter, ChatCompletionRequest chatCompletionRequest);
|
|
||||||
}
|
|
@ -1,121 +0,0 @@
|
|||||||
//package xyz.wbsite.achat.core.service.impl;
|
|
||||||
//
|
|
||||||
//import org.springframework.stereotype.Service;
|
|
||||||
//import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
|
|
||||||
//import xyz.wbsite.achat.core.message.MessageSseEmitter;
|
|
||||||
//import xyz.wbsite.achat.core.chat.Message;
|
|
||||||
//import xyz.wbsite.achat.core.Result;
|
|
||||||
//import xyz.wbsite.achat.core.Session;
|
|
||||||
//import xyz.wbsite.achat.core.prompt.MessagePrompt;
|
|
||||||
//import xyz.wbsite.achat.core.service.SessionService;
|
|
||||||
//
|
|
||||||
//import java.util.ArrayList;
|
|
||||||
//import java.util.HashMap;
|
|
||||||
//import java.util.List;
|
|
||||||
//import java.util.Map;
|
|
||||||
//import java.util.UUID;
|
|
||||||
//import java.util.stream.Collectors;
|
|
||||||
//
|
|
||||||
///**
|
|
||||||
// * 会话管理服务实现类
|
|
||||||
// * 实现会话的创建、删除、查询、消息收发等功能
|
|
||||||
// *
|
|
||||||
// * @author wangbing
|
|
||||||
// * @version 0.0.1
|
|
||||||
// * @since 1.8
|
|
||||||
// */
|
|
||||||
//@Service
|
|
||||||
//public class SessionServiceMemoryImpl implements SessionService {
|
|
||||||
//
|
|
||||||
// private final Map<String, Session> sessionStore = new HashMap<>();
|
|
||||||
//
|
|
||||||
// private final List<Message> messageStore = new ArrayList<>();
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * 创建新会话
|
|
||||||
// */
|
|
||||||
// @Override
|
|
||||||
// public Result<Session> createSession(String uid) {
|
|
||||||
// Session session = new Session();
|
|
||||||
// session.setId(String.valueOf(UUID.randomUUID().toString()));
|
|
||||||
// session.setUid(uid);
|
|
||||||
// session.setTitle("新对话");
|
|
||||||
// sessionStore.put(session.getId(), session);
|
|
||||||
// return Result.success(session);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * 删除会话
|
|
||||||
// */
|
|
||||||
// @Override
|
|
||||||
// public Result<Void> deleteSession(String sid) {
|
|
||||||
// sessionStore.remove(sid);
|
|
||||||
// return Result.success();
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * 查询会话列表
|
|
||||||
// */
|
|
||||||
// @Override
|
|
||||||
// public Result<List<Session>> listSessions(String uid) {
|
|
||||||
// List<Session> collect = sessionStore.values()
|
|
||||||
// .stream()
|
|
||||||
// .filter(item -> item.getUid().equals(uid))
|
|
||||||
// .collect(Collectors.toList());
|
|
||||||
// return Result.success(collect);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * 获取会话详情
|
|
||||||
// */
|
|
||||||
// @Override
|
|
||||||
// public Result<Session> getSession(String sid) {
|
|
||||||
// Session session = sessionStore.get(sid);
|
|
||||||
// if (session == null) {
|
|
||||||
// return Result.error("会话不存在");
|
|
||||||
// }
|
|
||||||
// return Result.success(session);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// /**
|
|
||||||
// * 发送消息并获取流式响应
|
|
||||||
// */
|
|
||||||
// @Override
|
|
||||||
// public SseEmitter sendMessage(MessagePrompt message) {
|
|
||||||
// // 创建VChatSseEmitter来处理流式响应
|
|
||||||
// return new MessageSseEmitter(message, (emitter, message1) -> {
|
|
||||||
// // 这边模拟LLM复述一遍用户问题
|
|
||||||
// String text = message1.getContent();
|
|
||||||
// for (char c : text.toCharArray()) {
|
|
||||||
// if (emitter.isComplete()) {
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
// emitter.onPartialResponse(String.valueOf(c));
|
|
||||||
// try {
|
|
||||||
// Thread.sleep(100);
|
|
||||||
// } catch (InterruptedException e) {
|
|
||||||
// throw new RuntimeException(e);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// emitter.onCompleteResponse(null);
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @Override
|
|
||||||
// public Result<Void> stopSession(String sid) {
|
|
||||||
// // todo
|
|
||||||
// return Result.success();
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @Override
|
|
||||||
// public Result<List<Message>> listMessage(String sid) {
|
|
||||||
// List<Message> messages = messageStore.stream().filter(item -> item.getSid().equals(sid)).collect(Collectors.toList());
|
|
||||||
// return Result.success(messages);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @Override
|
|
||||||
// public Result<Void> deleteMessage(String sid) {
|
|
||||||
// messageStore.forEach(item -> messageStore.remove(item));
|
|
||||||
// return null;
|
|
||||||
// }
|
|
||||||
//}
|
|
@ -0,0 +1,34 @@
|
|||||||
|
package xyz.wbsite.achat.core.session;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class Message extends xyz.wbsite.achat.core.chat.Message {
|
||||||
|
private String id;
|
||||||
|
private String uid;
|
||||||
|
private String sid;
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(String id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUid() {
|
||||||
|
return uid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUid(String uid) {
|
||||||
|
this.uid = uid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSid() {
|
||||||
|
return sid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSid(String sid) {
|
||||||
|
this.sid = sid;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,138 @@
|
|||||||
|
package xyz.wbsite.achat.core.session;
|
||||||
|
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 会话
|
||||||
|
*
|
||||||
|
* @author wangbing
|
||||||
|
* @version 0.0.1
|
||||||
|
* @since 1.8
|
||||||
|
*/
|
||||||
|
public class Session {
|
||||||
|
/**
|
||||||
|
* 主键
|
||||||
|
*/
|
||||||
|
private String id;
|
||||||
|
/**
|
||||||
|
* 用户ID
|
||||||
|
*/
|
||||||
|
private String uid;
|
||||||
|
private String title;
|
||||||
|
private String model;
|
||||||
|
private String prompt;
|
||||||
|
private String temperature;
|
||||||
|
private String topP;
|
||||||
|
private String frequencyPenalty;
|
||||||
|
private String presencePenalty;
|
||||||
|
private String maxTokens;
|
||||||
|
private String lastTime;
|
||||||
|
private String lastMessage;
|
||||||
|
|
||||||
|
private List<Message> messages;
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(String id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUid() {
|
||||||
|
return uid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUid(String uid) {
|
||||||
|
this.uid = uid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTitle() {
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTitle(String title) {
|
||||||
|
this.title = title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getModel() {
|
||||||
|
return model;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setModel(String model) {
|
||||||
|
this.model = model;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPrompt() {
|
||||||
|
return prompt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPrompt(String prompt) {
|
||||||
|
this.prompt = prompt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTemperature() {
|
||||||
|
return temperature;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTemperature(String temperature) {
|
||||||
|
this.temperature = temperature;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTopP() {
|
||||||
|
return topP;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTopP(String topP) {
|
||||||
|
this.topP = topP;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFrequencyPenalty() {
|
||||||
|
return frequencyPenalty;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFrequencyPenalty(String frequencyPenalty) {
|
||||||
|
this.frequencyPenalty = frequencyPenalty;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPresencePenalty() {
|
||||||
|
return presencePenalty;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPresencePenalty(String presencePenalty) {
|
||||||
|
this.presencePenalty = presencePenalty;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMaxTokens() {
|
||||||
|
return maxTokens;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMaxTokens(String maxTokens) {
|
||||||
|
this.maxTokens = maxTokens;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLastTime() {
|
||||||
|
return lastTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLastTime(String lastTime) {
|
||||||
|
this.lastTime = lastTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLastMessage() {
|
||||||
|
return lastMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLastMessage(String lastMessage) {
|
||||||
|
this.lastMessage = lastMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Message> getMessages() {
|
||||||
|
return messages;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMessages(List<Message> messages) {
|
||||||
|
this.messages = messages;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,56 @@
|
|||||||
|
package xyz.wbsite.achat.core.session;
|
||||||
|
|
||||||
|
import xyz.wbsite.achat.core.chat.Message;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 会话管理服务接口
|
||||||
|
* 提供会话的创建、删除、查询、消息收发等功能
|
||||||
|
*
|
||||||
|
* @author wangbing
|
||||||
|
* @version 0.0.1
|
||||||
|
* @since 1.8
|
||||||
|
*/
|
||||||
|
public interface SessionService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建新会话
|
||||||
|
*
|
||||||
|
* @param uid 用户编号
|
||||||
|
* @return 创建的会话对象
|
||||||
|
*/
|
||||||
|
Result<Session> createSession(String uid);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除会话
|
||||||
|
*
|
||||||
|
* @param sid 会话ID
|
||||||
|
* @return 删除是否成功
|
||||||
|
*/
|
||||||
|
Result<Void> deleteSession(String uid, String sid);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询会话列表
|
||||||
|
*
|
||||||
|
* @param uid 用户编号
|
||||||
|
* @return 会话列表
|
||||||
|
*/
|
||||||
|
Result<List<Session>> listSessions(String uid);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取会话详情
|
||||||
|
*
|
||||||
|
* @param sid 会话ID
|
||||||
|
* @return 会话对象
|
||||||
|
*/
|
||||||
|
Result<Session> getSession(String uid,String sid);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取会话历史消息
|
||||||
|
*
|
||||||
|
* @param sid 会话ID
|
||||||
|
* @return 消息列表
|
||||||
|
*/
|
||||||
|
Result<Void> deleteMessage(String uid, String sid, String mid);
|
||||||
|
}
|
@ -0,0 +1,176 @@
|
|||||||
|
package xyz.wbsite.achat.core.session;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 会话管理服务实现类
|
||||||
|
* 实现会话的创建、删除、查询、消息收发等功能
|
||||||
|
*
|
||||||
|
* @author wangbing
|
||||||
|
* @version 0.0.1
|
||||||
|
* @since 1.8
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class SessionServiceMemoryImpl implements SessionService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 会话存储
|
||||||
|
*/
|
||||||
|
private final List<Session> sessionStore = new ArrayList<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 消息存储
|
||||||
|
*/
|
||||||
|
private final List<Message> messageStore = new ArrayList<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建新会话
|
||||||
|
*
|
||||||
|
* @param uid 用户ID
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Result<Session> createSession(String uid) {
|
||||||
|
// 检查参数合法性
|
||||||
|
if (uid == null || uid.isEmpty()) {
|
||||||
|
return Result.error("用户ID不能为空");
|
||||||
|
}
|
||||||
|
|
||||||
|
Session session = new Session();
|
||||||
|
session.setId(String.valueOf(UUID.randomUUID().toString()));
|
||||||
|
session.setUid(uid);
|
||||||
|
session.setTitle("新对话");
|
||||||
|
sessionStore.add(session);
|
||||||
|
return Result.success(session);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除会话
|
||||||
|
*
|
||||||
|
* @param uid 用户ID
|
||||||
|
* @param sid 会话ID
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Result<Void> deleteSession(String uid, String sid) {
|
||||||
|
// 检查参数合法性
|
||||||
|
if (uid == null || uid.isEmpty() || sid == null || sid.isEmpty()) {
|
||||||
|
return Result.error("用户ID或会话ID不能为空");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 从sessionStore查找比对uid和sid然后删除
|
||||||
|
boolean sessionRemoved = sessionStore.removeIf(session ->
|
||||||
|
session.getId().equals(sid) && session.getUid().equals(uid)
|
||||||
|
);
|
||||||
|
|
||||||
|
// 从messageStore查找比对uid和sid然后删除
|
||||||
|
messageStore.removeIf(message ->
|
||||||
|
message.getUid().equals(uid) && message.getSid().equals(sid)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!sessionRemoved) {
|
||||||
|
return Result.error("会话不存在或无权限删除");
|
||||||
|
}
|
||||||
|
|
||||||
|
return Result.success();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询会话列表
|
||||||
|
*
|
||||||
|
* @param uid 用户ID
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* 查询会话列表
|
||||||
|
*
|
||||||
|
* @param uid 用户ID
|
||||||
|
* @return 会话列表
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Result<List<Session>> listSessions(String uid) {
|
||||||
|
// 检查参数合法性
|
||||||
|
if (uid == null || uid.isEmpty()) {
|
||||||
|
return Result.error("用户ID不能为空");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 从sessionStore查找比对uid返回所有会话
|
||||||
|
List<Session> userSessions = sessionStore.stream()
|
||||||
|
.filter(session -> session.getUid().equals(uid))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
return Result.success(userSessions);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取会话详情
|
||||||
|
*
|
||||||
|
* @param uid 用户ID
|
||||||
|
* @param sid 会话ID
|
||||||
|
* @return 会话详情
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Result<Session> getSession(String uid, String sid) {
|
||||||
|
// 检查参数合法性
|
||||||
|
if (uid == null || uid.isEmpty() || sid == null || sid.isEmpty()) {
|
||||||
|
return Result.error("用户ID或会话ID不能为空");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 从sessionStore查找比对uid和sid返回会话
|
||||||
|
Session session = sessionStore.stream()
|
||||||
|
.filter(s -> s.getId().equals(sid) && s.getUid().equals(uid))
|
||||||
|
.findFirst()
|
||||||
|
.orElse(null);
|
||||||
|
|
||||||
|
if (session == null) {
|
||||||
|
return Result.error("会话不存在或无权限查看");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建会话副本
|
||||||
|
Session sessionCopy = new Session();
|
||||||
|
sessionCopy.setId(session.getId());
|
||||||
|
sessionCopy.setUid(session.getUid());
|
||||||
|
sessionCopy.setTitle(session.getTitle());
|
||||||
|
|
||||||
|
// 从messageStore检索出当前会话的聊天记录
|
||||||
|
List<Message> sessionMessages = messageStore.stream()
|
||||||
|
.filter(message -> message.getUid().equals(uid) && message.getSid().equals(sid))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
sessionCopy.setMessages(sessionMessages);
|
||||||
|
|
||||||
|
return Result.success(sessionCopy);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除会话中的消息
|
||||||
|
*
|
||||||
|
* @param uid 用户ID
|
||||||
|
* @param sid 会话ID
|
||||||
|
* @param mid 消息ID
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Result<Void> deleteMessage(String uid, String sid, String mid) {
|
||||||
|
// 检查参数合法性
|
||||||
|
if (uid == null || uid.isEmpty() || sid == null || sid.isEmpty() || mid == null || mid.isEmpty()) {
|
||||||
|
return Result.error("用户ID、会话ID或消息ID不能为空");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 从messageStore查找比对uid、sid和mid然后删除
|
||||||
|
boolean mr = messageStore.removeIf(message ->
|
||||||
|
message.getId().equals(mid) && message.getUid().equals(uid) && message.getSid().equals(sid)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!mr) {
|
||||||
|
return Result.error("消息不存在或无权限删除");
|
||||||
|
}
|
||||||
|
|
||||||
|
return Result.success();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in new issue