Conversation
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughCelune 4.2.0 adds voice-conversion runtime support, typed extension events, Persona emotion prompting, Hugging Face cache configuration, and updated UI/API logging and command flows. ChangesUnified runtime expansion
Possibly related PRs
Estimated code review effort🎯 5 (Critical) | ⏱️ ~120 minutes Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 14
🧹 Nitpick comments (3)
tests/test_backends_and_extensions.py (1)
972-977: 🧹 Nitpick | 🔵 Trivial | ⚡ Quick winAssert override delegation arguments explicitly.
This test currently enters
with_backend("mini")/with_cevoice("nova")but does not verify the override hooks received those exact values (Line 999-Line 1002). Add call assertions so future regressions in delegation are caught.Suggested test tightening
def setUp(self) -> None: + self.backend_override = mock.Mock( + side_effect=lambda backend_name: contextlib.nullcontext( + cast(Celune, SimpleNamespace()) + ) + ) + self.cevoice_override = mock.Mock( + side_effect=lambda bundle: contextlib.nullcontext( + cast(Celune, SimpleNamespace()) + ) + ) self.logs: list[tuple[str, str]] = [] self.dev_logs: list[tuple[str, str]] = [] @@ - backend_override=lambda backend_name: contextlib.nullcontext( - cast(Celune, SimpleNamespace()) - ), - cevoice_override=lambda bundle: contextlib.nullcontext( - cast(Celune, SimpleNamespace()) - ), + backend_override=self.backend_override, + cevoice_override=self.cevoice_override, ) @@ with extension.with_backend("mini"): pass with extension.with_cevoice("nova"): pass + self.backend_override.assert_called_once_with("mini") + self.cevoice_override.assert_called_once_with("nova")Also applies to: 999-1002
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@tests/test_backends_and_extensions.py` around lines 972 - 977, The test is not verifying that the override hooks receive the correct delegation arguments. Replace the lambda functions for backend_override and cevoice_override with call assertion objects (such as unittest.mock.Mock or similar) that will capture the arguments passed to them, then add assertions after the with_backend("mini") and with_cevoice("nova") calls to verify these mocks were called with the expected argument values to catch future regressions in delegation.extensions/test.py (1)
7-9: 🧹 Nitpick | 🔵 Trivial | ⚡ Quick winAdd concrete event payload types to subscribed handlers.
Typing the
eventparameters here keeps the example aligned with the typed event contract the extension API is introducing.Proposed patch
import celune from celune import CeluneExtension +from celune.dataclasses.events import ReadyEvent, VoiceChangedEvent from celune.utils import discard @@ - def on_ready(self, event) -> None: + def on_ready(self, event: ReadyEvent) -> None: @@ - def on_voice_changed(self, event) -> None: + def on_voice_changed(self, event: VoiceChangedEvent) -> None:As per coding guidelines, avoid broad types and prefer concrete, meaningful types in Python signatures.
Also applies to: 18-18, 52-52
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@extensions/test.py` around lines 7 - 9, Replace the broad or untyped event parameters in the subscribed event handlers with concrete event payload types. Locate the handler functions at the indicated line numbers (likely decorated with event subscription patterns) and replace any generic event parameter types (such as Any or untyped event) with the specific, concrete event payload types that match the typed event contract expected by the extension API. Ensure you import any necessary concrete event types from the celune module if they are not already imported.Source: Coding guidelines
tests/test_pipeline.py (1)
1434-1447: 🧹 Nitpick | 🔵 Trivial | ⚡ Quick winAssert the default identity is absent here.
This test can still pass if a custom pack named
Celuneinherits the default Celune identity fields, because it only checks the name label. Add negative assertions like the non-default pack test above.Proposed test tightening
self.assertIn("Celune:", prompt) self.assertIn("You are Celune", prompt) + self.assertNotIn("Gender: female", prompt) + self.assertNotIn("The speaker uses a more confident", prompt)🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@tests/test_pipeline.py` around lines 1434 - 1447, The test test_named_celune_custom_pack_does_not_use_default_identity currently only verifies positive assertions that the name labels are present, but does not verify that default identity fields are actually absent from the custom pack. Add negative assertions using assertNotIn to check that the default Celune identity fields that should not be inherited are not present in the prompt variable, similar to the pattern used in the non-default pack test mentioned in the review.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@celune/api.py`:
- Around line 1909-1910: The `/v1/convert` route contains a blocking synchronous
call to celune.convert_audio() inside an async function which stalls the event
loop and delays other requests. Similarly, the `/v1/sfx` route at line 1849
calls the blocking celune.play_audio() method with the same issue. Move both of
these blocking operations off the event loop by wrapping them in an executor
call (such as loop.run_in_executor() or asyncio.to_thread()) so they run in a
thread pool instead of blocking the async event loop.
In `@celune/celune.py`:
- Around line 498-503: The _cleanup_residual_temp_data method calls
temp_dir.iterdir() without verifying that the directory exists first, causing a
FileNotFoundError on fresh installations. Add a guard clause at the beginning of
the method to check if temp_dir.exists() before attempting to iterate over its
contents, and return early if the directory does not exist.
- Around line 1788-1800: After loading the new model with
self.backend.load_model(new_model_name), the self.model_name attribute is not
updated to reflect the newly loaded model, causing it to remain stale. Add a
line after the model loading statement to update self.model_name to the
new_model_name value so that subsequent voice switches correctly identify the
current model and saved metadata reflects the correct model name.
In `@celune/entrypoint.py`:
- Around line 971-973: The ANSI title initialization block with the if
runtime.supports_ansi() check and subsequent sys.stdout.write/flush calls is
currently positioned outside the startup try block, which means any failures in
writing to stdout will bypass error handling and crash the startup sequence.
Move this entire block inside the startup try block (or alternatively guard it
with contextlib.suppress) to ensure that output stream failures are properly
caught and handled by the existing startup error handling mechanism.
In `@celune/extensions/manager.py`:
- Around line 388-392: The handler assignment to
self._event_registrations[owner_key] at line 388 does not clean up previously
registered handlers for the same owner_key before replacing them, causing old
callbacks to remain active and fire multiple times when autoload() or handler
registration runs again. Before assigning the new handlers list to
self._event_registrations[owner_key], check if handlers already exist for that
owner_key and properly unsubscribe or clean them up to prevent callback leaks
and duplicates.
- Around line 113-117: The unregister_all() method only unregisters extensions
but does not clean up module-level subscriptions that are registered under
module:* owner keys, leaving stale handlers active. After unregistering all
extensions in the loop, also clear or unregister any module-level handlers to
ensure complete cleanup of all auto-registered handlers and fully honor the
"unregister all" contract.
In `@celune/paths.py`:
- Around line 133-137: The portable-cache configuration is incomplete. In
addition to setting _HF_HOME_ENV and _HF_HUB_CACHE_ENV in the compiled/forced
branch shown in the diff, you need to also set TRANSFORMERS_CACHE to
default_transformers_cache. Add a similar conditional check after the
_HF_HUB_CACHE_ENV block that checks if TRANSFORMERS_CACHE is not in os.environ
and sets it to the default_transformers_cache variable that was computed
earlier, ensuring all three cache paths are properly configured.
In `@celune/persona/impl.py`:
- Line 250: The current check in the return statement at line 250 only validates
that voice_bundle_is_default is true, but this applies Celune defaults
(age/gender) to any character with a default voice bundle, not just Celune
itself. Add character gating to the condition by checking both that
voice_bundle_is_default is true AND that the engine's character/identity is
specifically Celune (likely by checking an additional engine attribute that
identifies the character as Celune) to ensure Celune defaults are only applied
when the character is actually Celune.
In `@celune/pipeline.py`:
- Around line 1471-1476: The exception handling in the loader.materialize() call
silently catches all exceptions and sets target_references to an empty tuple
without any logging or error reporting. Instead of silently dropping the
failure, add logging to record when loader.materialize() fails, including the
actual error details. Additionally, consider whether the voice conversion
feature requires these references to function properly with the current backend,
and if so, return None from the function to prevent silent behavioral changes
rather than continuing with empty target_references.
In `@celune/ui/app.py`:
- Around line 364-365: The refresh method in the _RefreshableWidget Protocol has
a return type annotation of object, which is too broad. Examine where the
refresh method is implemented or used throughout the codebase to determine what
specific type it should actually return, then replace the object return type
annotation with the more specific and narrower type that reflects the actual
usage. This will strengthen the type guarantees for this Protocol definition.
In `@celune/utils.py`:
- Line 843: The current implementation in the return statement that translates
special characters and removes double spaces using a single replace call is
incomplete because it only handles pairs of spaces. When the translated text
contains 3 or more consecutive spaces, the single replace pass will leave double
spaces behind. Fix this by using a regex-based approach with the re module to
replace one or more consecutive spaces with a single space in one pass, or
alternatively use a loop to repeatedly call replace until no double spaces
remain in the text.
In `@launcher.c`:
- Line 687: The printfe call at line 687 contains unescaped percent signs in the
format string "%PATH%" which are interpreted as format specifiers, causing
undefined behavior. To fix this, escape each percent sign by doubling it,
changing "%PATH%" to "%%PATH%%" in the format string argument to printfe. This
ensures the percent signs are printed literally rather than being parsed as
format specifiers.
In `@tests/test_celune_core.py`:
- Around line 911-923: The test needs to capture the value of
celune._reload_pending at the time each signal is recorded to properly verify
the ordering contract. Modify the record_signal function to append
celune._reload_pending to the tuple along with signal_type, celune.cur_state,
and celune.loaded, update the signal_states list type annotation from tuple[str,
str, bool] to tuple[str, str, bool, bool] to reflect the 4-element tuples, and
update the assertion that checks signal_states to include the expected
_reload_pending value for each recorded signal state.
In `@tests/test_runtime_paths.py`:
- Around line 181-201: The assertion checking
os.environ["HF_HUB_DISABLE_PROGRESS_BARS"] in the
test_huggingface_runtime_disables_global_progress_and_logs method is located
after the with block exits, meaning it validates the restored environment rather
than the patched one. Move this assertion inside the with block, after the
configure_huggingface_runtime() call, so it checks the environment while the
mock.patch.dict context is still active.
---
Nitpick comments:
In `@extensions/test.py`:
- Around line 7-9: Replace the broad or untyped event parameters in the
subscribed event handlers with concrete event payload types. Locate the handler
functions at the indicated line numbers (likely decorated with event
subscription patterns) and replace any generic event parameter types (such as
Any or untyped event) with the specific, concrete event payload types that match
the typed event contract expected by the extension API. Ensure you import any
necessary concrete event types from the celune module if they are not already
imported.
In `@tests/test_backends_and_extensions.py`:
- Around line 972-977: The test is not verifying that the override hooks receive
the correct delegation arguments. Replace the lambda functions for
backend_override and cevoice_override with call assertion objects (such as
unittest.mock.Mock or similar) that will capture the arguments passed to them,
then add assertions after the with_backend("mini") and with_cevoice("nova")
calls to verify these mocks were called with the expected argument values to
catch future regressions in delegation.
In `@tests/test_pipeline.py`:
- Around line 1434-1447: The test
test_named_celune_custom_pack_does_not_use_default_identity currently only
verifies positive assertions that the name labels are present, but does not
verify that default identity fields are actually absent from the custom pack.
Add negative assertions using assertNotIn to check that the default Celune
identity fields that should not be inherited are not present in the prompt
variable, similar to the pattern used in the non-default pack test mentioned in
the review.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 6a4bf112-5886-4e11-8af4-6b43caa7bd84
📒 Files selected for processing (68)
AGENTS.mdREADME.mdcelune/__init__.pycelune/api.pycelune/backends/__init__.pycelune/backends/base.pycelune/backends/dotstts.pycelune/backends/mini.pycelune/backends/qwen3.pycelune/backends/voxcpm2.pycelune/celune.pycelune/cevoice.pycelune/chroma.pycelune/colors.pycelune/constants.pycelune/dataclasses/__init__.pycelune/dataclasses/celune.pycelune/dataclasses/events.pycelune/dataclasses/extensions.pycelune/dataclasses/persona.pycelune/dataclasses/pipeline.pycelune/dataclasses/properties.pycelune/entrypoint.pycelune/extensions/base.pycelune/extensions/events.pycelune/extensions/manager.pycelune/paths.pycelune/persona/emotion.pycelune/persona/impl.pycelune/persona/memory.pycelune/persona/prompts.pycelune/persona/runtime.pycelune/pipeline.pycelune/terminal.pycelune/typing/__init__.pycelune/typing/analysis.pycelune/typing/backends.pycelune/typing/celune.pycelune/typing/cevoice.pycelune/typing/common.pycelune/typing/events.pycelune/typing/persona.pycelune/typing/pipeline.pycelune/ui/app.pycelune/ui/commands.pycelune/ui/terminal.pycelune/updater.pycelune/utils.pycelune/vc_backends/__init__.pycelune/vc_backends/base.pycelune/vc_backends/passthrough.pycelune/vram.pyextensions/test.pylauncher.crequirements.txttests/support.pytests/test_api_audio.pytests/test_api_webui.pytests/test_backends_and_extensions.pytests/test_celune_core.pytests/test_cevoice.pytests/test_extension_events.pytests/test_package_api.pytests/test_persona_emotion.pytests/test_persona_memory.pytests/test_pipeline.pytests/test_runtime_and_ui_commands.pytests/test_runtime_paths.py
| class _RefreshableWidget(Protocol): | ||
| def refresh(self, *args, **kwargs) -> object: |
There was a problem hiding this comment.
Narrow the Protocol.refresh typing instead of returning object.
At Line 365, -> object is broader than needed and weakens local type guarantees.
Proposed fix
class _RefreshableWidget(Protocol):
- def refresh(self, *args, **kwargs) -> object:
+ def refresh(self, layout: bool = False) -> None:
"""Refresh one widget in place.As per coding guidelines, "Avoid using broad types like Any, object or T, unless the function explicitly requires a broad type."
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| class _RefreshableWidget(Protocol): | |
| def refresh(self, *args, **kwargs) -> object: | |
| class _RefreshableWidget(Protocol): | |
| def refresh(self, layout: bool = False) -> None: | |
| """Refresh one widget in place. |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@celune/ui/app.py` around lines 364 - 365, The refresh method in the
_RefreshableWidget Protocol has a return type annotation of object, which is too
broad. Examine where the refresh method is implemented or used throughout the
codebase to determine what specific type it should actually return, then replace
the object return type annotation with the more specific and narrower type that
reflects the actual usage. This will strengthen the type guarantees for this
Protocol definition.
Source: Coding guidelines
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@pyproject.toml`:
- Line 129: The pytest configuration in pyproject.toml is globally silencing all
DeprecationWarnings which masks both internal and external deprecation signals.
Remove or replace the filterwarnings setting that contains
"ignore::DeprecationWarning" with a more targeted approach that only suppresses
specific known third-party deprecations, allowing first-party deprecation
warnings to surface and help catch regressions during release validation.
In `@scripts/build_nuitka.ps1`:
- Around line 11-20: The process termination logic is brittle because
Stop-Process will fail with an error if the specified process does not exist,
since ErrorActionPreference defaults to Stop. Modify both Stop-Process calls
(for celune and celune-bin process names) to include the ErrorAction
SilentlyContinue parameter, so that the script continues gracefully even if
either process is not running. Additionally, consider checking for both celune
and celune-bin processes in the initial condition to ensure both are terminated
if either exists.
In `@scripts/build_nuitka.sh`:
- Around line 14-18: The pkill commands for celune and celune-bin will cause the
build script to fail under set -euo pipefail if the processes don't exist
(returning non-zero exit code), and the pattern-based matching with pgrep and
pkill is too broad and can match unintended process names. Guard both pkill
invocations with || true to prevent script failure when processes aren't
running, and use the -x flag with pkill to match exact process names only
instead of pattern matching, ensuring only the intended celune and celune-bin
processes are terminated.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 2254934e-f9a5-4228-906c-a99f0fffcbbd
⛔ Files ignored due to path filters (1)
uv.lockis excluded by!**/*.lock
📒 Files selected for processing (29)
celune/analysis.pycelune/api.pycelune/backends/dotstts.pycelune/backends/mini.pycelune/backends/qwen3.pycelune/backends/voxcpm2.pycelune/celune.pycelune/constants.pycelune/dataclasses/pipeline.pycelune/entrypoint.pycelune/extensions/manager.pycelune/paths.pycelune/persona/impl.pycelune/persona/runtime.pycelune/pipeline.pycelune/ui/app.pycelune/ui/terminal.pycelune/utils.pyextensions/test.pylauncher.cpyproject.tomlscripts/build_nuitka.ps1scripts/build_nuitka.shtests/test_backends_and_extensions.pytests/test_celune_core.pytests/test_persona_api.pytests/test_pipeline.pytests/test_runtime_and_ui_commands.pytests/test_runtime_paths.py
✅ Files skipped from review due to trivial changes (1)
- launcher.c
🚧 Files skipped from review as they are similar to previous changes (12)
- celune/entrypoint.py
- extensions/test.py
- celune/utils.py
- tests/test_runtime_paths.py
- celune/api.py
- tests/test_celune_core.py
- tests/test_backends_and_extensions.py
- tests/test_runtime_and_ui_commands.py
- celune/extensions/manager.py
- celune/pipeline.py
- celune/celune.py
- tests/test_pipeline.py
|
Detected potential slop in commit The following jobs have failed:
Please check the logs and unslop your code: https://github.com/celunah/celune/actions/runs/28101889312 |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@scripts/build_nuitka.ps1`:
- Line 16: The conditional in build_nuitka.ps1 has a stray leading plus sign
before the if statement, which makes the PowerShell script invalid. Remove the
extra plus in the existingProcesses check and keep the condition as a normal if
block so the script can execute correctly.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 552ce4a9-3e9f-49c9-80d1-24e5b0c1b781
📒 Files selected for processing (3)
pyproject.tomlscripts/build_nuitka.ps1scripts/build_nuitka.sh
🚧 Files skipped from review as they are similar to previous changes (1)
- scripts/build_nuitka.sh
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (1)
celune/entrypoint.py (1)
974-976: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueStartup window-title text is still hardcoded English.
Every other user-facing string in this path was localized, but the OSC title
"{APP_NAME} is starting up..."remains an inline literal. Consider routing it throughstring(...)for consistency with the rest of the i18n migration.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@celune/entrypoint.py` around lines 974 - 976, The startup window title in the runtime.supports_ansi() block is still an inline English literal, so route the `"{APP_NAME} is starting up..."` text through `string(...)` to match the rest of the i18n migration. Update the logic around the `sys.stdout.write` call in `entrypoint.py` so the OSC title uses the localized string helper while preserving `APP_NAME` interpolation and the existing ANSI behavior.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@celune/entrypoint.py`:
- Line 1182: The exception display fallback is unreachable because the current
print in entrypoint.py always treats exc as truthy. Update the handling around
the print(exc or string("cli.no_error_description")) call to use the exception’s
string form instead, so an empty exception message can fall back to the
localized no-error description. Keep the change localized to the
exception-printing path in the entrypoint logic.
- Around line 1259-1265: The start/run command path in entrypoint.py reads
args[1] without checking whether it exists, which causes an IndexError when the
command is invoked with no extra arguments. Update the args[0] in {"start",
"run"} branch to guard the args[1] access with a length check before comparing
against "--verbose" and "-v", following the same safe pattern used by the
verbose handling logic, so the existing invalid-argument flow can run when no
trailing flag is present.
---
Nitpick comments:
In `@celune/entrypoint.py`:
- Around line 974-976: The startup window title in the runtime.supports_ansi()
block is still an inline English literal, so route the `"{APP_NAME} is starting
up..."` text through `string(...)` to match the rest of the i18n migration.
Update the logic around the `sys.stdout.write` call in `entrypoint.py` so the
OSC title uses the localized string helper while preserving `APP_NAME`
interpolation and the existing ANSI behavior.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: f9bbf4b7-b2d3-4f5d-a124-92af064e3cf6
📒 Files selected for processing (12)
celune/api.pycelune/celune.pycelune/entrypoint.pycelune/extensions/manager.pycelune/i18n.pycelune/pipeline.pycelune/ui/app.pycelune/ui/commands.pycelune/ui/headless.pyscripts/build_nuitka.ps1tests/test_namedays_i18n_updater.pytests/test_pipeline.py
🚧 Files skipped from review as they are similar to previous changes (8)
- scripts/build_nuitka.ps1
- celune/extensions/manager.py
- celune/ui/commands.py
- celune/api.py
- tests/test_pipeline.py
- celune/pipeline.py
- celune/ui/app.py
- celune/celune.py
|
@coderabbitai review |
✅ Action performedReview finished.
|
|
Detected potential slop in commit The following jobs have failed:
Please check the logs and unslop your code: https://github.com/celunah/celune/actions/runs/28249201157 |
because all Celune backends being grouped into their own optional package groups, we have to explicitly tell CI to install the whole thing
There was a problem hiding this comment.
Actionable comments posted: 4
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (3)
celune/backends/tts/dotstts.py (1)
95-100: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winLocalize the compatible-bundle failure message.
This backend availability error is likely surfaced to users when DotTTS cannot start, so the new English text should be moved into the localization database and read via
string(...). As per coding guidelines, “Do not use raw string literals for user-facing text.”Also applies to: 115-120
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@celune/backends/tts/dotstts.py` around lines 95 - 100, The DotTTS backend availability error in the loader check uses a raw English user-facing message instead of the localization system. Move the compatible-bundle failure text used in the `custom_assert` path inside the DotTTS initialization logic into the localization database and retrieve it with `string(...)` so the message is no longer hardcoded. Update the corresponding user-facing failure in `dotstts` (including the related assertion block mentioned in the review) to use the localized string instead of a literal.Source: Coding guidelines
celune/backends/tts/voxcpm2.py (1)
87-92: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winLocalize the compatible-bundle failure message.
This VoxCPM2 startup failure can be user-visible, so keep it in Celune’s localization database rather than hardcoding English in the backend. As per coding guidelines, “Make sure new user-facing strings ... are added to Celune's localization string database instead of being hardcoded in English.”
Also applies to: 107-112
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@celune/backends/tts/voxcpm2.py` around lines 87 - 92, The VoxCPM2 startup failure message is user-facing and should not be hardcoded in English. Update the error handling in the VoxCPM2 backend around the loader assertion and the matching path at the later startup check to pull the message from Celune’s localization string database instead of embedding the literal text. Use the existing VoxCPM2 backend symbols and the same localized message key consistently wherever this compatible-bundle failure is raised.Source: Coding guidelines
tests/test_api_webui.py (1)
590-593: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick winKeep new WebUI assertions locale-driven.
These tests still lock English UI copy into expected output (
"voice conversion mode","TTS","VC","CTRL+R toggle recording"). Prefer asserting the correspondingstring(...)values, adding localization keys first if needed, so the tests enforce the i18n contract instead of bypassing it. As per coding guidelines, new user-facing strings must be added to the localization string database and called viastring(...); based on learnings, do not hardcode strings when the repository already defines them.Also applies to: 595-605, 635-640
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@tests/test_api_webui.py` around lines 590 - 593, The WebUI tests are hardcoding English UI text instead of validating the i18n contract. Update the affected assertions in the test suite to use the corresponding string(...) lookups rather than literals like voice conversion mode, TTS, VC, and CTRL+R toggle recording, and add any missing localization keys to the string database first if they do not already exist. Keep the checks anchored to the same test helpers and assertions so the intent stays the same while making the tests locale-driven.Sources: Coding guidelines, Learnings
🧹 Nitpick comments (6)
AGENTS.md (1)
115-115: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueHyphenate compound modifier: "user-facing strings"
"user facing" should be "user-facing" because it modifies "strings" as a compound adjective.
-Make sure to only modify user facing strings (both normal and dev mode strings), don't change anything internal. +Make sure to only modify user-facing strings (both normal and dev mode strings), don't change anything internal.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@AGENTS.md` at line 115, The issue is a wording fix in the user-facing guidance text: change “user facing strings” to “user-facing strings” while keeping all internal behavior and non-string content unchanged. Update only the affected string in AGENTS.md, and make sure both the normal and dev mode string guidance still say that only user-facing strings should be modified.celune/backends/vc/seedvc.py (1)
172-179: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winReplace the placeholder return documentation.
Result of this function.reads like generated placeholder text; please replace it with the actual sample-rate contract. Based on learnings, “After each task, runscripts/update_docstrings.pyand then replace placeholder docstrings with proper documentation while preserving format.”🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@celune/backends/vc/seedvc.py` around lines 172 - 179, The output_sample_rate property in SeedVC still has placeholder return documentation. Update its docstring so the Returns section clearly states the actual sample-rate contract for the backend’s default Seed-VC mode, matching the 44100/22050 behavior based on f0_condition. Preserve the existing docstring format while replacing the generic placeholder text.Source: Learnings
celune/celune.py (1)
727-733: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueReplace placeholder docstring.
is_voice_conversion_modestill carries the generated placeholder (Result of this function.); document what it returns.Based on learnings: "replace placeholder docstrings with proper documentation while preserving format."
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@celune/celune.py` around lines 727 - 733, The docstring on is_voice_conversion_mode still uses the generated placeholder text, so replace it with a real description of what the method returns. Keep the existing docstring structure in Celune.is_voice_conversion_mode, but document that it returns whether the instance is currently in voice conversion mode, and remove the placeholder “Result of this function.” wording.Source: Learnings
celune/dsp.py (1)
87-96: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueReplace the placeholder docstring with real documentation.
The
pitch_shift_audiodocstring still contains auto-generated placeholders (Value for \audio`.,Result of this function.`) instead of describing the arguments and return value.Based on learnings: "After each task, run
scripts/update_docstrings.pyand then replace placeholder docstrings with proper documentation while preserving format."🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@celune/dsp.py` around lines 87 - 96, The pitch_shift_audio docstring still uses auto-generated placeholder text, so replace it with real documentation that explains what audio, sample_rate, and n_steps represent and what the function returns. Update the docstring in pitch_shift_audio to preserve the existing format while removing the placeholder phrases like “Value for `audio`.” and “Result of this function.”, then run scripts/update_docstrings.py as required after making the change.Source: Learnings
celune/ui/resources.py (1)
157-158: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winLocalize the new footer hint.
"CTRL+R toggle recording"is a newly added user-facing string. As per coding guidelines, new user-facing strings should be added to Celune's localization database and rendered viastring("key_name")rather than hardcoded in English. The neighboring footer hints are currently hardcoded too, but since this PR is centered on i18n, the new string ideally follows the samestring(...)path.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@celune/ui/resources.py` around lines 157 - 158, The new footer hint in the resources footer logic is hardcoded English text, so it should be moved through Celune’s localization path. Update the branch in the footer-building code that checks input_mode for voice_conversion to use the existing string(...) helper with a new localization key instead of appending the literal text, and add that key to the localization database so the hint is rendered in the same i18n flow as other user-facing strings.Source: Coding guidelines
scripts/run_ci.py (1)
22-35: 🎯 Functional Correctness | 🔵 TrivialReplace the unordered set with a tuple to guarantee deterministic matching order.
The function
_agent_permission_markerdocuments that it returns the "first matching marker", but_AGENT_ERROR_MARKERSis defined as a set. In Python, sets are unordered, so the iteration order is arbitrary and non-deterministic. This violates the function's contract when multiple error markers exist in the output.Change the definition to a tuple or list to preserve the intended priority sequence.
Proposed fix
-_AGENT_ERROR_MARKERS = { +_AGENT_ERROR_MARKERS = ( "Access is denied", "Permission denied", "Operation not permitted", -} +)🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@scripts/run_ci.py` around lines 22 - 35, The permission-marker matching in _agent_permission_marker is using an unordered set, so “first match” is non-deterministic when multiple markers appear. Change _AGENT_ERROR_MARKERS from a set to an ordered sequence (tuple or list) and keep the existing iteration in _agent_permission_marker so the marker priority is deterministic and matches the documented behavior.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@celune/backends/tts/__init__.py`:
- Around line 73-82: The backend resolution errors in the backend loader are
using hardcoded English user-facing strings instead of localized text. Update
the backend-selection path in the backend factory/initializer to add new
localization entries for the unknown-backend and invalid-backend-type messages,
then call them through string("key_name", **kwargs) in place of the literal
ValueError and TypeError text. Keep the existing logic in the backend
import/dispatch flow intact while switching the messages to Celune’s
localization database.
In `@celune/backends/vc/seedvc.py`:
- Around line 72-82: The Seed-VC backend is ignoring the configured pitch shift
because `SeedVCBackend.convert()` always passes a zero value instead of the
instance’s configured setting. Update the `convert` path (and any related call
sites around the `SeedVCBackend` pitch handling) so it either forwards the
effective `pitch_shift` from `self.pitch_shift` or removes the backend option
entirely if pitch shifting is intentionally handled elsewhere; do not leave the
configuration field unused.
- Around line 135-147: The Seed-VC install/load/validation messages are still
hardcoded in English and should be localized; update the user-facing strings in
SeedVCWrapper and related helper paths to use string(...) lookups instead of
literals. Add the new messages to lang/en.json, then replace the messages shown
during backend setup, wrapper loading, and conversion failure in the SeedVC
backend methods (including _load_wrapper_type and _get_wrapper) with their i18n
keys so they flow through Celune’s localization system.
In `@celune/ui/app.py`:
- Around line 1593-1601: `_stop_vc_recording_stream` is shutting down the
`sounddevice.InputStream` while `self._vc_recording_lock` is still held, which
can deadlock with the callback path that also acquires the same lock. Refactor
`_stop_vc_recording_stream` to only clear state and return the `stream`
reference, then move the `stream.stop()`/`stream.close()` work into the callers
(`toggle_vc_recording`, `_cancel_vc_recording`,
`_stop_vc_recording_for_feedback`) after the `with self._vc_recording_lock:`
block has exited, or via a dedicated `_shutdown_vc_stream` helper called outside
the lock.
---
Outside diff comments:
In `@celune/backends/tts/dotstts.py`:
- Around line 95-100: The DotTTS backend availability error in the loader check
uses a raw English user-facing message instead of the localization system. Move
the compatible-bundle failure text used in the `custom_assert` path inside the
DotTTS initialization logic into the localization database and retrieve it with
`string(...)` so the message is no longer hardcoded. Update the corresponding
user-facing failure in `dotstts` (including the related assertion block
mentioned in the review) to use the localized string instead of a literal.
In `@celune/backends/tts/voxcpm2.py`:
- Around line 87-92: The VoxCPM2 startup failure message is user-facing and
should not be hardcoded in English. Update the error handling in the VoxCPM2
backend around the loader assertion and the matching path at the later startup
check to pull the message from Celune’s localization string database instead of
embedding the literal text. Use the existing VoxCPM2 backend symbols and the
same localized message key consistently wherever this compatible-bundle failure
is raised.
In `@tests/test_api_webui.py`:
- Around line 590-593: The WebUI tests are hardcoding English UI text instead of
validating the i18n contract. Update the affected assertions in the test suite
to use the corresponding string(...) lookups rather than literals like voice
conversion mode, TTS, VC, and CTRL+R toggle recording, and add any missing
localization keys to the string database first if they do not already exist.
Keep the checks anchored to the same test helpers and assertions so the intent
stays the same while making the tests locale-driven.
---
Nitpick comments:
In `@AGENTS.md`:
- Line 115: The issue is a wording fix in the user-facing guidance text: change
“user facing strings” to “user-facing strings” while keeping all internal
behavior and non-string content unchanged. Update only the affected string in
AGENTS.md, and make sure both the normal and dev mode string guidance still say
that only user-facing strings should be modified.
In `@celune/backends/vc/seedvc.py`:
- Around line 172-179: The output_sample_rate property in SeedVC still has
placeholder return documentation. Update its docstring so the Returns section
clearly states the actual sample-rate contract for the backend’s default Seed-VC
mode, matching the 44100/22050 behavior based on f0_condition. Preserve the
existing docstring format while replacing the generic placeholder text.
In `@celune/celune.py`:
- Around line 727-733: The docstring on is_voice_conversion_mode still uses the
generated placeholder text, so replace it with a real description of what the
method returns. Keep the existing docstring structure in
Celune.is_voice_conversion_mode, but document that it returns whether the
instance is currently in voice conversion mode, and remove the placeholder
“Result of this function.” wording.
In `@celune/dsp.py`:
- Around line 87-96: The pitch_shift_audio docstring still uses auto-generated
placeholder text, so replace it with real documentation that explains what
audio, sample_rate, and n_steps represent and what the function returns. Update
the docstring in pitch_shift_audio to preserve the existing format while
removing the placeholder phrases like “Value for `audio`.” and “Result of this
function.”, then run scripts/update_docstrings.py as required after making the
change.
In `@celune/ui/resources.py`:
- Around line 157-158: The new footer hint in the resources footer logic is
hardcoded English text, so it should be moved through Celune’s localization
path. Update the branch in the footer-building code that checks input_mode for
voice_conversion to use the existing string(...) helper with a new localization
key instead of appending the literal text, and add that key to the localization
database so the hint is rendered in the same i18n flow as other user-facing
strings.
In `@scripts/run_ci.py`:
- Around line 22-35: The permission-marker matching in _agent_permission_marker
is using an unordered set, so “first match” is non-deterministic when multiple
markers appear. Change _AGENT_ERROR_MARKERS from a set to an ordered sequence
(tuple or list) and keep the existing iteration in _agent_permission_marker so
the marker priority is deterministic and matches the documented behavior.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: ad2e8bca-c124-46ef-bb25-b39e924e3303
⛔ Files ignored due to path filters (1)
uv.lockis excluded by!**/*.lock
📒 Files selected for processing (43)
.github/workflows/ci.ymlAGENTS.mdcelune/api.pycelune/backends/__init__.pycelune/backends/tts/__init__.pycelune/backends/tts/base.pycelune/backends/tts/dotstts.pycelune/backends/tts/mini.pycelune/backends/tts/qwen3.pycelune/backends/tts/voxcpm2.pycelune/backends/vc/__init__.pycelune/backends/vc/base.pycelune/backends/vc/passthrough.pycelune/backends/vc/seedvc.pycelune/celune.pycelune/constants.pycelune/dataclasses/celune.pycelune/dataclasses/pipeline.pycelune/dsp.pycelune/entrypoint.pycelune/i18n.pycelune/lang/en.jsoncelune/modeling.pycelune/pipeline.pycelune/typing/celune.pycelune/ui/app.pycelune/ui/commands.pycelune/ui/resources.pycelune/ui/terminal.pycelune/ui/theme.pycelune/vram.pydefault_config.yamlpyproject.tomlscripts/run_ci.pytests/support.pytests/test_api_audio.pytests/test_api_webui.pytests/test_backends_and_extensions.pytests/test_backends_mini.pytests/test_celune_core.pytests/test_modeling.pytests/test_pipeline.pytests/test_runtime_and_ui_commands.py
✅ Files skipped from review due to trivial changes (6)
- default_config.yaml
- celune/backends/init.py
- celune/ui/theme.py
- celune/lang/en.json
- tests/test_backends_mini.py
- .github/workflows/ci.yml
🚧 Files skipped from review as they are similar to previous changes (8)
- celune/dataclasses/pipeline.py
- celune/typing/celune.py
- celune/entrypoint.py
- tests/test_backends_and_extensions.py
- celune/constants.py
- tests/test_pipeline.py
- celune/pipeline.py
- celune/api.py
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@celune/backends/vc/seedvc.py`:
- Line 236: The Seed-VC conversion path is applying pitch shift from the backend
state twice because the shared VC pipeline already handles the request/engine
pitch shift after conversion. Update the Seed-VC call site in the backend
conversion flow to use the request-level backend pitch value instead of
self.pitch_shift, and rely on the pipeline to pass 0 when post-processing owns
the shift; use the Seed-VC conversion method and its pitch_shift argument to
locate the change.
In `@celune/config.py`:
- Around line 16-17: AudioDeviceDirection is currently too broad and allows
invalid values to silently fall into the output branch. Update the typing in
celune/config.py to restrict AudioDeviceDirection to only the supported
direction values, and add validation in the code that branches on the direction
so unsupported inputs are rejected before the device lookup logic in the
relevant query function executes.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: a385d0f4-69b9-478a-8966-ef718f95e347
📒 Files selected for processing (22)
AGENTS.mdcelune/api.pycelune/backends/tts/__init__.pycelune/backends/tts/dotstts.pycelune/backends/tts/voxcpm2.pycelune/backends/vc/seedvc.pycelune/celune.pycelune/config.pycelune/dataclasses/pipeline.pycelune/dsp.pycelune/lang/en.jsoncelune/pipeline.pycelune/ui/app.pycelune/ui/resources.pydefault_config.yamlscripts/run_ci.pytests/test_api_webui.pytests/test_backends_and_extensions.pytests/test_celune_core.pytests/test_config_and_utils.pytests/test_pipeline.pytests/test_runtime_and_ui_commands.py
✅ Files skipped from review due to trivial changes (3)
- celune/lang/en.json
- default_config.yaml
- tests/test_config_and_utils.py
🚧 Files skipped from review as they are similar to previous changes (15)
- celune/dsp.py
- scripts/run_ci.py
- celune/dataclasses/pipeline.py
- celune/backends/tts/init.py
- celune/backends/tts/voxcpm2.py
- celune/backends/tts/dotstts.py
- AGENTS.md
- tests/test_pipeline.py
- tests/test_celune_core.py
- celune/celune.py
- tests/test_runtime_and_ui_commands.py
- celune/api.py
- celune/pipeline.py
- celune/ui/app.py
- tests/test_backends_and_extensions.py
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
celune/entrypoint.py (1)
1274-1285: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick winValidate every trailing
start/runflag, not justargs[1].
celune start --test --boguscurrently launches instead of returningEXIT_UNKNOWN_ARGS, because only the first extra token is checked while the rest ofargs[1:]is still consumed.Suggested fix
elif args[0] in {"start", "run"}: - if len(args) > 1: - if args[1] not in {"--verbose", "-v", "--test", "-t"}: - print(string("cli.invalid_argument")) - print() - print( - string("cli.start_usage", program=resolved_argv[0], command=args[0]) - ) - print(string("cli.start_description", app_name=APP_NAME)) - sys.exit(EXIT_CODES.EXIT_UNKNOWN_ARGS.value) + allowed_args = {"--verbose", "-v", "--test", "-t"} + if any(arg not in allowed_args for arg in args[1:]): + print(string("cli.invalid_argument")) + print() + print( + string("cli.start_usage", program=resolved_argv[0], command=args[0]) + ) + print(string("cli.start_description", app_name=APP_NAME)) + sys.exit(EXIT_CODES.EXIT_UNKNOWN_ARGS.value) verbose = any(arg in {"--verbose", "-v"} for arg in args[1:]) testing = any(arg in {"--test", "-t"} for arg in args[1:]) start(verbose=verbose, testing=testing)🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@celune/entrypoint.py` around lines 1274 - 1285, The argument validation in the CLI entrypoint only checks args[1], so extra trailing flags after start/run can slip through. Update the validation logic in the entrypoint flow that calls start(verbose=..., testing=...) to scan every token in args[1:] and reject any unrecognized flag before computing verbose and testing, preserving the existing valid flags set and EXIT_UNKNOWN_ARGS behavior.
♻️ Duplicate comments (1)
celune/entrypoint.py (1)
980-985: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick winKeep the UI test-mode startup inside the guarded startup path.
This branch now runs before the existing
try, so failures from_load_ui_test_backend(),runtime.Celune(...), orui.run()bypass the normal startup recovery and exit handling.Suggested fix
def start(verbose: bool = False, testing: bool = False) -> None: @@ runtime = _load_runtime() - if testing: - ui = runtime.CeluneUI() - celune = runtime.Celune(config={}, backend=_load_ui_test_backend()) - ui.celune = celune - ui.run() - sys.exit(EXIT_CODES.EXIT_SUCCESS.value) - try: + if testing: + ui = runtime.CeluneUI() + celune = runtime.Celune(config={}, backend=_load_ui_test_backend()) + ui.celune = celune + ui.run() + sys.exit(EXIT_CODES.EXIT_SUCCESS.value) if runtime.supports_ansi():🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@celune/entrypoint.py` around lines 980 - 985, The UI test-mode startup in the `testing` branch is now executing outside the guarded startup flow, so move it back under the existing `try` path in `entrypoint.py` alongside the normal startup logic. Keep the `_load_ui_test_backend()`, `runtime.Celune(...)`, `ui.run()`, and `sys.exit(...)` calls within that guarded block so any failures are handled by the same startup recovery and exit handling as the rest of the `main` startup sequence.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@celune/entrypoint.py`:
- Around line 1274-1285: The argument validation in the CLI entrypoint only
checks args[1], so extra trailing flags after start/run can slip through. Update
the validation logic in the entrypoint flow that calls start(verbose=...,
testing=...) to scan every token in args[1:] and reject any unrecognized flag
before computing verbose and testing, preserving the existing valid flags set
and EXIT_UNKNOWN_ARGS behavior.
---
Duplicate comments:
In `@celune/entrypoint.py`:
- Around line 980-985: The UI test-mode startup in the `testing` branch is now
executing outside the guarded startup flow, so move it back under the existing
`try` path in `entrypoint.py` alongside the normal startup logic. Keep the
`_load_ui_test_backend()`, `runtime.Celune(...)`, `ui.run()`, and
`sys.exit(...)` calls within that guarded block so any failures are handled by
the same startup recovery and exit handling as the rest of the `main` startup
sequence.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 144541a8-9880-4876-99b2-56b3b7b8d822
📒 Files selected for processing (15)
celune/api.pycelune/backends/tts/base.pycelune/backends/vc/base.pycelune/backends/vc/seedvc.pycelune/celune.pycelune/config.pycelune/entrypoint.pycelune/lang/en.jsoncelune/pipeline.pycelune/runtime.pycelune/ui/app.pytests/support.pytests/test_backends_and_extensions.pytests/test_main_doctor.pytests/test_runtime_and_ui_commands.py
✅ Files skipped from review due to trivial changes (1)
- celune/lang/en.json
🚧 Files skipped from review as they are similar to previous changes (11)
- celune/backends/vc/base.py
- tests/support.py
- celune/config.py
- celune/backends/tts/base.py
- celune/backends/vc/seedvc.py
- tests/test_backends_and_extensions.py
- tests/test_runtime_and_ui_commands.py
- celune/api.py
- celune/pipeline.py
- celune/celune.py
- celune/ui/app.py
Who said 3 months is too much? She needs to be good.
Summary by CodeRabbit
New Features
POST /v1/convert, including proper sample-rate response headers.subscribe(...), enabling extensions to react to lifecycle/voice events.Bug Fixes
Documentation / Chores