设置页(/settings):
- 新增 Setting DB 模型(键值存储,持久化运行时覆盖)
- config.py 加 _apply_overrides:get_settings() 合并 DB 覆盖值
(_applying_overrides 标志防递归:DB 初始化回调 get_settings 时不重入)
- save_setting() 写 DB + 清 lru_cache,后续任务读到新值
- settings_router.py: GET/PUT /api/settings
- settings_html.py: 设置页表单(batch_size/beam_size/sort_by_length)
+ 设备只读信息 + 保存后 reload 确认
- 验证:改 asr_batch_size=16 beam_size=1 -> 任务 ASR 日志确认生效
- 验证:重启容器后设置从 DB 恢复(持久化)
删除任务:
- task_router.py: DELETE /api/tasks/{id},仅 done/failed 可删
删字幕/音频/视频产物 + UploadSession + Task DB 记录
- home_html.py + history_html.py: done/failed 任务显示删除按钮
+ confirm 确认 + 调用 DELETE API + 刷新列表
- 验证:删除 task 15 成功,删除进行中 task 返回 409
/docs 去认证:
- 移除 require_docs_auth 依赖,/docs /redoc /openapi.json 直接公开
离线模式:
- Dockerfile dev/final 加 HF_HUB_OFFLINE=1 TRANSFORMERS_OFFLINE=1
(模型已缓存在 ./models volume,无需联网验证)
- 验证:离线模式完整跑通 ASR+翻译(task 15 done)
93 lines
3.2 KiB
Python
93 lines
3.2 KiB
Python
"""设置路由:查询/修改运行时可调参数。
|
||
|
||
config.yaml 是只读挂载,改它需重启容器。本路由把部分参数(batch_size 等)
|
||
存到 DB 的 setting 表,通过 config.save_setting() + reload_settings() 实现
|
||
运行时热更新:保存后清 lru_cache,后续任务读到新值。
|
||
|
||
当前可调项与 config._OVERIDEABLE_FIELDS 对齐。
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
import logging
|
||
|
||
from fastapi import APIRouter
|
||
from pydantic import BaseModel, Field
|
||
|
||
from ..config import _OVERIDEABLE_FIELDS, get_settings, save_setting
|
||
|
||
logger = logging.getLogger("audio2text.settings")
|
||
router = APIRouter(prefix="/api/settings", tags=["settings"])
|
||
|
||
|
||
# ---------------- 响应 / 请求 DTO ----------------
|
||
|
||
class SettingsResponse(BaseModel):
|
||
"""当前生效的设置值(YAML 基础 + DB 覆盖后的合并值)。"""
|
||
asr_batch_size: int
|
||
asr_beam_size: int
|
||
translation_batch_size: int
|
||
translation_sort_by_length: bool
|
||
# 不可改但展示的只读信息
|
||
asr_model: str
|
||
asr_device: str
|
||
asr_compute_type: str
|
||
translation_model: str
|
||
translation_device: str
|
||
|
||
|
||
class SettingsUpdate(BaseModel):
|
||
"""设置更新请求:只传要改的字段,未传的保持不变。"""
|
||
asr_batch_size: int | None = Field(default=None, ge=1, le=128)
|
||
asr_beam_size: int | None = Field(default=None, ge=1, le=10)
|
||
translation_batch_size: int | None = Field(default=None, ge=1, le=256)
|
||
translation_sort_by_length: bool | None = None
|
||
|
||
|
||
# ---------------- 字段映射:DTO 字段名 -> config 点分路径 ----------------
|
||
|
||
_FIELD_MAP: dict[str, str] = {
|
||
"asr_batch_size": "asr.batch_size",
|
||
"asr_beam_size": "asr.beam_size",
|
||
"translation_batch_size": "translation.batch_size",
|
||
"translation_sort_by_length": "translation.sort_by_length",
|
||
}
|
||
|
||
|
||
# ---------------- 接口 ----------------
|
||
|
||
@router.get("", summary="查询当前生效的设置")
|
||
def get_current_settings() -> SettingsResponse:
|
||
"""返回当前生效的设置(YAML 基础 + DB 覆盖合并后的值)。"""
|
||
s = get_settings()
|
||
return SettingsResponse(
|
||
asr_batch_size=s.asr.batch_size,
|
||
asr_beam_size=s.asr.beam_size,
|
||
translation_batch_size=s.translation.batch_size,
|
||
translation_sort_by_length=s.translation.sort_by_length,
|
||
asr_model=s.asr.model,
|
||
asr_device=s.asr.device,
|
||
asr_compute_type=s.asr.compute_type,
|
||
translation_model=s.translation.model,
|
||
translation_device=s.translation.device,
|
||
)
|
||
|
||
|
||
@router.put("", summary="更新设置(保存后对后续任务生效)")
|
||
def update_settings(req: SettingsUpdate) -> dict:
|
||
"""保存修改的设置项到 DB,清配置缓存。
|
||
|
||
只处理请求中非 None 的字段。保存后立即生效(后续任务读到新值),
|
||
已在跑的任务不受影响(任务在各阶段开始时读配置)。
|
||
"""
|
||
changed: dict = {}
|
||
for field, path in _FIELD_MAP.items():
|
||
val = getattr(req, field)
|
||
if val is not None:
|
||
save_setting(path, val)
|
||
changed[field] = val
|
||
logger.info("设置已更新:%s = %s(对后续任务生效)", path, val)
|
||
if not changed:
|
||
return {"status": "no_change", "changed": {}}
|
||
return {"status": "saved", "changed": changed}
|