>_ DevTrendspl

Język

Strona główna

Języki

Sekcje

Frontend Backend Mobilne DevOps AI / ML GameDev Blockchain Systemy wbudowane Bezpieczeństwo
JavaScript

Jak przekazać dowolną stronę do sieci neuronowej bez reklam i zbędnych tokenów

Przekazując agentowi LLM zwykłe pobieranie stron internetowych, masa menu nawigacyjnych, stopek, banerów i ścian znaczników HTML błyskawicznie trafia do kontekstu. Oprócz artykułu liczącego kilka tysięcy słów agent otrzymuje megabajt śmieci, okno kontekstowe się zapełnia, a rachunek za tokeny rośnie.

Ostatnio natknąłem się na projekt pullmd. To samodzielna usługa, która pobiera adres URL strony lub pliku i zwraca czysty Markdown. Bez zbędnego obciążenia, bez duplikowania metadanych w tekście i z kilkoma funkcjami, których często brakuje w standardowych bibliotekach do parsowania.

Interfejs sieciowy PullMD (jasny i ciemny motyw)

Co pod maską

Twórcy projektu połączyli kilka sprawdzonych narzędzi. Gdy trafia URL, usługa najpierw sprawdza natywny Markdown z Cloudflare. Jeśli go nie ma, wkraczają Mozilla Readability i Trafilatura.

Czasami strona jest w pełni zbudowana w React lub Vue i goły HTML zwraca pusty szablon. W takich sytuacjach pullmd uruchamia sidecar Playwright, renderuje stronę w headless Chromium i stamtąd wyodrębnia treść. Jeśli nie potrzebujesz ciężkiej przeglądarki, możesz po prostu wyłączyć kontener Playwright z pliku docker-compose.yml, zwalniając około 3,7 GB miejsca na dysku. W takim przypadku usługa będzie nadal działać poprzez zwykłe statyczne parsowanie.

Wszystkie wyniki trafiają do lokalnej bazy danych SQLite. Jeśli zażądasz tego samego URL w ciągu godziny, odpowiedź wraca natychmiast z cache. Każda konwersja otrzymuje stały krótki identyfikator, więc link taki jak /s/:id może służyć jako stabilne źródło danych.

Główne funkcje oszczędzające czas

Wątki Reddit i Hacker News

Zwykle skrypty mają problemy ze stronami komentarzy. Tutaj parser jest specjalnie wytrenowany do parsowania wątków Reddit i Hacker News. Wynik to uporządkowane drzewo komentarzy z zachowanym zagnieżdżeniem, autorami i liczbą głosów.

Wyszukiwanie na stronie przez BM25

Jedno z najlepszych znalezisk w trzeciej wersji usługi. Jeśli przekażesz parametr ?query=как настроить базу w zapytaniu, pullmd nie zwróci całej wielostronicowej dokumentacji. Usługa dzieli Markdown na sekcje według nagłówków, rankinguje je za pomocą algorytmu BM25 i dostarcza tylko bloki odpowiadające na pytanie. W przypadku dużych stron zmniejsza to użycie tokenów o 70% do 95%, co znacząco przyspiesza działanie agenta. Tabele i bloki kodu pozostają nienaruszone.

Dokumenty, wideo i audio

Usługa obsługuje więcej niż tylko strony internetowe. Po podłączeniu sidecara MarkItDown od Microsoft przetwarza pliki PDF, dokumenty Word, arkusze Excel, prezentacje PowerPoint i ebooki EPUB.

Jeśli przekażesz link do YouTube, usługa wyodrębnia transkrypcję wideo z klikalnymi znacznikami czasowymi — bez kluczy API. Do rozpoznawania obrazów i dźwięku możesz skonfigurować endpoint dla dowolnego modelu kompatybilnego z OpenAI lub lokalnego serwera jak Ollama.

Wbudowany serwer MCP i integracje

Dostępnych jest kilka opcji połączenia dla integracji z agentami:

  • Standardowe REST API (GET /api?url=...)
  • Serwer MCP dla Cursor, Claude Desktop i innych kompatybilnych klientów
  • Gotowa wtyczka dla Claude Code
  • Interfejs sieciowy PWA z obsługą przeciągania i upuszczania plików prosto z eksploratora plików

Bezpieczeństwo i ochrona przed SSRF

Usługi pobierające dane z dowolnych URL są podatne na ataki SSRF. Użytkownik może nakarmić parser wewnętrznym adresem sieciowym lub metadanymi dostawcy chmury.

pullmd zawiera walidację adresów. Przed każdym żądaniem i na każdym etapie przekierowania adresy IP hosta są rozwiązywane. Jeśli adres mieści się w zakresach sieci prywatnych, loopback, CGNAT lub zakresach metadanych chmury jak 169.254.169.254, żądanie jest natychmiast blokowane z błędem 403. W przypadku zamierzonego dostępu do wewnętrznej wiki, adresy można dodać do whitelisty przez zmienną środowiskową PULLMD_ALLOWED_HOSTS.

Jak wdrożyć

Do podstawowego uruchomienia wystarczy jeden plik docker-compose.yml:

mkdir pullmd && cd pullmd
curl -O https://raw.githubusercontent.com/AeternaLabsHQ/pullmd/main/docker-compose.yml
docker compose up -d

Usługa uruchomi się na porcie 3000. Uwierzytelnianie jest domyślnie wyłączone, ale można je skonfigurować: obsługiwany jest zarówno tryb pojedynczego administratora, jak i tryb wieloużytkownikowy z rejestracją i plikami cookie sesji.

Przykład prostego żądania API:

curl "http://localhost:3000/api?url=https://news.ycombinator.com/item?id=1"

Aby połączyć się z Claude Code, wystarczy jedno polecenie:

claude mcp add --transport http pullmd http://localhost:3000/mcp

Dla kogo to jest

Projekt okazał się czysty i praktyczny. Ma mniej niż pięćset gwiazdek na GitHubie, ale baza kodu wygląda dojrzale: czysta modułowa struktura, szczegółowy plik migracji i minimalne zewnętrzne zależności w głównym kontenerze.

Narzędzie sprawdzi się u osób budujących pipeline'y RAG, konfigurujących lokalne asystenty AI lub po prostu chcących mieć wygodny czytnik długich artykułów w formacie Markdown. Jeśli używasz Cursor lub Claude Code i często prosisz je o przejrzenie dokumentacji z linku, lokalna instancja pullmd zaoszczędzi Ci sporo kontekstu i nerwów.

Powiązane projekty