#include #include #include #include #include "cJSON.h" #include "lisa_log.h" #include "mcp.h" #include "service_volume.h" #define TAG "mcp_tool_volume" static cJSON *volume_control_list(const char *name) { cJSON *tool = mcp_tool_list_info_create_default(name, "音量控制与调节工具。当用户发出调节音量、控制声音大小的指令时调用。支持绝对值设置(如:调到50%)、相对值调节(如:大声点、调小2档)以及极值控制(如:静音、最大声)。"); if (!tool) { return NULL; } mcp_tool_info_add_property(tool, "text", "用户输入的关于音量调节的意图", "string", true); cJSON *intent_property = cJSON_CreateObject(); cJSON_AddStringToObject(intent_property, "type", "string"); cJSON_AddStringToObject(intent_property, "description", "调节类型:set(设定到具体值或极值,如:调到10档、最大声、最小声);adjustUp(调大声、加两档);adjustDown(调小声、小一点)"); cJSON *intent_enum = cJSON_CreateArray(); cJSON_AddItemToArray(intent_enum, cJSON_CreateString("set")); cJSON_AddItemToArray(intent_enum, cJSON_CreateString("adjustUp")); cJSON_AddItemToArray(intent_enum, cJSON_CreateString("adjustDown")); cJSON_AddItemToObject(intent_property, "enum", intent_enum); mcp_tool_info_add_json_property(tool, "intent", intent_property, true); mcp_tool_info_add_property(tool, "value", "具体的数值或状态:1. 数字(如:1, 10, 50);2. 标准状态位:max(最大声、满格)、min(最小声、静音)、mid(中等音量),如果没有明确参数,则留空,如(大点儿声音)", "string", false); cJSON *unit_property = cJSON_CreateObject(); cJSON_AddStringToObject(unit_property, "type", "string"); cJSON_AddStringToObject(unit_property, "description", "描述数值的单位。若指令中提及'档'、'级'、'%'则对应填写,否则留空。"); cJSON *unit_enum = cJSON_CreateArray(); cJSON_AddItemToArray(unit_enum, cJSON_CreateString("档")); cJSON_AddItemToArray(unit_enum, cJSON_CreateString("级")); cJSON_AddItemToArray(unit_enum, cJSON_CreateString("百分比")); cJSON_AddItemToArray(unit_enum, cJSON_CreateString("")); cJSON_AddItemToObject(unit_property, "enum", unit_enum); mcp_tool_info_add_json_property(tool, "unit", unit_property, false); return tool; } static cJSON *volume_control_call(const char *id, const char *name, cJSON *args) { const cJSON *text_json = mcp_tool_call_args_get(args, "text"); const cJSON *intent_json = mcp_tool_call_args_get(args, "intent"); const cJSON *value_json = mcp_tool_call_args_get(args, "value"); const cJSON *unit_json = mcp_tool_call_args_get(args, "unit"); if (!text_json || !cJSON_IsString(text_json)) { LOGE("text parameter not found or invalid"); return NULL; } if (!intent_json || !cJSON_IsString(intent_json)) { LOGE("intent parameter not found or invalid"); return NULL; } const char *text = text_json->valuestring; const char *intent = intent_json->valuestring; const char *value = value_json && cJSON_IsString(value_json) ? value_json->valuestring : NULL; const char *unit = unit_json && cJSON_IsString(unit_json) ? unit_json->valuestring : ""; LOGI("Volume control - text: %s, intent: %s, value: %s, unit: %s", text, intent, value ? value : "null", unit); if (strcmp(intent, "set") == 0) { if (value) { if (strcmp(value, "max") == 0) { service_volume_set(100); } else if (strcmp(value, "min") == 0) { service_volume_set(0); } else if (strcmp(value, "mid") == 0) { service_volume_set(50); } else { int target_vol = atoi(value); service_volume_set(target_vol); } } } else if (strcmp(intent, "adjustUp") == 0) { int adjust_step = 10; if (value) { adjust_step = atoi(value); if (adjust_step <= 0) adjust_step = 10; } service_volume_adjust(adjust_step); } else if (strcmp(intent, "adjustDown") == 0) { int adjust_step = 10; if (value) { adjust_step = atoi(value); if (adjust_step <= 0) adjust_step = 10; } service_volume_adjust(-adjust_step); } cJSON *result = mcp_tool_call_result_create(name); if (!result) { return NULL; } cJSON *content_array = cJSON_CreateArray(); cJSON *content_item = cJSON_CreateObject(); cJSON_AddStringToObject(content_item, "type", "text"); cJSON_AddStringToObject(content_item, "text", "已完成操作"); cJSON_AddItemToArray(content_array, content_item); cJSON_AddItemToObject(result, "content", content_array); cJSON_AddBoolToObject(result, "isError", false); return result; } MCP_TOOL_DEFINE(ls.set_volume, volume_control_list, volume_control_call);