shangfangjian
|
06e973d34d
|
fix(concurrency): 消除 model 覆盖的模块级变量中转(并发串味)
R4 首版实现用模块级 _ACTIVE_MODEL_OVERRIDE 中转 model override,
理由是不想改动 run_specialists 的签名(既有测试会 mock 它)。
但 backtest.py:225 会 asyncio.gather 并发 8 场预测(Semaphore(8)),
每场都调用 predict_match_multi —— 模块级变量会被并发调用互相覆盖,
导致 A 场的预测用上 B 场的模型。这是静默的正确性缺陷。
改为: run_specialists 新增 model_override 形参,一路显式下传;
删除模块级变量。同步更新 6 处 mock 签名。
新增 3 个守卫并做变异验证:
- test_r4_no_module_level_model_override_global (源码级,可判别)
- test_r4_run_specialists_accepts_model_override_parameter
- test_r4_dispatch_passes_override_to_specialists
变异测试: 重新引入全局变量方案 → 两个守卫变红;还原 → 全绿。
注: 曾尝试写并发行为测试,但真实 run_specialists 会访问数据库,
测试环境下不稳定(ConnectionRefusedError),会是 flaky 的假证据,
故改用清晰的源码级判别守卫,并在注释中说明原因。
240 passed / 1 skipped; tsc 0 error; vite build 成功。
|
2026-09-21 17:52:45 +08:00 |
|
shangfangjian
|
50a6753ff8
|
test: 修正 selectin 守卫的假阳性(变异测试发现)
原断言对「关系声明到下一注解」的整段(含注释)做 lazy="selectin"
子串匹配;而 Match.league 声明正下方的注释里恰好也写着该字样,
导致移除真实 kwarg 后测试依旧通过(变异测试确认)。
改为只匹配 relationship(...) 括号内内容,并加注释说明该假阳性。
验证: 干净代码通过 → 移除 league 的 lazy 后失败 → 还原后又通过。
全套 238 passed / 1 skipped。
|
2026-09-21 17:36:07 +08:00 |
|
shangfangjian
|
951faf31df
|
test: 修复 13 个腐化用例,套件恢复全绿且顺序无关
按「测试腐化(a)/ 源码缺陷(b)/ 测试污染(c)」逐项定性,仅改 tests/:
- 外机绝对路径(4): 迁移文件路径改为相对仓库根解析(沿用
test_regressions._read 约定),断言内容保持不变。
- cutoff 用例(4+1): mock 未生效的真因是 _agent_provider 被换成同步
lambda,await 抛 TypeError 被生产代码吞掉后 IndexError;改为 async
mock 并按 run_specialists/load_match_header/_agent_provider 的真实契约
打补丁。degraded 用例再加 _upsert_prediction 顶层 kwargs(model)采集。
- 陈旧断言(3): agent 键按现契约断言中文映射;h2h mock 改 async;
Match.stats 按设计为 lazy="select",从 MATCH_RELATIONS 移出并单独
固化该设计决定。
- P0-3 守卫(1): seg 越界扫到下游 stats 管线导致误报,改为按缩进收口;
合法形状含经 raw 派生变量中转的写法,并补元测试确保守卫仍能抓到回归。
- 交叉污染(6): test_multi_agent_cutoff 用 patch.object 精确还原,消除
裸赋值泄漏的同步 mock;现已验证顺序无关。
|
2026-09-21 17:31:36 +08:00 |
|
shangfangjian
|
11da4d3631
|
fix(critical): 修复评审确认的 R1-R5 五处缺陷
R1 429 key 轮换路径调用不存在的 _km → NameError(且位于凭证脱敏日志行):
改用 src/data/key_ring._mask,全树不再有 _km 调用。
[注: 该改动已随另一工作流提交 9ccda4b 一并入库]
R2 ingest_bzzoiro_standings 被截断(return 前无 upsert 逻辑,standings 表
永不写入、total_upserted 恒为 0):从 f05dc1a 移植完整实现,按
(league_id, season, team_id) upsert,保留逐联赛错误隔离,不加 db.commit()。
[注: 同上,已随 9ccda4b 入库]
R3 src/llm/agents/orchestrator.py 完成日志把 list 喂给 %d → logging TypeError:
改为 len(ok_reports),与同文件降级日志行写法一致。
R4 mode=multi 静默丢弃调用方传入的 model:predict_match_multi 新增
model 关键字参数,经 _ACTIVE_MODEL_OVERRIDE 下传至 _agent_provider,
显式 model 优先级最高;override 生效时跳过 provider 缓存读写以免串味,
并在 predict.py 派发点透传。
R5 回测把字符串日期直接与 timestamptz 列比较:新增 _parse_date_bound 助手,
支持 YYYY-MM-DD / 完整 ISO / datetime / None,裸日期按 UTC 锚定,
结束日取当天末刻(闭区间,避免最后一天被静默排除),非法输入抛 ValueError。
新增 tests/test_review_required_fixes.py 覆盖 R1-R5(R2/R4 为行为测试),
20 项全通过。
|
2026-09-21 17:19:24 +08:00 |
|
shangfangjian
|
b9d7b6423e
|
test(c2): 补齐导入次序回归,注明环状导入为预期且可自愈
test_bzzoiro_source_registry.py 增至 11 项:
- 新增 TestImportOrderSelfHeal:用独立子进程验证两种真实导入次序
(sources 先 / bzzoiro 先)下注册表均可用。该缺陷只在真实模块初始化
时序下成立,mock 照不出来,故不 mock。
- 新增未知名字仍抛 ValueError 的契约守卫。
src/data/sources.py:补全 _load_sources 文档,说明首次装载失败属正常的
环状导入(bzzoiro 仍在初始化),失败时保持 _loaded=False 使后续
get_source()/list_sources() 调用可重试装载(自愈)。
验证:
- tests/test_bzzoiro_source_registry.py:11 passed
- 两种导入次序实测均输出 bzzoiro ['bzzoiro']
|
2026-09-21 17:13:57 +08:00 |
|
shangfangjian
|
9ccda4bf51
|
fix(critical): 恢复 bzzoiro events 采集管线,消除数据源注册表静默失效
C2 数据丢失修复。重构提交 6a49940 删除了 src/data/bzzoiro.py 中的
fetch_bzzoiro_events 与 BzzoiroSource 后未做替换,同时 sources.py 用
`try/except Exception: pass` 吞掉了 ImportError,导致:
- _SOURCES 注册表恒为空
- get_source("bzzoiro") 恒抛 ValueError("未知数据源: bzzoiro")
- src/api/routes/ingest.py 与 schedules.py 运行时全线失效,
且日志中无任何导入错误痕迹
修复内容:
1. 从 f05dc1a 恢复并移植 events 管线:
- fetch_bzzoiro_events():分页抓取 /events/(纯异步,复用现有 _fetch_json_async)
- @register class BzzoiroSource + ingest():保留原签名
(db, *, leagues, date_from, date_to, status),保持「不 commit,
事务由调用方 UnitOfWork 控制」的契约,并保留单联赛抓取失败的
错误隔离(记录 error 后 continue)
- 复用现有 _to_date / _to_int_or_none / _match_key,未重复定义
- 血缘字段继续使用与 nm 配对的 raw(避免 P0-3 回归)
2. sources.py:导入失败改为 logger.exception 记录,新增 _loaded 标记
保证 _load_sources() 至多执行一次;失败时不置位以便后续重试。
get_source() 对真正未知的名字仍抛 ValueError。
验证:
- 新增 tests/test_bzzoiro_source_registry.py(8 项):注册表非空、
get_source/list_sources 可用、ingest 签名契约、不再静默吞异常
- test_regressions.py:3 failed -> 2 failed
- 全量:14 failed -> 13 failed,通过数 190 -> 199
注意事项:未改动任何 caller(routes/ingest.py、routes/schedules.py 原样
可用,证明签名保持正确)。
|
2026-09-21 17:10:17 +08:00 |
|
shangfangjian
|
8c87b9d024
|
fix(critical): 修复调度器静默失效、数据源缺失与前端类型错误
C1 定时任务静默失效(4 层缺陷):
- scheduler.py: croniter(expr, datetime.now) 未调用 now(),
导致 TypeError 被吞、next_run 恒为 None(最深一层)
- scheduler.py: _calc_next 非法 cron 静默吞异常 -> 改为构造期抛 ValueError
- scheduler.py: _run_loop 一次异常即永久停摆 -> 增加异常隔离
- scheduler.py: sleep(min(wait,60)) 使运行期 cron 变更最长 60s 才生效
-> 改为固定 SLEEP_TICK 轮询
- app.py / schedules.py: 3 处 register() 第 2 参误传 task 类型名
C3 EvalPage.tsx: 引用未导入的 EmptyState -> 改为已导入的 EmptyText
(tsc --noEmit 由 1 error 变为 0 error)
新增 tests/test_scheduler_registration.py: 9 项行为回归测试
|
2026-09-21 17:04:04 +08:00 |
|
 shangfangjianandnew-provider/LongCat-2.0 <
