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.
Files changed (74) hide show
  1. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/CHANGELOG.md +6 -0
  2. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/PKG-INFO +1 -1
  3. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/_transport.py +21 -1
  4. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/pyproject.toml +1 -1
  5. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_client_retry.py +19 -2
  6. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/uv.lock +1 -1
  7. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/.gitignore +0 -0
  8. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/LICENSE +0 -0
  9. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/README.md +0 -0
  10. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/__init__.py +0 -0
  11. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/_client.py +0 -0
  12. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/_models.py +0 -0
  13. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/_streaming.py +0 -0
  14. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/_utils.py +0 -0
  15. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/codex_client.py +0 -0
  16. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/oauth.py +0 -0
  17. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/pkce.py +0 -0
  18. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/__init__.py +0 -0
  19. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/_responses_payloads.py +0 -0
  20. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/chatgpt.py +0 -0
  21. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/chatgpt_apps.py +0 -0
  22. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/chatgpt_connectors.py +0 -0
  23. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/chatgpt_plugin_bundles.py +0 -0
  24. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/chatgpt_plugin_shares.py +0 -0
  25. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/chatgpt_plugins.py +0 -0
  26. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/chatgpt_writing_blocks.py +0 -0
  27. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/codex.py +0 -0
  28. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/codex_web_search.py +0 -0
  29. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/files.py +0 -0
  30. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/images.py +0 -0
  31. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/models.py +0 -0
  32. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/openai_oauth.py +0 -0
  33. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/realtime.py +0 -0
  34. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/remote_control.py +0 -0
  35. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/responses.py +0 -0
  36. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/responses_websocket.py +0 -0
  37. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/resources/worktree_snapshots.py +0 -0
  38. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/codex_backend_sdk/storage.py +0 -0
  39. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/docs/api-reference.md +0 -0
  40. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/docs/backend-api.md +0 -0
  41. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/docs/desktop-endpoint-inventory.md +0 -0
  42. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/docs/endpoint-coverage.md +0 -0
  43. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/docs/openai-compatibility.md +0 -0
  44. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/examples/agent.py +0 -0
  45. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/conftest.py +0 -0
  46. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_account_info.py +0 -0
  47. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_basic.py +0 -0
  48. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_chatgpt_apps.py +0 -0
  49. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_chatgpt_connectors.py +0 -0
  50. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_chatgpt_plugin_bundles.py +0 -0
  51. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_chatgpt_plugin_shares.py +0 -0
  52. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_chatgpt_plugins.py +0 -0
  53. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_chatgpt_projects_gizmos.py +0 -0
  54. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_chatgpt_resources.py +0 -0
  55. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_chatgpt_search_files.py +0 -0
  56. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_chatgpt_writing_blocks.py +0 -0
  57. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_codex_resources.py +0 -0
  58. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_codex_web_search.py +0 -0
  59. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_conversation.py +0 -0
  60. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_files_resource.py +0 -0
  61. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_hosted_mcp.py +0 -0
  62. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_images.py +0 -0
  63. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_oauth.py +0 -0
  64. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_openai_compatibility.py +0 -0
  65. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_openai_oauth_resources.py +0 -0
  66. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_prompt_cache_usage.py +0 -0
  67. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_realtime_resource.py +0 -0
  68. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_reasoning.py +0 -0
  69. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_remote_control_resource.py +0 -0
  70. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_responses_resource.py +0 -0
  71. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_responses_websocket.py +0 -0
  72. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_structured_output.py +0 -0
  73. {codex_backend_sdk-0.5.3 → codex_backend_sdk-0.5.4}/tests/test_tools.py +0 -0
  74. {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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: codex-backend-sdk
3
- Version: 0.5.3
3
+ Version: 0.5.4
4
4
  Summary: Unofficial Python SDK for the ChatGPT Codex backend API
5
5
  License: MIT
6
6
  License-File: LICENSE
@@ -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.raise_for_status()
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
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "codex-backend-sdk"
7
- version = "0.5.3"
7
+ version = "0.5.4"
8
8
  description = "Unofficial Python SDK for the ChatGPT Codex backend API"
9
9
  readme = "README.md"
10
10
  license = { text = "MIT" }
@@ -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
- pass
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)
@@ -162,7 +162,7 @@ wheels = [
162
162
 
163
163
  [[package]]
164
164
  name = "codex-backend-sdk"
165
- version = "0.5.3"
165
+ version = "0.5.4"
166
166
  source = { editable = "." }
167
167
  dependencies = [
168
168
  { name = "pydantic" },