fix(ai): I1+I3 — Redis TTL + openclaw_nemo 命名對齊
Some checks failed
CD Pipeline / build-and-deploy (push) Failing after 36s

I1: ai_control.py 所有寫入 Redis 的 key 加入 30 天 TTL
    防止 ai:control:* keys 永久累積造成記憶體洩漏

I3: ai_rate_limiter.py "nvidia" key → "openclaw_nemo"
    對齊 Phase 24 AIProviderEnum,使 rate limit 正確作用

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
OG T
2026-04-03 13:22:36 +08:00
parent e7b4f43b60
commit e60225ea29
2 changed files with 13 additions and 8 deletions

View File

@@ -6,9 +6,9 @@ Telegram /ai 指令動態控制 AI Router 狀態
- OPENCLAW_TG_USER_WHITELIST 白名單保護
Redis Keys:
ai:control:use_router "true"/"false" (覆蓋 USE_AI_ROUTER env)
ai:control:primary_provider "openclaw_nemo"/"gemini"/"ollama"/"claude"
ai:control:disabled:<provider> "1" (TTL: 永久或手動清除)
ai:control:use_router "true"/"false" (TTL: 30天)
ai:control:primary_provider "openclaw_nemo"/"gemini"/"ollama"/"claude" (TTL: 30天)
ai:control:disabled:<provider> "1" (TTL: 30天)
Usage:
/ai status — 顯示所有 Provider 狀態 + 當前路由模式
@@ -29,6 +29,9 @@ _AI_ROUTER_KEY = "ai:control:use_router"
_PRIMARY_PROVIDER_KEY = "ai:control:primary_provider"
_DISABLED_KEY_PREFIX = "ai:control:disabled:"
# 2026-04-03 ogt: I1 防止記憶體洩漏 — 所有控制 key 統一 30 天 TTL
_CONTROL_KEY_TTL = 30 * 24 * 3600 # 30 days
VALID_PROVIDERS = {"openclaw_nemo", "gemini", "ollama", "claude", "nemotron"}
@@ -57,7 +60,7 @@ async def set_ai_router_enabled(enabled: bool) -> bool:
"""設定 AIRouter 啟用狀態到 Redis"""
try:
r = await _get_redis()
await r.set(_AI_ROUTER_KEY, "true" if enabled else "false")
await r.set(_AI_ROUTER_KEY, "true" if enabled else "false", ex=_CONTROL_KEY_TTL)
logger.info("ai_control_router_set", enabled=enabled)
return True
except Exception as e:
@@ -83,7 +86,7 @@ async def set_primary_provider(provider: str) -> bool:
return False
try:
r = await _get_redis()
await r.set(_PRIMARY_PROVIDER_KEY, provider)
await r.set(_PRIMARY_PROVIDER_KEY, provider, ex=_CONTROL_KEY_TTL)
logger.info("ai_control_primary_set", provider=provider)
return True
except Exception as e:
@@ -119,7 +122,7 @@ async def set_provider_disabled(provider: str, disabled: bool) -> bool:
r = await _get_redis()
key = f"{_DISABLED_KEY_PREFIX}{provider}"
if disabled:
await r.set(key, "1")
await r.set(key, "1", ex=_CONTROL_KEY_TTL)
else:
await r.delete(key)
logger.info("ai_control_provider_set", provider=provider, disabled=disabled)