|
6a4994097a
|
feat: 采集管线基础设施全面接线
后端:
- bzzoiro events 采集成功后写入 RawEvent(Bronze 层)
- 采集失败写入 IngestFailure(死信队列)
- 写入 DataLineage(ETL 血缘追踪)
- stats 回填成功后写入 RawEvent + DataLineage
- 新增 DataQualityScheduler(每小时自动质量检查)
- 新增 /api/v1/admin/data-quality 端点
- 新增 /api/v1/admin/ingest-failures 端点(失败记录 + 重试)
- 新增 /api/v1/admin/llm/ping 端点(LLM 连通性测试)
- lifespan 启动 quality_scheduler
- Match 表补充 CHECK 约束(完赛必须有比分、状态枚举、半场≤全场)
- Prediction FK 加 ondelete="CASCADE" 与迁移对齐
- PredictRequest mode 加 pattern 校验
前端:
- 新增「数据管线」管理页(/admin/data-pipeline)
- 采集失败记录列表(状态/重试次数/错误类型 + 重试按钮)
- 数据质量检查结果(通过/未通过/严重度)
- 手动触发质量检查按钮
- 预测历史:比赛信息内嵌(日期/队名/主客徽标/赛果自动填充)
- 导航统一为 React Router Link
- AdminStats 类型扩展(matches/stats/standings 真实计数)
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
|
2026-09-21 10:28:02 +08:00 |
|
 shangfangjianandnew-provider/LongCat-2.0 <
|
ae89d0f04f
|
feat: 数据采集管线基础设施接线 + 数据管线管理页
后端:
- bzzoiro 采集成功后写入 RawEvent(Bronze 层原始事件存档)
- 采集失败写入 IngestFailure(死信队列,支持重试)
- 写入 DataLineage(ETL 血缘追踪)
- 新增 DataQualityScheduler(每小时自动质量检查)
- 新增 /api/v1/admin/data-quality 端点(质量检查 + 手动触发)
- 新增 /api/v1/admin/ingest-failures 端点(失败记录 + 重试)
- 新增 /admin/llm/ping 端点(LLM 连通性测试,不依赖比赛)
- lifespan 启动 quality_scheduler
前端:
- 新增「数据管线」管理页(/admin/data-pipeline)
- 采集失败记录列表(状态/重试次数/错误类型)
- 数据质量检查结果(通过/未通过/严重度)
- 手动触发质量检查按钮
- 失败记录重试按钮
- 预测历史:比赛信息内嵌(日期/队名/主客徽标/赛果自动填充)
- 导航统一为 React Router Link
- AdminStats 类型扩展(matches/stats/standings 真实计数)
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
|
2026-09-21 10:04:26 +08:00 |
|
 shangfangjianandnew-provider/LongCat-2.0 <
|
b6e367a640
|
Code Review 第二轮修复:前端 HTTP 统一 + 数据采集可靠性
F1: 统一前端 HTTP 客户端
- 新增 frontend/src/lib/http.ts(共享客户端,统一超时/错误/401 处理)
- Matches.tsx 的列表/分页/进行中/预测请求改用 http 客户端
- 公开站与 Admin 行为一致
D2: events 采集按联赛分批提交
- _run_bzzoiro 改为 per-league 独立事务,避免超长事务
- 单联赛失败不影响其他联赛
F3: 仪表盘真实计数
- admin_stats 补充 matches/stats/standings 真实聚合
- Dashboard 展示比赛总数/已完赛/统计行/积分榜
F4: LLM 连通性测试不依赖 match_id=1
- 新增 POST /admin/llm/ping 端点(只发一次 chat,不依赖比赛)
- testLLMConnection 优先调用 ping,失败回退旧方式
F5: 导航改用 React Router Link
- App.tsx 中 <a href> 全部替换为 <Link to>
D5: 删除 away_possession 死代码
- bzzoiro.py 中移除计算与注释
D1: 管线基础设施表文档化
- RawEvent/IngestFailure/DataQualityCheck/DataLineage 添加「预留未启用」注释
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
|
2026-09-21 03:06:52 +08:00 |
|
 shangfangjianandnew-provider/LongCat-2.0 <
