| | |
| | | |
| | | @Getter |
| | | public enum BillingType { |
| | | TOKEN("1", "token扣费"), // token扣费 |
| | | TIMES("2", "次数扣费"); // 次数扣费 |
| | | TOKEN("1", "token扣费"), |
| | | TIMES("2", "次数扣费"); |
| | | |
| | | private final String code; |
| | | private final String description; |
| | |
| | | |
| | | @Getter |
| | | public enum ChatModeType { |
| | | OLLAMA("ollama", "本地部署模型"), // token扣费 |
| | | CHAT("chat", "中转模型"), // 次数扣费 |
| | | VECTOR("vector", "知识库向量模型"); // 次数扣费 |
| | | OLLAMA("ollama", "本地部署模型"), |
| | | CHAT("chat", "中转模型"), |
| | | VECTOR("vector", "知识库向量模型"); |
| | | |
| | | private final String code; |
| | | private final String description; |
| | |
| | | this.description = description; |
| | | } |
| | | |
| | | public String getCode() { |
| | | return code; |
| | | } |
| | | |
| | | public String getDescription() { |
| | | return description; |
| | | } |
| | | } |
| | |
| | | import lombok.Getter; |
| | | |
| | | /** |
| | | * 描述: |
| | | * 描述:是否显示 |
| | | * |
| | | * @author ageerle@163.com |
| | | * date 2025/4/10 |
| | |
| | | import org.springframework.ai.mcp.SyncMcpToolCallbackProvider; |
| | | import org.springframework.ai.openai.OpenAiChatOptions; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; |
| | | import java.util.List; |
| | |
| | | private IChatModelService chatModelService; |
| | | |
| | | private OpenAiStreamClient openAiStreamClient; |
| | | |
| | | |
| | | @Value("${spring.ai.mcp.client.enabled}") |
| | | private Boolean enabled; |
| | | |
| | | private final ChatClient chatClient; |
| | | |
| | |
| | | public SseEmitter chat(ChatRequest chatRequest,SseEmitter emitter) { |
| | | ChatModelVo chatModelVo = chatModelService.selectModelByName(chatRequest.getModel()); |
| | | openAiStreamClient = ChatConfig.createOpenAiStreamClient(chatModelVo.getApiHost(), chatModelVo.getApiKey()); |
| | | List<Message> messages = chatRequest.getMessages(); |
| | | if (enabled) { |
| | | String toolString = mcpChat(chatRequest.getPrompt()); |
| | | Message userMessage = Message.builder().content("工具返回信息:"+toolString).role(Message.Role.USER).build(); |
| | | List<Message> messages = chatRequest.getMessages(); |
| | | messages.add(userMessage); |
| | | } |
| | | SSEEventSourceListener listener = new SSEEventSourceListener(emitter); |
| | | ChatCompletion completion = ChatCompletion |
| | | .builder() |
| | |
| | | checkUnauthenticatedUserChatLimit(request); |
| | | }else { |
| | | LocalCache.CACHE.put("userId", chatCostService.getUserId()); |
| | | |
| | | chatRequest.setUserId(chatCostService.getUserId()); |
| | | // 保存消息记录 并扣除费用 |
| | | chatCostService.deductToken(chatRequest); |
| | | } |
| | | // 根据模型名称前缀调用不同的处理逻辑 |
| | | // 根据模型分类调用不同的处理逻辑 |
| | | switchModelAndHandle(chatRequest,sseEmitter); |
| | | } catch (Exception e) { |
| | | log.error(e.getMessage(),e); |
| | |
| | | count++; |
| | | RedisUtils.setCacheObject(redisKey, count); |
| | | } |
| | | |
| | | } |
| | | |
| | | /** |
| | |
| | | if(StringUtils.isEmpty(sysPrompt)){ |
| | | sysPrompt ="你是一个由RuoYI-AI开发的人工智能助手,名字叫熊猫助手。你擅长中英文对话,能够理解并处理各种问题,提供安全、有帮助、准确的回答。" + |
| | | "当前时间:"+ DateUtils.getDate()+ |
| | | "#注意:回复之前注意结合上下文和工具返回内容。"; |
| | | |
| | | "#注意:回复之前注意结合上下文和工具返回内容进行回复。"; |
| | | } |
| | | // 设置系统默认提示词 |
| | | Message sysMessage = Message.builder().content(sysPrompt).role(Message.Role.SYSTEM).build(); |