Skip to content

chore(deps): update github actions - #5488

Open
renovate[bot] wants to merge 1 commit into
mainfrom
renovate/github-actions
Open

renovate[bot] wants to merge 1 commit into
mainfrom
renovate/github-actions

Conversation

@renovate

@renovate renovate Bot commented Apr 20, 2026 •

Copy link
Copy Markdown
Contributor

This PR contains the following updates:

Package Type Update Change Pending
actions/checkout (changelog) action digest 9c091bb → 3d3c42e
actions/download-artifact (changelog) action digest 3e5f45b → 9000827
actions/upload-artifact (changelog) action digest 043fb46 → cf430e0
astral-sh/setup-uv action minor v10.1.0 → v10.3.0 v10.3.3 (+2)
python uses-with minor 3.12 → 3.15 3.15.2 (+1)
python uses-with minor 3.10 → 3.15 3.15.2 (+1)
python uses-with minor 3.11 → 3.15 3.15.2 (+1)

Release Notes

astral-sh/setup-uv

v10.3.0: 🌈 Add Python architecture selection

Compare Source

Changes

This release adds the python-arch input to select a Python architecture independently of the Python version. With uv 0.13.0 or later, set python-arch: x86_64 to use x64 Python on Windows ARM64 runners.

It also includes embedded checksums for uv releases through 0.13.0.

🚀 Enhancements

🧰 Maintenance

⬆️ Dependency updates

v10.2.0: 🌈 Disable automatic cache saves for merge queues

Compare Source

Changes

This release contains the known-checksum of the most recent uv releases and also disabled the uploading(saving) of the cache when in a merge queue since theses caches would almost never be used.

🚀 Enhancements
🧰 Maintenance
📚 Documentation
⬆️ Dependency updates
actions/python-versions (python)

v3.15.0: 3.15.0

Compare Source

Python 3.15.0

v3.14.10: 3.14.10

Compare Source

Python 3.14.10

v3.14.9: 3.14.9

Compare Source

Python 3.14.9

v3.14.8: 3.14.8

Compare Source

Python 3.14.8

v3.14.7: 3.14.7

Compare Source

Python 3.14.7

v3.14.6: 3.14.6

Compare Source

Python 3.14.6

v3.14.5: 3.14.5

Compare Source

Python 3.14.5

v3.14.4: 3.14.4

Compare Source

Python 3.14.4

v3.14.3: 3.14.3

Compare Source

Python 3.14.3

v3.14.2: 3.14.2

Compare Source

Python 3.14.2

v3.14.1: 3.14.1

Compare Source

Python 3.14.1

v3.14.0: 3.14.0

Compare Source

Python 3.14.0

v3.13.18: 3.13.18

Compare Source

Python 3.13.18

v3.13.17: 3.13.17

Compare Source

Python 3.13.17

v3.13.16: 3.13.16

Compare Source

Python 3.13.16

v3.13.15: 3.13.15

Compare Source

Python 3.13.15

v3.13.14: 3.13.14

Compare Source

Python 3.13.14

v3.13.13: 3.13.13

Compare Source

Python 3.13.13

v3.13.12: 3.13.12

Compare Source

Python 3.13.12

v3.13.11: 3.13.11

Compare Source

Python 3.13.11

v3.13.10: 3.13.10

Compare Source

Python 3.13.10

v3.13.9: 3.13.9

Compare Source

Python 3.13.9

v3.13.8: 3.13.8

Compare Source

Python 3.13.8

v3.13.7: 3.13.7

Compare Source

Python 3.13.7

v3.13.6: 3.13.6

Compare Source

Python 3.13.6

v3.13.5: 3.13.5

Compare Source

Python 3.13.5

v3.13.4: 3.13.4

Compare Source

Python 3.13.4

v3.13.3: 3.13.3

Compare Source

Python 3.13.3

v3.13.2: 3.13.2

Compare Source

Python 3.13.2

v3.13.1: 3.13.1

Compare Source

Python 3.13.1

v3.13.0: 3.13.0

Compare Source

Python 3.13.0


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.

👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.


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

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

@chenghao-mou
chenghao-mou requested a review from a team April 20, 2026 00:46

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

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.

✅ Devin Review: No Issues Found

Devin Review analyzed this PR and found no potential bugs to report.

View in Devin Review to see 2 additional findings.

Open in Devin Review

@github-actions

github-actions Bot commented Apr 20, 2026 •

Copy link
Copy Markdown
Contributor

STT Test Results

