日期2026-04-12项目FinAgentFastAPI 后端 React/Vite 前端1. 摘要今日工作集中在本机 Ollama 与 LangChain 调用出现 502 的根因修复、单股分析异步入队与任务中心/报告中心历史接口闭环、历史列表按用户隔离与真实删除落盘、任务状态中文展示以及单股分析日期默认当天且禁止选择未来日的前端约束。配套补充了GET /api/history按当前用户过滤、DELETE /api/analysis/tasks/{task_id}删除状态与报告文件、以及若干 pytest 用例。2. 背景与目标本机已启动 Ollama 且已拉取模型时分析师子图仍报「LLM 调度失败…502」需区分误走公网 OpenAI与httpx 走系统代理导致本机 11434 异常。单股分析创建后应进入任务中心未完成显示进行中结束后已完成/失败任务中心与报告中心依赖/api/history且每次进入页面重新拉取。报告列表删除应删除磁盘上的 state/report刷新后不再出现历史任务仅展示当前登录用户创建的分析。界面状态展示使用中文如「进行中」「已完成」与后端英文枚举并存。单股分析分析日期默认当天且不可选当天之后的日期。3. 交付物与变更清单3.1 后端LLM 工厂与本机 Ollama文件/模块说明backend/app/core/config.pyexplicit_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_envFalse)规避 Windows 系统代理把127.0.0.1流量导向代理导致5023.2 后端异步任务、历史、鉴权与删除文件/模块说明backend/app/api/routes/analysis.pyPOST /api/analysis/tasks先落盘 running user_idBackgroundTasks异步执行execute_analysis_langgraph_task(..., preseededTrue)GET报告/状态/结果前_assert_task_ownedDELETE /api/analysis/tasks/{task_id}校验归属后delete_task_filesPOST /api/analysis传入owner_user_idbackend/app/workflows/langgraph/runner.pyexecute_analysis_langgraph_task支持preseeded、owner_user_id成功/失败落盘均携带user_id异常路径failed不写报告文件backend/app/workflows/analysis_workflow.pyrun_analysis_workflow(..., owner_user_id...)透传backend/app/repositories/history_repository.pylist_analysis_history(user_id...)仅payload.user_id与当前用户一致的任务无user_id的旧文件不入列表backend/app/api/routes/history.pyGET /api/history传入user.idbackend/app/services/storage.pydelete_task_artifacts(task_id)删除mvp_tasks与langgraph_states下同 id 文件backend/app/repositories/task_repository.pydelete_task_files封装backend/app/models/schemas.pyAnalysisTaskState.user_idTaskHistoryItem等保持与前端契约一致3.3 前端任务流、历史、展示与日期文件说明frontend/src/services/tasksApi.tsgetTaskState、waitForTerminalTaskStatus含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.tsdeleteTask→DELETE /api/analysis/tasks/...frontend/src/utils/taskStatus.tstaskStatusToLabel、TASK_STATUS_FILTER_OPTIONS3.4 测试文件说明backend/tests/test_mvp_api.py异步任务返回running后后台 mock 成功、failed 无报告结果、GET /api/historymock、DELETE调用删除封装各 mock state 补充user_id: 1与鉴权路径一致4. 踩坑与结论简表现象原因处理Ollama 可用仍502urllib 探测正常全局OPENAI_API_KEY存在且未配 base URL 时请求打到公网或httpxtrust_envTrue走系统代理本机流量经代理返回 502未显式 base 时优先本机 OllamaOllama 端口使用trust_envFalse的 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 typedate的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. 验证建议可复现本机 LLM不设FINAGENT_OPENAI_BASE_URL、仅本机 Ollama 时启动单股分析确认不再稳定出现502若需强制公网设FINAGENT_AUTO_LOCAL_OLLAMA0并显式配置 base URL。任务流登录后发起单股分析 → 任务中心可见进行中→ 完成后为已完成切换侧栏「任务中心/分析报告」应重新请求/api/history。删除报告列表点删除 → 刷新页面该项应不再出现对应data/processed/langgraph_states/{task_id}.json与mvp_tasks/{task_id}.json应已删除。用户隔离换账号登录应看不到上一账号任务新创建任务均带user_id。分析日期打开单股分析日期默认为当天日期控件无法选择未来日。7. 小结今日完成了本机 Ollama 与 OpenAI 兼容栈在 Windows 代理环境下的稳定调用、分析任务异步化与历史 API 闭环、按用户隔离与真实删除以及状态与日期交互的中文化/日历约束使演示路径更接近「多用户、可审计、可清理」的本地产品形态。FinAgent 项目实训进度记录 · weekly-cjw · report2