6 failing tests in tests/test_openai_compatible.py that establish the
core behaviors of the new send_openai_compatible() shared helper:
1. test_send_non_streaming_returns_normalized_response: blocking call
returns text, empty tool_calls, and correct usage token counts
2. test_send_streaming_aggregates_chunks: streaming call aggregates
deltas into final text and fires stream_callback per chunk
3. test_tool_call_detection_in_response: tool_calls from the response
are converted to dicts with id/type/function/arguments fields
4. test_vision_multimodal_message: messages with multimodal content
(text + image_url) are passed through unchanged to the client
5. test_error_classification_429_to_rate_limit: RateLimitError from
openai SDK is caught and re-raised as ProviderError(kind='rate_limit')
6. test_normalized_response_is_frozen_dataclass: NormalizedResponse is
a frozen dataclass (FrozenInstanceError on attribute assignment)
All 6 tests fail with ModuleNotFoundError: No module named
'src.openai_compatible' (confirmed via pytest). The implementation file
will be created in the next commit (Green phase).
ProviderError confirmed importable from src.ai_client (no stub needed).