Spaces:
Running
Running
| from __future__ import annotations | |
| import base64 | |
| import json | |
| from headroom.proxy.handlers.anthropic import AnthropicHandlerMixin | |
| from headroom.proxy.handlers.openai import OpenAIHandlerMixin, _decode_openai_bearer_payload | |
| def _jwt(payload: object) -> str: | |
| header = {"alg": "none", "typ": "JWT"} | |
| def encode(part: object) -> str: | |
| raw = json.dumps(part, separators=(",", ":")).encode("utf-8") | |
| return base64.urlsafe_b64encode(raw).decode("ascii").rstrip("=") | |
| return f"{encode(header)}.{encode(payload)}." | |
| class _ImageCompressor: | |
| def __init__(self, compressed_message): | |
| self._compressed_message = compressed_message | |
| def compress(self, messages, provider): # noqa: ANN001, ANN201 | |
| assert provider == "anthropic" | |
| return [self._compressed_message] | |
| def test_decode_openai_bearer_payload_handles_missing_and_non_mapping_payloads() -> None: | |
| assert _decode_openai_bearer_payload({}) is None | |
| assert _decode_openai_bearer_payload({"authorization": "Basic abc"}) is None | |
| assert ( | |
| _decode_openai_bearer_payload({"authorization": f"Bearer {_jwt(['not', 'a', 'dict'])}"}) | |
| is None | |
| ) | |
| def test_openai_handler_prefix_helpers_cover_edge_cases() -> None: | |
| assert OpenAIHandlerMixin._strict_previous_turn_frozen_count([], 2) == 2 | |
| assert ( | |
| OpenAIHandlerMixin._strict_previous_turn_frozen_count( | |
| [{"role": "assistant"}, {"role": "user"}], | |
| 0, | |
| ) | |
| == 1 | |
| ) | |
| assert ( | |
| OpenAIHandlerMixin._strict_previous_turn_frozen_count( | |
| [{"role": "user"}, {"role": "assistant"}], | |
| 0, | |
| ) | |
| == 2 | |
| ) | |
| original = [{"role": "system", "content": "keep"}, {"role": "user", "content": "hello"}] | |
| restored, changed = OpenAIHandlerMixin._restore_frozen_prefix( | |
| original, | |
| [], | |
| frozen_message_count=1, | |
| ) | |
| assert restored == [{"role": "system", "content": "keep"}] | |
| assert changed == 1 | |
| restored, changed = OpenAIHandlerMixin._restore_frozen_prefix( | |
| original, | |
| [{"role": "system", "content": "changed"}, {"role": "user", "content": "hello"}], | |
| frozen_message_count=1, | |
| ) | |
| assert restored == original | |
| assert changed == 1 | |
| def test_anthropic_tool_sort_and_context_append_helpers() -> None: | |
| tools = [ | |
| {"type": "function", "function": {"name": "beta"}}, | |
| {"name": "alpha"}, | |
| {"type": "tool"}, | |
| ] | |
| sorted_tools = AnthropicHandlerMixin._sort_tools_deterministically(tools) | |
| assert [AnthropicHandlerMixin._tool_sort_key(tool)[0] for tool in sorted_tools] == [ | |
| "alpha", | |
| "beta", | |
| "tool", | |
| ] | |
| assert AnthropicHandlerMixin._sort_tools_deterministically(None) is None | |
| assert ( | |
| AnthropicHandlerMixin._append_context_to_latest_non_frozen_user_turn( | |
| [], "ctx", frozen_message_count=0 | |
| ) | |
| == [] | |
| ) | |
| assert AnthropicHandlerMixin._append_context_to_latest_non_frozen_user_turn( | |
| [{"role": "user", "content": "hello"}], | |
| "ctx", | |
| frozen_message_count=0, | |
| ) == [{"role": "user", "content": "hello\n\nctx"}] | |
| assert AnthropicHandlerMixin._append_context_to_latest_non_frozen_user_turn( | |
| [{"role": "user", "content": [{"type": "text", "text": "hello"}]}], | |
| "ctx", | |
| frozen_message_count=0, | |
| ) == [{"role": "user", "content": [{"type": "text", "text": "hello"}]}] | |
| def test_anthropic_image_compression_helper_only_rewrites_latest_eligible_turn() -> None: | |
| image_message = { | |
| "role": "user", | |
| "content": [{"type": "image", "source": {"type": "base64", "data": "abc"}}], | |
| } | |
| compressed = { | |
| "role": "user", | |
| "content": [{"type": "image", "source": {"type": "base64", "data": "xyz"}}], | |
| } | |
| assert ( | |
| AnthropicHandlerMixin._compress_latest_user_turn_images_cache_safe( | |
| [], | |
| frozen_message_count=0, | |
| compressor=_ImageCompressor(compressed), | |
| ) | |
| == [] | |
| ) | |
| assert AnthropicHandlerMixin._compress_latest_user_turn_images_cache_safe( | |
| [image_message], | |
| frozen_message_count=1, | |
| compressor=_ImageCompressor(compressed), | |
| ) == [image_message] | |
| assert AnthropicHandlerMixin._compress_latest_user_turn_images_cache_safe( | |
| [{"role": "assistant", "content": image_message["content"]}], | |
| frozen_message_count=0, | |
| compressor=_ImageCompressor(compressed), | |
| ) == [{"role": "assistant", "content": image_message["content"]}] | |
| assert AnthropicHandlerMixin._compress_latest_user_turn_images_cache_safe( | |
| [{"role": "user", "content": "no-image"}], | |
| frozen_message_count=0, | |
| compressor=_ImageCompressor(compressed), | |
| ) == [{"role": "user", "content": "no-image"}] | |
| assert AnthropicHandlerMixin._compress_latest_user_turn_images_cache_safe( | |
| [image_message], | |
| frozen_message_count=0, | |
| compressor=_ImageCompressor(image_message), | |
| ) == [image_message] | |
| assert AnthropicHandlerMixin._compress_latest_user_turn_images_cache_safe( | |
| [image_message], | |
| frozen_message_count=0, | |
| compressor=_ImageCompressor(compressed), | |
| ) == [compressed] | |
| def test_anthropic_cache_delta_helpers_cover_string_list_and_role_mismatch() -> None: | |
| previous_original = [{"role": "user", "content": "hello"}] | |
| previous_forwarded = [{"role": "user", "content": "HELLO"}] | |
| assert AnthropicHandlerMixin._extract_cache_stable_delta( | |
| [{"role": "user", "content": "hello"}, {"role": "assistant", "content": "next"}], | |
| previous_original, | |
| previous_forwarded, | |
| ) == (previous_forwarded, [{"role": "assistant", "content": "next"}]) | |
| assert ( | |
| AnthropicHandlerMixin._extract_cache_stable_delta( | |
| [{"role": "assistant", "content": "hello"}], | |
| previous_original, | |
| previous_forwarded, | |
| ) | |
| is None | |
| ) | |
| string_suffix = AnthropicHandlerMixin._extract_cache_stable_last_message_suffix( | |
| [{"role": "user", "content": "hello world"}], | |
| previous_original, | |
| previous_forwarded, | |
| ) | |
| assert string_suffix == ([], previous_forwarded[0], [{"role": "user", "content": " world"}]) | |
| list_suffix = AnthropicHandlerMixin._extract_cache_stable_last_message_suffix( | |
| [ | |
| { | |
| "role": "user", | |
| "content": [{"type": "text", "text": "a"}, {"type": "text", "text": "b"}], | |
| } | |
| ], | |
| [{"role": "user", "content": [{"type": "text", "text": "a"}]}], | |
| [{"role": "user", "content": [{"type": "text", "text": "A"}]}], | |
| ) | |
| assert list_suffix == ( | |
| [], | |
| {"role": "user", "content": [{"type": "text", "text": "A"}]}, | |
| [{"role": "user", "content": [{"type": "text", "text": "b"}]}], | |
| ) | |
| assert AnthropicHandlerMixin._merge_appended_message_delta( | |
| {"role": "user", "content": "HELLO"}, | |
| {"role": "user", "content": " world"}, | |
| ) == {"role": "user", "content": "HELLO world"} | |
| assert AnthropicHandlerMixin._merge_appended_message_delta( | |
| {"role": "user", "content": [{"type": "text", "text": "A"}]}, | |
| {"role": "user", "content": [{"type": "text", "text": "b"}]}, | |
| ) == {"role": "user", "content": [{"type": "text", "text": "A"}, {"type": "text", "text": "b"}]} | |
| assert ( | |
| AnthropicHandlerMixin._merge_appended_message_delta( | |
| {"role": "user", "content": "A"}, | |
| {"role": "assistant", "content": "B"}, | |
| ) | |
| is None | |
| ) | |
| def test_anthropic_assistant_message_helper_requires_assistant_role() -> None: | |
| assert AnthropicHandlerMixin._assistant_message_from_response_json(None) is None | |
| assert AnthropicHandlerMixin._assistant_message_from_response_json({"role": "user"}) is None | |
| assert AnthropicHandlerMixin._assistant_message_from_response_json( | |
| {"role": "assistant", "content": [{"type": "text", "text": "ok"}]} | |
| ) == {"role": "assistant", "content": [{"type": "text", "text": "ok"}]} | |