Tags: Unstructured-IO/unstructured-python-client
Tags
fix: retry on all TransportError subclasses (ReadError, WriteError, e… …tc.) (#334) ## Summary - Replaces individual `except` blocks for `ConnectError`, `RemoteProtocolError`, and `TimeoutException` with a single catch for their parent class `httpx.TransportError` - This covers `ReadError` (TCP connection reset mid-response with empty message), `WriteError`, and all other transport-level failures - Previously, `ReadError` fell through to the catch-all `Exception` handler and was wrapped as `PermanentError`, failing immediately without retry ## Context Follow-up to #332. After deploying the `RemoteProtocolError` fix, we observed `httpx.ReadError` (empty message) failures when api pods crashed mid-response. The TCP connection was reset during the response read phase, which httpx classifies as `ReadError` rather than `RemoteProtocolError`. The httpx exception hierarchy: ``` TransportError ├── ConnectError (was retried) ├── RemoteProtocolError (was retried since #332) ├── ReadError (was NOT retried — now fixed) ├── WriteError (was NOT retried — now fixed) ├── PoolTimeout (was NOT retried — now fixed) └── ... TimeoutException (was retried, subclass of TransportError) ├── ConnectTimeout ├── ReadTimeout ├── WriteTimeout └── PoolTimeout ``` Catching `TransportError` is the correct level — all transport errors are transient and should be retried when `retry_connection_errors=True`. ## Test plan - [x] Parametrized tests for all TransportError subclasses (sync + async) - [ ] Each subclass retried when `retry_connection_errors=True` - [ ] Each subclass raises immediately when `retry_connection_errors=False` 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Expands which network failures are treated as retryable, which can change error/latency behavior for callers and potentially mask persistent transport issues until backoff is exhausted. > > **Overview** > **Broadened retry handling for transport failures.** The retry wrapper now catches `httpx.TransportError` in both sync and async paths, so additional transport-level errors (e.g. `ReadError`, `WriteError`, and timeout subclasses) are retried when `retry_connection_errors=True` instead of being treated as permanent. > > Tests were updated to parameterize across multiple `TransportError` subclasses for both sync and async retry behavior, and the package version/release notes were bumped to `0.42.12`. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit bdd403c. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY --> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
fix: correct RELEASES.md format for Speakeasy publish (#333) ## Summary - Adds missing trailing spaces to `- OpenAPI Doc` line in the 0.42.11 RELEASES.md entry - Adds missing trailing newline at end of file - The Speakeasy publish action failed with `error parsing last release info` because the format didn't match the expected pattern This unblocks the 0.42.11 PyPI publish. 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Low risk: documentation-only formatting tweaks (trailing spaces/newline) to satisfy Speakeasy release parsing; no runtime code changes. > > **Overview** > Fixes the `2026-03-25` (`v0.42.11`) entry in `RELEASES.md` to match Speakeasy’s expected release format by restoring the trailing spaces on `- OpenAPI Doc` and ensuring the file ends with a proper final newline (so the last `PyPI v0.42.11` line is parsed correctly). > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 39fd2ae. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY --> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
chore: 🐝 Update SDK - Generate 0.42.10 (#329) # SDK update ## Versioning Version Bump Type: [patch] - 🤖 (automated) [View full SDK changelog](https://app.speakeasy.com/org/unstructured/unstructured5xr/changes-report/5a3cd247d1de374a010b2d312a09a5e4) <details> <summary>OpenAPI Change Summary</summary> Based on [Speakeasy CLI](https://github.com/speakeasy-api/speakeasy) 1.601.0 Co-authored-by: Austin Walker <austin@unstructured.io>
chore: 🐝 Update SDK - Generate 0.42.9 (#324) > [!IMPORTANT] > Linting report available at: <https://app.speakeasy.com/org/unstructured/unstructured5xr/linting-report/acc9ed4ac70b9e127a4693cc52193c86> > OpenAPI Change report available at: <https://app.speakeasy.com/org/unstructured/unstructured5xr/changes-report/3ce57b3ff042c75da24df753a4e9de1f> # SDK update ## Versioning Version Bump Type: [patch] - 🤖 (automated) <details> <summary>OpenAPI Change Summary</summary> ``` └─┬Info └──[🔀] version (18:16) ``` | Document Element | Total Changes | Breaking Changes | |------------------|---------------|------------------| | info | 1 | 0 | </details> ## PYTHON CHANGELOG No relevant generator changes Based on [Speakeasy CLI](https://github.com/speakeasy-api/speakeasy) 1.601.0 Co-authored-by: speakeasybot <bot@speakeasyapi.dev>
chore: 🐝 Update SDK - Generate 0.42.8 (#322) > [!IMPORTANT] > Linting report available at: <https://app.speakeasy.com/org/unstructured/unstructured5xr/linting-report/3ed620997acae18a1e26ead1df0f8446> > OpenAPI Change report available at: <https://app.speakeasy.com/org/unstructured/unstructured5xr/changes-report/31f32cae2ab448877e4dff6f510a4fd1> # SDK update ## Versioning Version Bump Type: [patch] - 🤖 (automated) <details open> <summary>OpenAPI Change Summary</summary> No specification changes </details> ## PYTHON CHANGELOG No relevant generator changes Based on [Speakeasy CLI](https://github.com/speakeasy-api/speakeasy) 1.601.0 Co-authored-by: speakeasybot <bot@speakeasyapi.dev>
chore: 🐝 Update SDK - Generate 0.42.6 (#318) > [!IMPORTANT] > Linting report available at: <https://app.speakeasy.com/org/unstructured/unstructured5xr/linting-report/22e5ea0a87c022e301ddc0b9479c97bc> > OpenAPI Change report available at: <https://app.speakeasy.com/org/unstructured/unstructured5xr/changes-report/37746683fbc81629886ad5fa3bdcde18> # SDK update ## Versioning Version Bump Type: [patch] - 🤖 (automated) ## Python SDK Changes: * `unstructured_client.destinations.create_destination()`: * `request.create_destination_connector.config.[open_search_connector_config_input]` **Added** * `response.config.[open_search_connector_config]` **Added** * `unstructured_client.destinations.get_destination()`: `response.config.[open_search_connector_config]` **Added** * `unstructured_client.destinations.list_destinations()`: * `request.destination_type` **Changed** * `response.[].config.[open_search_connector_config]` **Added** * `unstructured_client.destinations.update_destination()`: * `request.update_destination_connector.config.[open_search_connector_config_input]` **Added** * `response.config.[open_search_connector_config]` **Added** * `unstructured_client.sources.create_source()`: * `request.create_source_connector.config.[open_search_connector_config_input]` **Added** * `response.config.[open_search_connector_config]` **Added** * `unstructured_client.sources.get_source()`: `response.config.[open_search_connector_config]` **Added** * `unstructured_client.sources.list_sources()`: * `request.source_type` **Changed** * `response.[].config.[open_search_connector_config]` **Added** * `unstructured_client.sources.update_source()`: * `request.update_source_connector.config.[open_search_connector_config_input]` **Added** * `response.config.[open_search_connector_config]` **Added** <details> <summary>OpenAPI Change Summary</summary> ``` └─┬Components ├──[➕] schemas (5420:36) ├──[➕] schemas (5518:41) ├─┬UpdateDestinationConnector │ └─┬config │ ├──[➕] anyOf (7295:15) │ ├─┬ANYOF │ │ └──[🔀] $ref (5519:17)❌ │ ├─┬ANYOF │ │ └──[🔀] $ref (5773:17)❌ │ ├─┬ANYOF │ │ └──[🔀] $ref (5845:17)❌ │ ├─┬ANYOF │ │ └──[🔀] $ref (6135:17)❌ │ ├─┬ANYOF │ │ └──[🔀] $ref (6040:17)❌ │ ├─┬ANYOF │ │ └──[🔀] $ref (6266:17)❌ │ ├─┬ANYOF │ │ └──[🔀] $ref (6724:17)❌ │ ├─┬ANYOF │ │ └──[🔀] $ref (7563:17)❌ │ └─┬ANYOF │ └──[🔀] $ref (4249:17)❌ ├─┬SourceConnectorType │ └──[➕] enum (7091:11) ├─┬UpdateSourceConnector │ └─┬config │ ├──[➕] anyOf (7376:15) │ ├─┬ANYOF │ │ └──[🔀] $ref (5519:17)❌ │ ├─┬ANYOF │ │ └──[🔀] $ref (5681:17)❌ │ ├─┬ANYOF │ │ └──[🔀] $ref (5950:17)❌ │ ├─┬ANYOF │ │ └──[🔀] $ref (6396:17)❌ │ ├─┬ANYOF │ │ └──[🔀] $ref (6495:17)❌ │ ├─┬ANYOF │ │ └──[🔀] $ref (6597:17)❌ │ ├─┬ANYOF │ │ └──[🔀] $ref (6875:17)❌ │ ├─┬ANYOF │ │ └──[🔀] $ref (4444:17)❌ │ └─┬ANYOF │ └──[🔀] $ref (7831:17)❌ ├─┬CreateSourceConnector │ └─┬config │ ├──[➕] anyOf (3195:15) │ ├─┬ANYOF │ │ └──[🔀] $ref (5519:17)❌ │ ├─┬ANYOF │ │ └──[🔀] $ref (5681:17)❌ │ ├─┬ANYOF │ │ └──[🔀] $ref (5950:17)❌ │ ├─┬ANYOF │ │ └──[🔀] $ref (6396:17)❌ │ ├─┬ANYOF │ │ └──[🔀] $ref (6495:17)❌ │ ├─┬ANYOF │ │ └──[🔀] $ref (6597:17)❌ │ ├─┬ANYOF │ │ └──[🔀] $ref (6875:17)❌ │ ├─┬ANYOF │ │ └──[🔀] $ref (4444:17)❌ │ └─┬ANYOF │ └──[🔀] $ref (7831:17)❌ ├─┬DestinationConnectorType │ └──[➕] enum (3840:11) ├─┬DestinationConnectorInformation │ └─┬config │ ├──[➕] anyOf (3787:15) │ ├─┬ANYOF │ │ └──[🔀] $ref (5421:17)❌ │ ├─┬ANYOF │ │ └──[🔀] $ref (5745:17)❌ │ ├─┬ANYOF │ │ └──[🔀] $ref (5802:17)❌ │ ├─┬ANYOF │ │ └──[🔀] $ref (6069:17)❌ │ ├─┬ANYOF │ │ └──[🔀] $ref (6012:17)❌ │ ├─┬ANYOF │ │ └──[🔀] $ref (6204:17)❌ │ ├─┬ANYOF │ │ └──[🔀] $ref (6652:17)❌ │ ├─┬ANYOF │ │ └──[🔀] $ref (7534:17)❌ │ └─┬ANYOF │ └──[🔀] $ref (4181:17)❌ ├─┬CreateDestinationConnector │ └─┬config │ ├──[➕] anyOf (3105:15) │ ├─┬ANYOF │ │ └──[🔀] $ref (5519:17)❌ │ ├─┬ANYOF │ │ └──[🔀] $ref (5773:17)❌ │ ├─┬ANYOF │ │ └──[🔀] $ref (5845:17)❌ │ ├─┬ANYOF │ │ └──[🔀] $ref (6135:17)❌ │ ├─┬ANYOF │ │ └──[🔀] $ref (6040:17)❌ │ ├─┬ANYOF │ │ └──[🔀] $ref (6266:17)❌ │ ├─┬ANYOF │ │ └──[🔀] $ref (6724:17)❌ │ ├─┬ANYOF │ │ └──[🔀] $ref (7563:17)❌ │ └─┬ANYOF │ └──[🔀] $ref (4249:17)❌ └─┬SourceConnectorInformation └─┬config ├──[➕] anyOf (7041:15) ├─┬ANYOF │ └──[🔀] $ref (5421:17)❌ ├─┬ANYOF │ └──[🔀] $ref (5617:17)❌ ├─┬ANYOF │ └──[🔀] $ref (5888:17)❌ ├─┬ANYOF │ └──[🔀] $ref (6329:17)❌ ├─┬ANYOF │ └──[🔀] $ref (6464:17)❌ ├─┬ANYOF │ └──[🔀] $ref (6543:17)❌ ├─┬ANYOF │ └──[🔀] $ref (6796:17)❌ ├─┬ANYOF │ └──[🔀] $ref (4324:17)❌ └─┬ANYOF └──[🔀] $ref (7784:17)❌ ``` | Document Element | Total Changes | Breaking Changes | |------------------|---------------|------------------| | components | 64 | 54 | </details> ## PYTHON CHANGELOG No relevant generator changes Based on [Speakeasy CLI](https://github.com/speakeasy-api/speakeasy) 1.601.0 Co-authored-by: speakeasybot <bot@speakeasyapi.dev>
chore: 🐝 Update SDK - Generate 0.42.5 (#317) > [!IMPORTANT] > Linting report available at: <https://app.speakeasy.com/org/unstructured/unstructured5xr/linting-report/16e0c8159aa07f60f346209d2661d329> > OpenAPI Change report available at: <https://app.speakeasy.com/org/unstructured/unstructured5xr/changes-report/875f5043b32383cb8853d3dfa9fa5717> # SDK update ## Versioning Version Bump Type: [patch] - 🤖 (automated) <details> <summary>OpenAPI Change Summary</summary> ``` └─┬Info └──[🔀] version (18:16) ``` | Document Element | Total Changes | Breaking Changes | |------------------|---------------|------------------| | info | 1 | 0 | </details> ## PYTHON CHANGELOG No relevant generator changes Based on [Speakeasy CLI](https://github.com/speakeasy-api/speakeasy) 1.601.0 --------- Co-authored-by: speakeasybot <bot@speakeasyapi.dev> Co-authored-by: Jordan Homan <jordan@unstructured.io>
chore: bump pypdf and other dependencies (#312) - This is done by updating the version constraint in `gen.yaml` and then running `make client-generate-sdk` - I've removed other new changes in order to keep this pr small - By manually touching `RELEASES.md` we'll trigger a package release in this repo
chore: 🐝 Update SDK - Generate 0.42.3 (#306) > [!IMPORTANT] > Linting report available at: <https://app.speakeasy.com/org/unstructured/unstructured5xr/linting-report/7a385740ded90a1b1df8b2685f4e1181> > OpenAPI Change report available at: <https://app.speakeasy.com/org/unstructured/unstructured5xr/changes-report/eaa1b1b1959d9dbe3784727572638377> # SDK update ## Versioning Version Bump Type: [patch] - 🤖 (automated) <details> <summary>OpenAPI Change Summary</summary> ``` └─┬Components ├─┬CreateDestinationConnector │ └─┬config │ └──[➕] anyOf (2768:15) ├─┬DestinationConnectorInformation │ └─┬config │ └──[➕] anyOf (3428:15) ├─┬UpdateSourceConnector │ └─┬config │ └──[➕] anyOf (6675:15) ├─┬UpdateDestinationConnector │ └─┬config │ └──[➕] anyOf (6597:15) ├─┬SourceConnectorInformation │ └─┬config │ └──[➕] anyOf (6467:15) └─┬CreateSourceConnector └─┬config └──[➕] anyOf (2855:15) ``` | Document Element | Total Changes | Breaking Changes | |------------------|---------------|------------------| | components | 6 | 0 | </details> ## PYTHON CHANGELOG No relevant generator changes Based on [Speakeasy CLI](https://github.com/speakeasy-api/speakeasy) 1.601.0 --------- Co-authored-by: speakeasybot <bot@speakeasyapi.dev> Co-authored-by: Austin Walker <austin@unstructured.io>
chore: 🐝 Update SDK - Generate 0.42.2 (#305) > [!IMPORTANT] > Linting report available at: <https://app.speakeasy.com/org/unstructured/unstructured5xr/linting-report/0a5f5e6fa72220658eebd2029258b3f1> > OpenAPI Change report available at: <https://app.speakeasy.com/org/unstructured/unstructured5xr/changes-report/ab67ee934e789814b24e905291d94612> # SDK update Based on: - OpenAPI Doc - Speakeasy CLI 1.598.3 (2.674.3) https://github.com/speakeasy-api/speakeasy ## Versioning Version Bump Type: [patch] - 🤖 (automated) ## PYTHON CHANGELOG ## core: 5.19.7 - 2025-08-06 ### 🐛 Bug Fixes - add return type hint for methods returning None *(commit by [@AshGodfrey](https://github.com/AshGodfrey))* Co-authored-by: speakeasybot <bot@speakeasyapi.dev>
PreviousNext