Skip to content

Conversation

@stainless-app
Copy link
Contributor

@stainless-app stainless-app bot commented Feb 4, 2025

Automated Release PR

4.1.0 (2025-12-19)

Full Changelog: v4.0.0...v4.1.0

Features

  • api: update via SDK Studio (#61) (9c0c551)
  • clean up environment call outs (696f18b)
  • client: add follow_redirects request option (6eb41c9)
  • client: add support for aiohttp (6f6ddd9)
  • client: allow passing NotGiven for body (#67) (3ad7f25)
  • client: send X-Stainless-Read-Timeout header (#63) (a594c75)
  • client: support file upload requests (fde965a)
  • improve future compat with pydantic v3 (bccbddf)
  • types: replace List[str] with SequenceNotStr in params (0578887)

Bug Fixes

  • asyncify on non-asyncio runtimes (#66) (ca310cd)
  • avoid newer type syntax (db10820)
  • ci: correct conditional (66eb0ef)
  • ci: ensure pip is always available (#78) (d3d295a)
  • ci: release-doctor — report correct token name (65cdccf)
  • ci: remove publishing patch (#79) (493f504)
  • client: close streams without requiring full consumption (e783145)
  • client: correctly parse binary response | stream (3924997)
  • client: don't send Content-Type header on GET requests (6bcbc4e)
  • client: mark some request bodies as optional (3ad7f25)
  • compat with Python 3.14 (f7d6103)
  • compat: update signatures of model_dump and model_dump_json for Pydantic v1 (898ca7b)
  • ensure streams are always closed (f89af68)
  • package: support direct resource imports (ad2d130)
  • parsing: correctly handle nested discriminated unions (cd511d2)
  • parsing: ignore empty metadata (bdd8ead)
  • parsing: parse extra field types (470d8a8)
  • perf: optimize some hot paths (7cc4937)
  • perf: skip traversing types for NotGiven values (38509ba)
  • pydantic v1: more robust ModelField.annotation check (3dc3480)
  • tests: fix: tests which call HTTP endpoints directly with the example parameters (539215f)
  • types: allow pyright to infer TypedDict types within SequenceNotStr (84b4806)
  • types: handle more discriminated union shapes (#77) (8b6dcf0)
  • use async_to_httpx_files in patch method (6bfd0c0)

Chores

  • add Python 3.14 classifier and testing (c172e9c)
  • broadly detect json family of content-type headers (febefbc)
  • bump httpx-aiohttp version to 0.1.9 (7aeb4c8)
  • ci: add timeout thresholds for CI jobs (d5cbcd0)
  • ci: change upload type (d7e4405)
  • ci: enable for pull requests (1ea6fbc)
  • ci: fix installation instructions (6291f4a)
  • ci: only run for pushes and fork pull requests (5d00f3e)
  • ci: only use depot for staging repos (19ee773)
  • ci: upload sdks to package manager (598ec7e)
  • client: minor internal fixes (1e29d3b)
  • deps: mypy 1.18.1 has a regression, pin to 1.17 (fd940b6)
  • do not install brew dependencies in ./scripts/bootstrap by default (67c48f0)
  • docs: grammar improvements (540e711)
  • docs: remove reference to rye shell (ec32daa)
  • docs: update client docstring (#71) (b41543a)
  • docs: use environment variables for authentication in code snippets (ff7f0ef)
  • fix typos (#80) (c1576cc)
  • internal/tests: avoid race condition with implicit client cleanup (d3a5435)
  • internal: add --fix argument to lint script (0b1e68e)
  • internal: add missing files argument to base client (5547d1b)
  • internal: add Sequence related utils (5f815ef)
  • internal: avoid errors for isinstance checks on proxies (5dc0949)
  • internal: base client updates (0ac179a)
  • internal: bump pinned h11 dep (6cafe07)
  • internal: bump pyright version (81c2baf)
  • internal: bump rye to 0.44.0 (#76) (21a20b3)
  • internal: change ci workflow machines (656643d)
  • internal: codegen related update (2f8fbc4)
  • internal: codegen related update (d6d5a1d)
  • internal: codegen related update (a145cee)
  • internal: codegen related update (#75) (db19786)
  • internal: detect missing future annotations with ruff (23b94ed)
  • internal: expand CI branch coverage (7fd1145)
  • internal: fix devcontainers setup (#68) (97b7254)
  • internal: fix list file params (1b5e333)
  • internal: fix ruff target version (1437b86)
  • internal: fix type traversing dictionary params (#64) (1322c80)
  • internal: grammar fix (it's -> its) (8b1cdb7)
  • internal: import reformatting (8a3f6f0)
  • internal: minor type handling changes (#65) (7e69125)
  • internal: move mypy configurations to pyproject.toml file (f87b268)
  • internal: properly set pydantic_private (#69) (bc25b84)
  • internal: reduce CI branch coverage (2492996)
  • internal: refactor retries to not use recursion (055e329)
  • internal: remove extra empty newlines (#74) (3d90dff)
  • internal: remove trailing character (#81) (4cfa80b)
  • internal: remove unused http client options forwarding (#72) (69a44e3)
  • internal: slight transform perf improvement (#82) (5498eaf)
  • internal: update comment in script (103820e)
  • internal: update conftest.py (83531b4)
  • internal: update models test (421a2b5)
  • internal: update pydantic dependency (5dd09a4)
  • internal: update pyright exclude list (f306088)
  • internal: update pyright settings (2d267e1)
  • package: drop Python 3.8 support (95ca18d)
  • package: mark python 3.13 as supported (06ad64f)
  • project: add settings file for vscode (6754b39)
  • readme: fix version rendering on pypi (b1e9e51)
  • readme: update badges (f3f214f)
  • speedup initial import (3b3f4e6)
  • tests: add tests for httpx client instantiation & proxies (5e172cd)
  • tests: run tests in parallel (497b381)
  • tests: simplify get_platform test (ef07d85)
  • tests: skip some failing tests on the latest python versions (39d037c)
  • types: change optional parameter type from NotGiven to Omit (14cb9a9)
  • update @stainless-api/prism-cli to v5.15.0 (d766a01)
  • update github action (d0f9d9e)
  • update lockfile (77726a0)

Documentation

  • client: fix httpx.Timeout documentation reference (3341b85)
  • update URLs from stainlessapi.com to stainless.com (#70) (08062c4)

This pull request is managed by Stainless's GitHub App.

The semver version number is based on included commit messages. Alternatively, you can manually set the version number in the title of this pull request.

For a better experience, it is recommended to use either rebase-merge or squash-merge when merging this pull request.

🔗 Stainless website
📚 Read the docs
🙋 Reach out for help or questions


Note

Release 4.1.0 with aiohttp support, follow_redirects, API/type updates (voice deployments, Omit), CI/dev tooling upgrades, and docs refinements.

  • SDK/Client:
    • Add DefaultAioHttpClient (aiohttp backend) and per-request follow_redirects.
    • Send X-Stainless-Read-Timeout; improve retries (loop + sleep), pagination (PageInfo supports json), and content-type/binary handling.
    • Export omit/not_given; enhance file upload (patch/put), platform/proxy handling, and streaming cleanup.
  • API/Types:
    • Unify voice deployment models to VoiceDeployment; update return types and list aliasing.
    • Use Omit for optional params across workers/flows; update api.md accordingly.
  • Tooling/CI:
    • Upgrade Rye to 0.44.0; add Node feature to devcontainer; adjust shell activation.
    • CI: branch filters, timeouts, conditional runners, new build job with OIDC artifact upload; test/bootstrap script tweaks; new upload script.
    • pyproject: optional aiohttp extra, newer classifiers (3.13/3.14), dev deps pins; ruff/mypy/pytest settings; lockfiles refreshed.
  • Docs:
    • README/SECURITY/CONTRIBUTING updates (Python 3.9+, aiohttp usage, links, timeout doc link).

Written by Cursor Bugbot for commit 590d7c8. This will update automatically on new commits. Configure here.

@stainless-app stainless-app bot force-pushed the release-please--branches--main--changes--next branch from 6c2b6c5 to a594c75 Compare February 6, 2025 03:11
@stainless-app stainless-app bot force-pushed the release-please--branches--main--changes--next branch from 85e4dfe to 1322c80 Compare February 7, 2025 03:11
@stainless-app stainless-app bot force-pushed the release-please--branches--main--changes--next branch from 2bb4c49 to 7e69125 Compare February 7, 2025 03:14
@stainless-app stainless-app bot force-pushed the release-please--branches--main--changes--next branch from 7cdfb0a to ca310cd Compare February 14, 2025 03:14
fix(client): mark some request bodies as optional
@stainless-app stainless-app bot force-pushed the release-please--branches--main--changes--next branch from 3bdb00f to 3ad7f25 Compare February 21, 2025 04:03
@stainless-app stainless-app bot force-pushed the release-please--branches--main--changes--next branch from 1be6ce9 to 97b7254 Compare February 22, 2025 03:24
@stainless-app stainless-app bot force-pushed the release-please--branches--main--changes--next branch from 35a4088 to bc25b84 Compare February 26, 2025 03:11
@stainless-app stainless-app bot force-pushed the release-please--branches--main--changes--next branch from ef0d130 to 08062c4 Compare February 28, 2025 03:03
@stainless-app stainless-app bot force-pushed the release-please--branches--main--changes--next branch from 9257acd to b41543a Compare February 28, 2025 03:05
@stainless-app stainless-app bot force-pushed the release-please--branches--main--changes--next branch from df1d708 to 69a44e3 Compare March 4, 2025 03:29
@stainless-app stainless-app bot force-pushed the release-please--branches--main--changes--next branch from cf36bae to bba1424 Compare March 11, 2025 11:58
@stainless-app stainless-app bot force-pushed the release-please--branches--main--changes--next branch from e0b03f0 to 3d90dff Compare March 14, 2025 08:46
@stainless-app stainless-app bot force-pushed the release-please--branches--main--changes--next branch from 84a0625 to db19786 Compare March 15, 2025 07:00
@stainless-app stainless-app bot force-pushed the release-please--branches--main--changes--next branch from 359644d to 21a20b3 Compare March 15, 2025 07:03
@stainless-app stainless-app bot force-pushed the release-please--branches--main--changes--next branch 2 times, most recently from 68d28dd to 873e0de Compare November 11, 2025 05:57
@stainless-app stainless-app bot force-pushed the release-please--branches--main--changes--next branch from 873e0de to 9ef228a Compare November 12, 2025 05:32
@stainless-app stainless-app bot force-pushed the release-please--branches--main--changes--next branch from 9ef228a to e4ed00c Compare November 22, 2025 04:57
@stainless-app stainless-app bot force-pushed the release-please--branches--main--changes--next branch from e4ed00c to a72636d Compare November 28, 2025 03:42
@stainless-app stainless-app bot force-pushed the release-please--branches--main--changes--next branch from a72636d to b7b5b98 Compare November 28, 2025 03:43
@stainless-app stainless-app bot force-pushed the release-please--branches--main--changes--next branch from b7b5b98 to f7c66f3 Compare December 3, 2025 07:17
if metadata is not None and len(metadata) > 0:
meta: tuple[Any, ...] = tuple(metadata)
elif is_annotated_type(type_):
meta = get_args(type_)[1:]
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: Annotated types not unwrapped when metadata provided directly

The construct_type function has a bug where Annotated types are not unwrapped when metadata is provided directly. The comment says "unwrap Annotated[T, ...] -> T" but when the first branch is taken (metadata non-empty), type_ remains wrapped as Annotated[T, ...]. This causes get_origin(type_) to return Annotated, which doesn't match any type handlers (list, dict, BaseModel, etc.), so nested types like Annotated[list[MyModel], PropertyInfo(...)] won't have their items properly constructed. The elif is_annotated_type(type_) branch that unwraps the type is skipped when metadata is provided.

Additional Locations (1)

Fix in Cursor Fix in Web

@stainless-app stainless-app bot force-pushed the release-please--branches--main--changes--next branch from f7c66f3 to f0262a9 Compare December 3, 2025 07:27
else:
import types

return tp is Union or tp is types.UnionType
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: is_union fails to recognize parameterized union types

The is_union function checks tp is Union directly, but parameterized unions like Union[A, B] are not the same object as Union. The old Pydantic v1 implementation used get_origin(tp) is Union, which correctly handled parameterized unions. This causes is_basemodel to fail recognizing union types containing BaseModel classes, since is_union(Union[ModelA, ModelB]) incorrectly returns False. This affects response parsing when the cast_to type is a union of models.

Additional Locations (1)

Fix in Cursor Fix in Web

@stainless-app stainless-app bot force-pushed the release-please--branches--main--changes--next branch from f0262a9 to 3524f04 Compare December 9, 2025 05:23
@stainless-app stainless-app bot force-pushed the release-please--branches--main--changes--next branch from 3524f04 to 9bd1046 Compare December 16, 2025 05:10
@stainless-app stainless-app bot force-pushed the release-please--branches--main--changes--next branch from 9bd1046 to f263f8c Compare December 17, 2025 07:32
@stainless-app stainless-app bot force-pushed the release-please--branches--main--changes--next branch from f263f8c to 5cddd6f Compare December 18, 2025 08:51
@stainless-app stainless-app bot force-pushed the release-please--branches--main--changes--next branch from 5cddd6f to 590d7c8 Compare December 19, 2025 07:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant