Skip to content

fix(deps): update dependency websockets to v16#5833

Open
renovate[bot] wants to merge 1 commit into
mainfrom
renovate/major-third-party-deps
Open

fix(deps): update dependency websockets to v16#5833
renovate[bot] wants to merge 1 commit into
mainfrom
renovate/major-third-party-deps

Conversation

@renovate
Copy link
Copy Markdown
Contributor

@renovate renovate Bot commented May 25, 2026

This PR contains the following updates:

Package Change Age Confidence
websockets (changelog) >=13.1,<16.0 β†’ >=16,<16.1 age confidence

Release Notes

python-websockets/websockets (websockets)

v16.0

Compare Source

See https://websockets.readthedocs.io/en/stable/project/changelog.html for details.


Configuration

πŸ“… Schedule: (UTC)

  • Branch creation
    • "before 9am on monday"
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

β™» Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

πŸ”• Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate
Copy link
Copy Markdown
Contributor Author

renovate Bot commented May 25, 2026

⚠️ Artifact update problem

Renovate failed to update an artifact related to this branch. You probably do not want to merge this PR as-is.

β™» Renovate will retry this branch, including artifacts, only when one of the following happens:

  • any of the package files in this branch needs updating, or
  • the branch becomes conflicted, or
  • you click the rebase/retry checkbox if found above, or
  • you rename this PR's title to start with "rebase!" to trigger it manually

The artifact failure details are included below:

