105 lines
4.4 KiB
Markdown
105 lines
4.4 KiB
Markdown
# Web AI Optimize Fallback and Automatic Hermes Analysis — 2026-05
|
||
|
||
## Context
|
||
|
||
BOSS reported two UX problems in the local xianyu-hunter Web UI:
|
||
|
||
1. 新建任务/任务编辑里的“AI 润色/AI 优化”提示 `AI不可用`,容易误以为功能坏了。
|
||
2. 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/optimize` API compatible, but treat local fallback as a successful no-configuration path.
|
||
- Frontend fallback text: `已用本地规则优化(无需配置 AI)`.
|
||
- Add task config flags:
|
||
- `autoAnalyze: true` by default.
|
||
- `autoNotify: true` by default.
|
||
- Add visible task form checkboxes:
|
||
- `采集完成后自动执行 Hermes 分析`
|
||
- `分析后按通知设置自动推送`
|
||
- After `_runPipeline()` completes and task is not stopped, call `_runAutoAnalysis()` before setting stage to `completed`.
|
||
- `_runAutoAnalysis()`:
|
||
1. Skips if `autoAnalyze === false`.
|
||
2. Skips if no `products.fineFiltered` candidates.
|
||
3. Calls `analyzeTask()` with `limit=maxItems`.
|
||
4. Calls `renderAnalysisMarkdown()` and persists `summary.reportPath`.
|
||
5. Calls `sendNotifications()` unless `autoNotify === false`.
|
||
6. Logs success/skip/failure into task logs.
|
||
|
||
## Files Touched
|
||
|
||
```text
|
||
server.mjs
|
||
lib/task.mjs
|
||
public/app.js
|
||
public/index.html
|
||
```
|
||
|
||
## Verification Commands
|
||
|
||
```bash
|
||
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:
|
||
|
||
```bash
|
||
lsof -nP -iTCP:3000 -sTCP:LISTEN
|
||
kill -9 <pid>
|
||
PORT=3000 node server.mjs
|
||
```
|
||
|
||
API fallback smoke test:
|
||
|
||
```bash
|
||
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:
|
||
|
||
```bash
|
||
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:
|
||
|
||
```bash
|
||
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 stop` may say `no-recorded-server`; use `lsof` and kill the actual PID.
|
||
- `source: local-fallback` from `/api/tasks/optimize` is 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.
|