fix(tasks): 增加自动标题本地兜底

This commit is contained in:
caoqianming 2026-08-06 16:42:24 +08:00
parent d7cb88c7ba
commit fdbaf934b6
2 changed files with 52 additions and 1 deletions

View File

@ -101,6 +101,10 @@ def generate_task_title(
f"{type(e).__name__}: {e}", f"{type(e).__name__}: {e}",
flush=True, flush=True,
) )
# 标题是一次性闸:若模型瞬时失败后仍只消费 pending任务会永久停在
# “新对话”。直接用首条消息的第一行作本地兜底,保证有效首发总能完成
# 命名;不保留 pending 给后续消息重试,避免拿第二条消息误命名整段对话。
title = clean_generated_title("", user_message)
# 一次性消费 pending。WHERE pending=true 是与人工 PATCH name 的竞态闸: # 一次性消费 pending。WHERE pending=true 是与人工 PATCH name 的竞态闸:
# 用户先改名时 PATCH 已清 false此处 rowcount=0不覆盖。 # 用户先改名时 PATCH 已清 false此处 rowcount=0不覆盖。

View File

@ -2,8 +2,15 @@
from __future__ import annotations from __future__ import annotations
import unittest import unittest
from types import SimpleNamespace
from unittest.mock import MagicMock, patch
from uuid import uuid4
from core.task_title import clean_generated_title, is_attachment_only_message from core.task_title import (
clean_generated_title,
generate_task_title,
is_attachment_only_message,
)
class TaskTitleTests(unittest.TestCase): class TaskTitleTests(unittest.TestCase):
@ -32,6 +39,46 @@ class TaskTitleTests(unittest.TestCase):
)) ))
self.assertFalse(is_attachment_only_message("")) self.assertFalse(is_attachment_only_message(""))
def test_model_failure_applies_local_fallback_title(self):
task_id = uuid4()
user_id = uuid4()
read_session = MagicMock()
read_session.execute.return_value.first.return_value = SimpleNamespace(
auto_title_pending=True,
auto_title_version=3,
)
write_session = MagicMock()
write_session.execute.return_value.rowcount = 1
read_ctx = MagicMock()
read_ctx.__enter__.return_value = read_session
write_ctx = MagicMock()
write_ctx.__enter__.return_value = write_session
with (
patch("core.task_title.session_scope", side_effect=[read_ctx, write_ctx]),
patch(
"core.task_title.load_config",
return_value={
"default_model": "deepseek_v4.flash",
"models_dir": "config/models",
},
),
patch("core.task_title.ModelCapabilities.load", return_value=MagicMock()),
patch("core.task_title.LLM", side_effect=RuntimeError("provider unavailable")),
):
title = generate_task_title(
task_id=task_id,
user_id=user_id,
user_message="分析手机端自动命名失败\n补充说明",
model_profile="deepseek_v4.flash",
)
self.assertEqual(title, "分析手机端自动命名失败")
values = write_session.execute.call_args.args[0].compile().params
self.assertEqual(values["name"], "分析手机端自动命名失败")
self.assertFalse(values["auto_title_pending"])
if __name__ == "__main__": if __name__ == "__main__":
unittest.main() unittest.main()