deps: refresh the lock, and fix the two breakages it surfaced - #54
Merged
Conversation
Refreshes 34 packages, notably cryptography 50.0.1, click 8.5.0, idna 3.19, pydantic 2.13.5, dcap-qvl 0.6.3 and filelock 3.32.5. Three of the changes needed more than a version bump. abnf is capped below 2.9 on the x402 extra. siwe accepts abnf >=2.2,<3, but 2.9.0 made redefining an RFC 5234 core rule a hard error and siwe's own rfc5234 grammar redefines ALPHA, so `import siwe` raised GrammarError and took the whole SIWE and x402 authentication path with it. Capped here rather than waiting on siwe, which is already at its latest release. Bisected against published versions: 2.8.3 is the last good one. MessageContentPartParam is pinned to union_mode="left_to_right". It unions the discriminated MessageContentPart with TypedDict mirrors of the same shapes, which exist only so callers can pass plain dicts without type-checker complaints. Smart mode picks a union member by score rather than by order, and the mirrors describe the same shapes by construction, so nothing but a scoring tiebreak separated them; pydantic 2.13.5 adjusted that scoring (pydantic/pydantic#13731) and the TypedDict members began winning, leaving dict content parts as dicts instead of TextContent/ImageContent/AudioContent/ VideoContent/FileContent. Serialization was unaffected, so the request put on the wire stayed correct, but msg.content[0].text raised AttributeError. left_to_right drops the dependency on scoring altogether and was verified identical on 2.13.4 and 2.13.5 across clean dicts, extra keys, invalid parts, unknown types and typed instances. click 8.5.0 deprecates CliRunner.isolated_filesystem, which emitted seven DeprecationWarnings from one helper. The fixture files now go into pytest's tmp_path and are passed as absolute paths, as the deprecation message recommends. The chdir it provided was not load-bearing: the CLI reads its config from ~/.venice-py and none of these commands touch Path.cwd(). web3 8, eth-account 0.14, websockets 17 and chardet 7 stay where they are. siwe 4.4.0 pins web3 <8 and eth-account <0.14, web3 7 pins websockets <16, and cyclonedx-bom 7.3.1 pins chardet <6 — all already at their latest releases, so these are ecosystem ceilings rather than deferred work. hexbytes, eth-abi, rlp and eth-rlp did cross majors, because web3 7.16.0 and eth-account 0.13.7 declare them with no upper bound; that cohort is safe here because this SDK imports nothing from web3, hexbytes, eth_abi or rlp directly, and the one hexbytes 2.0 change that reaches it — .hex() no longer returning a 0x prefix — is already normalised at every call site. Also runs the suite on 4 xdist workers instead of 6. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This was referenced Sep 1, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Refreshes 34 packages — notably
cryptography50.0.1,click8.5.0,idna3.19,pydantic2.13.5,dcap-qvl0.6.3 andfilelock3.32.5 — and fixes the two things that broke as a result.abnfcapped below 2.9A plain
poetry updatebroke SIWE outright.siweacceptsabnf >=2.2,<3, but 2.9.0 made redefining an RFC 5234 core rule a hard error, and siwe's ownrfc5234grammar redefinesALPHA— soimport siweraisedGrammarError, taking the whole SIWE and x402 authentication path with it. Capped here rather than waiting onsiwe, which is already at its latest release. Bisected against published versions: 2.8.3 is the last good one.Dict content parts coerce to typed objects again
UserMessage(content=[{"type": "text", ...}])returned plaindictparts instead ofTextContent/ImageContent/AudioContent/VideoContent/FileContent, somsg.content[0].textraisedAttributeError. Serialization was unaffected, so the request put on the wire stayed correct — this was an attribute-access break only.MessageContentPartParamunions the discriminatedMessageContentPartwithTypedDictmirrors of the same shapes, which exist only so callers can pass plain dicts without type-checker complaints. Smart mode picks a union member by score rather than by order, and the mirrors describe the same shapes by construction, so nothing but a scoring tiebreak ever separated them. pydantic 2.13.5 shipped #13731 "Count validated model fields once in smart unions" and theTypedDictmembers began winning.That is an intentional upstream fix, not a regression awaiting revert, so pinning
pydantic <2.13.5would have been a symptom fix with no end date. The union is now pinned tounion_mode="left_to_right", which drops the dependency on scoring altogether.Verified across a behavior matrix on both versions — identical in every case:
TextContentdictTextContentdictdictdicttext="")dictdictdicttypeTextContentTextContentTextContentClick deprecation
click8.5.0 deprecatesCliRunner.isolated_filesystem, which emitted sevenDeprecationWarnings from one helper. Fixture files now go into pytest'stmp_pathand are passed as absolute paths, as the deprecation message recommends. Thechdirit provided was not load-bearing: the CLI reads its config from~/.venice-pyand none of these commands touchPath.cwd().Notes for review
MessageContentPartParamis exported in__all__, and its runtime value is nowAnnotated[...]rather than a bare union —get_args()andTypeAdapter()on it see a different shape.{"type": "text", "text": ""}(violatingmin_length=1), fall through to raw dicts instead of raising. This behaves the same on 2.13.4, so it predates this branch and is deliberately left alone here — closing it means auditing every dict-formcontent=[...]call site. Worth a separate issue.web38,eth-account0.14,websockets17 andchardet7 stay put:siwe4.4.0 pinsweb3 <8andeth-account <0.14,web37 pinswebsockets <16,cyclonedx-bom7.3.1 pinschardet <6— all at their latest releases, so these are ecosystem ceilings, not deferred work.hexbytes,eth-abi,rlpandeth-rlpcrossed majors becauseweb37.16.0 andeth-account0.13.7 declare them uncapped. Safe here for a specific reason: this SDK imports nothing fromweb3/hexbytes/eth_abi/rlpdirectly, and the onehexbytes2.0 change that reaches it —.hex()no longer returning a0xprefix — is already normalised at every call site. EIP-712 signing and SIWE verify were both checked end to end.image-size <= 2.0.2, both unpatched upstream) were dismissed astolerable_risk— build-time only, static output, no attacker-supplied input. 0 open alerts.Verification
Full suite green, no failures and no warnings.
make check-allclean — mypySuccess: no issues found in 190 source files, pyright0 errors.Closes on merge
Supersedes Dependabot #43, #44, #45, #47, #50, #51, #52. #46 (tiktoken) is not covered — it bumps the
^0.13.0constraint inpyproject.toml, which a lock refresh cannot do; merge it after this lands. #48 and #41 are workflow-only and independent.🤖 Generated with Claude Code