mirror of
https://gitverse.ru/kpa39l/openspec-lab.git
synced 2026-09-29 09:15:01 +00:00
2.9 KiB
2.9 KiB
Design: local-extractor
Approach
Расширить существующий /opt/hermes/.hermes/scripts/tavily_extract_proxy.py:
- В local-режиме (нет
--socks) сервер НЕ проксирует в Tavily, а сам извлекает: для каждого URL делает HTTP-запрос (httpx, при--local-socksчерез SOCKS5-туннель) и конвертирует HTML → Markdown черезtrafilatura(включён в venv). - Формат ответа в точности повторяет Tavily
/extract:{"results":[{url,title,raw_content,metadata}], "failed_results":[{url,error}], "failed_urls":[...]}— Hermes-провайдер (plugins/web/tavily/provider.py:_normalize_tavily_documents) обрабатывает его без изменений. - Режимы взаимозаменяемы через аргументы CLI:
--socks 127.0.0.1:1080— forward в Tavily (как сейчас в systemd)--localили ничего — локальная экстракция--local-socks 127.0.0.1:1080— локальная, но страницы через туннель
- systemd-юнит указать на tavily_extract_proxy.py (уже сделано, forward-режим).
Files
/opt/hermes/.hermes/scripts/tavily_extract_proxy.py— добавлены_fetch_page,_extract_local,_extract_local_batch,--local-socks/opt/hermes/.hermes/hermes-agent/venv/— установлен trafilatura 2.2.0/etc/systemd/system/tavily-proxy.service— ExecStart → tavily_extract_proxy.py (forward),--socks 127.0.0.1:1080
Commands
# Локальный режим (тест)
python3 /opt/hermes/.hermes/scripts/tavily_extract_proxy.py --port 8972 --local
curl -s -X POST http://127.0.0.1:8972/extract -H 'Content-Type: application/json' \
-d '{"urls":["https://example.com"]}' # → {"results":[...]}
# Переключение systemd на local (когда решено отказаться от облака)
# в /etc/systemd/system/tavily-proxy.service: ExecStart → ... --port 8971 --local
# sudo systemctl daemon-reload && sudo systemctl restart tavily-proxy
Rollback
# Вернуть forward-режим:
# ExecStart → ... --socks 127.0.0.1:1080 --upstream https://api.tavily.com
sudo systemctl daemon-reload && sudo systemctl restart tavily-proxy
Risks
- trafilatura хуже Tavily на JS-heavy страницах (нет headless-браузера) — приемлемо для типовых статей/доков.
- Локальная экстракция не обходит блокировки РФ сама по себе — нужен
--local-socksчерез туннель для таких сайтов. - Fetch без туннеля из РФ на github может висеть — ограничение сети, не кода.