From 43dbfb2a1e6444f1461d4f8d1b160f9872c4c518 Mon Sep 17 00:00:00 2001 From: Windpicker-owo <3431391539@qq.com> Date: Sun, 7 Dec 2025 16:50:18 +0800 Subject: [PATCH] =?UTF-8?q?feat(waiting):=20=E6=B7=BB=E5=8A=A0=E8=BF=9E?= =?UTF-8?q?=E7=BB=AD=E7=AD=89=E5=BE=85=E8=B6=85=E6=97=B6=E6=AC=A1=E6=95=B0?= =?UTF-8?q?=E4=B8=8A=E9=99=90=E9=85=8D=E7=BD=AE=EF=BC=8C=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E7=AD=89=E5=BE=85=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/config/official_configs.py | 6 +++ .../built_in/kokoro_flow_chatter/chatter.py | 21 +++++++-- .../built_in/kokoro_flow_chatter/config.py | 14 +++++- .../kokoro_flow_chatter/proactive_thinker.py | 43 ++++++++++++++++--- template/bot_config_template.toml | 3 +- 5 files changed, 75 insertions(+), 12 deletions(-) diff --git a/src/config/official_configs.py b/src/config/official_configs.py index a693925f5..e2b869af7 100644 --- a/src/config/official_configs.py +++ b/src/config/official_configs.py @@ -950,6 +950,12 @@ class KokoroFlowChatterWaitingConfig(ValidatedConfigBase): le=10.0, description="等待时长倍率,用于整体放大或缩短LLM给出的等待时间", ) + max_consecutive_timeouts: int = Field( + default=3, + ge=0, + le=10, + description="允许的连续等待超时次数上限,达到后不再等待用户回复 (0 表示不限制)", + ) class KokoroFlowChatterConfig(ValidatedConfigBase): diff --git a/src/plugins/built_in/kokoro_flow_chatter/chatter.py b/src/plugins/built_in/kokoro_flow_chatter/chatter.py index 60bf5349f..3b50fe6f0 100644 --- a/src/plugins/built_in/kokoro_flow_chatter/chatter.py +++ b/src/plugins/built_in/kokoro_flow_chatter/chatter.py @@ -179,11 +179,26 @@ class KokoroFlowChatter(BaseChatter): ) # 10. 执行动作 - adjusted_wait = apply_wait_duration_rules(plan_response.max_wait_seconds) - if adjusted_wait != plan_response.max_wait_seconds: + raw_wait = plan_response.max_wait_seconds + adjusted_wait = apply_wait_duration_rules( + raw_wait, + session.consecutive_timeout_count, + ) + timeout_limit = max(0, self._config.waiting.max_consecutive_timeouts) + if ( + timeout_limit + and session.consecutive_timeout_count >= timeout_limit + and raw_wait > 0 + and adjusted_wait == 0 + ): + logger.info( + "[KFC] 连续等待 %s 次未收到回复,暂停继续等待", + session.consecutive_timeout_count, + ) + elif adjusted_wait != raw_wait: logger.debug( "[KFC] 调整等待时长: raw=%ss adjusted=%ss", - plan_response.max_wait_seconds, + raw_wait, adjusted_wait, ) plan_response.max_wait_seconds = adjusted_wait diff --git a/src/plugins/built_in/kokoro_flow_chatter/config.py b/src/plugins/built_in/kokoro_flow_chatter/config.py index 95d8dc0fd..f44bb51c8 100644 --- a/src/plugins/built_in/kokoro_flow_chatter/config.py +++ b/src/plugins/built_in/kokoro_flow_chatter/config.py @@ -51,6 +51,9 @@ class WaitingDefaults: # 等待时长倍率(>1 放大等待时间,<1 缩短) wait_duration_multiplier: float = 1.0 + # 连续等待超时上限(达到后不再继续等待,0 表示不限制) + max_consecutive_timeouts: int = 3 + @dataclass class ProactiveConfig: @@ -206,6 +209,7 @@ def load_config() -> KokoroFlowChatterConfig: min_wait_seconds=getattr(wait_cfg, 'min_wait_seconds', 30), max_wait_seconds=getattr(wait_cfg, 'max_wait_seconds', 1800), wait_duration_multiplier=getattr(wait_cfg, 'wait_duration_multiplier', 1.0), + max_consecutive_timeouts=getattr(wait_cfg, 'max_consecutive_timeouts', 3), ) # 主动思考配置 - 支持 proactive 和 proactive_thinking 两种写法 @@ -268,7 +272,7 @@ def reload_config() -> KokoroFlowChatterConfig: return _config -def apply_wait_duration_rules(raw_wait_seconds: int) -> int: +def apply_wait_duration_rules(raw_wait_seconds: int, consecutive_timeouts: int = 0) -> int: """根据配置计算最终的等待时间""" if raw_wait_seconds <= 0: return 0 @@ -291,4 +295,10 @@ def apply_wait_duration_rules(raw_wait_seconds: int) -> int: if min_wait > 0: adjusted = max(adjusted, min_wait) - return max(adjusted, 0) + adjusted = max(adjusted, 0) + + timeout_limit = max(0, waiting_cfg.max_consecutive_timeouts) + if timeout_limit and consecutive_timeouts >= timeout_limit: + return 0 + + return adjusted diff --git a/src/plugins/built_in/kokoro_flow_chatter/proactive_thinker.py b/src/plugins/built_in/kokoro_flow_chatter/proactive_thinker.py index ef10c9cd4..e80ee1863 100644 --- a/src/plugins/built_in/kokoro_flow_chatter/proactive_thinker.py +++ b/src/plugins/built_in/kokoro_flow_chatter/proactive_thinker.py @@ -83,6 +83,7 @@ class ProactiveThinker: """加载配置 - 使用统一的配置系统""" config = get_config() proactive_cfg = config.proactive + self._waiting_cfg = config.waiting # 工作模式 self._mode = config.mode @@ -461,11 +462,26 @@ class ProactiveThinker: action.params["situation_type"] = "timeout" action.params["extra_context"] = extra_context - adjusted_wait = apply_wait_duration_rules(plan_response.max_wait_seconds) - if adjusted_wait != plan_response.max_wait_seconds: + raw_wait = plan_response.max_wait_seconds + adjusted_wait = apply_wait_duration_rules( + raw_wait, + session.consecutive_timeout_count, + ) + timeout_limit = max(0, getattr(self._waiting_cfg, "max_consecutive_timeouts", 0)) + if ( + timeout_limit + and session.consecutive_timeout_count >= timeout_limit + and raw_wait > 0 + and adjusted_wait == 0 + ): + logger.info( + "[ProactiveThinker] 连续等待 %s 次未获回复,停止继续等待", + session.consecutive_timeout_count, + ) + elif adjusted_wait != raw_wait: logger.debug( "[ProactiveThinker] 调整超时等待: raw=%ss adjusted=%ss", - plan_response.max_wait_seconds, + raw_wait, adjusted_wait, ) plan_response.max_wait_seconds = adjusted_wait @@ -693,11 +709,26 @@ class ProactiveThinker: action.params["situation_type"] = "proactive" action.params["extra_context"] = extra_context - adjusted_wait = apply_wait_duration_rules(plan_response.max_wait_seconds) - if adjusted_wait != plan_response.max_wait_seconds: + raw_wait = plan_response.max_wait_seconds + adjusted_wait = apply_wait_duration_rules( + raw_wait, + session.consecutive_timeout_count, + ) + timeout_limit = max(0, getattr(self._waiting_cfg, "max_consecutive_timeouts", 0)) + if ( + timeout_limit + and session.consecutive_timeout_count >= timeout_limit + and raw_wait > 0 + and adjusted_wait == 0 + ): + logger.info( + "[ProactiveThinker] 连续等待 %s 次未获回复,主动无需再等", + session.consecutive_timeout_count, + ) + elif adjusted_wait != raw_wait: logger.debug( "[ProactiveThinker] 调整主动等待: raw=%ss adjusted=%ss", - plan_response.max_wait_seconds, + raw_wait, adjusted_wait, ) plan_response.max_wait_seconds = adjusted_wait diff --git a/template/bot_config_template.toml b/template/bot_config_template.toml index b36e6aa46..110115ae5 100644 --- a/template/bot_config_template.toml +++ b/template/bot_config_template.toml @@ -1,5 +1,5 @@ [inner] -version = "7.9.7" +version = "7.9.8" #----以下是给开发人员阅读的,如果你只是部署了MoFox-Bot,不需要阅读---- #如果你想要修改配置文件,请递增version的值 @@ -628,6 +628,7 @@ default_max_wait_seconds = 300 # LLM 未给出等待时间时的默认值 min_wait_seconds = 30 # 允许的最短等待时间,防止太快打扰用户 max_wait_seconds = 1800 # 允许的最长等待时间(秒) wait_duration_multiplier = 1.0 # 对 LLM 给出的等待时间应用的倍率(>1 放大,<1 缩短) +max_consecutive_timeouts = 3 # 连续等待超时达到该次数后,强制不再继续等待(0 表示不限制) # --- 私聊专属主动思考配置 --- # 注意:这是KFC专属的主动思考配置,只有当KFC启用时才生效。