import json import httpx import pytest from fastapi.testclient import TestClient from free_claude_code.core.anthropic.stream_contracts import ( assert_anthropic_stream_contract, parse_sse_text, text_content, ) from free_claude_code.providers.admission import ProviderAdmissionController from free_claude_code.providers.base import ProviderConfig from free_claude_code.providers.openai_codex.auth import ( OpenAIAccess, OpenAIAuthManager, ) from free_claude_code.providers.openai_codex.provider import OpenAICodexProvider from tests.api.support import create_test_app class _FakeOpenAIAuth(OpenAIAuthManager): async def access(self, *, force_refresh: bool = False) -> OpenAIAccess: return OpenAIAccess("access", "account", False) async def recover_unauthorized(self, rejected_token: str) -> OpenAIAccess: raise AssertionError("The compatibility request must not require auth recovery") def _complete_stream(text: str) -> str: events = [ ( "response.created", {"type": "response.created", "response": {"id": "resp_1"}}, ), ( "response.output_text.delta", {"type": "response.output_text.delta", "delta": text}, ), ( "response.completed", { "type": "response.completed", "response": { "id": "resp_1", "usage": {"input_tokens": 3, "output_tokens": 2}, }, }, ), ] return "".join( f"event: {event_type}\ndata: {json.dumps(payload)}\n\n" for event_type, payload in events ) @pytest.mark.asyncio async def test_messages_accepts_current_claude_controls_for_openai_provider() -> None: upstream_requests: list[httpx.Request] = [] def handler(request: httpx.Request) -> httpx.Response: upstream_requests.append(request) return httpx.Response( 200, content=_complete_stream("hello").encode(), request=request, ) upstream_client = httpx.AsyncClient( base_url="https://chatgpt.com/backend-api/codex/", transport=httpx.MockTransport(handler), ) provider = OpenAICodexProvider( ProviderConfig( api_key="", base_url="https://chatgpt.com/backend-api/codex", rate_limit=100, rate_window=1, max_concurrency=2, ), auth=_FakeOpenAIAuth(), admission=ProviderAdmissionController( provider_name="openai", rate_limit=100, rate_window=1, max_concurrency=2, base_delay=0, max_delay=0, jitter=0, ), client=upstream_client, ) app = create_test_app(providers={"openai": provider}) try: with TestClient(app) as client: response = client.post( "/v1/messages", json={ "model": "openai/gpt-test", "max_tokens": 1024, "messages": [{"role": "user", "content": "hello"}], "metadata": {"user_id": "example-user"}, "thinking": {"type": "adaptive", "display": "omitted"}, "context_management": { "edits": [ { "type": "clear_thinking_20251015", "keep": "all", } ] }, "output_config": {"effort": "high"}, "stream": True, }, ) finally: await upstream_client.aclose() assert response.status_code == 200 assert response.headers["content-type"].startswith("text/event-stream") events = parse_sse_text(response.text) assert_anthropic_stream_contract(events) assert text_content(events) == "hello" assert len(upstream_requests) == 1 payload = json.loads(upstream_requests[0].content) assert payload["model"] == "gpt-test" assert payload["reasoning"] == {"effort": "high", "summary": "auto"} assert "max_output_tokens" not in payload assert "metadata" not in payload assert "context_management" not in payload assert "output_config" not in payload