4.4 KiB
Web AI Optimize Fallback and Automatic Hermes Analysis — 2026-05
Context
BOSS reported two UX problems in the local xianyu-hunter Web UI:
- 新建任务/任务编辑里的“AI 润色/AI 优化”提示
AI不可用,容易误以为功能坏了。 - Hermes 分析需要手动点“执行分析”,BOSS 希望采集完成后自动分析、自动通知。
Root Cause
The local fork intentionally runs in Hermes-main-control mode and does not require project-level AI API configuration. /api/tasks/optimize already caught chatCompletion() failures and returned a local fallback task, but the frontend text said AI不可用,已用本地规则优化, which surfaced the expected no-AI state as an error.
Hermes analysis existed as POST /api/tasks/:id/analyze, but TaskManager.startTask() ended after local detail collection. No automatic analysis/report/notification was triggered from the normal run pipeline.
Implemented Shape
- Rename Web copy from “AI 优化” to “任务智能润色”.
- Keep
/api/tasks/optimizeAPI compatible, but treat local fallback as a successful no-configuration path. - Frontend fallback text:
已用本地规则优化(无需配置 AI). - Add task config flags:
autoAnalyze: trueby default.autoNotify: trueby default.
- Add visible task form checkboxes:
采集完成后自动执行 Hermes 分析分析后按通知设置自动推送
- After
_runPipeline()completes and task is not stopped, call_runAutoAnalysis()before setting stage tocompleted. _runAutoAnalysis():- Skips if
autoAnalyze === false. - Skips if no
products.fineFilteredcandidates. - Calls
analyzeTask()withlimit=maxItems. - Calls
renderAnalysisMarkdown()and persistssummary.reportPath. - Calls
sendNotifications()unlessautoNotify === false. - Logs success/skip/failure into task logs.
- Skips if
Files Touched
server.mjs
lib/task.mjs
public/app.js
public/index.html
Verification Commands
cd /Users/chick/.Hermes/workspace/research/xianyu-hunter
node --check server.mjs
node --check lib/task.mjs
node --check public/app.js
Restart stale port manually if needed:
lsof -nP -iTCP:3000 -sTCP:LISTEN
kill -9 <pid>
PORT=3000 node server.mjs
API fallback smoke test:
curl -sS http://127.0.0.1:3000/api/tasks/optimize \
-H 'Content-Type: application/json' \
-d '{"product":"e3-1245v3 cpu","budget":"150","currentRequirements":"价格150左右,能正常点亮,排除坏件维修配件"}'
Expected response can be source: local-fallback; this is OK. It should include task.autoAnalyze: true and task.autoNotify: true.
Task create smoke test should persist config flags:
curl -sS http://127.0.0.1:3000/api/tasks \
-H 'Content-Type: application/json' \
-d '{"name":"验证自动分析任务","queries":["test"],"autoStart":false,"autoAnalyze":true,"autoNotify":true}'
Unit-style auto-analysis check without starting scheduler:
XIANHU_DISABLE_SCHEDULER=1 node --input-type=module <<'JS'
import { TaskManager } from './lib/task.mjs';
const tm = new TaskManager(() => {});
const task = tm.createTask({ name: '自动分析单元验证', queries: ['e3-1245v3 cpu'], maxItems: 2, autoAnalyze: true, autoNotify: false, autoStart: false });
const full = tm.getTaskFull(task.id);
full.products.fineFiltered = [
{ id:'unit-1', title:'Intel Xeon E3 1245 V3 CPU 正常使用', price:'¥150', detailPrice:'¥150', sellerLocation:'广东', description:'自用拆机,能正常点亮,不是维修件', href:'https://example.com/1' },
{ id:'unit-2', title:'E3 CPU 坏件维修练手', price:'¥50', detailPrice:'¥50', sellerLocation:'广东', description:'坏件', href:'https://example.com/2' },
];
const logs=[];
await tm._runAutoAnalysis(full, msg => logs.push(msg));
console.log(tm.getTaskFull(task.id).hermesAnalysis);
tm.deleteTask(task.id);
JS
Pitfalls
- If API tests still show missing
autoAnalyze/autoNotify, the old server process is still listening.tools/xianyu_ops.mjs stopmay sayno-recorded-server; uselsofand kill the actual PID. source: local-fallbackfrom/api/tasks/optimizeis not a failure in Hermes mode.- Do not reintroduce project-level AI API gating for task creation or collection.
- Do not automatically contact sellers; this automation only performs collect → local prefilter → Hermes analysis → notification.