from typing import TYPE_CHECKING from plugins_func.register import register_function, ToolType, ActionResponse, Action if TYPE_CHECKING: from core.connection import ConnectionHandler start_repeater_function_desc = { "type": "function", "function": { "name": "start_repeater", "description": "打开复读机,在设备 SD 卡上循环播放 MP3。name 与 self.mp3.get_list 的 files[].name 一致;省略 name 时设备会播放上次音频或 SD 卡第一首。repeat 是整首循环次数。speed 是播放倍率 0.5~2.0,默认由音频熟悉天数决定。不要用 play_music。播放期间不会聊天。", "parameters": { "type": "object", "properties": { "name": { "type": "string", "description": "可选。SD 卡 MP3 文件名,必须与 get_list 的 files[].name 一致;省略则播上次或第一首", }, "repeat": { "type": "integer", "description": "整首循环次数,默认 1。大于 1 且配置了 repeat_speeds 时,每一遍可以用不同倍速", }, "speed": { "type": "number", "description": "可选。播放倍率 0.5~2.0,省略则按熟悉天数自动选择", }, "power_off_after": { "type": "boolean", "description": "播完后是否软关机,默认 false", }, }, "required": [], }, }, } @register_function("start_repeater", start_repeater_function_desc, ToolType.SYSTEM_CTL) async def start_repeater( conn: "ConnectionHandler", name: str = "", repeat: int = 1, power_off_after: bool = False, speed: float = None, ): from core.app_runtime.runtime import start_app_task try: repeat_n = int(repeat or 1) except (TypeError, ValueError): repeat_n = 1 if repeat_n < 1: repeat_n = 1 params = { "name": name, "repeat": repeat_n, "power_off_after": bool(power_off_after), } if speed is not None and speed != "": params["speed"] = speed result = await start_app_task( conn, "english_learning", "repeater", params, source="voice", ) if result.action in (Action.ERROR, Action.RESPONSE): return ActionResponse( action=Action.RESPONSE, result=result.result, response=result.response or "无法开始复读", ) return ActionResponse( action=Action.NONE, result=result.result, response=result.response, )