|
675e176603
|
fix: 修复 Code Review 发现的 4 个 High + 1 个 Medium 问题
High-1/2: baseline mode 违反 DB CHECK 约束
- ck_mode_enum 扩展为 ('single','multi','baseline')
- baseline 的 run_type 从 'baseline' 改为 'live'(符合现有约束)
- 新增迁移 0017_mode_baseline
High-3: 限流日志 NameError: ip 未定义
- deps.py:190 的 logger.warning 中 ip → client_ip
High-4: 生产 Cookie 缺少 Secure 标志
- auth.py 登录时根据 APP_ENV 设置 secure=True(生产)
Medium-5: 降级日志参数类型错误
- orchestrator.py:266 ok_reports(list) → len(ok_reports)(int)
附加: PredictRequest mode 字段加 pattern 校验,与 DB 约束同源
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
|
2026-09-21 02:44:32 +08:00 |
|
shangfangjian
|
0a6af0657a
|
预测历史:比赛信息内嵌到预测API + 实际比分自动填充
后端:
- PredictionOut 新增 match 字段(内嵌比赛信息)
- list_predictions 返回完整比赛数据(日期/队名/赛果/主客徽标)
- 新增 _match_dict() 辅助函数序列化比赛对象
前端:
- 移除独立的 fetchMatches 调用,直接使用 p.match
- 实际比分自动从比赛赛果填充
- 显示:比赛日(M/D) + 主客队徽标 + 队伍中文名
- 赛后一键结算(使用比赛实际赛果)
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
)
|
2026-09-21 01:54:30 +08:00 |
|
shangfangjian
|
a9e85a5d62
|
修复定时任务更新接口:支持部分更新
PUT /schedules/{id} 原来要求完整 ScheduleIn(所有字段必传),
前端只传 {enabled} 时因缺少 task/cron 校验失败。
→ 新增 ScheduleUpdate schema(所有字段可选)
→ update_schedule 仅更新提供的字段
→ 使用最终值同步调度器
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
)
|
2026-09-21 01:45:19 +08:00 |
|
 shangfangjianandnew-provider/LongCat-2.0 <
|
7a4e61ebc4
|
定时任务操作添加点击反馈和文案提示
- 启用/禁用/立即执行/删除按钮添加 loading 状态(Spinner)
- 操作成功后显示绿色提示(如「已启用任务 xxx」)
- 操作失败后显示红色错误提示
- 按钮禁用期间防止重复点击
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
|
2026-09-21 01:42:17 +08:00 |
|
 shangfangjianandnew-provider/LongCat-2.0 <
|
0a5a14cbbb
|
采集任务支持手动触发 + 定时调度(cron)
后端:
- 新增 Scheduler + ScheduledTask 核心模块(croniter 解析 cron 表达式)
- 新增 Schedule 数据模型(alembic 0016)
- 新增 /api/v1/admin/schedules CRUD 接口
- lifespan 启动时注册默认定时任务并加载数据库配置
- 默认任务:每日比赛/积分榜/30分钟统计回填(默认禁用)
前端:
- 设置页新增「定时任务」管理区块
- 支持:新建/启用禁用/立即执行/删除定时任务
- 显示:任务ID、类型、cron表达式、上次执行时间/状态
依赖:新增 croniter>=2.0
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
|
2026-09-21 01:36:54 +08:00 |
|
shangfangjian
|
1fc799a5b0
|
预测历史:实际比分自动填充 + 显示比赛日/队伍/主客徽标
- 实际比分自动从比赛赛果填充,无需手动输入
- 比赛列显示:比赛日(M/D) + 主客队徽标 + 队伍中文名
- 状态分三类:待赛果(灰)/可结算(蓝)/已结算(绿)
- 一键结算按钮:仅当比赛有赛果且未结算时显示
- 结算后1X2自动判断命中(绿✓/红✗)
- 顶部新增统计概览:已结算数/命中数/1X2准确率
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
)
|
2026-09-21 01:21:05 +08:00 |
|
shangfangjian
|
f08fef8a22
|
预测管理改为预测历史页面
- 删除 Predictions.tsx,新建 PredictionHistory.tsx
- 不再支持触发预测(从主站比赛列表操作)
- 支持查看所有预测记录(全部/待标注/已结算筛选)
- 支持标注实际比分:行内编辑 + 保存,自动判断1X2是否命中
- 展开查看详情:预测比分/置信度/终裁意见/专家意见
- 侧边栏更名为「预测历史」,图标改为 logs
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
)
|
2026-09-21 01:17:14 +08:00 |
|
 shangfangjianandnew-provider/LongCat-2.0 <
|
857a21910b
|
侧边栏图标统一为线条SVG + hover品牌色过渡
- 新增 Icon 组件:8种线条风格 SVG 图标(collection/chart/target/repeat等)
- 统一 stroke-width:1.5,hover 加粗到 2
- hover 时颜色平滑过渡到品牌色(press red)
- 添加 .nav-icon 和 .nav-icon-wrap CSS 类
- 活跃/悬停态:opacity 0.5→1,stroke-width 1.5→2
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
|
2026-09-21 01:01:01 +08:00 |
|
shangfangjian
|
ad184e1b82
|
修复定位按钮无反应 + 增强高亮效果
- scrollIntoView 改用 requestAnimationFrame 确保 DOM 已更新
- 滚动位置改为 block: 'start',更可靠
- 高亮增加背景色变化(bg-press-wash/40),更明显
- 高亮持续时间延长至 5 秒
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
)
|
2026-09-21 00:48:39 +08:00 |
|
shangfangjian
|
83cc24e54b
|
健康摘要与联赛卡片联动
- 问题项新增「定位」按钮,点击滚动到对应联赛卡片
- 被定位的联赛卡片高亮显示(ring + scale),3秒后自动消失
- 健康摘要 → 联赛详情形成闭环操作
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
)
|
2026-09-21 00:44:19 +08:00 |
|
shangfangjian
|
7025338226
|
移除活跃Tab下划线渐变动画
- 删除 .nav-tab-active CSS 及 ::after 伪元素
- 移除 NavLink 中的 nav-tab-active 类名
- 活跃Tab仅保留左侧彩色竖条 + 背景高亮
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
)
|
2026-09-21 00:38:06 +08:00 |
|
shangfangjian
|
4ae61a5683
|
回到顶部按钮:滚动淡入 + 平滑滚动
- 滚动超过 300px 后按钮优雅淡入(translate-y + opacity 过渡)
- 点击后平滑滚动到顶部(behavior: smooth)
- 首页和积分榜页均添加
- 按钮隐藏时 pointer-events-none 防止误触
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
)
|
2026-09-21 00:23:56 +08:00 |
|
shangfangjian
|
a2dc2b07c5
|
Tab切换动画:横向轻扫+淡入 + 活跃Tab下划线渐变
- 活跃Tab下方添加墨色渐变下划线动画(从中心向两侧展开)
- 页面内容切换时横向轻扫+淡入效果(0.3s)
- 使用 key={location.pathname} 触发重新渲染动画
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
)
|
2026-09-21 00:19:31 +08:00 |
|
shangfangjian
|
930dfd184d
|
侧边栏恢复先知刊头,去掉ADMIN
- 顶部通栏不再显示先知,改为纯功能栏(面包屑/日期/状态/登出)
- 侧边栏顶部显示「先知」毛笔字
- 移除 ADMIN 标识
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
)
|
2026-09-20 23:47:44 +08:00 |
|
shangfangjian
|
9fb8e24be3
|
后台管理页面顶部改为通栏样式
- 顶部报眉通栏显示:先知(毛笔字) + 面包屑 + 日期 + 系统状态 + 登出
- 移动端汉堡按钮移至顶部通栏,用于切换侧边栏
- 侧边栏不再重复显示先知标题,仅保留 ADMIN 标识
- 布局从 sidebar+main 横向排列改为 header 通栏 + sidebar/main 下方排列
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
)
|
2026-09-20 23:44:21 +08:00 |
|
shangfangjian
|
81b1f48382
|
积分榜补全剩余分区翻译
新增:
- Champions League Qualification → 欧冠资格
- Qualification Playoffs → 资格附加赛
现已覆盖数据库中所有8种分区类型。
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
)
|
2026-09-20 23:34:52 +08:00 |
|
 shangfangjianandnew-provider/LongCat-2.0 <
|
730bc0de00
|
积分榜:补全所有分区中文翻译 + 防止换行
新增分区翻译:
- Europa Conference League → 欧协杯
- Championship / Promotion → 升级区
- Promotion Group → 升级组
- Relegation Group → 降级组
- Playoffs → 附加赛
- Championship Playoffs → 升级附加赛
- Qualification → 资格赛
修复:zoneBadge 添加 whitespace-nowrap,4字以上不换行
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
|
2026-09-20 23:32:05 +08:00 |
|
 shangfangjianandnew-provider/LongCat-2.0 <
|
078fc0c5dd
|
修正3队翻译为主流媒体通用译法
- Cardiff City: 加的夫城 → 加的夫
- Linfield FC: 林斯菲尔德 → 连菲尔德
- Shamrock Rovers: 沙姆罗克流浪者 → 沙姆罗克流浪
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
|
2026-09-20 23:26:16 +08:00 |
|
 shangfangjianandnew-provider/LongCat-2.0 <
|
5cbfe84ae6
|
修复队名翻译缺失:补全规范化队名映射
问题:normalize()返回的规范化名(带变音)在TEAM_NAME_ZH中找不到对应中文。
修复:补全以下规范化队名映射:
- 德语:Bayern München, FC Köln, Union Berlin, Mainz 05,
VfL Bochum, Werder Bremen
- 西语:Atlético Madrid, Leganés
- 法语:Olympique Marseille
- 诺维奇城 → 诺维奇(主流译法)
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
|
2026-09-20 23:22:07 +08:00 |
|
shangfangjian
|
05dd0a6dc4
|
积分榜分区标签英译中
- Champions League → 欧冠区
- Europa League → 欧联区
- Conference League / Conference League Qualification → 欧协杯
- Relegation → 降级区
- Relegation Playoffs → 降级附加赛
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
)
|
2026-09-20 23:11:23 +08:00 |
|
shangfangjian
|
95be59bc9f
|
去掉刊头下方副标题文案
- 首页移除「足球比分预测 · 五路专家 · 终裁汇总」
- 积分榜页移除「联赛积分榜 · 积分 / 净胜 / xG差 / 近期走势」
- 刊头仅保留「先知」毛笔字,更简洁
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
)
|
2026-09-20 23:01:13 +08:00 |
|
shangfangjian
|
8a8b71083e
|
毛笔字刊头加粗:笔触更粗更醒目
- 新增 .font-brush CSS 类:text-stroke + text-shadow 模拟粗笔触
- font-weight:700 叠加,无论 CDN 字体还是回退楷体都显粗
- 移动端 + PC 端刊头均应用
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
)
|
2026-09-20 22:57:29 +08:00 |
|
shangfangjian
|
9a21edf5c0
|
首页刊头改用毛体草书(刘建毛草)
- 引入国内可访问的 jsDelivr CDN 字体:Liu Jian Mao Cao(毛体草书)
- 通过 @font-face 注册,font-display:swap 避免阻塞
- 离线回退到系统楷体(KaiTi)
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
)
|
2026-09-20 22:33:09 +08:00 |
|
shangfangjian
|
130f41a31e
|
修复 CSS 加载超时:移除 Google Fonts 依赖
国内网络无法访问 Google Fonts,导致首页 CSS 加载超时(ERR_CONNECTION_TIMED_OUT)。
→ 移除 Google Fonts 外部字体链接
→ font-brush 回退到系统楷体(KaiTi / STKaiti),仍有书法韵味且零依赖
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
)
|
2026-09-20 22:25:03 +08:00 |
|
 shangfangjianandnew-provider/LongCat-2.0 <
