Files
inquiry_robot/inquiry-agent/agent/redis_coord/selftest.py
T

80 lines
2.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
Redis 协调骨架自检(默认 Memory 后端)。
用法:
set REDIS_BACKEND=memory
python -m agent.redis_coord.selftest
"""
from __future__ import annotations
import logging
import os
import sys
logger = logging.getLogger(__name__)
def main() -> int:
logging.basicConfig(level=logging.INFO, format="%(levelname)s %(message)s")
os.environ["REDIS_BACKEND"] = "memory"
os.environ.setdefault("YTD_ENV", "test")
os.environ.setdefault("REDIS_KEY_PREFIX", "inquiry_robot:")
from agent.config import get_settings
from agent.redis_coord import (
get_redis_runtime,
get_wecom_token,
rate_limit_allow,
set_wecom_token,
shutdown_redis_runtime,
try_acquire_idempotency,
)
from agent.redis_coord.keys import join_key
get_settings.cache_clear()
# 证明:名字在前缀,不在「库名」
k = join_key("inquiry_robot:", "stream", "llm")
assert k.startswith("inquiry_robot:"), k
logger.info("OK: 键前缀示例 %s(db 号在 REDIS_URL 的 /1,不在键名里)", k)
rt = get_redis_runtime(get_settings())
try:
assert rt.client.ping()
logger.info("OK: ping backend=%s", rt.client.backend)
assert try_acquire_idempotency(
rt.client, scope="selftest", idempotency_key="once", ttl_seconds=60
)
assert not try_acquire_idempotency(
rt.client, scope="selftest", idempotency_key="once", ttl_seconds=60
)
logger.info("OK: 短幂等")
r1 = rate_limit_allow(rt.client, scope="selftest", limit=2, window_seconds=60)
r2 = rate_limit_allow(rt.client, scope="selftest", limit=2, window_seconds=60)
r3 = rate_limit_allow(rt.client, scope="selftest", limit=2, window_seconds=60)
assert r1.allowed and r2.allowed and not r3.allowed
logger.info("OK: 限流")
set_wecom_token(rt.client, agent_id="1000010", token="tok-selftest", ttl_seconds=30)
assert get_wecom_token(rt.client, agent_id="1000010") == "tok-selftest"
logger.info("OK: token 缓存")
eid = rt.llm_stream.enqueue(
payload={"mode": "ordered_actions", "text": "hi"},
idempotency_key="msg-1",
)
claimed = rt.llm_stream.claim(consumer="selftest-worker", count=1, block_ms=10)
assert claimed and claimed[0][0] == eid
rt.llm_stream.ack(eid)
logger.info("OK: Stream 入队/认领/ack id=%s", eid)
logger.info("Redis 骨架自检通过")
return 0
finally:
shutdown_redis_runtime()
if __name__ == "__main__":
sys.exit(main())