/root/.openclaw/workspace/tasks/task-t038p1-bd4413/task.md/root/.openclaw/workspace/tasks/task-t038p1-bd4413/session.md为 SearXNG 搜索引擎容器完成三项基础设施配置:
1. Docker restart policy — 设置 unless-stopped,保证容器自动恢复
2. 代理池配置 — 将 9 个 SOCKS5 代理节点配入 SearXNG outgoing.proxies,防反爬
3. 自定义搜索引擎 — 通过 json_engine 模板添加 5-10 个新引擎(ClinicalTrials/OpenFDA/WorldBank/CoinGecko/Bangumi 等)
背景:这是搜索工具整合项目(T038)的第一阶段,后续会将 SearXNG 封装进 ai-search CLI。
searxng127.0.0.1:8889/etc/searxng/settings.yml(需确认 volume mount 方式)127.0.0.1)/root/.openclaw/workspace/tasks/T038-P1-BRIEF.mdcoder → reviewer → 爱衣质检
agent:coder:main)模型:claude-opus-4-6
任务:执行 SearXNG 基础设施配置的全部开发和配置工作。
具体步骤:
确认配置持久化方式
bash
docker inspect searxng --format '{{json .Mounts}}' | python3 -m json.tool
确认 settings.yml 是通过 bind mount 还是 volume,确定编辑路径。
设置 Docker restart policy
bash
docker update --restart unless-stopped searxng
确认容器内访问宿主机的地址
bash
docker inspect searxng --format '{{.HostConfig.NetworkMode}}'
docker network inspect bridge --format '{{range .IPAM.Config}}{{.Gateway}}{{end}}'
bridge 模式用网关 IP(通常 172.17.0.1),不能用 127.0.0.1。
配置代理池 — 在 settings.yml 的 outgoing 节添加:
yaml
outgoing:
proxies:
all://:
- socks5h://<网关IP>:50002
- socks5h://<网关IP>:50004
- ... (共9个)
extra_proxy_timeout: 5
添加自定义引擎 — 每个引擎:
curl 测试 API 返回 JSON 格式results_query/title_query/url_query/content_query 路径必须添加(已确认 API 可用):
| 引擎 | shortcut | 分类 |
|------|----------|------|
| ClinicalTrials | ct | science, medical |
| OpenFDA | fda | medical |
| WorldBank | wb | finance |
| CoinGecko | cg | finance |
| Bangumi | bgm | media |
测试后决定:
| 引擎 | 注意事项 |
|------|---------|
| Semantic Scholar 增强版 | 含 citationCount/year 等额外字段 |
| bioRxiv | URL 格式特殊,可能不支持关键词搜索 |
| medRxiv | 同 bioRxiv |
| IMF | JSON 格式可能不稳定,失败则跳过 |
| 萌娘百科 | 海外 IP 403,代理池配好后测试 |
bash
docker restart searxng && sleep 5
# 验证每个自定义引擎
for engine in clinicaltrials openfda worldbank coingecko bangumi; do
echo "=== $engine ==="
curl -s "http://127.0.0.1:8889/search?q=test&format=json&engines=$engine" | \
python3 -c "import sys,json; d=json.load(sys.stdin); r=d.get('results',[]); print(f'Results: {len(r)}')"
done开始时:
1. 发工作日志:
bash
/root/.openclaw/workspace/scripts/log-to-channel.sh coder receive "T038-P1 SearXNG基础设施" task-t038p1-bd4413
完成后:
1. 在 task 目录创建 T038-P1-RESULT.md,记录每个引擎测试结果、代理池测试、最终配置 diff
2. 将执行日志追加到 session.md
3. 发工作日志:
bash
/root/.openclaw/workspace/scripts/log-to-channel.sh coder handoff "T038-P1 SearXNG基础设施" reviewer task-t038p1-bd4413
4. sessions_send 通知 reviewer(agent:reviewer:main,必须传 timeoutSeconds=0):
task_id=task-t038p1-bd4413
task=/root/.openclaw/workspace/tasks/task-t038p1-bd4413/task.md
agent:reviewer:main)模型:claude-sonnet-4-6(默认)
任务:审查 coder 的配置工作,执行验证测试,确保所有引擎正常工作。
审查要点:
每个自定义引擎的 json_engine 配置是否完整
功能验证(逐个引擎测试)
bash
# 每个引擎至少测 2 个不同查询
for engine in clinicaltrials openfda worldbank coingecko bangumi; do
for query in "diabetes" "cancer"; do
echo "=== $engine: $query ==="
curl -s "http://127.0.0.1:8889/search?q=$query&format=json&engines=$engine" | \
python3 -c "
import sys,json
d=json.load(sys.stdin)
r=d.get('results',[])
print(f' Results: {len(r)}')
if r:
print(f' First: {r[0].get(\"title\",\"\")[:50]}')
print(f' URL: {r[0].get(\"url\",\"\")[:60]}')
"
done
done
代理池验证
bash
# Google 搜索应该通过代理返回结果(之前可能被限速)
curl -s "http://127.0.0.1:8889/search?q=test&format=json&engines=google" | \
python3 -c "import sys,json; print(f'Google results: {len(json.load(sys.stdin).get(\"results\",[]))}')"
分类聚合验证
bash
# 验证自定义引擎是否正确纳入分类
curl -s "http://127.0.0.1:8889/search?q=diabetes&format=json&categories=science" | \
python3 -c "
import sys,json
d=json.load(sys.stdin)
engines = set(r.get('engine','') for r in d.get('results',[]))
print(f'Science engines: {engines}')
"
restart policy 验证
bash
docker inspect searxng --format '{{.HostConfig.RestartPolicy.Name}}'
# 应输出 unless-stopped
开始时:
1. 发工作日志:
bash
/root/.openclaw/workspace/scripts/log-to-channel.sh reviewer receive "T038-P1 SearXNG基础设施" task-t038p1-bd4413
完成后:
1. 将审查报告追加到 session.md(通过/不通过 + 具体问题)
2. 发工作日志:
bash
/root/.openclaw/workspace/scripts/log-to-channel.sh reviewer handoff "T038-P1 SearXNG基础设施" main task-t038p1-bd4413
3. sessions_send 通知爱衣(agent:main:main,必须传 timeoutSeconds=0):
task_id=task-t038p1-bd4413
task=/root/.openclaw/workspace/tasks/task-t038p1-bd4413/task.md
du -sb /root/.openclaw/workspace/tasks/task-t038p1-bd4413/
wc -l /root/.openclaw/workspace/tasks/task-t038p1-bd4413/session.md
若行数 N > 0,read session.md 全文。
通用检查(每次必须):
- 产出是否符合原始需求?
- 执行过程是否有明显问题?
- Agent 间是否有未解决的分歧?
任务特定检查:
- 所有 5 个必须引擎(ClinicalTrials/OpenFDA/WorldBank/CoinGecko/Bangumi)是否全部可搜索?
- 代理池 9 个节点是否全部配入?
- Docker restart policy 是否设置为 unless-stopped?
- 分类聚合是否正确(自定义引擎出现在对应分类搜索结果中)?
- 测试性引擎(S2增强/bioRxiv/medRxiv/IMF/萌娘百科)的结果记录是否清晰?
通过 →
bash
/root/.openclaw/workspace/scripts/log-to-channel.sh main done "T038-P1 SearXNG基础设施" task-t038p1-bd4413message 工具发送给主人(telegram, 92763607),归纳任务结果不通过(rejectCount == 0) →
1. 分析问题根因,设计新执行链
2. 创建新的 task.md(task_id 加后缀 -retry1),session.md 独立
3. 在原 session.md 末尾追加一行 rejectCount=1
4. sessions_send 给新执行链起始 Agent
5. 发工作日志:
bash
/root/.openclaw/workspace/scripts/log-to-channel.sh main retry "T038-P1 SearXNG基础设施" "<新执行链>" <起始role> 1 task-t038p1-bd4413
rejectCount >= 1(第二次仍失败) →
1. 发工作日志:
bash
/root/.openclaw/workspace/scripts/log-to-channel.sh main fail "T038-P1 SearXNG基础设施" task-t038p1-bd4413
2. message 主人,归纳问题和两次失败原因,请主人裁决
bash
wc -l /root/.openclaw/workspace/tasks/task-t038p1-bd4413/session.md # 获取总行数 N
# 然后 read offset=max(1, N-200) limit=200