|
d28203ac54
|
去掉首页和后台的 Profeto 字样
- 首页刊头仅保留「先知」毛笔字
- 后台侧边栏仅保留「先知」毛笔字
- 版本号简化为 v1.0
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
|
2026-09-20 22:20:53 +08:00 |
|
shangfangjian
|
4cda662d6e
|
首页「先知」刊头改用毛笔字艺术字体
- 引入 Google Fonts「Ma Shan Zheng」(马善政毛笔楷书)
- Tailwind 新增 font-brush 字体族
- 首页 + 积分榜页 + 后台侧边栏的「先知」均改为毛笔字
- 字号加大(text-5xl / text-6xl),去除 tracking,突出书法韵味
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
)
|
2026-09-20 22:18:05 +08:00 |
|
shangfangjian
|
9a65e81ab0
|
移动端比赛行布局放宽,保持比分绝对居中
- 水平内边距 px-1 → px-4
- 垂直内边距 py-3.5 → py-5
- 行间距 gap-2 → gap-3
- 主客队列间距 gap-2 → gap-4
- 队名字号 13px → text-sm, VS 字号 xs → text-sm
- 比分字号 lg → xl,更醒目
- 网格 grid-cols-[1fr_auto_1fr] 确保比分绝对居中
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
)
|
2026-09-20 22:12:16 +08:00 |
|
shangfangjian
|
53b638d282
|
修复移动端比赛行比分严格居中
从 flex + flex-1 改为 grid grid-cols-[1fr_auto_1fr]:
- 主队/客队各占 1fr,比分 auto 宽度居中
- 无论队名长短,比分始终在视觉中心
- 桌面端 sm:contents 恢复 grid 分列布局
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
)
|
2026-09-20 22:06:45 +08:00 |
|
 shangfangjianandnew-provider/LongCat-2.0 <
|
41109402a3
|
修复移动端比赛行队伍和比分居中
移动端原布局:主队/比分/客队垂直堆叠,比分区域仅 12px 宽,导致不居中。
改为:flex 单行居中布局,gap-3 均匀间距,主队右对齐 + 客队左对齐 + 比分居中。
桌面端保持原有 grid 布局不变。
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
|
2026-09-20 22:04:46 +08:00 |
|
 shangfangjianandnew-provider/LongCat-2.0 <
|
aaf9d38056
|
修复统计回填 ExecutionOption 错误
ingest_bzzoiro_event_stats 中 .options(select(Match.stats)) 用法错误:
.options() 期望 loader option(如 selectinload),不能传 select() 对象。
→ 改用 selectinload(Match.stats) 并补充 import。
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
|
2026-09-20 21:33:32 +08:00 |
|
 shangfangjianandnew-provider/LongCat-2.0 <
|
fb27f6e2d2
|
UI/UX 全面改进:22项优化落地(报纸风前端 + 管理后台)
P0 严重问题:
- 采集任务进度反馈:Collection 页新增任务状态跟踪(运行中/完成/失败) + 轮询 ingest 状态
- 积分榜加载态:切换联赛显示 spinner + 禁用 tab 防重复点击
- 数据完整性可操作:问题列表每项加「去修复」按钮,跳转采集页并预填参数
- 面包屑导航:顶部显示 仪表盘 > 当前页
P1 重要问题:
- 侧边栏当前页指示器:1.5px 圆点 → 4px 左侧彩色竖条 + 背景高亮
- Key Ring 重置确认:点击「重置冷却」前弹窗确认
- 预测比赛选择器:只显示未开赛 + 联赛筛选 + 显示可预测数量
- 表格移动端溢出:评估页表格加 overflow-x-auto
- 设置页合并:数据源 + LLM + 系统配置 → 统一「设置」页
- 预测按钮去重:移动端/桌面端合并为一个响应式按钮
P2 体验优化:
- 日志滚动保持:自动滚动仅当用户未向上滚动时
- 评估结果预览:显示「共 N 组」
- ⌘K 命令面板:键盘导航跳转所有管理页面
- 专家意见折叠:默认折叠,可展开(已存在)
- 版本信息:侧边栏底部显示 v1.0
- 积分榜表格:min-w 防止挤压
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
|
2026-09-20 21:24:21 +08:00 |
|
 shangfangjianandnew-provider/LongCat-2.0 <
|
dd538d66d7
|
首页:去掉日期选择器,顶部增加「进行中」比赛区块
- 移除日期选择器(今日按钮 + date input + 清除按钮)及相关 date 状态
- 顶部新增「进行中 · 实时比分」独立区块:红色脉冲圆点 + 主客比分
- 进行中区块仅在默认「未开赛」视图显示,切换已完赛/全部时隐藏
- 进行中数据独立请求(status=in_play,limit 20),不影响主列表逻辑
- 清理 todayStr(),改用 dateKey()统一日期格式化
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
|
2026-09-20 20:57:27 +08:00 |
|
 shangfangjianandnew-provider/LongCat-2.0 <
|
9d7f8dfeee
|
简化首页加载按钮:合并「显示后续」与「载入更多」为单一智能按钮
- 3 天视图且有折叠比赛时 →「显示后续 N 场未开赛」(展开)
- 展开全部后 / 非 3 天视图 →「载入更多赛程」(从服务器拉取下一页)
- 移除重复按钮,保留「收起」文字链接回 3 天视图
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
|
2026-09-20 20:52:25 +08:00 |
|
 shangfangjianandnew-provider/LongCat-2.0 <
|
acac856b61
|
修复积分榜入库 UniqueViolationError
根因:ingest_bzzoiro_standings 批量处理时逐行 SELECT 检查 Standing 是否存在,
但新 INSERT 的 Standing 未 flush 就被同批下一条 SELECT 判定为不存在,
导致同一 (league_id, season, team_id) 插入两次 → UniqueViolation。
修复:
- 预加载该 league+season 的所有已有 standings team_id 到内存 set
- 同批内按 team.id 去重,同一 team 仅处理一次
- 命中已有 standing 时 UPDATE,否则 INSERT 并立即加入 set 防止同批重复
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
|
2026-09-20 20:35:53 +08:00 |
|
 shangfangjianandnew-provider/LongCat-2.0 <
|
19f17145cc
|
feat: 首页未开赛默认展示未来 3 天,支持展开更多
- 新增 showAllUpcoming 状态,默认 false,仅渲染未来 3 天(今/明/后天)的未开赛
- 列表头显示「未来3天 N / 共 M 场」计数
- 「显示后续 N 场未开赛」按钮:展开全部已加载的未开赛
- 展开后提供「收起,仅显示未来 3 天」回退
- 切换联赛/状态时自动重置为 3 天视图
- 空态区分「未来3天暂无比赛」与「暂无赛程」
- 已完赛/全部状态不受影响,展示全部
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
|
2026-09-20 20:29:12 +08:00 |
|
 shangfangjianandnew-provider/LongCat-2.0 <
|
c586a38b3a
|
修复积分榜"body stream already read"错误
两个根因:
1. src/api/routes/standings 端点使用 func.max() 但未导入 func → NameError(500)
→ 在 matches.py 的 sqlalchemy 导入中加入 func
2. 前端 api.ts 错误处理中先调 res.json() 失败后回退 res text(),
但 Response body 流只能读一次 → "body stream already read"
→ 改为先 res.text() 再 JSON.parse(),避免重复读取
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
|
2026-09-20 20:05:40 +08:00 |
|
 shangfangjianandnew-provider/LongCat-2.0 <
