feat: Bot发布增加外链聊天界面

This commit is contained in:
2026-03-03 16:36:27 +08:00
parent 29f82ed1f0
commit 80409259c3
12 changed files with 2152 additions and 30 deletions

View File

@@ -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) {

View File

@@ -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();