File name: uv.lock
Command failed: uv lock --upgrade-package websockets
Using CPython 3.14.5 interpreter at: /opt/containerbase/tools/python/3.14.5/bin/python3
  Γ— No solution found when resolving dependencies for split (markers:
  β”‚ python_full_version == '3.14.*' and platform_machine != 's390x'):
  ╰─▢ Because openai[realtime]>=2.16.0 depends on websockets>=13,<16
      and websockets>=13,<16, we can conclude that
      openai[realtime]>=2.16.0,<=2.17.0 depends on websockets>=13,<16.
      And because openai[realtime]>=2.18.0 depends on websockets>=13,<16,
      we can conclude that openai[realtime]>=2.16.0,<=2.18.0 depends on
      websockets>=13,<16.
      And because openai[realtime]>=2.19.0 depends on
      websockets>=13,<16 and websockets>=13,<16, we can conclude that
      openai[realtime]>=2.16.0,<=2.20.0 depends on websockets>=13,<16.
      And because openai[realtime]>=2.21.0 depends on
      websockets>=13,<16 and websockets>=13,<16, we can conclude that
      openai[realtime]>=2.16.0,<=2.22.0 depends on websockets>=13,<16.
      And because openai[realtime]>=2.23.0 depends on
      websockets>=13,<16 and websockets>=13,<16, we can conclude that
      openai[realtime]>=2.16.0,<=2.24.0 depends on websockets>=13,<16.
      And because openai[realtime]>=2.25.0 depends on
      websockets>=13,<16 and websockets>=13,<16, we can conclude that
      openai[realtime]>=2.16.0,<=2.26.0 depends on websockets>=13,<16.
      And because openai[realtime]>=2.27.0 depends on
      websockets>=13,<16 and websockets>=13,<16, we can conclude that
      openai[realtime]>=2.16.0,<=2.28.0 depends on websockets>=13,<16.
      And because openai[realtime]>=2.29.0 depends on
      websockets>=13,<16 and websockets>=13,<16, we can conclude that
      openai[realtime]>=2.16.0,<=2.30.0 depends on websockets>=13,<16.
      And because openai[realtime]>=2.31.0 depends on
      websockets>=13,<16 and websockets>=13,<16, we can conclude that
      openai[realtime]>=2.16.0,<=2.32.0 depends on websockets>=13,<16.
      And because openai[realtime]>=2.33.0 depends on websockets>=13,<16 and
      websockets>=13,<16, we can conclude that all of:
          openai[realtime]>=2.16.0,<=2.33.0
          openai[realtime]==2.35.0
      depend on websockets>=13,<16.
      And because all of:
          openai[realtime]==2.34.0
          openai[realtime]>=2.35.1
      depend on websockets>=13,<16 and websockets>=13,<16, we can conclude
      that all of:
          openai[realtime]>=2.16.0,<=2.33.0
          openai[realtime]>=2.35.0,<=2.36.0
      depend on websockets>=13,<16.
      And because all of:
          openai[realtime]==2.34.0
          openai[realtime]>=2.37.0
      depend on websockets>=13,<16 and websockets>=13,<16, we can conclude
      that all of:
          openai[realtime]>=2.16.0,<=2.33.0
          openai[realtime]>=2.35.0
      depend on websockets>=13,<16.
      And because only the following versions of openai[realtime] are
      available:
          openai[realtime]<=2.0.0
          openai[realtime]==2.0.1
          openai[realtime]==2.1.0
          openai[realtime]==2.2.0
          openai[realtime]==2.3.0
          openai[realtime]==2.4.0
          openai[realtime]==2.5.0
          openai[realtime]==2.6.0
          openai[realtime]==2.6.1
          openai[realtime]==2.7.0
          openai[realtime]==2.7.1
          openai[realtime]==2.7.2
          openai[realtime]==2.8.0
          openai[realtime]==2.8.1
          openai[realtime]==2.9.0
          openai[realtime]==2.11.0
          openai[realtime]==2.12.0
          openai[realtime]==2.13.0
          openai[realtime]==2.14.0
          openai[realtime]==2.15.0
          openai[realtime]==2.16.0
          openai[realtime]==2.17.0
          openai[realtime]==2.18.0
          openai[realtime]==2.19.0
          openai[realtime]==2.20.0
          openai[realtime]==2.21.0
          openai[realtime]==2.22.0
          openai[realtime]==2.23.0
          openai[realtime]==2.24.0
          openai[realtime]==2.25.0
          openai[realtime]==2.26.0
          openai[realtime]==2.27.0
          openai[realtime]==2.28.0
          openai[realtime]==2.29.0
          openai[realtime]==2.30.0
          openai[realtime]==2.31.0
          openai[realtime]==2.32.0
          openai[realtime]==2.33.0
          openai[realtime]==2.34.0
          openai[realtime]==2.35.0
          openai[realtime]==2.35.1
          openai[realtime]==2.36.0
          openai[realtime]==2.37.0
          openai[realtime]==2.38.0
      and openai[realtime]==2.34.0 depends on websockets>=13,<16, we can
      conclude that all of:
          openai<2.0.0
          openai>2.15.0
      , all of:
          websockets<13
          websockets>=16
      , openai[realtime]>=2.0.0 are incompatible.
      And because livekit-plugins-openai depends on openai[realtime]>=2 and
      livekit-plugins-cerebras depends on openai>=2.16.0, we can conclude that
      livekit-plugins-cerebras, livekit-plugins-openai, all of:
          websockets<13
          websockets>=16
       are incompatible.
      And because livekit-plugins-gnani depends on websockets>=16,<16.1
      and your workspace requires livekit-plugins-cerebras, we can
      conclude that your workspace's requirements, livekit-plugins-gnani,
      livekit-plugins-openai[vertex] are incompatible.
      And because your workspace requires livekit-plugins-gnani and
      livekit-plugins-openai[vertex], we can conclude that your workspace's
      requirements are unsatisfiable.

@chenghao-mou chenghao-mou requested a review from a team May 25, 2026 01:54
Copy link
Copy Markdown
Contributor

@devin-ai-integration devin-ai-integration Bot left a comment

Choose a reason for hiding this comment

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

Devin Review found 1 potential issue.

View 2 additional findings in Devin Review.

Open in Devin Review

