fix: refresh delegation permissions and report Reasoner task outcomes
This commit is contained in:
@@ -16,7 +16,7 @@ class PromptTaskBridgeTest(unittest.IsolatedAsyncioTestCase):
|
||||
runtime = SimpleNamespace(session_id="conv_1", transport=object(), tool_executor_factory=None, call_end=SimpleNamespace(ending=False), queue_frame=AsyncMock(), llm=SimpleNamespace(queue_frame=AsyncMock()))
|
||||
detach = Mock()
|
||||
service = SimpleNamespace(subscribe=Mock(return_value=detach), submit=AsyncMock(return_value={"id": "task_1", "status": "queued"}))
|
||||
bridge = PromptTaskBridge(cfg, runtime, ToolExecutor(DynamicVariableStore({})), service)
|
||||
bridge = PromptTaskBridge(cfg, runtime, ToolExecutor(DynamicVariableStore({})), service, AsyncMock(return_value=cfg.task_backend))
|
||||
functions = bridge.functions()
|
||||
self.assertEqual(functions[0][0].name, "delegate_task")
|
||||
callback = AsyncMock()
|
||||
@@ -62,10 +62,46 @@ class PromptTaskBridgeTest(unittest.IsolatedAsyncioTestCase):
|
||||
runtime = SimpleNamespace(session_id="conv_1", transport=None, tool_executor_factory=None)
|
||||
service = SimpleNamespace(submit=AsyncMock(return_value={"id": "task_1"}))
|
||||
store = DynamicVariableStore({"project": "demo"})
|
||||
bridge = PromptTaskBridge(cfg, runtime, ToolExecutor(store), service)
|
||||
bridge = PromptTaskBridge(cfg, runtime, ToolExecutor(store), service, AsyncMock(return_value=cfg.task_backend))
|
||||
schema, handler = bridge.functions()[0]
|
||||
self.assertEqual(schema.to_default_dict()["parameters"]["properties"], {})
|
||||
callback = AsyncMock()
|
||||
await handler(SimpleNamespace(arguments={"instruction": "unauthorized override"}, tool_call_id="call_1", result_callback=callback))
|
||||
self.assertEqual(service.submit.await_args.kwargs["instruction"], expected)
|
||||
self.assertEqual(service.submit.await_args.kwargs["variable_state"]["values"], store.values)
|
||||
|
||||
async def test_each_delegation_uses_refreshed_backend_and_rejects_disabled_resources(self):
|
||||
cfg = self.config(conversation_id="conv_1", dynamic_variables={"system__agent_id": "asst_1"})
|
||||
runtime = SimpleNamespace(session_id="conv_1", transport=None, tool_executor_factory=None)
|
||||
service = SimpleNamespace(submit=AsyncMock(return_value={"id": "task_1"}))
|
||||
updated = cfg.task_backend.model_copy(deep=True)
|
||||
updated.secrets = {"password": "rotated"}
|
||||
loader = AsyncMock(side_effect=[updated, ValueError("任务后端不存在或未启用")])
|
||||
bridge = PromptTaskBridge(cfg, runtime, ToolExecutor(DynamicVariableStore({})), service, loader)
|
||||
handler = bridge.functions()[0][1]
|
||||
callback = AsyncMock()
|
||||
params = SimpleNamespace(arguments={"instruction": "检查项目"}, tool_call_id="call_1", result_callback=callback)
|
||||
await handler(params)
|
||||
self.assertIs(service.submit.await_args.kwargs["backend"], updated)
|
||||
await handler(params)
|
||||
self.assertEqual(loader.await_count, 2)
|
||||
service.submit.assert_awaited_once()
|
||||
self.assertEqual(callback.await_args.args[0]["status"], "error")
|
||||
|
||||
async def test_live_loader_rejects_binding_changes_and_revalidates_resources(self):
|
||||
from unittest.mock import MagicMock, patch
|
||||
from services.brains.prompt_tasks import load_current_backend
|
||||
cfg = self.config()
|
||||
assistant = SimpleNamespace(dynamic_variable_definitions={})
|
||||
session = SimpleNamespace(get=AsyncMock(return_value=assistant))
|
||||
database = MagicMock()
|
||||
database.__aenter__ = AsyncMock(return_value=session)
|
||||
database.__aexit__ = AsyncMock(return_value=False)
|
||||
updated = cfg.task_backend.model_copy(update={"id": "different_backend"})
|
||||
with patch("db.session.SessionLocal", return_value=database), patch("services.task_backend_resources.resolve_task_backend", AsyncMock(return_value=updated)) as resolve:
|
||||
with self.assertRaisesRegex(ValueError, "绑定已更新"):
|
||||
await load_current_backend("asst_1", cfg.task_backend, {})
|
||||
resolve.assert_awaited_once_with(session, assistant)
|
||||
resolve.side_effect = ValueError("模型已停用")
|
||||
with self.assertRaisesRegex(ValueError, "模型已停用"):
|
||||
await load_current_backend("asst_1", cfg.task_backend, {})
|
||||
|
||||
Reference in New Issue
Block a user