feat: add cache_salt dimension to LLM response cache

This commit is contained in:
2026-07-16 05:23:58 -04:00
parent c5c11ea81b
commit 564c92a043
6 changed files with 57 additions and 14 deletions
+9 -3
View File
@@ -23,8 +23,13 @@ class _FakeRedisCache:
def __init__(self) -> None:
self._store: dict[str, LLMResponse] = {}
async def get(self, model: str, messages: list[dict[str, str]]) -> LLMResponse | None:
key = f"{model}:{json.dumps(messages, sort_keys=True)}"
async def get(
self,
model: str,
messages: list[dict[str, str]],
cache_salt: str | None = None,
) -> LLMResponse | None:
key = f"{model}:{cache_salt}:{json.dumps(messages, sort_keys=True)}"
return self._store.get(key)
async def set(
@@ -32,8 +37,9 @@ class _FakeRedisCache:
model: str,
messages: list[dict[str, str]],
response: LLMResponse,
cache_salt: str | None = None,
) -> None:
key = f"{model}:{json.dumps(messages, sort_keys=True)}"
key = f"{model}:{cache_salt}:{json.dumps(messages, sort_keys=True)}"
self._store[key] = response
+12
View File
@@ -109,6 +109,18 @@ async def test_different_models_different_keys(
assert await cache.get("claude-3-opus", MESSAGES) is None
@pytest.mark.asyncio
async def test_salt_changes_key(fake_redis: object) -> None:
"""cache_salt 进入键:不同 salt 产生不同键,None 保持旧键结构。"""
cache = RedisResponseCache(redis=fake_redis, ttl_s=None)
k_none = cache._build_key("m", [{"role": "user", "content": "x"}], None)
k_e1 = cache._build_key("m", [{"role": "user", "content": "x"}], "run:e1")
k_e2 = cache._build_key("m", [{"role": "user", "content": "x"}], "run:e2")
assert k_none != k_e1
assert k_none != k_e2
assert k_e1 != k_e2
@pytest.mark.asyncio
async def test_graceful_degradation_on_error() -> None:
"""Redis 不可用时静默降级:get→None,set→不报错。"""