feat: Bot发布增加外链聊天界面
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package tech.easyflow.ai.easyagents.listener;
|
||||
|
||||
import com.easyagents.core.message.AiMessage;
|
||||
import com.easyagents.core.message.ToolCall;
|
||||
import com.easyagents.core.message.ToolMessage;
|
||||
import com.easyagents.core.model.chat.ChatModel;
|
||||
import com.easyagents.core.model.chat.ChatOptions;
|
||||
@@ -66,11 +67,18 @@ public class ChatStreamListener implements StreamResponseListener {
|
||||
if (aiMessage.isFinalDelta() && aiMessageResponse.hasToolCalls()) {
|
||||
this.canStop = false; // 工具调用期间,禁止执行onStop
|
||||
this.hasToolCall = true; // 标记已进入过工具调用
|
||||
List<ToolCall> toolCalls = aiMessage.getToolCalls();
|
||||
if (toolCalls != null) {
|
||||
for (ToolCall toolCall : toolCalls) {
|
||||
sendToolCallEnvelope(toolCall);
|
||||
}
|
||||
}
|
||||
aiMessage.setContent(null);
|
||||
memoryPrompt.addMessage(aiMessage);
|
||||
List<ToolMessage> toolMessages = aiMessageResponse.executeToolCallsAndGetToolMessages();
|
||||
for (ToolMessage toolMessage : toolMessages) {
|
||||
memoryPrompt.addMessage(toolMessage);
|
||||
sendToolResultEnvelope(toolMessage);
|
||||
}
|
||||
chatModel.chatStream(memoryPrompt, this, chatOptions);
|
||||
} else {
|
||||
@@ -151,6 +159,43 @@ public class ChatStreamListener implements StreamResponseListener {
|
||||
}
|
||||
}
|
||||
|
||||
private void sendToolCallEnvelope(ToolCall toolCall) {
|
||||
if (toolCall == null) {
|
||||
return;
|
||||
}
|
||||
ChatEnvelope<Map<String, Object>> chatEnvelope = new ChatEnvelope<>();
|
||||
chatEnvelope.setDomain(ChatDomain.TOOL);
|
||||
chatEnvelope.setType(ChatType.TOOL_CALL);
|
||||
|
||||
Map<String, Object> payload = new LinkedHashMap<>();
|
||||
payload.put("tool_call_id", toolCall.getId());
|
||||
payload.put("name", toolCall.getName());
|
||||
payload.put("arguments", toolCall.getArguments());
|
||||
chatEnvelope.setPayload(payload);
|
||||
boolean sent = sseEmitter.send(chatEnvelope);
|
||||
if (!sent) {
|
||||
throw new IllegalStateException("SSE emitter has already completed while sending tool call envelope");
|
||||
}
|
||||
}
|
||||
|
||||
private void sendToolResultEnvelope(ToolMessage toolMessage) {
|
||||
if (toolMessage == null) {
|
||||
return;
|
||||
}
|
||||
ChatEnvelope<Map<String, Object>> chatEnvelope = new ChatEnvelope<>();
|
||||
chatEnvelope.setDomain(ChatDomain.TOOL);
|
||||
chatEnvelope.setType(ChatType.TOOL_RESULT);
|
||||
|
||||
Map<String, Object> payload = new LinkedHashMap<>();
|
||||
payload.put("tool_call_id", toolMessage.getToolCallId());
|
||||
payload.put("result", toolMessage.getContent());
|
||||
chatEnvelope.setPayload(payload);
|
||||
boolean sent = sseEmitter.send(chatEnvelope);
|
||||
if (!sent) {
|
||||
throw new IllegalStateException("SSE emitter has already completed while sending tool result envelope");
|
||||
}
|
||||
}
|
||||
|
||||
public void sendSystemError(ChatSseEmitter sseEmitter,
|
||||
String message,
|
||||
Throwable throwable) {
|
||||
|
||||
@@ -148,7 +148,16 @@ public class BotServiceImpl extends ServiceImpl<BotMapper, Bot> implements BotSe
|
||||
return ChatSseUtil.sendSystemError(conversationId, "请配置大模型!");
|
||||
}
|
||||
boolean login = StpUtil.isLogin();
|
||||
if (!login && !aiBot.isAnonymousEnabled()) {
|
||||
boolean anonymousAccount = false;
|
||||
if (login) {
|
||||
try {
|
||||
anonymousAccount = SaTokenUtil.getLoginAccount() != null
|
||||
&& BigInteger.ZERO.equals(SaTokenUtil.getLoginAccount().getId());
|
||||
} catch (Exception ignored) {
|
||||
anonymousAccount = false;
|
||||
}
|
||||
}
|
||||
if ((!login || anonymousAccount) && !aiBot.isAnonymousEnabled()) {
|
||||
return ChatSseUtil.sendSystemError(conversationId, "此聊天助手不支持匿名访问");
|
||||
}
|
||||
Map<String, Object> modelOptions = aiBot.getModelOptions();
|
||||
|
||||
Reference in New Issue
Block a user