1) 客服 Agent 四份交付文档 + 构建脚手架:品牌由包装占位 XX科技 / 旧名 南方财富 统一为南方基金(热线 400-889-8899 / 官网 nffund.com),系统名改为「智能服务系统」; 同步追加 §0.4 修订记录行,工程记录行保留原占位字面以支撑硬编码扫描验收。 2) 开发文档:清理 28 份已作废/残留文档(14 份移出归档 + 14 份仓库副本), 新增《文档规整方案与开发前待决事项-2026-09-17》。 3) 客服agent 四份交付文档首次纳入本分支。
102 lines
3.8 KiB
Python
102 lines
3.8 KiB
Python
"""记忆系统明细探针(只读):回答「写入了什么 / 今天有没有活动 / 为什么 dead」。"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import asyncio
|
|
from typing import Any
|
|
|
|
from sqlalchemy import text
|
|
|
|
from app.infrastructure.db import SessionFactory
|
|
|
|
|
|
async def q(session: Any, sql: str, **params: Any) -> list[Any]:
|
|
try:
|
|
return list((await session.execute(text(sql), params)).all())
|
|
except Exception as exc:
|
|
print(f" ERROR {type(exc).__name__}: {exc}")
|
|
return []
|
|
|
|
|
|
async def main() -> None:
|
|
async with s_factory() as session:
|
|
print("=" * 66)
|
|
print("A) memory_unit 全部内容(写入是否成功的直接证据)")
|
|
print("=" * 66)
|
|
rows = await q(session, """
|
|
SELECT id, customer_id, memory_key, content, memory_type, status,
|
|
confidence, source_type, evidence_count, created_at, updated_at
|
|
FROM memory_unit ORDER BY updated_at DESC LIMIT 20
|
|
""")
|
|
if not rows:
|
|
print(" (memory_unit 为空 —— 一条记忆都没写入)")
|
|
for r in rows:
|
|
print(f" id={r[0]} customer={r[1]} [{r[5]}]")
|
|
print(f" key = {r[2]}")
|
|
print(f" value = {r[3]!r}")
|
|
print(f" type={r[4]} conf={r[6]} src={r[7]} evidence={r[8]}")
|
|
print(f" created={r[9]} updated={r[10]}")
|
|
|
|
print()
|
|
print("=" * 66)
|
|
print("B) 今天(2026-09-14)有没有任何新活动")
|
|
print("=" * 66)
|
|
for label, sql in (
|
|
("agent_run 今天创建", "SELECT COUNT(*) FROM agent_run WHERE created_at >= '2026-09-14'"),
|
|
("agent_run 最新一条", "SELECT MAX(created_at) FROM agent_run"),
|
|
("conversation_message 最新", "SELECT MAX(created_at) FROM conversation_message"),
|
|
("domain_event_outbox 最新", "SELECT MAX(created_at) FROM domain_event_outbox"),
|
|
("outbox pending 总数", "SELECT COUNT(*) FROM domain_event_outbox WHERE status='pending'"),
|
|
("outbox failed 总数", "SELECT COUNT(*) FROM domain_event_outbox WHERE status='failed'"),
|
|
):
|
|
rows = await q(session, sql)
|
|
print(f" {label:<26} {rows[0][0] if rows else '?'}")
|
|
|
|
print()
|
|
print("=" * 66)
|
|
print("C) 最近 10 条 outbox 事件(看最新动向)")
|
|
print("=" * 66)
|
|
rows = await q(session, """
|
|
SELECT event_type, status, retry_count, last_error, occurred_at
|
|
FROM domain_event_outbox ORDER BY id DESC LIMIT 10
|
|
""")
|
|
for r in rows:
|
|
err = (str(r[3])[:70] + "...") if r[3] and len(str(r[3])) > 70 else r[3]
|
|
print(f" {r[4]} | {r[0]:<34} | {r[1]:<9} | retry={r[2]}")
|
|
if err:
|
|
print(f" last_error: {err}")
|
|
|
|
print()
|
|
print("=" * 66)
|
|
print("D) agent.run_requested 死信的原因分布(取 5 条样本)")
|
|
print("=" * 66)
|
|
rows = await q(session, """
|
|
SELECT retry_count, last_error, occurred_at
|
|
FROM domain_event_outbox
|
|
WHERE event_type='agent.run_requested' AND status='dead'
|
|
ORDER BY id DESC LIMIT 5
|
|
""")
|
|
for r in rows:
|
|
err = (str(r[1])[:150] + "...") if r[1] and len(str(r[1])) > 150 else r[1]
|
|
print(f" {r[2]} retry={r[0]}")
|
|
print(f" {err}")
|
|
|
|
print()
|
|
print("=" * 66)
|
|
print("E) 最近 5 次 agent_run 的状态")
|
|
print("=" * 66)
|
|
rows = await q(session, """
|
|
SELECT run_id, agent_type, status, error_code, created_at
|
|
FROM agent_run ORDER BY id DESC LIMIT 5
|
|
""")
|
|
for r in rows:
|
|
print(f" {r[4]} | {r[1]:<18} | {r[2]:<10} | err={r[3]} | {r[0][:8]}")
|
|
|
|
|
|
def s_factory():
|
|
return SessionFactory()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main())
|