Szybka odpowiedź
Co zwraca API LLMWebSearch dla wyszukiwania?
LLMWebSearch zwraca JSON z query, created_at, credits_used oraz uszeregowaną tablicą results. Każdy wynik ma swoją pozycję, tytuł, URL, host i snippet oraz content_status; gdy jest to ok, główna treść strony znajduje się w content z word_count. Jedno wyszukiwanie z odczytem do 3 stron kosztuje 1 kredyt, od 1,20 USD/1K wyszukiwań według stanu na październik 2026. Bez KYC; płatność kryptowalutą.
Które pola opisują wywołanie?
Najwyższy poziom odpowiedzi /search.
| Pole | Typ | Znaczenie |
|---|---|---|
query | string | Zapytanie w postaci, w jakiej je wykonano, po przycięciu spacji |
created_at | string | Kiedy wykonano wyszukiwanie, ISO 8601 w UTC |
credits_used | integer | Ile kosztowało wywołanie: 1 lub 2, gdy read wynosiło od 4 do 10 |
results | array | Uszeregowane wyniki, najlepszy pierwszy, maksymalnie max_results pozycji |
Jakie pola niesie każdy wynik?
Pole, którego strona lub wynik wyszukiwania nie dostarcza, jest pomijane, a nie wysyłane jako puste.
| Pole | Typ | Gdy występuje | Znaczenie |
|---|---|---|---|
position | integer | Zawsze | Pozycja w wyszukiwaniu, zaczynając od 1 |
title | string | Zawsze | Tytuł wyniku |
url | string | Zawsze | Adres strony |
host | string | Zawsze | Nazwa hosta strony, przydatna do grupowania lub cytowania |
snippet | string | Zawsze | Krótki fragment pokazany przez wyszukiwanie |
published_at | string | Gdy data jest znana | Data publikacji ze strony lub z wyniku wyszukiwania |
content_status | string | Zawsze | Czy strona została odczytana, a jeśli nie, to dlaczego |
content | string | Gdy content_status wynosi ok | Główna treść jako Markdown lub zwykły tekst, przycięta na max_chars |
word_count | integer | Gdy content_status wynosi ok | Słowa w całym wyodrębnionym tekście, liczone przed przycięciem |
target_status | integer | Z target_refused | Kod statusu HTTP, którym odpowiedział serwis, np. 403 lub 429 |
Co oznacza każdy content_status?
Żadna z tych zmian nie wpływa na cenę wyszukiwania. Dotyczą jednej strony, nigdy całego zapytania.
content_status | Znaczenie | Co powinien zrobić agent |
|---|---|---|
ok | Strona została odczytana; content zawiera jej główny tekst | Użyj go i zacytuj url |
not_requested | Wynik wykracza poza liczbę read | Zwiększ read lub w razie potrzeby odczytaj go przez /extract |
blocked_by_robots | robots.txt tego serwisu nie pozwala naszemu czytnikowi na tej stronie | Oprzyj się na snippecie lub innym źródle |
blocked_by_site_policy | Serwis deklaruje Content-Signal: ai-input=no | Oprzyj się na snippecie lub innym źródle |
target_refused | Serwis odrzucił zapytanie; zobacz target_status | Nie ponawiaj próby dla tej strony; użyj innego źródła |
fetch_failed | Błąd DNS, TLS lub połączenia albo strona już nie istnieje | Spróbuj innego wyniku; późniejsze ponowienie może zadziałać |
fetch_timeout | Strona nie odpowiedziała w ciągu 15 sekund | Spróbuj innego wyniku; późniejsze ponowienie może zadziałać |
unsupported_content | Link wskazuje plik, którego nie możemy zamienić na tekst | Użyj snippetu lub innego wyniku |
Jak wygląda pełna odpowiedź?
Poniższy przykład poprosił o 5 wyników z odczytem pierwszych 4, więc kosztował 2 kredyty. Wyniki 1 i 3 zostały odczytane. Wynik 2 należy do serwisu, którego robots.txt nie wpuszcza naszego czytnika, wynik 4 odrzucił zapytanie, a wynik 5 wykracza poza read. Tytuły, URL-e i wartości są przykładowe.
{
"query": "how to rotate api keys without downtime",
"created_at": "2026-10-22T10:15:04Z",
"credits_used": 2,
"results": [
{
"position": 1,
"title": "Rotating API keys",
"url": "https://docs.example.com/security/key-rotation",
"host": "docs.example.com",
"snippet": "Create a second key, deploy it everywhere, then revoke the first one.",
"published_at": "2026-09-30",
"content_status": "ok",
"content": "# Rotating API keys\n\n## Zero-downtime rotation\n\n1. Create a second key.\n2. Deploy it to every service.\n3. Revoke the old key.",
"word_count": 948
},
{
"position": 2,
"title": "Key rotation checklist",
"url": "https://blog.example.org/key-rotation-checklist",
"host": "blog.example.org",
"snippet": "Keep two keys active during the switch and alert on the old one.",
"content_status": "blocked_by_robots"
},
{
"position": 3,
"title": "Secrets management basics",
"url": "https://security.example.net/secrets-basics",
"host": "security.example.net",
"snippet": "Never commit keys to a repository.",
"content_status": "ok",
"content": "# Secrets management basics\n\n**Never** commit keys to a repository.",
"word_count": 1310
},
{
"position": 4,
"title": "Key management service guide",
"url": "https://cloud.example.com/kms-guide",
"host": "cloud.example.com",
"snippet": "Store keys in a managed vault and rotate them on a schedule.",
"content_status": "target_refused",
"target_status": 403
},
{
"position": 5,
"title": "API key best practices",
"url": "https://dev.example.com/api-key-best-practices",
"host": "dev.example.com",
"snippet": "Scope each key to one service and one environment.",
"content_status": "not_requested"
}
]
}Które wyniki otrzymują status strony inny niż not_requested?
Tylko pierwsze read wyników oraz każdy element wywołania /extract. To strony, które nasz reader faktycznie próbował odczytać. Wszystko poza liczbą read pozostaje not_requested, niezależnie od tego, co odpowiedziałby serwis.
Kolejność nigdy się nie zmienia: reader pracuje na pozycjach 1, 2, 3 i tak dalej, nigdy na późniejszym wyniku zamiast wcześniejszego, który zawiódł. Jeśli agent potrzebuje zamiennika dla odmówionej strony, może odczytać kolejny wynik przez /extract.
Jak wygląda odpowiedź extract?
/extract zwraca credits_used oraz tablicę results w kolejności przesłanych URL-i. Każdy element ma url i content_status; z ok dodaje title, content i word_count, a z target_refused dodaje target_status. Nie ma position, host ani snippet, ponieważ nie uruchomiono wyszukiwania.
Referencja extract pokazuje pełny przykład i wyjaśnia, jak liczone są jej kredyty.
Jak zamienić wyniki w kontekst dla modelu?
Numeruj źródła, trzymaj URL przy każdym z nich i przekazuj tylko to, czego potrzebuje model. Kompaktowy układ sprawdza się dobrze: [1] title — url, potem treść tej strony, potem kolejne źródło. Poproś model, aby cytował za pomocą tych samych numerów.
Gdy wynik nie ma treści, przekaż modelowi jego snippet i zaznacz, że to tylko snippet. To pozwala uniknąć odpowiedzi opartych na stronie, której model nigdy nie widział. Strona Python zawiera krótką pętlę, która robi to wszystko w ramach budżetu tokenów.
Format odpowiedzi: często zadawane pytania
Czy treść zawsze jest w Markdown?
Domyślnie Markdown. Wyślij format: "text", aby otrzymać zwykły tekst bez znaczników, na przykład gdy tylko liczysz słowa lub klasyfikujesz strony. Nazwa pola pozostaje content.
Dlaczego w niektórych wynikach brakuje published_at?
Wiele stron nie podaje daty, a niektóre wyniki wyszukiwania też jej nie pokazują. W takim przypadku pole jest pomijane, więc sprawdź jego obecność przed użyciem.
Czy nowe pola mogą pojawić się później?
Tak. W wersji 1 pola mogą być dodawane, ale nigdy nie są zmieniane nazwy ani usuwane. Napisz parser tak, aby ignorował pola, których nie zna.
Czy treść jest przechowywana po Waszej stronie?
Nie. Nie trenujemy żadnego modelu na Twoich zapytaniach ani na tym, co zwraca API, i nie dodajemy własnej reguły przeciwko przechowywaniu wyników; nadal obowiązują prawa witryn, których strony czytasz. Nasz log żądań przechowuje tylko krótki ślad każdego wywołania, opisany na stronie prywatności.