KYC yok — kimlik yok, selfie yok, belge yok. Kripto ile ödeme yapın: BTC, USDT, USDC, ETH, SOL, LTC
Dil: Türkçe
API anahtarı alın

Dokümanlar · LangChain · LlamaIndex

LangChain ve LlamaIndex: bir web sayfası yükleyici ve bir read_url aracı

API'yi bir Python AI yığınında kullanmanın iki yolu: sayfaları erişim için belge olarak yükleyin veya bir ajana read_url aracı verin. Aynı 20 satırlık bağlantı kodu hem LangChain hem de LlamaIndex için hizmet eder.

Son güncelleme: · 4 dk okuma

Hızlı yanıt

Web sayfalarını LangChain veya LlamaIndex'e temiz Markdown olarak nasıl yüklerim?

WebReaderAPI'nin /read endpoint'ini çağırın ve her yanıtı bir Document içine sarın: içerik olarak Markdown, metadata olarak final_url ve başlık. Ajanlar için aynı çağrıyı bir read_url aracı olarak sunun. Sayfaların her biri 1 kredi, tarayıcıyla 2 kredi, Ekim 2026 itibarıyla $0,07/1K sayfa'den itibaren. Bizim herhangi bir paketimiz gerekmez. KYC yok; kripto ile ödeme.

Neden ham HTML yerine Markdown belgeler?

Çünkü erişim metin üzerinde çalışır ve Markdown, önemli olan yapıyı korurken gerisini atar. Başlıklar korunur, böylece bir bölücü konu değişikliklerinde kesebilir. Listeler ve tablolar korunur, böylece adımlar ve özellikler bir arada kalır. Gezinme, çerez banner'ları ve reklamlar gider, böylece embedding'lerinizi kirletmez veya token harcamaz.

Metadata aynı çağrıdan gelir: alıntı kaynağı olarak final_url, filtreleme için title, published_at ve language.

reader.py: paylaşılan yardımcı (kodunuzun yanına kaydedin)
import os

import requests

API = "https://webreaderapi.com/api/v1/read"
HEADERS = {"Authorization": "Bearer " + os.environ["WEBREADER_API_KEY"]}


class PageError(Exception):
    pass


def read_page(url, **options):
    resp = requests.get(API, headers=HEADERS, params={"url": url, **options}, timeout=75)
    body = resp.json()
    if resp.status_code != 200:
        raise PageError(body["error"]["code"])
    return body

Bir LangChain belge yükleyicisini nasıl oluştururum?

Her sayfayı bir langchain_core.documents.Document'e dönüştürün, ardından langchain-text-splitters paketinden MarkdownHeaderTextSplitter ile başlıklara göre bölün. Her parça başlık yolunu metadata'sında korur ve her yanıtın kendi sayfasına geri işaret edebilmesi için kaynak URL'i ekleyin.

Atlantılan sayfalar, örneğin robots.txt tarafından reddedilenler, kodla birlikte PageError fırlatır; bunları günlüğe kaydedin ve devam edin.

LangChain: sayfaları yükle ve böl
from langchain_core.documents import Document
from langchain_text_splitters import MarkdownHeaderTextSplitter

from reader import PageError, read_page

splitter = MarkdownHeaderTextSplitter(headers_to_split_on=[("#", "h1"), ("##", "h2"), ("###", "h3")])


def load_pages(urls):
    chunks = []
    for url in urls:
        try:
            page = read_page(url)
        except PageError as exc:
            print("skipped", url, exc)
            continue
        for part in splitter.split_text(page["markdown"]):
            part.metadata.update({"source": page["final_url"], "title": page.get("title", "")})
            chunks.append(part)
    return chunks


docs = load_pages(["https://example.com/docs/install", "https://example.com/docs/configure"])
print(len(docs), "chunks", isinstance(docs[0], Document) if docs else "")

Bir LangChain ajanına read_url aracını nasıl veririm?

Bir fonksiyonu langchain_core.tools'den @tool ile dekore edin. Docstring, modelin okuduğu araç açıklaması haline gelir, bu yüzden aracın ne döndürdüğünü ve ne zaman kullanılacağını belirtin. Düz metin döndürün: bir başlık satırı, kaynak ve modelinize uyacak şekilde max_chars ile kesilmiş Markdown.

Aracı, araç çağrısını destekleyen herhangi bir sohbet modeline bağlayın veya ajan kurucunuza iletin. Model daha sonra read_url aracını konuşmadan veya bir arama sonucundan gelen bir URL ile çağırır.

LangChain: read_url aracı
import os

from langchain.chat_models import init_chat_model
from langchain_core.tools import tool

from reader import PageError, read_page


@tool
def read_url(url: str, max_chars: int = 20000) -> str:
    """Read a public web page and return its main content as Markdown, with its title and source URL."""
    try:
        page = read_page(url, max_chars=max_chars)
    except PageError as exc:
        return "Could not read the page: " + str(exc)
    return "# " + (page.get("title") or url) + "\nSource: " + page["final_url"] + "\n\n" + page["markdown"]


