Skip to content

Commit fdd8085

Browse files
committed
调整服务,支持mcp对设备进行调用
1 parent 7cb4eb3 commit fdd8085

File tree

13 files changed

+327
-1
lines changed

13 files changed

+327
-1
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
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
}
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/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";
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.xiaozhi.communication.domain.mcp.device;
2+
3+
import lombok.Data;
4+
5+
import java.util.Map;
6+
7+
@Data
8+
public class DeviceMcpPayload {
9+
private String jsonrpc = "2.0";
10+
private String method;//方法名称
11+
private Object params;
12+
private Long id;//请求id
13+
private Map<String, Object> result;//请求结果
14+
private Map<String, Object> error;//请求失败信息
15+
16+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.xiaozhi.communication.domain.mcp.device.initialize;
2+
3+
import lombok.Data;
4+
5+
@Data
6+
public class DeviceMcpClientInfo {
7+
private String name = "xiaozhi-mqtt-client";
8+
private String version = "1.0.0";
9+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.xiaozhi.communication.domain.mcp.device.initialize;
2+
3+
import lombok.Data;
4+
5+
import java.util.Collections;
6+
import java.util.Map;
7+
8+
@Data
9+
public class DeviceMcpInitialize {
10+
private String protocolVersion = "2024-11-05";
11+
private Map<String, Object> capabilities = Collections.emptyMap();
12+
private DeviceMcpClientInfo clientInfo = new DeviceMcpClientInfo();
13+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.xiaozhi.communication.domain.mcp.device.initialize;
2+
3+
import lombok.Data;
4+
5+
/**
6+
* 摄像头视觉相关
7+
*/
8+
@Data
9+
public class DeviceMcpVision {
10+
private String url;//摄像头: 图片处理地址(必须是http地址, 不是websocket地址)
11+
private String token;// url toke
12+
}

0 commit comments

Comments
 (0)