Status: ✗ Some tests failed

Metric Count
✓ Passed 22
✗ Failed 7
× Errors 0
→ Skipped 18
▣ Total 47
⏱ Duration 480.4s
Failed Tests
  • tests.test_stt::test_stream[livekit.plugins.fireworksai]
    self = <livekit.plugins.fireworksai.stt.SpeechStream object at 0x7d647687b390>
    
        async def __anext__(self) -> SpeechEvent:
            try:
    >           val = await self._event_aiter.__anext__()
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    E           StopAsyncIteration
    
    livekit-agents/livekit/agents/stt/stt.py:620: StopAsyncIteration
    
    During handling of the above exception, another exception occurred:
    
    stt_factory = <function parameter_factory.<locals>.<lambda> at 0x7d6476707480>
    request = <FixtureRequest for <Coroutine test_stream[livekit.plugins.fireworksai]>>
    
        @pytest.mark.usefixtures("job_process")
        @pytest.mark.parametrize("stt_factory", STTs + STREAM_ONLY_STTs)
        async def test_stream(stt_factory: Callable[[], STT], request):
            sample_rate = SAMPLE_RATE
            plugin_id = request.node.callspec.id.split("-")[0]
            frames, transcript, _ = await make_test_speech(
                chunk_duration_ms=STREAM_CHUNK_DURATION_MS, sample_rate=sample_rate
            )
      
            # TODO: differentiate missing key vs other errors
            try:
                stt_instance: STT = stt_factory()
            except ValueError as e:
                pytest.skip(f"{plugin_id}: {e}")
      
            async with stt_instance as stt:
                label = f"{stt.model}@{stt.provider}"
                if not stt.capabilities.streaming:
                    pytest.skip(f"{label} does not support streaming")
      
                for attempt in range(MAX_RETRIES):
                    try:
                        state = {"closing": False}
      
                        async def _stream_input(
                            frames: list[rtc.AudioFrame], stream: RecognizeStream, state: dict = state
                        ):
                            for frame in frames:
                                stream.push_frame(frame)
                                await asyncio.sleep(frame.duration)
      
                            silence = rtc.AudioFrame.create(
                                sample_rate=sample_rate,
    
  • tests.test_stt::test_stream[livekit.plugins.nvidia]
    self = <livekit.plugins.nvidia.stt.SpeechStream object at 0x7d64751ac050>
    config = config {
      encoding: LINEAR_PCM
      sample_rate_hertz: 16000
      language_code: "en-US"
      max_alternatives: 1
      audio_chan...automatic_punctuation: true
      model: "parakeet-1.1b-en-US-asr-streaming-silero-vad-sortformer"
    }
    interim_results: true
    
    
        def _recognition_worker(self, config: riva.client.StreamingRecognitionConfig) -> None:
            error = None
            try:
                audio_generator = self._audio_chunk_generator()
      
                response_generator = self._asr_service.streaming_response_generator(
                    audio_generator, config
                )
      
    >           for response in response_generator:
                                ^^^^^^^^^^^^^^^^^^
    
    livekit-plugins/livekit-plugins-nvidia/livekit/plugins/nvidia/stt.py:236: 
    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
    
    self = <riva.client.asr.ASRService object at 0x7d64751ac410>
    audio_chunks = <generator object SpeechStream._audio_chunk_generator at 0x7d6475610ad0>
    streaming_config = config {
      encoding: LINEAR_PCM
      sample_rate_hertz: 16000
      language_code: "en-US"
      max_alternatives: 1
      audio_chan...automatic_punctuation: true
      model: "parakeet-1.1b-en-US-asr-streaming-silero-vad-sortformer"
    }
    interim_results: true
    
    
        def streaming_response_generator(
            self, audio_chunks: Iterable[bytes], streaming_config: rasr.StreamingRecognitionConfig
        ) -> Generator[rasr.StreamingRecognizeResponse, None, None]:
            """
            Generates speech recognition responses for fragments of speech audio in :param:`audio_chunks`.
            The purpose of the method is to perform speech recognition "online" - as soon as
            audio is acquired on small chunks of audio.
      
            All available audio chunks will be sent to a server on first ``next()`` call.
      
            Args:
                audio_chunks (:obj:`Iterable[bytes]`): an iterable object which contains raw audio fragments
    
  • tests.test_stt::test_stream[livekit.plugins.soniox]
    stt_factory = <function parameter_factory.<locals>.<lambda> at 0x7d6476707950>
    request = <FixtureRequest for <Coroutine test_stream[livekit.plugins.soniox]>>
    
        @pytest.mark.usefixtures("job_process")
        @pytest.mark.parametrize("stt_factory", STTs + STREAM_ONLY_STTs)
        async def test_stream(stt_factory: Callable[[], STT], request):
            sample_rate = SAMPLE_RATE
            plugin_id = request.node.callspec.id.split("-")[0]
            frames, transcript, _ = await make_test_speech(
                chunk_duration_ms=STREAM_CHUNK_DURATION_MS, sample_rate=sample_rate
            )
      
            # TODO: differentiate missing key vs other errors
            try:
                stt_instance: STT = stt_factory()
            except ValueError as e:
                pytest.skip(f"{plugin_id}: {e}")
      
            async with stt_instance as stt:
                label = f"{stt.model}@{stt.provider}"
                if not stt.capabilities.streaming:
                    pytest.skip(f"{label} does not support streaming")
      
                for attempt in range(MAX_RETRIES):
                    try:
                        state = {"closing": False}
      
                        async def _stream_input(
                            frames: list[rtc.AudioFrame], stream: RecognizeStream, state: dict = state
                        ):
                            for frame in frames:
                                stream.push_frame(frame)
                                await asyncio.sleep(frame.duration)
      
                            silence = rtc.AudioFrame.create(
                                sample_rate=sample_rate,
                                num_channels=1,
                                samples_per_channel=sample_rate * STREAM_CHUNK_DURATION_MS // 1000,
                            )
                            for _ in range(TRAILING_SILENCE_DURATION_MS // STREAM_CHUNK_DURATION_MS):
                                stream.push_frame(silence)
                                await asyncio.sleep(silence.duration)
      
                            stream.end_input()
    
  • tests.test_stt::test_stream[livekit.plugins.aws]
    stt_factory = <function parameter_factory.<locals>.<lambda> at 0x71d6873433d0>
    request = <FixtureRequest for <Coroutine test_stream[livekit.plugins.aws]>>
    
        @pytest.mark.usefixtures("job_process")
        @pytest.mark.parametrize("stt_factory", STTs + STREAM_ONLY_STTs)
        async def test_stream(stt_factory: Callable[[], STT], request):
            sample_rate = SAMPLE_RATE
            plugin_id = request.node.callspec.id.split("-")[0]
            frames, transcript, _ = await make_test_speech(
                chunk_duration_ms=STREAM_CHUNK_DURATION_MS, sample_rate=sample_rate
            )
      
            # TODO: differentiate missing key vs other errors
            try:
                stt_instance: STT = stt_factory()
            except ValueError as e:
                pytest.skip(f"{plugin_id}: {e}")
      
            async with stt_instance as stt:
                label = f"{stt.model}@{stt.provider}"
                if not stt.capabilities.streaming:
                    pytest.skip(f"{label} does not support streaming")
      
                for attempt in range(MAX_RETRIES):
                    try:
                        state = {"closing": False}
      
                        async def _stream_input(
                            frames: list[rtc.AudioFrame], stream: RecognizeStream, state: dict = state
                        ):
                            for frame in frames:
                                stream.push_frame(frame)
                                await asyncio.sleep(frame.duration)
      
                            silence = rtc.AudioFrame.create(
                                sample_rate=sample_rate,
                                num_channels=1,
                                samples_per_channel=sample_rate * STREAM_CHUNK_DURATION_MS // 1000,
                            )
                            for _ in range(TRAILING_SILENCE_DURATION_MS // STREAM_CHUNK_DURATION_MS):
                                stream.push_frame(silence)
                                await asyncio.sleep(silence.duration)
      
                            stream.end_input()
    
  • tests.test_stt::test_stream[livekit.plugins.sarvam]
    self = <livekit.plugins.sarvam.stt.SpeechStream object at 0x79f03382b890>
    
        async def __anext__(self) -> SpeechEvent:
            try:
    >           val = await self._event_aiter.__anext__()
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    E           StopAsyncIteration
    
    livekit-agents/livekit/agents/stt/stt.py:620: StopAsyncIteration
    
    During handling of the above exception, another exception occurred:
    
    stt_factory = <function parameter_factory.<locals>.<lambda> at 0x79f02528c300>
    request = <FixtureRequest for <Coroutine test_stream[livekit.plugins.sarvam]>>
    
        @pytest.mark.usefixtures("job_process")
        @pytest.mark.parametrize("stt_factory", STTs + STREAM_ONLY_STTs)
        async def test_stream(stt_factory: Callable[[], STT], request):
            sample_rate = SAMPLE_RATE
            plugin_id = request.node.callspec.id.split("-")[0]
            frames, transcript, _ = await make_test_speech(
                chunk_duration_ms=STREAM_CHUNK_DURATION_MS, sample_rate=sample_rate
            )
      
            # TODO: differentiate missing key vs other errors
            try:
                stt_instance: STT = stt_factory()
            except ValueError as e:
                pytest.skip(f"{plugin_id}: {e}")
      
            async with stt_instance as stt:
                label = f"{stt.model}@{stt.provider}"
                if not stt.capabilities.streaming:
                    pytest.skip(f"{label} does not support streaming")
      
                for attempt in range(MAX_RETRIES):
                    try:
                        state = {"closing": False}
      
                        async def _stream_input(
                            frames: list[rtc.AudioFrame], stream: RecognizeStream, state: dict = state
                        ):
                            for frame in frames:
                                stream.push_frame(frame)
                                await asyncio.sleep(frame.duration)
      
                            silence = rtc.AudioFrame.create(
                                sample_rate=sample_rate,
                                num_cha
    
  • tests.test_stt::test_stream[livekit.plugins.openai.realtime]
    stt_factory = <function <lambda> at 0x71d6873438a0>
    request = <FixtureRequest for <Coroutine test_stream[livekit.plugins.openai.realtime]>>
    
        @pytest.mark.usefixtures("job_process")
        @pytest.mark.parametrize("stt_factory", STTs + STREAM_ONLY_STTs)
        async def test_stream(stt_factory: Callable[[], STT], request):
            sample_rate = SAMPLE_RATE
            plugin_id = request.node.callspec.id.split("-")[0]
            frames, transcript, _ = await make_test_speech(
                chunk_duration_ms=STREAM_CHUNK_DURATION_MS, sample_rate=sample_rate
            )
      
            # TODO: differentiate missing key vs other errors
            try:
                stt_instance: STT = stt_factory()
            except ValueError as e:
                pytest.skip(f"{plugin_id}: {e}")
      
            async with stt_instance as stt:
                label = f"{stt.model}@{stt.provider}"
                if not stt.capabilities.streaming:
                    pytest.skip(f"{label} does not support streaming")
      
                for attempt in range(MAX_RETRIES):
                    try:
                        state = {"closing": False}
      
                        async def _stream_input(
                            frames: list[rtc.AudioFrame], stream: RecognizeStream, state: dict = state
                        ):
                            for frame in frames:
                                stream.push_frame(frame)
                                await asyncio.sleep(frame.duration)
      
                            silence = rtc.AudioFrame.create(
                                sample_rate=sample_rate,
                                num_channels=1,
                                samples_per_channel=sample_rate * STREAM_CHUNK_DURATION_MS // 1000,
                            )
                            for _ in range(TRAILING_SILENCE_DURATION_MS // STREAM_CHUNK_DURATION_MS):
                                stream.push_frame(silence)
                                await asyncio.sleep(silence.duration)
      
                            stream.end_input()
                            state
    
  • tests.test_stt::test_stream[livekit.plugins.gradium.STT]
    stt_factory = <function <lambda> at 0x7d6476738040>
    request = <FixtureRequest for <Coroutine test_stream[livekit.plugins.gradium.STT]>>
    
        @pytest.mark.usefixtures("job_process")
        @pytest.mark.parametrize("stt_factory", STTs + STREAM_ONLY_STTs)
        async def test_stream(stt_factory: Callable[[], STT], request):
            sample_rate = SAMPLE_RATE
            plugin_id = request.node.callspec.id.split("-")[0]
            frames, transcript, _ = await make_test_speech(
                chunk_duration_ms=STREAM_CHUNK_DURATION_MS, sample_rate=sample_rate
            )
      
            # TODO: differentiate missing key vs other errors
            try:
                stt_instance: STT = stt_factory()
            except ValueError as e:
                pytest.skip(f"{plugin_id}: {e}")
      
            async with stt_instance as stt:
                label = f"{stt.model}@{stt.provider}"
                if not stt.capabilities.streaming:
                    pytest.skip(f"{label} does not support streaming")
      
                for attempt in range(MAX_RETRIES):
                    try:
                        state = {"closing": False}
      
                        async def _stream_input(
                            frames: list[rtc.AudioFrame], stream: RecognizeStream, state: dict = state
                        ):
                            for frame in frames:
                                stream.push_frame(frame)
                                await asyncio.sleep(frame.duration)
      
                            silence = rtc.AudioFrame.create(
                                sample_rate=sample_rate,
                                num_channels=1,
                                samples_per_channel=sample_rate * STREAM_CHUNK_DURATION_MS // 1000,
                            )
                            for _ in range(TRAILING_SILENCE_DURATION_MS // STREAM_CHUNK_DURATION_MS):
                                stream.push_frame(silence)
                                await asyncio.sleep(silence.duration)
      
                            stream.end_input()
                            state["cl
    
Skipped Tests
Test Reason
tests.test_stt::test_recognize[livekit.plugins.assemblyai] universal-3-6-pro@AssemblyAI does not support batch recognition
tests.test_stt::test_recognize[livekit.plugins.speechmatics] linden-1@Speechmatics does not support batch recognition
tests.test_stt::test_recognize[livekit.plugins.fireworksai] unknown@FireworksAI does not support batch recognition
tests.test_stt::test_recognize[livekit.plugins.cartesia] ink-2@Cartesia does not support batch recognition
tests.test_stt::test_recognize[livekit.plugins.nvidia] unknown@unknown does not support batch recognition
tests.test_stt::test_recognize[livekit.plugins.soniox] stt-rt-v5@Soniox does not support batch recognition
tests.test_stt::test_recognize[livekit.plugins.cartesia._legacy] ink-whisper@Cartesia does not support batch recognition
tests.test_stt::test_recognize[livekit.plugins.deepgram.STTv2] flux-general-en@Deepgram does not support batch recognition
tests.test_stt::test_recognize[livekit.plugins.gradium.STT] default@Gradium does not support batch recognition
tests.test_stt::test_recognize[livekit.plugins.azure] unknown@Azure STT does not support batch recognition
tests.test_stt::test_recognize[livekit.plugins.aws] unknown@Amazon Transcribe does not support batch recognition
tests.test_stt::test_recognize[livekit.plugins.reson8] livekit.plugins.reson8: Reson8 API key is required, either as argument or RESON8_API_KEY env var
tests.test_stt::test_stream[livekit.plugins.elevenlabs] scribe_v1@ElevenLabs does not support streaming
tests.test_stt::test_recognize[livekit.agents.inference] unknown@livekit does not support batch recognition
tests.test_stt::test_stream[livekit.plugins.mistralai] voxtral-mini-latest@MistralAI does not support streaming
tests.test_stt::test_stream[livekit.plugins.openai] gpt-4o-mini-transcribe@api.openai.com does not support streaming
tests.test_stt::test_stream[livekit.plugins.fal] Wizper@Fal does not support streaming
tests.test_stt::test_stream[livekit.plugins.reson8] livekit.plugins.reson8: Reson8 API key is required, either as argument or RESON8_API_KEY env var

Triggered by workflow run #5338

@chenghao-mou

Copy link
Copy Markdown
Member

/test-stt

@renovate
renovate Bot force-pushed the renovate/github-actions branch 3 times, most recently from f6c98f5 to 67b4d33 Compare April 27, 2026 05:30
@renovate
renovate Bot force-pushed the renovate/github-actions branch 2 times, most recently from 7f8f90b to 1d5b7c8 Compare April 30, 2026 20:19
@renovate renovate Bot changed the title chore(deps): update dependency python to 3.14 chore(deps): update github actions Apr 30, 2026
@renovate
renovate Bot force-pushed the renovate/github-actions branch 3 times, most recently from 19f9247 to f7b4342 Compare May 18, 2026 04:07
@renovate renovate Bot changed the title chore(deps): update github actions chore(deps): pin dependencies May 18, 2026
devin-ai-integration[bot]

This comment was marked as resolved.

@renovate
renovate Bot force-pushed the renovate/github-actions branch from f7b4342 to a2aeb1f Compare May 18, 2026 05:13
@renovate renovate Bot changed the title chore(deps): pin dependencies chore(deps): update github actions May 18, 2026
@renovate
renovate Bot force-pushed the renovate/github-actions branch 3 times, most recently from e8933dd to a3d01c5 Compare May 28, 2026 21:27
@renovate
renovate Bot force-pushed the renovate/github-actions branch 2 times, most recently from 4c3c018 to fc2110b Compare June 4, 2026 00:52
@renovate
renovate Bot force-pushed the renovate/github-actions branch from fc2110b to 44d8b9c Compare June 11, 2026 11:07
devin-ai-integration[bot]

This comment was marked as resolved.

@renovate
renovate Bot force-pushed the renovate/github-actions branch 3 times, most recently from 2edae27 to c7c6d60 Compare June 24, 2026 06:02
@renovate
renovate Bot force-pushed the renovate/github-actions branch from c7c6d60 to f584e20 Compare June 24, 2026 15:43

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

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.

Devin Review found 1 new potential issue.

Open in Devin Review

Comment thread .github/workflows/tests.yml Outdated
- uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6
with:
python-version: "3.12"
python-version: "3.14"

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.

🚩 Unit and integration tests no longer run on any Python version below 3.14

Prior to this PR, unit-tests, blockguard-tests, evaluation, evals, test-realtime, test-stt, and download-stats all ran on Python 3.12 (or 3.10/3.11 for some build jobs). After this PR, they all run exclusively on 3.14. The only CI job that still exercises an older Python is the type-check matrix in ci.yml, which covers 3.10 and 3.13. This means runtime regressions specific to Python 3.10–3.13 (e.g. behavioral differences in asyncio, typing, stdlib changes) would no longer be caught by tests — only type-checking. This is a deliberate tradeoff but worth noting since AGENTS.md:125 states "Python 3.10+ compatibility required".

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

@renovate
renovate Bot force-pushed the renovate/github-actions branch from f584e20 to ca3d212 Compare July 6, 2026 10:52
@renovate
renovate Bot force-pushed the renovate/github-actions branch 4 times, most recently from a946ae7 to b42d944 Compare August 14, 2026 12:59

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

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.

Devin Review found 1 new potential issue.

View 6 additional findings in Devin Review.

Open in Devin Review

Comment thread .github/workflows/publish-docs.yml Outdated
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
with:
python-version: "3.12"
python-version: "3.14"

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.

🟡 Published API documentation will silently lose the BitHuman avatar plugin pages

The documentation build is switched to run on Python 3.14 (python-version: "3.14" at .github/workflows/publish-docs.yml:22), a version on which the BitHuman integration cannot be loaded, so its reference pages vanish from the published docs site.
Impact: Users browsing the Python API reference will no longer find any BitHuman avatar documentation after the next docs publish.

Mechanism: dependency marker excludes 3.14, import fails, pdoc --skip-errors drops the module, S3 sync --delete removes the old pages
  • livekit-plugins/livekit-plugins-bithuman/pyproject.toml:35 declares bithuman>=0.5.25,<3; python_version >= '3.11' and python_version < '3.14', so uv sync --all-extras --group docs on 3.14 installs the plugin package without its bithuman dependency.
  • livekit-plugins/livekit-plugins-bithuman/livekit/plugins/bithuman/__init__.py:22-27 imports .avatar and re-raises ImportError when the dependency is missing.
  • The docs step runs pdoc --skip-errors --html ... livekit (.github/workflows/publish-docs.yml:36), which silently skips modules that fail to import, so livekit.plugins.bithuman produces no HTML/markdown.
  • The upload step uses aws s3 sync --delete (.github/workflows/publish-docs.yml:44-45), so the previously published bithuman pages get deleted from the docs bucket.
  • Previously this job ran on Python 3.12, where the marker held and the module imported fine.
Suggested change
python-version: "3.14"
python-version: "3.13"
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

@renovate
renovate Bot force-pushed the renovate/github-actions branch 2 times, most recently from d181315 to 733cb0e Compare August 26, 2026 11:54
@renovate
renovate Bot force-pushed the renovate/github-actions branch 3 times, most recently from 9a60601 to ccf581f Compare September 7, 2026 17:08
@renovate
renovate Bot force-pushed the renovate/github-actions branch 5 times, most recently from 2de2a6d to 9c1b656 Compare September 16, 2026 19:04
@renovate
renovate Bot force-pushed the renovate/github-actions branch 2 times, most recently from 44e6129 to 70ffec8 Compare October 1, 2026 06:50
@renovate
renovate Bot force-pushed the renovate/github-actions branch 2 times, most recently from 5ab5da8 to 20787ca Compare October 5, 2026 15:09
@renovate
renovate Bot force-pushed the renovate/github-actions branch 5 times, most recently from 293f20d to 2e81e94 Compare October 20, 2026 08:18
@renovate
renovate Bot force-pushed the renovate/github-actions branch 5 times, most recently from 5e01c92 to f7bbf98 Compare October 24, 2026 21:28
Generated by renovateBot

This branch has not been deployed

No deployments
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.

1 participant