Commit c8d56664 authored by 何金镒's avatar 何金镒

dify token

parent 64de612b
......@@ -19,7 +19,7 @@ public class CDCSpacesTools {
this.spacesService = spacesService;
}
@Tool(description = "根据房间(场所)ID和日期查询该日期可预约情况")
@Tool(description = "场所(会所、共享空间)相关:根据房间(场所)ID和日期查询该日期可预约情况")
public JSONObject getAppointmentTimeByRoomId(@ToolParam(description = "设备的sn号,如:00226DA86A12")String sn,
@ToolParam(description = "查询的日期,如:2025-08-12")String date,
@ToolParam(description = "查询的房间(场所)ID")String roomId,
......@@ -28,14 +28,14 @@ public class CDCSpacesTools {
return spacesService.getAppointmentTimeByRoomId(sn,date,roomId,subspaceId);
}
@Tool(description = "获取可使用的优惠卷")
@Tool(description = "场所(会所、共享空间)相关:获取可使用的优惠卷")
public JSONArray getUserSpacesCoupons(@ToolParam(description = "设备的sn号,如:00226DA86A12")String sn,
@ToolParam(description = "查询的房间(场所)ID,若不传就查询所有房间(场所)的优惠券", required = false)String roomId){
log.info("mcp调用--->getUserCoupons..获取用户优惠券..sn:{},roomId:{}",sn,roomId);
return spacesService.getUserCoupons(sn,roomId);
}
@Tool(description = "获取在某个时间段可使用的优惠卷")
@Tool(description = "场所(会所、共享空间)相关:获取在某个时间段可使用的优惠卷")
public JSONArray getUserSpacesCouponsByTime(@ToolParam(description = "设备的sn号,如:00226DA86A12")String sn,
@ToolParam(description = "使用的开始时间,必须是30分钟的倍数且不能隔天预约,如:2025-08-12 09:00:00")String beginTime,
@ToolParam(description = "使用的结束时间,必须是30分钟的倍数且不能隔天预约,如:2025-08-12 10:30:00")String endTime,
......@@ -64,7 +64,7 @@ public class CDCSpacesTools {
// return e.getMessage();
// }
// }
@Tool(description = "自动查找优惠卷并使用优惠券预订房间(场所)")
@Tool(description = "场所(会所、共享空间)相关:自动查找优惠卷并使用优惠券预订房间(场所)")
public String bookingSpaces(@ToolParam(description = "设备的sn号,如:00226DA86A12")String sn,
@ToolParam(description = "使用的开始时间,必须是30分钟的倍数且不能隔天预约,如:2025-08-12 09:00:00")String beginTime,
@ToolParam(description = "使用的结束时间,必须是30分钟的倍数且不能隔天预约,如:2025-08-12 10:30:00")String endTime,
......
......@@ -25,27 +25,27 @@ public class DeviceTools {
this.sycDeviceService = sycDeviceService;
}
@Tool(description = "根据主机号和设备ID查询设备状态信息.")
@Tool(description = "智能家居相关:根据主机号和设备ID查询设备状态信息.")
public DeviceStatus findDeviceState(@ToolParam(description = "主机号") String ccuName,
@ToolParam(description = "设备ID") Integer devId) {
log.info("mcp调用--->根据主机号和设备ID查询设备状态信息....ccuName:{},devId:{}",ccuName,devId);
return deviceStatusUtil.findUserByUserId(CcuUtils.getCcuName(ccuName), devId);
}
@Tool(description = "根据主机号同步设备")
@Tool(description = "智能家居相关:根据主机号同步设备")
public boolean synchronousDevice(@ToolParam(description = "主机号")String ccuName){
log.info("mcp调用--->根据主机号同步设备....ccuName:{}",ccuName);
return sycDeviceService.synchronousDevice(CcuUtils.getCcuName(ccuName));
}
//==============================设备控制=============================================
@Tool(description = "根据主机号和设备ID控制:打开设备")
@Tool(description = "智能家居相关:根据主机号和设备ID控制:打开设备")
public String optDeviceOpen(@ToolParam(description = "主机号")String ccuName,
@ToolParam(description = "设备ID")String devId,
@ToolParam(description = "设备类型ID")String typeId){
log.info("mcp调用--->根据主机号和设备ID控制打开设备....ccuName:{},devId:{},type:{}",ccuName,devId,typeId);
return konkeIotServer.optDeviceOpen(CcuUtils.getCcuName(ccuName), devId, typeId);
}
@Tool(description = "根据主机号和设备ID控制:关闭设备")
@Tool(description = "智能家居相关:根据主机号和设备ID控制:关闭设备")
public String optDeviceClosed(@ToolParam(description = "主机号")String ccuName,
@ToolParam(description = "设备ID")String devId,
@ToolParam(description = "设备类型ID")String typeId){
......@@ -53,7 +53,7 @@ public class DeviceTools {
return konkeIotServer.optDeviceClosed(CcuUtils.getCcuName(ccuName), devId, typeId);
}
@Tool(description = "根据主机号和设备ID控制:设置亮度")
@Tool(description = "智能家居相关:根据主机号和设备ID控制:设置亮度")
public String setBrightness(@ToolParam(description = "主机号")String ccuName,
@ToolParam(description = "设备ID")String devId,
@ToolParam(description = "设备类型ID")String typeId,
......@@ -61,7 +61,7 @@ public class DeviceTools {
log.info("mcp调用--->根据主机号和设备ID控制设备亮度....ccuName:{},devId:{},type:{},brightness:{}",ccuName,devId,typeId,brightness);
return konkeIotServer.setBrightness(CcuUtils.getCcuName(ccuName), devId, typeId,brightness);
}
@Tool(description = "根据主机号和设备ID控制:设置色温")
@Tool(description = "智能家居相关:根据主机号和设备ID控制:设置色温")
public String setColourTemperature(@ToolParam(description = "主机号")String ccuName,
@ToolParam(description = "设备ID")String devId,
@ToolParam(description = "设备类型ID")String typeId,
......@@ -69,7 +69,7 @@ public class DeviceTools {
log.info("mcp调用--->根据主机号和设备ID控制设备的色温....ccuName:{},devId:{},type:{},colourTemperature:{}",ccuName,devId,typeId,colourTemperature);
return konkeIotServer.setColourTemperature(CcuUtils.getCcuName(ccuName), devId, typeId,colourTemperature);
}
@Tool(description = "根据主机号和设备ID控制:设置显示的颜色")
@Tool(description = "智能家居相关:根据主机号和设备ID控制:设置显示的颜色")
public String setColor(@ToolParam(description = "主机号")String ccuName,
@ToolParam(description = "设备ID")String devId,
@ToolParam(description = "设备类型ID")String typeId,
......@@ -78,14 +78,14 @@ public class DeviceTools {
return konkeIotServer.setColor(CcuUtils.getCcuName(ccuName), devId, typeId,color);
}
@Tool(description = "根据主机号和设备ID控制:暂停设备.只支持窗帘类型")
@Tool(description = "智能家居相关:根据主机号和设备ID控制:暂停设备.只支持窗帘类型")
public String setPause(@ToolParam(description = "主机号")String ccuName,
@ToolParam(description = "设备ID")String devId,
@ToolParam(description = "设备类型ID")String typeId){
log.info("mcp调用--->根据主机号和设备ID控制暂停设备....ccuName:{},devId:{},type:{}",ccuName,devId,typeId);
return konkeIotServer.setPause(CcuUtils.getCcuName(ccuName), devId, typeId);
}
@Tool(description = "根据主机号和设备ID控制设备:移动位置.只支持窗帘电机(CURTAIN_MOTOR)类型")
@Tool(description = "智能家居相关:根据主机号和设备ID控制设备:移动位置.只支持窗帘电机(CURTAIN_MOTOR)类型")
public String setMove(@ToolParam(description = "主机号")String ccuName,
@ToolParam(description = "设备ID")String devId,
@ToolParam(description = "设备类型ID")String typeId,
......@@ -94,7 +94,7 @@ public class DeviceTools {
return konkeIotServer.setMove(CcuUtils.getCcuName(ccuName), devId, typeId,progress);
}
@Tool(description = "根据主机号和设备ID控制设备:延时关机.只支持新风、地暖、空调")
@Tool(description = "智能家居相关:根据主机号和设备ID控制设备:延时关机.只支持新风、地暖、空调")
public String setDelayedShutdown(@ToolParam(description = "主机号")String ccuName,
@ToolParam(description = "设备ID")String devId,
@ToolParam(description = "设备类型ID")String typeId,
......@@ -103,7 +103,7 @@ public class DeviceTools {
return konkeIotServer.setDelayedShutdown(CcuUtils.getCcuName(ccuName), devId, typeId,delayTime);
}
@Tool(description = "根据主机号和设备ID设置设备的工作温度.只支持空调、地暖")
@Tool(description = "智能家居相关:根据主机号和设备ID设置设备的工作温度.只支持空调、地暖")
public String setTemperature(@ToolParam(description = "主机号")String ccuName,
@ToolParam(description = "设备ID")String devId,
@ToolParam(description = "设备类型ID")String typeId,
......@@ -111,7 +111,7 @@ public class DeviceTools {
log.info("mcp调用--->根据主机号和设备ID设置设备的工作温度....ccuName:{},devId:{},type:{},temperature:{}",ccuName,devId,typeId,temperature);
return konkeIotServer.setTemperature(CcuUtils.getCcuName(ccuName), devId, typeId,temperature);
}
@Tool(description = "根据主机号和设备ID设置设备的工作模式.只支持地暖、空调、新风")
@Tool(description = "智能家居相关:根据主机号和设备ID设置设备的工作模式.只支持地暖、空调、新风")
public String setModel(@ToolParam(description = "主机号")String ccuName,
@ToolParam(description = "设备ID")String devId,
@ToolParam(description = "设备类型ID")String typeId,
......@@ -120,7 +120,7 @@ public class DeviceTools {
return konkeIotServer.setModel(CcuUtils.getCcuName(ccuName), devId, typeId,mode);
}
@Tool(description = "根据主机号和设备ID设置设备的工作风速.只支持空调、新风")
@Tool(description = "智能家居相关:根据主机号和设备ID设置设备的工作风速.只支持空调、新风")
public String setSpeed(@ToolParam(description = "主机号")String ccuName,
@ToolParam(description = "设备ID")String devId,
@ToolParam(description = "设备类型ID")String typeId,
......@@ -131,7 +131,7 @@ public class DeviceTools {
@Tool(description = "根据主机号和场景ID:触发场景")
@Tool(description = "智能家居相关:根据主机号和场景ID:触发场景")
public String triggerScene(@ToolParam(description = "主机号")String ccuName,
@ToolParam(description = "场景ID")String devId,
@ToolParam(description = "场景类型ID,type等于scene")String typeId){
......
......@@ -16,17 +16,17 @@ public class WeatherTools {
}
@Tool(description = "根据城市名查询当前的天气")
@Tool(description = "天气相关:根据城市名查询当前的天气")
public String getWeatherNow(@ToolParam(description = "城市,如:成都、西安")String city){
log.info("mcp调用--->根据城市名查询当前的天气....city:{}",city);
return weatherUtils.getWeatherNow(city);
}
@Tool(description = "根据城市名查询未来24小时的天气")
@Tool(description = "天气相关:根据城市名查询未来24小时的天气")
public String getWeatherHourly(@ToolParam(description = "城市,如:成都、西安")String city){
log.info("mcp调用--->根据城市名查询未来24小时的天气...city:{}",city);
return weatherUtils.getWeatherHourly(city);
}
@Tool(description = "根据城市名查询未来7天的天气")
@Tool(description = "天气相关:根据城市名查询未来7天的天气")
public String getWeatherDaily(@ToolParam(description = "城市,如:成都、西安")String city){
log.info("mcp调用--->根据城市名查询未来7天的天气....city:{}",city);
return weatherUtils.getWeatherDaily(city);
......
package com.ikonke.konkeaialibabamcp.config;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ToolCategory {
String value();
}
......@@ -11,4 +11,6 @@ public class RedisKeys {
public static final String KONKE_DIFY_CONVERSATION_ID = "konke:dify:conversationid:";
public static final String KONKE_DIFY_API_KEY = "konke:dify:api:key";
}
......@@ -12,8 +12,10 @@ import com.ikonke.konkeaialibabamcp.controller.param.DifyStreamResponse;
import com.ikonke.konkeaialibabamcp.entity.mysql.CDCToken;
import com.ikonke.konkeaialibabamcp.service.mysqlservice.ICDCTokenService;
import com.ikonke.konkeaialibabamcp.utils.CcuUtils;
import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
......@@ -34,7 +36,21 @@ public class DifyController {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
private final static String dify_api_key = "app-YHXQcZVzokkdsrQ3mTOFhO9x";
@Value("${dify.token}")
private String dify_api_key;
@PostConstruct
public void init() {
Object redisValue = redisTemplate.opsForValue().get(RedisKeys.KONKE_DIFY_API_KEY);
// 如果Redis中有值,则使用Redis中的值覆盖配置文件的值
if (redisValue != null) {
this.dify_api_key = redisValue.toString();
log.info("Using Dify API key from Redis: {}", this.dify_api_key);
} else {
log.info("Using Dify API key from configuration file: {}", this.dify_api_key);
}
}
@GetMapping("/chatMessages")
......
......@@ -28,16 +28,19 @@ mybatis-plus:
logging:
level:
org.springframework.cloud.sleuth: DEBUG
root: info
file:
path: ./log/${server.port}
pattern:
file: '%d{yyyy/MM/dd HH:mm:ss.SSS} %-5level [%X{traceId:-}][%thread] %logger{15} : %msg%n'
console: '%d{yyyy/MM/dd HH:mm:ss.SSS} %clr(%-5level) [%X{traceId:-}][%magenta(%thread)] %cyan(%logger{15}) : %msg%n'
file: '%d{yyyy/MM/dd HH:mm:ss.SSS} %-5level [%X{traceId:-},%X{spanId:-}][%thread] %logger{15} : %msg%n'
console: '%d{yyyy/MM/dd HH:mm:ss.SSS} %clr(%-5level) [%X{traceId:-},%X{spanId:-}][%magenta(%thread)] %cyan(%logger{15}) : %msg%n'
# level: "%5p [${spring.application.name},%X{traceId},%X{spanId}]"
logback:
rollingpolicy:
max-history: 30
konke:
weather:
clientId: da4c19db2be64671
......
......@@ -18,3 +18,9 @@ spring:
resource: true
prompt: true
completion: true
enabled: true
dify:
token: app-YHXQcZVzokkdsrQ3mTOFhO9x
- 测试主机
### 设备控制与状态查询
```
你是一个智能家居设备控制专家,具备设备状态查询和场景触发的专业能力,能够准确解析用户指令并调用相应的MCP服务完成操作。
你的任务是根据用户输入的指令,结合用户的主机号({{#1754485785703.ccuName#}})和可操作设备及场景信息({{#1754554523017.body#}}),通过调用对应的MCP服务来执行设备控制、场景触发和设备状态查询功能。
- 内容范围:仅限于设备控制、场景触发和设备状态查询操作
- 输出格式:简洁的中文回复,直接告知用户操作结果或查询信息
- 语言风格:专业、简洁、友好
- 长度限制:50-100字
- 执行设备操作必须调用对应的mcp函数
- 查询设备的状态必须调用mcp函数:findDeviceState
- 禁止不调用MCP服务直接回复用户设备状态
- 对于type等于scene的场景,只能使用triggerScene函数触发
- 场景没有状态查询功能,遇到场景状态查询请求需明确告知用户
- 所有回复必须使用中文且保持简洁明了
```
- 执行设备操作必须调用mcp函数:optDeviceOpen、optDeviceClosed、setBrightness、setColourTemperature、setColor、setPause、setMove、setDelayedShutdown、setTemperature、setModel、setSpeed
# 设备控制
## 任务
根据用户的输入的主机号{{#1754485785703.ccuName#}}和可操作的设备:{{#1754554523017.body#}}再调用对应的mcp服务来完成用户的控制设备的需求
根据用户的主机号{{#1754485785703.ccuName#}}和可操作的设备:{{#1754554523017.body#}} 再调用对应的mcp服务来完成用户的控制设备的需求
## 注意
控制设备操作必须调用mcp服务,严禁不调用mcp服务直接回复用户
## 任务
根据用户的输入 {{#sys.query#}} 和您管理的主机号{{#1754485785703.ccuName#}}和可操作的设备:{{#1754554523017.body#}} 调用对应的mcp服务来完成用户的查询设备状态的需求
## 注意
查询设备状态操作必须调用mcp服务,严禁不调用mcp服务直接回复用
# 设备状态查询
## 任务
根据用户的输入主机号{{#1754485785703.ccuName#}}和可操作的设备:{{#17546471575190.body#}}再调用对应的mcp服务来完成用户的查询设备状态的需求
根据用户的输入主机号{{#1754485785703.ccuName#}}和可操作的设备:{{#17546471575190.body#}}再调用对应的mcp服务来完成用户的查询设备状态的需求
## 注意
查询设备状态操作必须调用mcp服务,严禁不调用mcp服务直接回复用户
# 会所优惠券查询
## 任务
根据会所信息调用合适的mcp函数来获取某个场所可使用的优惠卷
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment