fix: error state resettable via mic click, debug logging, pipeline traceback
This commit is contained in:
@@ -1,7 +1,11 @@
|
|||||||
|
import logging
|
||||||
import os
|
import os
|
||||||
import tempfile
|
import tempfile
|
||||||
|
import traceback
|
||||||
|
|
||||||
from api.state import state, Status
|
from api.state import state, Status
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
from config import load as load_config
|
from config import load as load_config
|
||||||
from transcription import engine as transcription_engine
|
from transcription import engine as transcription_engine
|
||||||
from llm import OllamaClient
|
from llm import OllamaClient
|
||||||
@@ -59,6 +63,8 @@ async def run_pipeline():
|
|||||||
await state.set_status(Status.IDLE)
|
await state.set_status(Status.IDLE)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
tb = traceback.format_exc()
|
||||||
|
logger.error("Pipeline error:\n%s", tb)
|
||||||
state.last_error = str(e)
|
state.last_error = str(e)
|
||||||
await state.set_status(Status.ERROR)
|
await state.set_status(Status.ERROR)
|
||||||
await broadcast({"event": "error", "message": str(e)})
|
await broadcast({"event": "error", "message": str(e)})
|
||||||
|
|||||||
@@ -97,6 +97,9 @@ async def toggle_recording(user: dict = Depends(current_user)):
|
|||||||
if state.status == Status.RECORDING:
|
if state.status == Status.RECORDING:
|
||||||
asyncio.create_task(run_pipeline())
|
asyncio.create_task(run_pipeline())
|
||||||
return {"action": "stopped"}
|
return {"action": "stopped"}
|
||||||
|
if state.status == Status.ERROR:
|
||||||
|
await state.set_status(Status.IDLE)
|
||||||
|
return {"action": "reset"}
|
||||||
if state.status == Status.IDLE:
|
if state.status == Status.IDLE:
|
||||||
from audio import AudioRecorder
|
from audio import AudioRecorder
|
||||||
state._recorder = AudioRecorder()
|
state._recorder = AudioRecorder()
|
||||||
|
|||||||
+10
-2
@@ -47,12 +47,20 @@ function setStatus(status) {
|
|||||||
btn.className = status;
|
btn.className = status;
|
||||||
headerStatus.className = `status-badge ${status}`;
|
headerStatus.className = `status-badge ${status}`;
|
||||||
const label = STATUS_LABELS[status] || status;
|
const label = STATUS_LABELS[status] || status;
|
||||||
statusText.textContent = label;
|
statusText.textContent = status === 'error' ? label + ' — klicken zum Zurücksetzen' : label;
|
||||||
headerStatus.textContent = label;
|
headerStatus.textContent = label;
|
||||||
btn.disabled = status === 'processing';
|
btn.disabled = status === 'processing';
|
||||||
}
|
}
|
||||||
|
|
||||||
btn.addEventListener('click', () => apiFetch('/toggle', { method: 'POST' }));
|
btn.addEventListener('click', async () => {
|
||||||
|
const r = await apiFetch('/toggle', { method: 'POST' });
|
||||||
|
const data = await r.json();
|
||||||
|
if (data.action === 'reset') {
|
||||||
|
preview.textContent = 'Noch keine Aufnahme verarbeitet.';
|
||||||
|
preview.classList.remove('has-content');
|
||||||
|
setStatus('idle');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
function connectWs() {
|
function connectWs() {
|
||||||
const proto = location.protocol === 'https:' ? 'wss:' : 'ws:';
|
const proto = location.protocol === 'https:' ? 'wss:' : 'ws:';
|
||||||
|
|||||||
@@ -137,7 +137,7 @@ if __name__ == "__main__":
|
|||||||
write_pid(pid_path)
|
write_pid(pid_path)
|
||||||
signal.signal(signal.SIGUSR1, _sigusr1_handler)
|
signal.signal(signal.SIGUSR1, _sigusr1_handler)
|
||||||
|
|
||||||
uvicorn_cfg = uvicorn.Config(app, host=host, port=port, log_level="warning")
|
uvicorn_cfg = uvicorn.Config(app, host=host, port=port, log_level="debug")
|
||||||
server_thread = threading.Thread(target=run_server, args=(uvicorn_cfg,), daemon=True)
|
server_thread = threading.Thread(target=run_server, args=(uvicorn_cfg,), daemon=True)
|
||||||
server_thread.start()
|
server_thread.start()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user