Skip to content

Commit bf9eec8

Browse files
committed
2 parents 4c4d366 + fdd8085 commit bf9eec8

21 files changed

+357
-100
lines changed

src/main/java/com/xiaozhi/communication/common/ChatSession.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package com.xiaozhi.communication.common;
22

3-
import com.xiaozhi.communication.domain.IotDescriptor;
3+
import com.xiaozhi.communication.domain.iot.IotDescriptor;
44
import com.xiaozhi.dialogue.llm.tool.ToolsSessionHolder;
5+
import com.xiaozhi.dialogue.llm.tool.mcp.device.DeviceMcpHolder;
56
import com.xiaozhi.entity.SysDevice;
67
import com.xiaozhi.entity.SysRole;
78
import com.xiaozhi.enums.ListenMode;
@@ -77,6 +78,9 @@ public abstract class ChatSession {
7778
*/
7879
protected final ConcurrentHashMap<String, Object> attributes = new ConcurrentHashMap<>();
7980

81+
//--------------------设备mcp-------------------------
82+
private DeviceMcpHolder deviceMcpHolder = new DeviceMcpHolder();
83+
8084
public ChatSession(String sessionId) {
8185
this.sessionId = sessionId;
8286
this.lastActivityTime = Instant.now();

src/main/java/com/xiaozhi/communication/common/MessageHandler.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.util.Date;
2727
import java.util.Map;
2828
import java.util.Optional;
29+
import java.util.concurrent.CompletableFuture;
2930
import java.util.concurrent.ConcurrentHashMap;
3031

3132
@Component
@@ -328,13 +329,23 @@ private void handleGoodbyeMessage(ChatSession session, GoodbyeMessage message) {
328329
sessionManager.closeSession(session);
329330
}
330331

332+
private void handleDeviceMcpMessage(ChatSession chatSession, DeviceMcpMessage message) {
333+
Long mcpRequestId = message.getPayload().getId();
334+
CompletableFuture<DeviceMcpMessage> future = chatSession.getDeviceMcpHolder().getMcpPendingRequests().get(mcpRequestId);
335+
if(future != null){
336+
future.complete(message);
337+
chatSession.getDeviceMcpHolder().getMcpPendingRequests().remove(mcpRequestId);
338+
}
339+
}
340+
331341
public void handleMessage(Message msg, String sessionId) {
332342
var chatSession = sessionManager.getSession(sessionId);
333343
switch (msg) {
334344
case ListenMessage m -> handleListenMessage(chatSession, m);
335345
case IotMessage m -> handleIotMessage(chatSession, m);
336346
case AbortMessage m -> handleAbortMessage(chatSession, m);
337347
case GoodbyeMessage m -> handleGoodbyeMessage(chatSession, m);
348+
case DeviceMcpMessage m -> handleDeviceMcpMessage(chatSession, m);
338349
default -> {
339350
}
340351
}

src/main/java/com/xiaozhi/communication/common/SessionManager.java

Lines changed: 1 addition & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.xiaozhi.communication.common;
22

3-
import com.xiaozhi.communication.domain.IotDescriptor;
43
import com.xiaozhi.dialogue.llm.tool.ToolsSessionHolder;
54
import com.xiaozhi.entity.SysDevice;
65
import com.xiaozhi.entity.SysRole;
@@ -17,7 +16,6 @@
1716
import java.time.Duration;
1817
import java.time.Instant;
1918
import java.util.List;
20-
import java.util.Map;
2119
import java.util.concurrent.ConcurrentHashMap;
2220
import java.util.concurrent.Executors;
2321
import java.util.concurrent.ScheduledExecutorService;
@@ -159,7 +157,7 @@ public void closeSession(ChatSession chatSession) {
159157
logger.info("会话已关闭 - SessionId: {} SessionType: {}", chatSession.getSessionId(), chatSession.getClass().getSimpleName());
160158
} catch (Exception e) {
161159
logger.error("清理会话资源时发生错误 - SessionId: {}",
162-
chatSession.getSessionId(), e);
160+
chatSession.getSessionId(), e);
163161
}
164162
}
165163

@@ -179,48 +177,6 @@ public void registerDevice(String sessionId, SysDevice device) {
179177
}
180178
}
181179