|
f52ec8b963
|
feat: bzzoiro 多 API Key 轮换,遇限流自动切换
新增 KeyRing 轮换环(src/data/key_ring.py):
- 支持逗号/分号/换行分隔多个 key,单 key 场景零开销
- 遇到 429 自动标记当前 key 冷却(默认 60s)并立即切换到下一个 key
- 全部 key 冷却时等待最早恢复的 key,避免无谓重试
- 热更新 key 列表(增删 key 无需重启)
- 进程级单例,按 base URL 隔离
后端集成:
- bzzoiro._fetch_json_async 接入 KeyRing,429 立即轮换(不等待)
- 新增 /admin/keyring/status 端点展示 key 环状态
- 新增 /admin/keyring/cooldown/reset 紧急重置冷却
- BZZOIRO_KEY 配置描述提示多 key 支持
- mask_value 多 key 显示数量(如 "3 个 key(末段 …XXXX)")
- 清理已移除 injuries 的 API_FOOTBALL_KEY 配置项
前端:
- 数据源页新增 Key Ring 状态面板(每个 key 可用/冷却状态 + 重置按钮)
- 配置项脱敏展示支持多 key 计数
测试: 新增 24 个 KeyRing 单元测试 + 2 个 bzzoiro 轮换集成测试,全部通过。
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
|
2026-09-20 19:40:20 +08:00 |
|
 shangfangjianandnew-provider/LongCat-2.0 <
