c0b67fd879
补齐「启动确认窗自进化闭环」里 app-server 这一侧的读路径:pricebot 的 launch_confirm LLM 兜底成功样本会 server→server 落到 app-server 的 launch_confirm_sample 表;本提交 新增「样本列表查询」内部接口, 供 pricebot 的 scripts/distill_launch_confirm.py 回读这些 样本、按「宿主包 × 文案变体」聚合沉淀出候选规则。 - app/api/internal/launch_confirm.py: 新增样本列表内部接口(server→server, 不走用户 JWT) - app/repositories/launch_confirm_sample.py: 样本列表查询 - app/schemas/launch_confirm_sample.py: 列表响应 schema Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Reviewed-on: #91 Co-authored-by: wuqi <wuqi@wonderable.ai> Co-committed-by: wuqi <wuqi@wonderable.ai>
62 lines
2.2 KiB
Python
62 lines
2.2 KiB
Python
"""启动确认窗兜底样本落库:单条 insert(都上报、不去重,by design)。"""
|
|
from __future__ import annotations
|
|
|
|
import logging
|
|
from datetime import datetime
|
|
from typing import Optional
|
|
|
|
from sqlalchemy import select
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.models.launch_confirm_sample import LaunchConfirmSample
|
|
from app.schemas.launch_confirm_sample import LaunchConfirmSampleIn
|
|
|
|
logger = logging.getLogger("shagua.launch_confirm")
|
|
|
|
|
|
def _trunc(s: Optional[str], n: int) -> Optional[str]:
|
|
"""截断到列长上限(PG varchar 超长会报错;繁体长标题等需要)。空 → None。"""
|
|
return s[:n] if s else None
|
|
|
|
|
|
def insert_sample(db: Session, payload: LaunchConfirmSampleIn) -> int:
|
|
"""写入一条样本,返回新行 id。"""
|
|
row = LaunchConfirmSample(
|
|
trace_id=_trunc(payload.trace_id, 64),
|
|
device_id=_trunc(payload.device_id, 64),
|
|
host_package=_trunc(payload.host_package, 128),
|
|
target_app=_trunc(payload.target_app, 128),
|
|
system_locale=_trunc(payload.system_locale, 32),
|
|
exec_success=bool(payload.exec_success),
|
|
dialog_title=_trunc(payload.dialog_title, 256),
|
|
payload=payload.payload,
|
|
)
|
|
db.add(row)
|
|
db.commit()
|
|
db.refresh(row)
|
|
return row.id
|
|
|
|
|
|
def list_samples(
|
|
db: Session,
|
|
*,
|
|
exec_success: Optional[bool] = None,
|
|
host_package: Optional[str] = None,
|
|
since: Optional[datetime] = None,
|
|
limit: int = 1000,
|
|
) -> list[LaunchConfirmSample]:
|
|
"""按条件查样本(pricebot 的 distill_launch_confirm.py 沉淀工具读)。created_at 升序。
|
|
|
|
过滤项都可空:exec_success(只看放行成功的)/ host_package(只看某宿主包)/
|
|
since(>= created_at)。limit 兜底防一次拉爆全表。
|
|
"""
|
|
stmt = select(LaunchConfirmSample)
|
|
if exec_success is not None:
|
|
stmt = stmt.where(LaunchConfirmSample.exec_success == exec_success)
|
|
if host_package:
|
|
stmt = stmt.where(LaunchConfirmSample.host_package == host_package)
|
|
if since is not None:
|
|
stmt = stmt.where(LaunchConfirmSample.created_at >= since)
|
|
stmt = stmt.order_by(LaunchConfirmSample.created_at.asc()).limit(limit)
|
|
return list(db.execute(stmt).scalars().all())
|