182-
/**
183-
* 注册设备iot部件描述信息
184-
*
185-
* @param sessionId 会话ID
186-
* @param iotDescriptor iot部件描述信息
187-
*/
188-
public void registerIot(String sessionId, IotDescriptor iotDescriptor) {
189-
ChatSession chatSession = sessions.get(sessionId);
190-
if(chatSession != null){
191-
// 先检查是否已存在该sessionId的配置
192-
Map<String, IotDescriptor> existingIotDescriptors = chatSession.getIotDescriptors();
193-
existingIotDescriptors.put(iotDescriptor.getName(), iotDescriptor);
194-
logger.debug("设备iot部件已注册 - SessionId: {}, Iot: {}", sessionId, iotDescriptor.getName());
195-
}
196-
}
197-
198-
/**
199-
* 注册会话的function_call
200-
*
201-
* @param sessionId 会话ID
202-
* @param toolsSessionHolder function_call工具
203-
*/
204-
public void registerFunctionSessionHolder(String sessionId, ToolsSessionHolder toolsSessionHolder) {
205-
ChatSession chatSession = sessions.get(sessionId);
206-
if(chatSession != null){
207-
chatSession.setFunctionSessionHolder(toolsSessionHolder);
208-
}
209-
}
210-
211-
/**
212-
* 注册设备iot部件描述信息
213-
*
214-
* @param sessionId 会话ID
215-
* @param roles 可用角色列表
216-
*/
217-
public void registerRoles(String sessionId, List<SysRole> roles) {
218-
ChatSession chatSession = sessions.get(sessionId);
219-
if(chatSession != null){
220-
chatSession.setSysRoleList(roles);
221-
}
222-
}
223-
224180
/**
225181
* 设置会话完成后是否关闭
226182
*
@@ -309,38 +265,6 @@ public SysDevice getDeviceConfig(String sessionId) {
309265
return null;
310266
}
311267

312-
/**
313-
* 获取Iot部件描述信息
314-
*
315-
* @param sessionId 会话ID
316-
* @return 设备配置
317-
*/
318-
public Map<String, IotDescriptor> getAllIotDescriptor(String sessionId) {
319-
ChatSession chatSession = sessions.get(sessionId);
320-
if (chatSession != null) {
321-
return chatSession.getIotDescriptors();
322-
}
323-
return null;
324-
}
325-
326-
/**
327-
* 获取Iot部件描述信息
328-
*
329-
* @param sessionId 会话ID
330-
* @param iotName IoT名称
331-
* @return 设备配置
332-
*/
333-
public IotDescriptor getIotDescriptor(String sessionId, String iotName) {
334-
ChatSession chatSession = sessions.get(sessionId);
335-
if (chatSession != null) {
336-
Map<String, IotDescriptor> descriptors = chatSession.getIotDescriptors();
337-
if (descriptors != null) {
338-
return descriptors.get(iotName);
339-
}
340-
}
341-
return null;
342-
}
343-
344268
/**
345269
* 获取会话的function holder
346270
*
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.xiaozhi.communication.domain;
2+
3+
import com.xiaozhi.communication.domain.mcp.device.DeviceMcpPayload;
4+
import lombok.Data;
5+
import lombok.EqualsAndHashCode;
6+
7+
/**
8+
* MCP请求类,用于处理向设备发送相关的MCP请求
9+
*/
10+
@Data
11+
@EqualsAndHashCode(callSuper = true)
12+
public final class DeviceMcpMessage extends Message {
13+
public DeviceMcpMessage() {
14+
super("mcp");
15+
}
16+
17+
private String sessionId;//会话id
18+
private String type = "mcp";
19+
private DeviceMcpPayload payload;
20+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.xiaozhi.communication.domain;
2+
3+
import lombok.Data;
4+
5+
@Data
6+
public class HelloFeatures {
7+
/**
8+
* 设备是否启用mcp
9+
*/
10+
private Boolean mcp = false;
11+
/**
12+
* 设备是否启用服务端aec
13+
*/
14+
private Boolean aec = false;
15+
}

src/main/java/com/xiaozhi/communication/domain/HelloMessage.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@ public HelloMessage() {
1010
super("hello");
1111
}
1212

13+
private HelloFeatures features;
1314
private AudioParams audioParams;
1415
}

src/main/java/com/xiaozhi/communication/domain/IotMessage.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package com.xiaozhi.communication.domain;
22

3-
import java.util.List;
4-
3+
import com.xiaozhi.communication.domain.iot.IotDescriptor;
4+
import com.xiaozhi.communication.domain.iot.IotState;
55
import lombok.Data;
66
import lombok.EqualsAndHashCode;
77

8+
import java.util.List;
9+
810
@Data
911
@EqualsAndHashCode(callSuper = true)
1012
public final class IotMessage extends Message {

src/main/java/com/xiaozhi/communication/domain/Message.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,15 @@
1414
visible = true)
1515
@JsonSubTypes({
1616
@JsonSubTypes.Type(value = HelloMessage.class, name = "hello"),
17+
@JsonSubTypes.Type(value = DeviceMcpMessage.class, name = "mcp"),
1718
@JsonSubTypes.Type(value = ListenMessage.class, name = "listen"),
1819
@JsonSubTypes.Type(value = IotMessage.class, name = "iot"),
1920
@JsonSubTypes.Type(value = AbortMessage.class, name = "abort"),
2021
@JsonSubTypes.Type(value = GoodbyeMessage.class, name = "goodbye"),
2122
@JsonSubTypes.Type(value = UnknownMessage.class, name = "unknown")
2223
})
2324
public sealed abstract class Message
24-
permits AbortMessage, GoodbyeMessage, HelloMessage, IotMessage, ListenMessage, UnknownMessage {
25+
permits AbortMessage, GoodbyeMessage, HelloMessage, IotMessage, ListenMessage, DeviceMcpMessage, UnknownMessage {
2526

2627
public Message() {
2728
this.type = "unknown";

src/main/java/com/xiaozhi/communication/domain/IotDescriptor.java renamed to src/main/java/com/xiaozhi/communication/domain/iot/IotDescriptor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.xiaozhi.communication.domain;
1+
package com.xiaozhi.communication.domain.iot;
22

33
import com.xiaozhi.utils.JsonUtil;
44
import lombok.Data;

src/main/java/com/xiaozhi/communication/domain/IotMethod.java renamed to src/main/java/com/xiaozhi/communication/domain/iot/IotMethod.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.xiaozhi.communication.domain;
1+
package com.xiaozhi.communication.domain.iot;
22

33
import com.xiaozhi.utils.JsonUtil;
44
import lombok.Data;

0 commit comments

Comments
 (0)