feat: add cache_salt dimension to LLM response cache
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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→不报错。"""
|
||||
|
||||
Reference in New Issue
Block a user