fix: refresh delegation permissions and report Reasoner task outcomes

This commit is contained in:
Xin Wang
2026-10-24 09:27:33 +08:00
parent 7600a297b3
commit 5e0cde85e3
11 changed files with 359 additions and 20 deletions
+34 -3
View File
@@ -134,7 +134,7 @@ class ReasonerNativeTest(unittest.IsolatedAsyncioTestCase):
await asyncio.wait_for(wait(), 5)
async def test_explicit_completion_uses_actual_native_backend_and_clears_context(self):
await self.start_reasoner([[('complete_task', {"result": "显式模拟结果"})]])
await self.start_reasoner([[('complete_task', {"status": "succeeded", "result": "显式模拟结果"})]])
await asyncio.wait_for(self.finished.wait(), 5)
self.assertEqual(self.results[0]["status"], "succeeded")
self.assertEqual(self.results[0]["result"], "显式模拟结果")
@@ -150,10 +150,41 @@ class ReasonerNativeTest(unittest.IsolatedAsyncioTestCase):
self.assertIn("complete_task", self.results[0]["result"])
self.assertNotIn("private reasoning", str(self.events))
async def test_explicit_partial_failure_preserves_failed_business_result(self):
await self.start_reasoner([[('complete_task', {
"status": "failed", "result": "只完成查询;写入服务不可用,目标未完整完成。",
})]])
await asyncio.wait_for(self.finished.wait(), 5)
self.assertEqual(self.results[0]["status"], "failed")
self.assertIn("报告任务未完成", self.results[0]["summary"])
self.assertIn("只完成查询", self.results[0]["result"])
self.assertIsNone(self.executor._worker)
async def test_missing_completion_status_does_not_accept_success(self):
await self.start_reasoner([
[('complete_task', {"result": "执行结束,但未报告目标是否完成"})],
"simulated model stopped without correcting completion status",
])
await asyncio.wait_for(self.finished.wait(), 5)
self.assertEqual(self.results[0]["status"], "failed")
self.assertIsNone(self.executor._final)
self.assertEqual(len(self.model.contexts), 2)
self.assertIn("必须提供 succeeded 或 failed", str(self.model.contexts[1]))
async def test_invalid_completion_status_requires_model_correction(self):
await self.start_reasoner([
[('complete_task', {"status": "partial", "result": "只完成查询"})],
[('complete_task', {"status": "failed", "result": "只完成查询,目标未完成"})],
])
await asyncio.wait_for(self.finished.wait(), 5)
self.assertEqual(self.results[0]["status"], "failed")
self.assertEqual(self.results[0]["result"], "只完成查询,目标未完成")
self.assertEqual(len(self.model.contexts), 2)
async def test_question_reply_continues_same_native_context(self):
await self.start_reasoner([
[('ask_user', {"question": "需要哪一天的数据?"})],
[('complete_task', {"result": "已按用户回答完成"})],
[('complete_task', {"status": "succeeded", "result": "已按用户回答完成"})],
])
await self.wait_status("waiting_input")
self.assertFalse(self.finished.is_set())
@@ -186,7 +217,7 @@ class ReasonerNativeTest(unittest.IsolatedAsyncioTestCase):
# Isolate the HTTP side effect while retaining real argument/result handling.
with patch("services.tool_executor.ToolExecutor._execute_http", AsyncMock(return_value={"status": "ok", "data": {"answer": "after"}})) as http:
await self.start_reasoner([[('lookup', {})], [('complete_task', {"result": "查询完成"})]], config)
await self.start_reasoner([[('lookup', {})], [('complete_task', {"status": "succeeded", "result": "查询完成"})]], config)
await asyncio.wait_for(self.finished.wait(), 5)
self.assertEqual(self.results[0]["status"], "succeeded")
self.assertEqual(http.await_args.args[1], {"customer": "local-customer"})