当前位置: 首页 > news >正文

FinAgent 本周进度记录|本机 LLM 联调、任务中心/历史、按用户隔离与单股日期约束

日期:2026-04-12
项目:FinAgent(FastAPI 后端 + React/Vite 前端)


1. 摘要

今日工作集中在本机 Ollama 与 LangChain 调用出现 502 的根因修复单股分析异步入队与任务中心/报告中心历史接口闭环历史列表按用户隔离与真实删除落盘任务状态中文展示,以及单股分析日期默认当天且禁止选择未来日的前端约束。配套补充了GET /api/history按当前用户过滤、DELETE /api/analysis/tasks/{task_id}删除状态与报告文件、以及若干 pytest 用例。


2. 背景与目标

  • 本机已启动 Ollama 且已拉取模型时,分析师子图仍报「LLM 调度失败…502」:需区分误走公网 OpenAIhttpx 走系统代理导致本机 11434 异常

  • 单股分析创建后应进入任务中心,未完成显示进行中,结束后已完成/失败;任务中心与报告中心依赖/api/history,且每次进入页面重新拉取

  • 报告列表删除应删除磁盘上的 state/report,刷新后不再出现;历史任务仅展示当前登录用户创建的分析。

  • 界面状态展示使用中文(如「进行中」「已完成」),与后端英文枚举并存。

  • 单股分析分析日期默认当天,且不可选当天之后的日期


3. 交付物与变更清单

3.1 后端:LLM 工厂与本机 Ollama

文件/模块

说明

backend/app/core/config.py

explicit_llm_base_url_from_env()auto_local_ollama_when_no_base()FINAGENT_AUTO_LOCAL_OLLAMA,默认开启);llm_base_url()语义保持

backend/app/core/llm.py

未显式配置 base URL 时优先探测本机 Ollama,避免仅因环境变量存在OPENAI_API_KEY就固定请求api.openai.com11434路径自动补/v1;对 Ollama 使用httpx.Client/AsyncClient(trust_env=False),规避 Windows 系统代理把127.0.0.1流量导向代理导致502

3.2 后端:异步任务、历史、鉴权与删除

文件/模块

说明

backend/app/api/routes/analysis.py

POST /api/analysis/tasks先落盘 running + user_idBackgroundTasks异步执行execute_analysis_langgraph_task(..., preseeded=True)GET报告/状态/结果前_assert_task_ownedDELETE /api/analysis/tasks/{task_id}校验归属后delete_task_filesPOST /api/analysis传入owner_user_id

backend/app/workflows/langgraph/runner.py

execute_analysis_langgraph_task支持preseededowner_user_id;成功/失败落盘均携带user_id;异常路径failed不写报告文件

backend/app/workflows/analysis_workflow.py

run_analysis_workflow(..., owner_user_id=...)透传

backend/app/repositories/history_repository.py

list_analysis_history(user_id=...)payload.user_id与当前用户一致的任务;无user_id的旧文件不入列表

backend/app/api/routes/history.py

GET /api/history传入user.id

backend/app/services/storage.py

delete_task_artifacts(task_id):删除mvp_taskslanggraph_states下同 id 文件

backend/app/repositories/task_repository.py

delete_task_files封装

backend/app/models/schemas.py

AnalysisTaskState.user_idTaskHistoryItem等保持与前端契约一致

3.3 前端:任务流、历史、展示与日期

文件

说明

frontend/src/services/tasksApi.ts

getTaskStatewaitForTerminalTaskStatus(含onStatus回调)供单股页轮询

frontend/src/pages/SingleStockAnalysisPage.tsx

创建任务后轮询至终态再取结果;状态 pill 使用taskStatusToLabellocalTodayISO/localDateISO默认当天、max与 onChange 钳位禁止未来日

frontend/src/App.tsx

任务中心/分析报告页条件挂载,每次进入重新请求历史

frontend/src/pages/ReportPage.tsx

进入时loadReportsdeleteTask调后端删除;列表状态中文;仅succeeded可查看/下载/批量导出

frontend/src/pages/TaskCenterPage.tsx

状态中文;筛选下拉的展示文案中文化(value 仍为英文)

frontend/src/services/historyApi.ts

deleteTaskDELETE /api/analysis/tasks/...

frontend/src/utils/taskStatus.ts

taskStatusToLabelTASK_STATUS_FILTER_OPTIONS

3.4 测试

文件

说明

backend/tests/test_mvp_api.py

异步任务返回running后后台 mock 成功、failed 无报告结果、GET /api/historymock、DELETE调用删除封装;各 mock state 补充user_id: 1与鉴权路径一致


4. 踩坑与结论(简表)

现象

原因

处理

Ollama 可用仍502(urllib 探测正常)

全局OPENAI_API_KEY存在且未配 base URL 时请求打到公网;或httpxtrust_env=True走系统代理,本机流量经代理返回 502

未显式 base 时优先本机 Ollama;Ollama 端口使用trust_env=False的 httpx 客户端

任务中心刷新后删除项仍在

前端仅本地filter,未删落盘

实现DELETE /api/analysis/tasks/{task_id}并删除state + report两个 JSON

