|
| 1 | +"""Unit tests for prompt_cache_key parameter.""" |
| 2 | + |
| 3 | +from langchain_core.messages import HumanMessage |
| 4 | + |
| 5 | +from langchain_openai import ChatOpenAI |
| 6 | + |
| 7 | + |
| 8 | +def test_prompt_cache_key_parameter_inclusion() -> None: |
| 9 | + """Test that prompt_cache_key parameter is properly included in request payload.""" |
| 10 | + chat = ChatOpenAI(model="gpt-4o-mini", max_completion_tokens=10) |
| 11 | + messages = [HumanMessage("Hello")] |
| 12 | + |
| 13 | + payload = chat._get_request_payload(messages, prompt_cache_key="test-cache-key") |
| 14 | + assert "prompt_cache_key" in payload |
| 15 | + assert payload["prompt_cache_key"] == "test-cache-key" |
| 16 | + |
| 17 | + |
| 18 | +def test_prompt_cache_key_parameter_exclusion() -> None: |
| 19 | + """Test that prompt_cache_key parameter behavior matches OpenAI API.""" |
| 20 | + chat = ChatOpenAI(model="gpt-4o-mini", max_completion_tokens=10) |
| 21 | + messages = [HumanMessage("Hello")] |
| 22 | + |
| 23 | + # Test with explicit None (OpenAI should accept None values (marked Optional)) |
| 24 | + payload = chat._get_request_payload(messages, prompt_cache_key=None) |
| 25 | + assert "prompt_cache_key" in payload |
| 26 | + assert payload["prompt_cache_key"] is None |
| 27 | + |
| 28 | + |
| 29 | +def test_prompt_cache_key_per_call() -> None: |
| 30 | + """Test that prompt_cache_key can be passed per-call with different values.""" |
| 31 | + chat = ChatOpenAI(model="gpt-4o-mini", max_completion_tokens=10) |
| 32 | + messages = [HumanMessage("Hello")] |
| 33 | + |
| 34 | + # Test different cache keys per call |
| 35 | + payload1 = chat._get_request_payload(messages, prompt_cache_key="cache-v1") |
| 36 | + payload2 = chat._get_request_payload(messages, prompt_cache_key="cache-v2") |
| 37 | + |
| 38 | + assert payload1["prompt_cache_key"] == "cache-v1" |
| 39 | + assert payload2["prompt_cache_key"] == "cache-v2" |
| 40 | + |
| 41 | + # Test dynamic cache key assignment |
| 42 | + cache_keys = ["customer-v1", "support-v1", "feedback-v1"] |
| 43 | + |
| 44 | + for cache_key in cache_keys: |
| 45 | + payload = chat._get_request_payload(messages, prompt_cache_key=cache_key) |
| 46 | + assert "prompt_cache_key" in payload |
| 47 | + assert payload["prompt_cache_key"] == cache_key |
| 48 | + |
| 49 | + |
| 50 | +def test_prompt_cache_key_model_kwargs() -> None: |
| 51 | + """Test prompt_cache_key via model_kwargs and method precedence.""" |
| 52 | + messages = [HumanMessage("Hello world")] |
| 53 | + |
| 54 | + # Test model-level via model_kwargs |
| 55 | + chat = ChatOpenAI( |
| 56 | + model="gpt-4o-mini", |
| 57 | + max_completion_tokens=10, |
| 58 | + model_kwargs={"prompt_cache_key": "model-level-cache"}, |
| 59 | + ) |
| 60 | + payload = chat._get_request_payload(messages) |
| 61 | + assert "prompt_cache_key" in payload |
| 62 | + assert payload["prompt_cache_key"] == "model-level-cache" |
| 63 | + |
| 64 | + # Test that per-call cache key overrides model-level |
| 65 | + payload_override = chat._get_request_payload( |
| 66 | + messages, prompt_cache_key="per-call-cache" |
| 67 | + ) |
| 68 | + assert payload_override["prompt_cache_key"] == "per-call-cache" |
| 69 | + |
| 70 | + |
| 71 | +def test_prompt_cache_key_responses_api() -> None: |
| 72 | + """Test that prompt_cache_key works with Responses API.""" |
| 73 | + chat = ChatOpenAI( |
| 74 | + model="gpt-4o-mini", use_responses_api=True, max_completion_tokens=10 |
| 75 | + ) |
| 76 | + |
| 77 | + messages = [HumanMessage("Hello")] |
| 78 | + payload = chat._get_request_payload( |
| 79 | + messages, prompt_cache_key="responses-api-cache-v1" |
| 80 | + ) |
| 81 | + |
| 82 | + # prompt_cache_key should be present regardless of API type |
| 83 | + assert "prompt_cache_key" in payload |
| 84 | + assert payload["prompt_cache_key"] == "responses-api-cache-v1" |
0 commit comments