Add voice analytics filters and metrics

This commit is contained in:
2026-04-26 22:00:34 +08:00
parent 3805c18622
commit 55ca0985eb
25 changed files with 710 additions and 39 deletions

View File

@@ -10,6 +10,7 @@ from app.core.logging import get_logger
from app.db.database import _get_session_factory
from app.db.models import Story, StoryUniverse
from app.services.achievement_extractor import extract_achievements
from app.tasks.utils import run_with_disposed_engine
logger = get_logger(__name__)
@@ -17,7 +18,7 @@ logger = get_logger(__name__)
@celery_app.task
def extract_story_achievements(story_id: int, universe_id: str) -> None:
"""Extract achievements and update universe."""
asyncio.run(_extract_story_achievements(story_id, universe_id))
asyncio.run(run_with_disposed_engine(_extract_story_achievements(story_id, universe_id)))
async def _extract_story_achievements(story_id: int, universe_id: str) -> None:

View File

@@ -6,6 +6,7 @@ from app.core.celery_app import celery_app
from app.core.logging import get_logger
from app.db.database import _get_session_factory
from app.services.story_service import prune_story_audio_cache
from app.tasks.utils import run_with_disposed_engine
logger = get_logger(__name__)
@@ -21,7 +22,7 @@ def prune_story_audio_cache_task():
return await prune_story_audio_cache(session)
try:
result = asyncio.run(_run())
result = asyncio.run(run_with_disposed_engine(_run()))
logger.info("prune_story_audio_cache_task_completed", **result)
return result
except Exception as exc:

View File

@@ -6,6 +6,7 @@ from app.core.celery_app import celery_app
from app.core.logging import get_logger
from app.db.database import _get_session_factory
from app.services.generation_jobs import mark_stale_generation_jobs
from app.tasks.utils import run_with_disposed_engine
logger = get_logger(__name__)
@@ -22,7 +23,7 @@ def prune_stale_generation_jobs_task():
return await mark_stale_generation_jobs(session)
try:
result = asyncio.run(_run())
result = asyncio.run(run_with_disposed_engine(_run()))
logger.info("prune_stale_generation_jobs_task_completed", **result)
return result
except Exception as exc:

View File

@@ -6,6 +6,7 @@ from app.core.celery_app import celery_app
from app.core.logging import get_logger
from app.db.database import _get_session_factory
from app.services.story_service import run_generation_job_service
from app.tasks.utils import run_with_disposed_engine
logger = get_logger(__name__)
@@ -22,7 +23,7 @@ def run_generation_workflow_task(job_id: str):
return await run_generation_job_service(job_id, session)
try:
result = asyncio.run(_run())
result = asyncio.run(run_with_disposed_engine(_run()))
logger.info(
"generation_workflow_task_completed",
job_id=job_id,

View File

@@ -2,9 +2,10 @@
import asyncio
from app.core.celery_app import celery_app
from app.core.logging import get_logger
from app.db.database import _get_session_factory
from app.services.memory_service import prune_expired_memories
from app.core.logging import get_logger
from app.db.database import _get_session_factory
from app.services.memory_service import prune_expired_memories
from app.tasks.utils import run_with_disposed_engine
logger = get_logger(__name__)
@@ -21,7 +22,7 @@ def prune_memories_task():
try:
# Create a new event loop for this task execution
count = asyncio.run(_run())
count = asyncio.run(run_with_disposed_engine(_run()))
logger.info("prune_memories_task_completed", deleted_count=count)
return f"Deleted {count} expired memories"
except Exception as exc:

View File

@@ -10,6 +10,7 @@ from app.core.celery_app import celery_app
from app.core.logging import get_logger
from app.db.database import _get_session_factory
from app.db.models import PushConfig, PushEvent
from app.tasks.utils import run_with_disposed_engine
logger = get_logger(__name__)
@@ -22,7 +23,7 @@ TRIGGER_WINDOW_MINUTES = 30
@celery_app.task
def check_push_notifications() -> None:
"""Check push configs and create push events."""
asyncio.run(_check_push_notifications())
asyncio.run(run_with_disposed_engine(_check_push_notifications()))
def _is_quiet_hours(current: time) -> bool:

View File

@@ -0,0 +1,17 @@
"""Shared helpers for Celery tasks."""
from collections.abc import Awaitable
from typing import TypeVar
from app.db.database import dispose_engine
T = TypeVar("T")
async def run_with_disposed_engine(awaitable: Awaitable[T]) -> T:
"""Run async task work and drop DB pools before the event loop closes."""
try:
return await awaitable
finally:
await dispose_engine()