|
f05dc1ae15
|
refactor: 以 bzzoiro 为唯一数据源的全面重构
数据源统一为 bzzoiro,移除 Understat 与 injuries:
- 删除 src/data/understat.py / injuries.py 及相关测试
- 删除 injuries 模型与表;扩展 match_stats(xG 之外增加 big_chances/fouls)
- 新增 standings 表(联赛积分榜:位置/积分/xG/走势/分区)
- matches 表增加 source_event_id 血缘列,支撑统计回填
采集管线(bzzoiro 三条管线):
- events:赛程/比分(/events/),记录 source_event_id
- standings:积分榜快照(/leagues/{id}/standings/)
- stats:已完赛比赛详细统计回填(/events/{id}/stats/)
预测增强:
- standings_slice 替代 injuries_slice;积分榜专家替代阵容完整性专家
- AGENT_META runtime_config 同步更新
管理后台:
- ingest 路由重写为单一 bzzoiro 入口 + task 参数(events/standings/stats/all)
- 新增 /admin/data-completeness 数据完整性分析 API
- 数据源状态页简化为 bzzoiro 单源
前端:
- 采集页重构为任务驱动(比赛/积分榜/统计回填/全量)
- 新增「数据完整性」可视化页(覆盖率矩阵/字段完整率/健康摘要)
- 新增主站积分榜页(/standings)与比赛详情完整统计面板
- agent 名称同步更新(injuries→standings)
迁移 0015_bzzoiro_single_source 已在容器内验证通过,后端测试全部通过。
Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
|
2026-09-20 19:13:07 +08:00 |
|
shangfangjian
|
ec8f36abb2
|
fix: 主站页面修复 + 新增文件
- App.tsx: 路由和布局修复
- index.css: 样式修复
- Matches.tsx: 比赛列表页修复
- .zcodeignore: 新增忽略配置
- tests/ui_audit.py: UI 审计测试脚本
|
2026-09-20 08:45:35 +08:00 |
|
shangfangjian
|
78375d6e39
|
fix: 管理后台页面修复
- AdminLayout: 侧边栏布局和导航修复
- dal.ts: 数据访问层 API 调用修复
- Dashboard: 仪表盘统计卡片和数据加载修复
- Backtest: 回测配置和结果展示修复
- LLMConfig: LLM 配置页面修复
- Predictions: 预测管理页面修复
|
2026-09-20 08:45:27 +08:00 |
|
shangfangjian
|
7b1457f0db
|
fix: 后端 API 修复
- deps.py: 依赖注入优化
- matches.py: 比赛列表查询修复
- predict.py: 预测接口参数校验修复
- orchestrator.py: 多 Agent 编排逻辑修复
|
2026-09-20 08:45:19 +08:00 |
|
shangfangjian
|
8e6ad5394e
|
fix:批量修复了一些问题
|
2026-09-19 22:51:35 +08:00 |
|
shangfangjian
|
786f10aa11
|
feat: 核心模块增强 — 加密 + 运行时配置 + 日志缓冲
- crypto.py: API Key 加密/解密工具
- runtime_config.py: 运行时动态配置管理
- log_buffer.py: 内存日志缓冲区
- config.py: 新增加密配置项
- http_client.py: 增强重试和错误处理
|
2026-09-19 11:58:03 +08:00 |
|
shangfangjian
|
cf0751d1ff
|
feat: 管理界面报刊风统一改造 — 移除独立暗色主题,预测/回测/监控/配置页增强
|
2026-09-18 10:42:14 +08:00 |
|
shangfangjian
|
91e406f5ee
|
feat: 管理界面优化 — 移动端自适应 + 数据源 + LLM 配置
移动端自适应:
- AdminLayout: 汉堡菜单 + 可折叠侧边栏 + 遮罩层 + ESC 关闭
- 所有页面响应式布局 (grid-cols-1 sm:grid-cols-2 lg:grid-cols-4)
- 触摸友好按钮 (min-h-[44px])
- 表格移动端卡片视图
新增页面:
- DataSources: 数据源状态 + API Key 脱敏 + 测试连接
- LLMConfig: LLM 配置 + 测试连接 + 使用统计 + 最近预测
增强功能:
- Config: 配置列表 + 修改指南 + 快捷导航
- types: 新增 DataSourceStatus, LLMUsageStats 等类型
- dal: 新增 testDataSource, fetchDataSourceStatuses, testLLMConnection 等
|
2026-09-17 02:43:44 +08:00 |
|
shangfangjian
|
6680da7d61
|
fix: 修复 Admin 后台多个 bug
- api.ts: 修复 URL 拼接 bug(缺少 API_BASE) 和 204 判断逻辑
- dal.ts: 修复 fetchDashboard 类型错乱,修正 API 端点
- types.ts: 对齐后端 Pydantic 模型
- 所有页面: Badge variant→status, CardHeader children→action
- 移除不存在的后端端点调用
|
2026-09-17 02:11:50 +08:00 |
|
shangfangjian
|
d3284c48c3
|
feat: 后台管理 Admin 仪表盘
新增完整的后台管理系统 (/admin):
- Dashboard: 系统概览、最近采集状态、预测统计
- Collection: 数据采集触发(bzzoiro/understat/injuries)
- Predictions: 预测历史查看、触发新预测
- Backtest: 回测配置与结果查看
- Monitoring: 系统健康、错误日志、死色队列
- Config: API Key 与数据源配置
技术栈: React Router + Tailwind 暗色主题 + TypeScript
文件: 11 个新文件, +21KB JS / +5KB CSS
|
2026-09-17 02:00:14 +08:00 |
|
shangfangjian
|
1219b4fd18
|
fix: alembic version_num 长度修复 + 前端部署配置
- env.py: 自动创建 alembic_version 表时使用 VARCHAR(255) 避免截断
- docker-compose: 添加 frontend nginx 服务 + alembic 挂载
- nginx.conf: SPA 路由 + API 代理
|
2026-09-17 01:26:58 +08:00 |
|
shangfangjian
|
312778d995
|
feat: 数据管线架构优化 + 前端部署配置
- Bronze 层 RawEvent 表(原始事件存档)
- IngestFailure 死信表(失败持久化+重试)
- DataQualityCheck 数据质量监控
- DataLineage 血缘追踪
- MatchStats xG 追踪字段
- Nginx 前端服务配置
|
2026-09-17 01:15:51 +08:00 |
|
shangfangjian
|
ff0045ad93
|
fix: 数据库与数据管线 6 个 P1 + 5 个 P2 审查问题修复
P1-1 [context_builder] build_context 共享 session,切片函数传 db 参数,
回测 20 场并发连接需求从 100+ 降至每场 1 个
P1-2 [bzzoiro] 预加载改为按 raw_events 日期范围 ±30 天按需加载
P1-3 [understat] 批量查询球队 + 比赛,从 1140 次往返降到 3 次
P1-4 [injuries] 批量幂等检查 + 分批 flush,IntegrityError 逐条回退
P1-5 [predict] 删除 threading.Lock,dict 操作原子无需同步锁
P1-6 [models] 添加 (match_id, provider, model) 唯一约束 + 迁移
P2-1 [unit_of_work] get_uow 返回类型改为 AsyncIterator[AsyncSession]
P2-2 [normalize] _parse_date 失败时记录 warning 避免静默丢数据
P2-3 [repositories] find_by_teams_and_date 改用 match_date_date 等值匹配
P2-4 [migration] 幽灵列 cutoff_at 已在 0006 迁移删除(已有)
P2-5 [migration] injuries 约束命名对齐 ORM,UniqueConstraint → 唯一索引
|
2026-09-16 03:09:39 +08:00 |
|
shangfangjian
|
983b620659
|
refactor: fix P0/P1/P2 security and performance issues
P0 fixes:
- CORS: replace wildcard methods/headers with configurable lists
- deps.py: remove unsafe global _warned_unset variable
P1 fixes:
- http_client: read default timeout from Settings
- bzzoiro: replace sync urllib with async httpx
- bzzoiro: normalize validation failures use warning level only
- db pool: read pool config from Settings (default 5+10)
- backtest: add asyncio.Semaphore(8) for concurrent execution
- predict/context_builder: add backtest parameter for cutoff buffer
P2 improvements:
- injuries: enforce int conversion for player_id/fixture_id
- injuries: use system temp dir for cache
- utils.py: extract shared actual_1x2/is_correct_1x2
- validation: downgrade 1x2 mismatch log to debug
- docker-compose: use env vars for all credentials
- .env.example: add POSTGRES_USER/PASSWORD/PORT, API_PORT
|
2026-09-16 02:38:25 +08:00 |
|
shangfangjian
|
fa69795d69
|
fix: 应用代码审查三项发现
- frontend: .tab 补 position:relative,修复激活 tab 下划线定位缺失定位上下文
- core/retry.py: 删除全项目零调用的重试模块(避免"看似生效实际未接入"的误判)
- llm/validation.py: KNOWN_AGENT_NAMES 改为从 orchestrator.SPECIALIST_SPECS 派生,单一权威源
|
2026-09-15 20:12:47 +08:00 |
|
shangfangjian
|
60e4b89822
|
docs: 统一文档与代码一致性
- 修复所有 confidence → subjective_confidence 残留(03-api, 04-agents, 05-data, 07-development)
- 修复 5 张表 → 6 张表残留(06-deployment)
- 同步 API schema 示例与实际模型一致
- 更新 predictions 表结构文档(新增 status/cutoff/input_hash 字段)
code: 修复 API 异常处理(eval/predict)和 context_builder stats 时间过滤
|
2026-09-15 02:27:48 +08:00 |
|
shangfangjian
|
0980c2242a
|
feat: P0-02/P0-03/P0-05 数据库时间语义与约束
P0-02: MatchStats 增加 source/source_record_id/retrieved_at/available_at
context_builder 过滤统计数据时检查 available_at <= cutoff
P0-03: Prediction 增加 match_kickoff_at/prediction_created_at/prediction_cutoff_at
明确区分比赛时间/预测创建时间/数据截止时间
P0-05: Prediction 增加 status 字段(success/failed/degraded)
数据库 CHECK 约束
Alembic: 0005_prediction_status_and_stats_provenance
P1-02: injuries as_of 不再截断为 date,保持 datetime 精度
|
2026-09-15 02:04:25 +08:00 |
|
shangfangjian
|
c657e04679
|
docs: 同步文档与实现一致性
- 5 张表 → 6 张表(添加 injuries)
- 同步所有 docs 和 models.py docstring
|
2026-09-15 01:44:49 +08:00 |
|
shangfangjian
|
98e3d07cf5
|
fix: 补充 Alembic 迁移 + bzzoiro 批量优化 + validation 兼容层
- 新增 0004_snapshot_and_constraints.py: 重命名 confidence → subjective_confidence,
新增 cutoff_at/input_hash, 添加 CHECK 约束
- bzzoiro.py: 预加载完整 Match 对象到内存,更新路径不再重复查询
- validation.py: 旧字段 confidence 兼容并打 deprecation 日志
|
2026-09-15 01:42:52 +08:00 |
|
shangfangjian
|
2c205c68b1
|
fix: 修复剩余审查问题
- ingest.py: 异常不再暴露客户端,改为通用错误消息+日志记录
- bzzoiro.py: 修复 normalize 重复调用,改为一次遍历缓存结果
- understat.py: 使用 Repository 替代原始 SQL
|
2026-09-15 01:26:15 +08:00 |
|
shangfangjian
|
53e602b4f6
|
fix: 代码审查问题修复
- unit_of_work.py: 简化为纯 session 上下文管理器,消除 double-close 风险
- validation.py: 移除未使用的 import,简化 _score_to_1x2 逻辑
- repositories.py: 将 func 导入移到模块顶层
- 更新所有 get_uow() 调用点使用新接口(yield session 而非 uow 对象)
|
2026-09-15 01:18:35 +08:00 |
|
shangfangjian
|
74586aa5b7
|
docs: 更新 README 反映当前架构
- 更新架构图(添加分层架构、backtest 端点)
- 更新项目结构(添加 unit_of_work.py、repositories.py、backtest.py)
- 更新核心模块表
- 添加数据正确性保障章节
- 修正表数量(6 张表)
- confidence → subjective_confidence
|
2026-09-15 00:48:43 +08:00 |
|
shangfangjian
|
483cb956ba
|
refactor: Sprint 3 - 引入 UnitOfWork + Repository 架构
新增:
- src/db/unit_of_work.py: UnitOfWork 事务封装
- src/db/repositories.py: Match/Team/League/Prediction Repository
重构:
- 删除 src/data/match_lookup.py(由 Repository 替代)
- 数据源(bzzoiro/understat/injuries)不再自行 commit
- API 路由(ingest)改用 UnitOfWork
- LLM 服务(predict/orchestrator/eval/backtest)改用 UnitOfWork
事务边界统一由调用方控制,数据层不再自行决定 commit。
|
2026-09-15 00:42:05 +08:00 |
|
shangfangjian
|
cb36dc3ef9
|
feat: Sprint 2 - 概率语义 + 轻量快照 + 数据库约束
P0-05: confidence → subjective_confidence 改名(15 文件)
LLM 主观置信度与概率分离
P0-02: predictions 增加 cutoff_at + input_hash(轻量快照)
MatchContext 暴露 match_dt
单/多 Agent 路径均记录快照元数据
P2-05: 数据库 CHECK 约束
- pred_home_goals >= 0
- pred_away_goals >= 0
- subjective_confidence 0~1
- pred_1x2 IN (1,X,2)
- mode IN (single,multi)
P2-06: limit 分页约束(ge=1, le=200)
P2-01: 新增 /health/ready 就绪检查
|
2026-09-15 00:14:24 +08:00 |
|
shangfangjian
|
f3160e3062
|
feat: Sprint 1 - 数据正确性整改
P2-01: 移除 lifespan create_all,改为仅验证连接
新增 /health/ready 就绪检查
P0-04: LLM 输出严格 Pydantic 校验
- Agent 输出越界/非法 → parse_error
- 预测输出自动修正 1X2 与比分一致性
P0-01: injuries cutoff 修复
- get_injuries_for_match 增加 as_of 参数
- injuries_slice 使用 as_of 过滤 retrieved_at
- 防止回测时未来采集数据泄漏
P1-12: 批量入库优化
- 预加载 teams 到内存 dict
- 预加载 existing matches 到内存 set
- 消灭 N+1 查询
|
2026-09-14 23:36:35 +08:00 |
|
shangfangjian
|
9b44905192
|
chore: gitignore AI 助手上下文文件
|
2026-09-14 22:09:45 +08:00 |
|
shangfangjian
|
c2b8a37bdd
|
Revert "docs: 建立多 Agent 协同架构"
This reverts commit f50784f9dc.
|
2026-09-14 22:09:28 +08:00 |
|
shangfangjian
|
f50784f9dc
|
docs: 建立多 Agent 协同架构
4 个专业 Agent 协同:
- DBA: 数据库 schema、迁移、模型
- FE: 前端 React 界面
- BE: 后端 API、LLM 预测、数据采集
- Ops: 部署、Docker、配置
详见 docs/AGENTS.md 和各 Agent 上下文文件
|
2026-09-14 21:59:45 +08:00 |
|
shangfangjian
|
3071ffd533
|
feat: 前端 Error Boundary + 体验改进
- 新增 ErrorBoundary 组件: 捕获组件崩溃,显示友好错误页+重试按钮
- App: 用 ErrorBoundary 包裹,标题改为「先知 Profeto」
- Matches 页面:
- 预测模式切换 (单次/多 Agent)
- 加载中动画指示
- 预测中状态提示
- 错误提示可关闭
|
2026-09-09 21:58:57 +08:00 |
|
shangfangjian
|
494751bbb0
|
feat: 数据采集健壮性改进
- 新增 src/core/retry.py: 指数退避 + 抖动的重试装饰器
- bzzoiro: 改进重试逻辑
- 429/5xx/网络错误均触发指数退避重试
- 4xx 直接抛(不重试)
- understat: 新增重试(原无重试)
- injuries: 新增重试 + 文件缓存 7 天过期
- sources.py: 延迟导入修复循环导入
|
2026-09-09 21:47:56 +08:00 |
|
shangfangjian
|
1166a157ec
|
feat: 添加回测框架
- 新增 src/llm/backtest.py: 回测核心逻辑
- 查询历史已完赛比赛
- 逐场预测(自动防未来信息泄漏)
- 实际比分回填 + 统计
- 1X2 准确率 / 比分 RMSE / 置信度校准
- 新增 POST /api/v1/backtest 路由
- 支持按联赛/日期范围/模式/模型筛选
|
2026-09-09 21:39:56 +08:00 |
|
shangfangjian
|
9c24b5f744
|
docs: 移除 MatchPro 对比,加入项目中文名「先知」
|
2026-09-09 02:23:02 +08:00 |
|
shangfangjian
|
d9b1c3aeb5
|
docs: 完善 README 文档
|
2026-09-09 02:17:47 +08:00 |
|
shangfangjian
|
0a27b18c27
|
feat: 足球 LLM 预测服务初始提交
Profeto — 给 LLM 提供数据,让 LLM 预测足球比分。
核心模块:
- FastAPI 后端 + PostgreSQL (SQLAlchemy async)
- 多 Agent LLM 预测 (5 专家 + 终裁)
- 数据采集 (bzzoiro / understat / injuries)
- React 前端 (Vite + Tailwind)
包含:
- 数据源抽象 (DataSource 协议 + 注册表)
- Alembic 数据库迁移
- Prompt 模板 (单/多 Agent)
- 核心路径单元测试
|
2026-09-09 02:10:47 +08:00 |
|