机器人显示名与站点标题可配;多段联运列表投影;协同群监听对账;工单附件落存;模板与工单后台补强
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user