dependencies = [
"livekit-agents[codecs]>=1.5.8",
"websockets>=13.1,<16.0",
"websockets>=16,<16.1",
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

πŸ”΄ uv.lock not updated after websockets version bump β€” lock file is stale and inconsistent

The pyproject.toml was changed to require websockets>=16,<16.1, but the shared uv.lock file was not regenerated. The lock file still resolves websockets to version 15.0.1 and records the old specifier >=13.1,<16.0 for livekit-plugins-gnani. This means uv sync will detect a stale lock and fail (or silently use the wrong version), since 15.0.1 does not satisfy >=16,<16.1.

Stale lock file metadata

In uv.lock, the gnani entry still reads:

[package.metadata]
requires-dist = [
    { name = "websockets", specifier = ">=13.1,<16.0" },
]

And websockets is resolved globally to 15.0.1, which is incompatible with the new >=16,<16.1 requirement.

Prompt for agents
The pyproject.toml was updated to require websockets>=16,<16.1 but the root uv.lock was not regenerated. The lock file still resolves websockets to 15.0.1 and records the old specifier >=13.1,<16.0 for livekit-plugins-gnani. Run `uv lock` from the repository root to regenerate the lock file. Note that since this is a uv workspace with a single lock file, upgrading websockets to 16.x will affect all workspace members that depend on websockets (e.g. livekit-plugins-phonic, google-genai, fal-client, speechmatics-rt). Verify that all those packages are compatible with websockets 16.x before merging.
Open in Devin Review

Was this helpful? React with πŸ‘ or πŸ‘Ž to provide feedback.

@renovate renovate Bot force-pushed the renovate/major-third-party-deps branch from 5e7f776 to c5d66e7 Compare May 25, 2026 06:03
@renovate renovate Bot force-pushed the renovate/major-third-party-deps branch from c5d66e7 to 8734c34 Compare May 27, 2026 23:17
Copy link
Copy Markdown
Contributor

@devin-ai-integration devin-ai-integration Bot left a comment

Choose a reason for hiding this comment

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

Devin Review found 1 new potential issue.

View 3 additional findings in Devin Review.

Open in Devin Review

dependencies = [
"livekit-agents[codecs]>=1.5.14",
"websockets>=13.1,<16.0",
"websockets>=16,<16.1",
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

πŸ”΄ websockets 16 removes websockets.exceptions attribute access, breaking all except clauses

The dependency is bumped to websockets>=16,<16.1, but in websockets 16.0, websockets.exceptions is no longer auto-loaded as an attribute of the websockets module after a bare import websockets. The gnani code does exactly that β€” import websockets in each _run method, then catches websockets.exceptions.ConnectionClosed in except clauses at stt.py:347, tts.py:472, and tts.py:577. In websockets 16, evaluating websockets.exceptions.ConnectionClosed in the except clause raises AttributeError. Per Python semantics, when an except clause's expression itself raises an exception, the remaining except clauses in the same try block are not evaluated β€” so the fallback except Exception handler won't catch it either. This means any ConnectionClosed from the server will surface as an unhandled AttributeError instead of being gracefully wrapped in APIConnectionError.

Verification showing the breakage with websockets 16.0

import websockets; websockets.exceptions β†’ AttributeError: module 'websockets' has no attribute 'exceptions'

import websockets.exceptions; websockets.exceptions.ConnectionClosed β†’ works fine

The fix is to add import websockets.exceptions (or from websockets.exceptions import ConnectionClosed) in each of the three _run methods alongside the existing import websockets.

Prompt for agents
The websockets dependency was bumped from >=13.1,<16.0 to >=16,<16.1. In websockets 16.0, the websockets.exceptions submodule is no longer auto-loaded when you do import websockets. The gnani plugin code catches websockets.exceptions.ConnectionClosed in three places after only doing import websockets:

1. livekit/plugins/gnani/stt.py line 303 does import websockets, then line 347 catches websockets.exceptions.ConnectionClosed
2. livekit/plugins/gnani/tts.py line 417 does import websockets, then line 472 catches websockets.exceptions.ConnectionClosed
3. livekit/plugins/gnani/tts.py line 506 does import websockets, then line 577 catches websockets.exceptions.ConnectionClosed

In all three _run methods, add import websockets.exceptions alongside the existing import websockets. Alternatively, change the except clauses to use a directly imported ConnectionClosed class via from websockets.exceptions import ConnectionClosed at the top of the file.
Open in Devin Review

Was this helpful? React with πŸ‘ or πŸ‘Ž to provide feedback.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants