机器人显示名与站点标题可配;多段联运列表投影;协同群监听对账;工单附件落存;模板与工单后台补强

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
linmianxun
2026-10-19 09:41:59 +08:00
co-authored by Cursor
parent 277cdc1c28
commit 2b528758b4
119 changed files with 6760 additions and 3516 deletions
+51 -1
View File
@@ -23,7 +23,7 @@ os.environ.setdefault("LLM_ALLOW_NETWORK", "false")
os.environ.setdefault("LEDGER_BACKEND", "memory")
from agent.channel.queue import MemoryMessageStore
from agent.channel.wshoto.client import wshoto_ready
from agent.channel.wshoto.client import WshotoError, wshoto_ready
from agent.channel.wshoto.parse import archive_record_to_inbound
from agent.channel.wshoto.rooms import (
list_watched_rooms,
@@ -340,6 +340,56 @@ class WshotoPollTests(unittest.TestCase):
self.assertEqual(api.calls[0].get("userid"), "")
self.assertEqual(api.calls[0].get("target_id"), "wr_room_1")
def test_hot_room_polled_before_cold_and_rate_limit_stops(self) -> None:
"""热群优先;遇 10061 本轮停;游标只推进已扫冷群,不跳过未扫到的。"""
from agent.channel.wshoto import rooms as rooms_mod
from agent.channel.wshoto.rooms import (
load_poll_cursor,
mark_room_hot,
plan_rooms_for_poll,
)
redis = _redis()
for i in range(6):
watch_collab_room(f"wr_cold_{i}", redis=redis)
watch_collab_room("wr_hot_now", redis=redis)
# watch 会标热;单测只留目标热群,模拟「大量冷群 + 一个刚说话的群」。
with rooms_mod._hot_lock:
rooms_mod._hot_until.clear()
mark_room_hot("wr_hot_now")
planned = plan_rooms_for_poll(
list_watched_rooms(redis=redis),
max_cold=2,
redis=redis,
)
self.assertEqual(planned[0], "wr_hot_now")
self.assertLessEqual(len(planned), 3)
# 规划阶段不得推进游标。
self.assertEqual(load_poll_cursor(redis=redis), 0)
class _RateApi:
def __init__(self) -> None:
self.calls: list[dict] = []
def list_group_messages(self, **kwargs):
self.calls.append(kwargs)
if len(self.calls) >= 2:
raise WshotoError(10061, "请求频率过高")
return []
store = MemoryMessageStore()
api = _RateApi()
cfg = _Cfg()
cfg.wshoto_rooms_per_poll = 2
cfg.wshoto_room_gap_ms = 0
cfg.wshoto_poll_budget_sec = 30
out = poll_once(client=api, settings=cfg, redis=redis, store=store)
self.assertTrue(out["ok"])
self.assertEqual(api.calls[0].get("target_id"), "wr_hot_now")
self.assertLessEqual(len(api.calls), 2)
# 热群不算冷游标;限频停在第 1 个冷群之前或之上时,冷游标推进应 < 计划冷群数。
self.assertLessEqual(load_poll_cursor(redis=redis), 1)
if __name__ == "__main__":
unittest.main()