用户 A 看到用户 B 的历史

历史扫描全目录

state 写入user_idlist_analysis_history按用户过滤;读接口_assert_task_owned

user_id的旧任务出现在列表

历史无法归因

跳过user_id的落盘(需重新跑分析或手工补字段才能纳入本人历史)

分析日期需约束为「不晚于今天」

硬编码演示日期易误导

input type="date"max+ onChange/payload钳位,默认localTodayISO()


5. 涉及路径速查

FinAgent/ ├─ backend/app/core/llm.py ├─ backend/app/core/config.py ├─ backend/app/api/routes/analysis.py ├─ backend/app/api/routes/history.py ├─ backend/app/repositories/history_repository.py ├─ backend/app/repositories/task_repository.py ├─ backend/app/services/storage.py ├─ backend/app/workflows/langgraph/runner.py ├─ backend/app/workflows/analysis_workflow.py ├─ backend/app/models/schemas.py ├─ backend/tests/test_mvp_api.py ├─ frontend/src/pages/SingleStockAnalysisPage.tsx ├─ frontend/src/pages/TaskCenterPage.tsx ├─ frontend/src/pages/ReportPage.tsx ├─ frontend/src/App.tsx ├─ frontend/src/services/tasksApi.ts ├─ frontend/src/services/historyApi.ts ├─ frontend/src/utils/taskStatus.ts └─ docs/weekly-cjw/report2.md # 本文

6. 验证建议(可复现)

  1. 本机 LLM:不设FINAGENT_OPENAI_BASE_URL、仅本机 Ollama 时启动单股分析,确认不再稳定出现502;若需强制公网,设FINAGENT_AUTO_LOCAL_OLLAMA=0并显式配置 base URL。

  2. 任务流:登录后发起单股分析 → 任务中心可见进行中→ 完成后为已完成;切换侧栏「任务中心/分析报告」应重新请求/api/history

  3. 删除:报告列表点删除 → 刷新页面,该项应不再出现;对应data/processed/langgraph_states/{task_id}.jsonmvp_tasks/{task_id}.json应已删除。

  4. 用户隔离:换账号登录,应看不到上一账号任务(新创建任务均带user_id)。

  5. 分析日期:打开单股分析,日期默认为当天;日期控件无法选择未来日


7. 小结

今日完成了本机 Ollama 与 OpenAI 兼容栈在 Windows 代理环境下的稳定调用分析任务异步化与历史 API 闭环按用户隔离与真实删除以及状态与日期交互的中文化/日历约束,使演示路径更接近「多用户、可审计、可清理」的本地产品形态。


(FinAgent 项目实训进度记录 · weekly-cjw · report2)

http://www.jsqmd.com/news/636371/

相关文章:

  • SQL索引策略深度解析:从理论到实战的优化指南
  • Spring IOC 源码学习 事务相关的 BeanDefinition 解析过程 (XML)感
  • 在集群作业中激活 conda 环境
  • 告别LabelImg!用Roboflow一站式搞定图片标注、增强与数据集管理
  • 银河麒麟 aarch64 大数据 Excel 导入:常见问题与优化思路分享
  • 多商户平台小程序的核心功能有哪些?
  • BiRefNet高分辨率二分图像分割:5分钟快速上手指南
  • 大模型下半场:2026年的五个关键预测
  • 深度学习理论框架:六周掌握核心技能
  • 4.14
  • Internet Archive Downloader:3步突破数字图书馆借阅限制的终极指南
  • 遥感图像智能分析:基于PyTorch的变化检测框架深度解析
  • 内存测试指标和工具
  • 一个简洁易用的 Delphi JSON 封装库,基于 System.JSON`单元封装,提供更直观的 API浅
  • 4.15
  • Z-Image-Turbo-辉夜巫女快速上手:8步生成动漫美图,新手5分钟搞定
  • iPad+向日葵远程控制:通过降级安装旧版向日葵11.2.2解决键盘快捷键失效问题(附罗技K380适配方案)
  • JasperReport 6.16 报表开发实战:Table组件与Dataset数据源的高效整合
  • B站资源下载终极指南:跨平台BiliTools使用全攻略
  • Intv_AI_MK11算法优化实战:改进模型推理效率的常用策略
  • 别再手动切文档了!用Dify 2.0的‘知识管道’流水线,5分钟搞定复杂PDF的RAG知识库搭建
  • 低代码平台新引擎:Dify集成Phi-4-mini-reasoning构建专属AI工作流
  • 如何彻底解决OCR文本重复问题:DeepSeek-OCR的NGram重复检测机制全解析
  • intv_ai_mk11应用场景:高校教师备课辅助——课程简介、思考题、知识点总结
  • FDAF/PFDAF
  • 4.16
  • 3步实现Chrome浏览器与KeePass密码库无缝同步
  • 20253317 孙晓东实验二《Python程序设计》实验报告
  • 3步解锁AI视频解说:NarratoAI让每个人都能成为专业内容创作者
  • 建议收藏:新手小白学习人工智能,推荐哪些入门书籍和课程?适合零基础的有哪些?