codex-backend-sdk 0.5.3__tar.gz → 0.5.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/CHANGELOG.md +6 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/PKG-INFO +1 -1
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/_transport.py +21 -1
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/pyproject.toml +1 -1
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_client_retry.py +19 -2
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/uv.lock +1 -1
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/.gitignore +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/LICENSE +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/README.md +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/__init__.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/_client.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/_models.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/_streaming.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/_utils.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/codex_client.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/oauth.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/pkce.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/__init__.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/_responses_payloads.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/chatgpt.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/chatgpt_apps.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/chatgpt_connectors.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/chatgpt_plugin_bundles.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/chatgpt_plugin_shares.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/chatgpt_plugins.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/chatgpt_writing_blocks.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/codex.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/codex_web_search.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/files.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/images.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/models.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/openai_oauth.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/realtime.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/remote_control.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/responses.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/responses_websocket.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/worktree_snapshots.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/storage.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/docs/api-reference.md +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/docs/backend-api.md +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/docs/desktop-endpoint-inventory.md +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/docs/endpoint-coverage.md +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/docs/openai-compatibility.md +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/examples/agent.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/conftest.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_account_info.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_basic.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_chatgpt_apps.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_chatgpt_connectors.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_chatgpt_plugin_bundles.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_chatgpt_plugin_shares.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_chatgpt_plugins.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_chatgpt_projects_gizmos.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_chatgpt_resources.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_chatgpt_search_files.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_chatgpt_writing_blocks.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_codex_resources.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_codex_web_search.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_conversation.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_files_resource.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_hosted_mcp.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_images.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_oauth.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_openai_compatibility.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_openai_oauth_resources.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_prompt_cache_usage.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_realtime_resource.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_reasoning.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_remote_control_resource.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_responses_resource.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_responses_websocket.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_structured_output.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_tools.py +0 -0
- {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_worktree_snapshots.py +0 -0
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
|
|
5
|
+
## [0.5.4] - 2026-09-24
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
- Preserve a bounded backend response body in raised HTTP errors so callers can
|
|
9
|
+
diagnose rejected requests without reconstructing the transport call.
|
|
10
|
+
|
|
5
11
|
## [0.5.3] - 2026-09-18
|
|
6
12
|
|
|
7
13
|
### Added
|
|
@@ -8,6 +8,26 @@ from typing import Any
|
|
|
8
8
|
import requests
|
|
9
9
|
|
|
10
10
|
|
|
11
|
+
_MAX_ERROR_DETAIL_CHARS = 4_000
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def raise_for_status_with_detail(response: requests.Response) -> None:
|
|
15
|
+
"""Raise the usual HTTPError while retaining a bounded backend error body."""
|
|
16
|
+
try:
|
|
17
|
+
response.raise_for_status()
|
|
18
|
+
except requests.HTTPError as error:
|
|
19
|
+
detail = response.text.strip()
|
|
20
|
+
if not detail:
|
|
21
|
+
raise
|
|
22
|
+
if len(detail) > _MAX_ERROR_DETAIL_CHARS:
|
|
23
|
+
detail = detail[:_MAX_ERROR_DETAIL_CHARS] + "..."
|
|
24
|
+
raise requests.HTTPError(
|
|
25
|
+
f"{error}. Backend response: {detail}",
|
|
26
|
+
response=response,
|
|
27
|
+
request=error.request,
|
|
28
|
+
) from error
|
|
29
|
+
|
|
30
|
+
|
|
11
31
|
def request_with_retries(
|
|
12
32
|
session: requests.Session,
|
|
13
33
|
method: str,
|
|
@@ -26,7 +46,7 @@ def request_with_retries(
|
|
|
26
46
|
if should_retry_response(response, attempt, max_retries=max_retries):
|
|
27
47
|
sleep_before_retry(response, attempt, retry_base_delay=retry_base_delay)
|
|
28
48
|
continue
|
|
29
|
-
response
|
|
49
|
+
raise_for_status_with_detail(response)
|
|
30
50
|
return response
|
|
31
51
|
except (requests.Timeout, requests.ConnectionError) as exc:
|
|
32
52
|
last_error = exc
|
|
@@ -73,8 +73,10 @@ def test_retry_does_not_retry_client_errors(monkeypatch):
|
|
|
73
73
|
|
|
74
74
|
try:
|
|
75
75
|
client._get_raw("/models")
|
|
76
|
-
except requests.HTTPError:
|
|
77
|
-
|
|
76
|
+
except requests.HTTPError as error:
|
|
77
|
+
assert 'Backend response: {"error": "bad request"}' in str(error)
|
|
78
|
+
assert error.response is not None
|
|
79
|
+
assert error.response.status_code == 400
|
|
78
80
|
else:
|
|
79
81
|
raise AssertionError("Expected HTTPError")
|
|
80
82
|
|
|
@@ -82,6 +84,21 @@ def test_retry_does_not_retry_client_errors(monkeypatch):
|
|
|
82
84
|
assert sleeps == []
|
|
83
85
|
|
|
84
86
|
|
|
87
|
+
def test_http_error_detail_is_bounded():
|
|
88
|
+
body = b"x" * 5_000
|
|
89
|
+
client = RetryClient([_response(400, body=body)])
|
|
90
|
+
|
|
91
|
+
try:
|
|
92
|
+
client._get_raw("/models")
|
|
93
|
+
except requests.HTTPError as error:
|
|
94
|
+
message = str(error)
|
|
95
|
+
assert "Backend response: " in message
|
|
96
|
+
assert message.endswith("...")
|
|
97
|
+
assert len(message) < 4_200
|
|
98
|
+
else:
|
|
99
|
+
raise AssertionError("Expected HTTPError")
|
|
100
|
+
|
|
101
|
+
|
|
85
102
|
def test_retry_retries_transport_timeout(monkeypatch):
|
|
86
103
|
sleeps = []
|
|
87
104
|
monkeypatch.setattr(transport_module.time, "sleep", sleeps.append)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/chatgpt_apps.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/chatgpt_plugins.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/codex_web_search.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/openai_oauth.py
RENAMED
|
File without changes
|
|
File without changes
|
{codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/remote_control.py
RENAMED
|
File without changes
|
{codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/responses.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|