model = init_chat_model(os.environ.get("CHAT_MODEL", "openai:gpt-4.1-mini")).bind_tools([read_url])
reply = model.invoke("Summarise https://example.com/blog/first-post in three bullet points.")
print(reply.tool_calls)

Aynısını LlamaIndex'te nasıl yaparım?

LlamaIndex, text ve metadata ile kendi Document sınıfını ve bir fonksiyonu araca dönüştürmek için FunctionTool.from_defaults kullanır. Yardımcı aynı kalır. Belgeden bir indeks oluşturmak için VectorStoreIndex.from_documents kullanın; bu, LlamaIndex ayarlarınızın belirttiği embedding modelini kullanır.

LlamaIndex: bir taramayı indeksle ve bir read_url aracı
import os
import time

import requests
from llama_index.core import Document, VectorStoreIndex
from llama_index.core.tools import FunctionTool

from reader import HEADERS, PageError, read_page


def crawl_pages(start_url, limit=200):
    job = requests.post("https://webreaderapi.com/api/v1/crawl", headers=HEADERS, json={"url": start_url, "limit": limit}, timeout=30).json()
    pages, cursor = [], None
    while True:
        params = {"cursor": cursor} if cursor else {}
        res = requests.get("https://webreaderapi.com/api/v1/jobs/" + job["job_id"], headers=HEADERS, params=params, timeout=30).json()
        pages += [r for r in res["results"] if "error" not in r]
        cursor = res.get("next_cursor")
        if not cursor and res["status"] == "done":
            return pages
        if not cursor:
            time.sleep(5)


pages = crawl_pages("https://docs.example.com/")
docs = [Document(text=p["markdown"], metadata={"source": p["final_url"], "title": p.get("title", "")}) for p in pages]
index = VectorStoreIndex.from_documents(docs)
print(index.as_query_engine().query("How do I install the product?"))


def read_url(url: str, max_chars: int = 20000) -> str:
    """Read a public web page and return its main content as Markdown."""
    try:
        return read_page(url, max_chars=max_chars)["markdown"]
    except PageError as exc:
        return "Could not read the page: " + str(exc)


read_tool = FunctionTool.from_defaults(fn=read_url, name="read_url")
print(os.environ.get("CHAT_MODEL", "set CHAT_MODEL for your agent"), read_tool.metadata.name)

Küçük bir RAG indeksi için ne kadar büyük bir tarama gerekir?

Düşündüğünüzden daha az. Bir ürünün dokümantasyonu genellikle birkaç yüz sayfadır ve include_paths, docs bölümüne ayarlanmış bir tarama yalnızca bunları okur. Sayfa başına 1 kredi ile 300 sayfalık bir docs sitesi yaklaşık 300 kredi tutar; 10.000 sayfa ($3,75) bunu birçok kez yeniler.

Kaynağın ne sıklıkla değiştiğine uyan bir programda yeniden tarama yapın ve yalnızca değişen sayfaları yeniden embed etmek için final_url ve word_count değerlerini önceki çalıştırmayla karşılaştırın. Ön ödemeli kreditler asla süresi dolmaz: kullanılmayan sayfalar siz kullanana kadar hesabınızda kalır.

LangChain ve LlamaIndex: sık sorulan sorular

LangChain veya LlamaIndex için bir WebReaderAPI paketi var mı?

Hayır. Bu sayfadaki yardımcı ve araç entegrasyonun tamamıdır, böylece onları serbestçe uyarlayabilirsiniz. WebReaderAPI, herhangi bir Python HTTP istemcisinin çağırabileceği düz bir HTTPS API'dir.

Bu hangi LangChain sürümünü gerektirir?

langchain_core, langchain-text-splitters ve init_chat_model içeren herhangi bir güncel sürümü. Araç dekoratörü ve Document sınıfı son sürümlerde istikrarlı olmuştur.

Değişmeyen sayfaları yeniden okumaktan nasıl kaçınırım?

final_url, word_count ve her okumanın tarihini saklayın. Bir programda yeniden okuyun ve bir sayfayı yalnızca kelime sayısı veya içerik hash'i değiştiğinde yeniden embed edin. Her yeniden okuma bir kredi tutar, bu yüzden kaynağa uyan bir ritim seçin.

Bazı sayfalar reddedilirse ne olur?

blocked_by_robots gibi bir kodla PageError fırlatırlar ve hiçbir ücrete tabi değildirler. Bir site isteğimizi reddederse, verdiği yanıtı döndürürüz: CAPTCHA'ları asla çözmeyiz, hesaplara giriş yapmayız veya bir engeli ya da ödeme duvarını aşmaya çalışmayız.

$0,07/1K sayfa başlangıçlı · KYC yok

API anahtarı alın