diff --git a/nanobot/providers/openai_codex_provider.py b/nanobot/providers/openai_codex_provider.py index 945cae9ba..0d37b5ece 100644 --- a/nanobot/providers/openai_codex_provider.py +++ b/nanobot/providers/openai_codex_provider.py @@ -56,7 +56,7 @@ class OpenAICodexProvider(LLMProvider): "input": input_items, "text": {"verbosity": "medium"}, "include": ["reasoning.encrypted_content"], - "prompt_cache_key": _prompt_cache_key(messages), + "prompt_cache_key": _prompt_cache_key(messages[:2]), "tool_choice": tool_choice or "auto", "parallel_tool_calls": True, } diff --git a/tests/providers/test_openai_codex_provider.py b/tests/providers/test_openai_codex_provider.py new file mode 100644 index 000000000..ef9a91a79 --- /dev/null +++ b/tests/providers/test_openai_codex_provider.py @@ -0,0 +1,50 @@ +from __future__ import annotations + +from types import SimpleNamespace + +import pytest + +from nanobot.providers.openai_codex_provider import OpenAICodexProvider + + +@pytest.mark.asyncio +async def test_codex_prompt_cache_key_uses_stable_conversation_prefix(monkeypatch) -> None: + bodies: list[dict] = [] + + monkeypatch.setattr( + "nanobot.providers.openai_codex_provider.get_codex_token", + lambda: SimpleNamespace(account_id="acct", access="token"), + ) + + async def fake_request(url, headers, body, verify, on_content_delta=None): + bodies.append(body) + return "ok", [], "stop" + + monkeypatch.setattr("nanobot.providers.openai_codex_provider._request_codex", fake_request) + + provider = OpenAICodexProvider() + await provider.chat( + [ + {"role": "system", "content": "You are nanobot."}, + {"role": "user", "content": "first request"}, + {"role": "assistant", "content": "first answer"}, + ], + ) + await provider.chat( + [ + {"role": "system", "content": "You are nanobot."}, + {"role": "user", "content": "first request"}, + {"role": "assistant", "content": "first answer"}, + {"role": "user", "content": "follow up"}, + ], + ) + await provider.chat( + [ + {"role": "system", "content": "You are nanobot."}, + {"role": "user", "content": "different request"}, + {"role": "assistant", "content": "first answer"}, + ], + ) + + assert bodies[0]["prompt_cache_key"] == bodies[1]["prompt_cache_key"] + assert bodies[0]["prompt_cache_key"] != bodies[2]["prompt_cache_key"]