From 87152ac5430ae69a9ec873c8c6e939a4604ea9bb Mon Sep 17 00:00:00 2001 From: Gargantua <22532097@zju.edu.cn> Date: Sat, 27 Jun 2026 19:23:17 +0800 Subject: [PATCH 1/2] fix: preserve fallback models for future tasks --- .gitignore | 1 + astrbot/core/cron/manager.py | 6 +-- tests/unit/test_cron_manager.py | 66 +++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 5eb9616c8c..44d55bc9c9 100644 --- a/.gitignore +++ b/.gitignore @@ -50,6 +50,7 @@ astrbot.lock # Other chroma venv/* +test.md pytest.ini AGENTS.md IFLOW.md diff --git a/astrbot/core/cron/manager.py b/astrbot/core/cron/manager.py index 95da3dcbc9..9e6feb37f6 100644 --- a/astrbot/core/cron/manager.py +++ b/astrbot/core/cron/manager.py @@ -416,13 +416,13 @@ async def _woke_main_agent( if cron_payload.get("origin", "tool") == "api": cron_event.role = "admin" - tool_call_timeout = cfg.get("provider_settings", {}).get( - "tool_call_timeout", 120 - ) + provider_settings = cfg.get("provider_settings", {}) or {} + tool_call_timeout = provider_settings.get("tool_call_timeout", 120) config = MainAgentBuildConfig( tool_call_timeout=tool_call_timeout, llm_safety_mode=False, streaming_response=False, + provider_settings=provider_settings, ) req = ProviderRequest() conv = await _get_session_conv(event=cron_event, plugin_context=self.ctx) diff --git a/tests/unit/test_cron_manager.py b/tests/unit/test_cron_manager.py index 46e081e9e9..242312754b 100644 --- a/tests/unit/test_cron_manager.py +++ b/tests/unit/test_cron_manager.py @@ -534,6 +534,72 @@ async def test_run_basic_job_no_handler(self, cron_manager, sample_cron_job): await cron_manager._run_basic_job(sample_cron_job) +class TestRunActiveAgentJob: + """Tests for active agent cron job execution.""" + + @pytest.mark.asyncio + async def test_woke_main_agent_passes_provider_settings(self, cron_manager): + """Test active cron agent keeps fallback chat model settings.""" + provider_settings = { + "tool_call_timeout": 77, + "fallback_chat_models": ["fallback-provider"], + } + ctx = MagicMock() + ctx.get_config.return_value = { + "admins_id": [], + "provider_settings": provider_settings, + } + cron_manager.ctx = ctx + + conv = MagicMock() + conv.history = "[]" + + class FakeRunner: + def step_until_done(self, max_step): + async def gen(): + if False: + yield None + + return gen() + + def get_final_llm_resp(self): + return None + + captured = {} + + async def fake_build_main_agent(*, event, plugin_context, config, req): + captured["config"] = config + return MagicMock(agent_runner=FakeRunner()) + + async def fake_persist_agent_history(*args, **kwargs): + return None + + with ( + patch( + "astrbot.core.astr_main_agent._get_session_conv", + AsyncMock(return_value=conv), + ), + patch( + "astrbot.core.astr_main_agent.build_main_agent", + side_effect=fake_build_main_agent, + ), + patch( + "astrbot.core.cron.manager.persist_agent_history", + side_effect=fake_persist_agent_history, + ), + ): + await cron_manager._woke_main_agent( + message="run scheduled task", + session_str="test:FriendMessage:user123", + extras={"cron_job": {"id": "job-1"}, "cron_payload": {}}, + ) + + config = captured["config"] + assert config.tool_call_timeout == 77 + assert config.provider_settings is provider_settings + assert config.provider_settings["fallback_chat_models"] == ["fallback-provider"] + + class TestGetNextRunTime: """Tests for _get_next_run_time method.""" From 482f398b129b64658355d7609c6d6a5f0f473dc1 Mon Sep 17 00:00:00 2001 From: Gargantua <22532097@zju.edu.cn> Date: Sat, 27 Jun 2026 19:39:50 +0800 Subject: [PATCH 2/2] chore: remove local test markdown ignore --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 44d55bc9c9..5eb9616c8c 100644 --- a/.gitignore +++ b/.gitignore @@ -50,7 +50,6 @@ astrbot.lock # Other chroma venv/* -test.md pytest.ini AGENTS.md IFLOW.md