fix(provider): retry Codex server_error

Mid-stream response.failed events from OpenAI carry
'server_error' (underscore), but the transient-error marker
list only had 'server error' (space). is_transient_response
missed it, so the retry loop gave up on the first attempt
instead of using its normal 1s/2s/4s backoff.
This commit is contained in:
akinolur
2026-08-21 10:52:34 +08:00
committed by chengyongru
parent 415df576b4
commit c7710238a8
2 changed files with 20 additions and 0 deletions
+1
View File
@@ -326,6 +326,7 @@ class LLMProvider(ABC):
"timed out",
"connection",
"server error",
"server_error",
"temporarily unavailable",
"速率限制",
"访问量过大",
@@ -319,6 +319,25 @@ async def test_codex_timeout_error_is_typed_and_retryable(monkeypatch) -> None:
assert response.error_should_retry is True
@pytest.mark.asyncio
async def test_codex_mid_stream_server_error_is_treated_as_transient(monkeypatch) -> None:
_mock_codex_token(monkeypatch)
async def fake_request(*args, **kwargs):
raise RuntimeError(
"Response failed: {'type': 'server_error', 'code': 'server_error', "
"'message': 'An error occurred while processing your request.'}"
)
monkeypatch.setattr("nanobot.providers.openai_codex_provider._request_codex", fake_request)
provider = OpenAICodexProvider()
response = await provider.chat([{"role": "user", "content": "hello"}])
assert response.finish_reason == "error"
assert provider_base.LLMProvider.is_transient_response(response) is True
@pytest.mark.asyncio
async def test_codex_provider_passes_proxy_to_oauth_and_response_request(monkeypatch) -> None:
proxy = "http://127.0.0.1:23458"