- name
- tts-error-reporting
- description
- Convention for reporting errors from multiprocessing TTS workers to the main process frontend. Use this skill when modifying, adding, or debugging TTS workers in tts_client.py to ensure connection errors, quotas, and API limits correctly display Toast notifications to the user rather than failing silently.
# TTS Error Reporting Protocol
To ensure users are properly notified when a TTS service encounters an error (such as quota exhaustion, API issues, or connection failures), TTS workers running in separate processes must propagate errors back to the main process (`core.py`).
## Core Rule: Use `response_queue.put(("__error__", error_msg))`
When a TTS worker (e.g. `step_realtime_tts_worker`, `qwen_realtime_tts_worker`, etc.) catches an error, it **MUST NOT** only log the error using `logger.error()`. It **MUST ALSO** send the error message back to the main process through its `response_queue` using the explicit tuple format `("__error__", error_msg)`.
This ensures that `core.py`'s `tts_response_handler` can intercept the error and translate it into a frontend WebSocket message (`type: 'status'`), triggering a user-friendly Toast notification (e.g., "💥 免费TTS限额已耗尽").
### Example Implementation
```python
# Bad Pattern (Fails silently for user)
except Exception as e:
logger.error(f"TTS Worker Error: {e}")
# Worker dies or hangs, user stuck on "Preparing..."
# Good Pattern (Structured JSON error for i18n frontend toasts)
import json
except Exception as e:
logger.error(f"TTS Worker Error: {e}")
# Map to specific error codes known to i18n
error_payload = json.dumps({"code": "API_QUOTA_TIME", "details": str(e)})
response_queue.put(("__error__", error_payload))
# Acceptable Fallback (Fallback 1008 error if code unknown)
except Exception as e:
logger.error(f"TTS Worker Error: {e}")
error_payload = json.dumps({"code": "API_1008_FALLBACK", "msg": str(e)})
response_queue.put(("__error__", error_payload))
```
### WebSocket Stream Callbacks Example
```python
import json
def on_error(self, message: str):
logger.error(f"TTS Error: {message}")
error_payload = json.dumps({"code": "API_1008_FALLBACK", "msg": message})
self.response_queue.put(("__error__", error_payload))
```
## Checklist for Adding a New TTS Worker
Whenever you add a new TTS API worker in `tts_client.py`:
1. Ensure the worker signature accepts a `response_queue`.
2. Locate all network initialization blocks, `try/except` loops, and `on_error` WebSocket callbacks.
3. In every local exception block where the worker might fail or drop the connection, add `response_queue.put(("__error__", error_message_string))`.
4. Ensure string encoding handles JSON cleanly if propagating raw API errors.
View on GitHub