feat(api+app): 对话阶段化、回忆录流水线与客户端会话体验

- DB: segments 用户输入文本(Alembic 0002)
- Chat: 阶段检测/阶段提示/回复限制,编排与访谈/画像 prompts 调整
- Memoir: 忠实度检查 agent,叙事与分类等链路更新
- Core: agent 日志、Alembic 启动、LangChain/日志/配置等
- Story: time_hints;Memory 检索与相关测试
- Expo: 助手头像、会话页与消息拆分、实时会话与文案/i18n
- Docs/scripts/tests: 迁移脚本、LLM JSON/记忆检索文档、新增单测
This commit is contained in:
Kevin
2026-03-26 12:13:36 +08:00
parent 49b089354c
commit a3f61fcc0f
94 changed files with 3332 additions and 672 deletions

View File

@@ -115,7 +115,7 @@ class PaymentOrderService:
except Exception as e:
order.status = "failed"
await self._db.flush()
logger.exception("微信支付客户端初始化失败: %s", e)
logger.exception("微信支付客户端初始化失败: {}", e)
raise HTTPException(status_code=503, detail=f"微信支付暂不可用: {e!s}")
try:
@@ -145,14 +145,14 @@ class PaymentOrderService:
except Exception as e:
order.status = "failed"
await self._db.flush()
logger.exception("创建支付订单异常: %s", e)
logger.exception("创建支付订单异常: {}", e)
raise HTTPException(
status_code=500, detail=f"创建支付订单异常: {type(e).__name__}: {e!s}"
)
await self._db.commit()
logger.info(
"订单创建成功: order_no=%s, payment_method=%s, amount_fen=%s",
"订单创建成功: order_no={}, payment_method={}, amount_fen={}",
order_no,
payment_method,
amount_fen,
@@ -168,10 +168,10 @@ class PaymentOrderService:
result = await self._db.execute(select(Order).where(Order.id == out_trade_no))
order = result.scalar_one_or_none()
if order is None:
logger.warning("支付回调: 订单不存在 %s", out_trade_no)
logger.warning("支付回调: 订单不存在 {}", out_trade_no)
return
if order.status == "paid":
logger.info("支付回调: 订单已处理过 %s", out_trade_no)
logger.info("支付回调: 订单已处理过 {}", out_trade_no)
return
now = utc_now()
order.status = "paid"
@@ -191,14 +191,14 @@ class PaymentOrderService:
user.subscription_expires_at = now + timedelta(days=duration_days)
user.subscription_type = order.plan_id
logger.info(
"用户 %s 订阅已升级为 %s,到期: %s",
"用户 {} 订阅已升级为 {},到期: {}",
user.id,
order.plan_id,
user.subscription_expires_at,
)
await self._db.commit()
logger.info(
"支付成功处理完成: 订单 %s, 第三方交易号 %s", out_trade_no, trade_no
"支付成功处理完成: 订单 {}, 第三方交易号 {}", out_trade_no, trade_no
)
async def handle_wechat_notify(self, headers: dict, body: str) -> dict: