- 新增 SQLite:measure/health 快照、delivery_cursor 单消费者 pop;clear/start_fresh 可清空库 - biomass GET 仅返回约定 data 字段,X-Fish-Biomass-New 表示是否有新快照;poller 读响应头 - loguru 桥接 uvicorn,子进程 stdout 流式输出;format_json_pretty 与算法摘要日志 - measure/action watch 无新任务时限流 WARNING;watch_idle 共用逻辑 - 依赖 loguru;新增 db、logging_config、subprocess_run、watch_idle、启动脚本 FishMeasure: 更新 fish_video_weight_evaluation 与 predict_weigth_from_svo2;移除未用 refbox/segmentation 脚本 Made-with: Cursor
39 lines
883 B
Python
39 lines
883 B
Python
from __future__ import annotations
|
||
|
||
import asyncio
|
||
from dataclasses import dataclass, field
|
||
from datetime import datetime
|
||
from typing import List, Optional
|
||
|
||
|
||
@dataclass
|
||
class MeasureSnapshot:
|
||
result: List[dict]
|
||
video_left: str
|
||
video_right: str
|
||
updated_at: Optional[datetime] = None
|
||
error: Optional[str] = None
|
||
raw_prediction_path: Optional[str] = None
|
||
|
||
|
||
@dataclass
|
||
class HealthSnapshot:
|
||
behavior_result: str
|
||
health_result: str
|
||
updated_at: Optional[datetime] = None
|
||
error: Optional[str] = None
|
||
raw_class_en: str = ""
|
||
|
||
|
||
@dataclass
|
||
class AppState:
|
||
measure_lock: asyncio.Lock = field(default_factory=asyncio.Lock)
|
||
action_lock: asyncio.Lock = field(default_factory=asyncio.Lock)
|
||
|
||
# job status for optional polling(业务结果见 SQLite)
|
||
measure_status: str = "idle"
|
||
action_status: str = "idle"
|
||
|
||
|
||
app_state = AppState()
|