[ blog · tutorial ]7 min read

Как добавить веб-поиск в реальном времени в OpenAI- или Claude-агента за 4 шага

Sarah ChoyОпубликовано 2 мая 2026 г.Обновлено 3 мая 2026 г.7 мин чтения
Как добавить веб-поиск в реальном времени в OpenAI- или Claude-агента за 4 шага

Хотите, чтобы агент опирался на свежую информацию? Нужны ровно две вещи: search API, возвращающий LLM-friendly snippets, и описание инструмента, которое модель сможет вызвать. Этот гайд делает обе за 4 шага.

Кратко

  • Шаг 1: получить API key (бесплатно) и проверить эндпоинт через curl.
  • Шаг 2: забрать tool schema OpenAI / Claude прямо из API — JSON руками не писать.
  • Шаг 3: зарегистрировать tool в агенте (OpenAI Assistants, Anthropic Messages, LangChain, n8n).
  • Шаг 4: написать handler, который вызывает /api/search/web и возвращает результаты модели.

Почему статья короткая

Большинство туториалов 'добавьте web search в LLM' длинные, потому что на самом деле учат SDK поиска или тяжёлый агентный фреймворк. Этот — нет. Работа: выбрать эндпоинт, зарегистрировать как инструмент, написать 5-строчный handler.

1Получить бесплатный API key и вызвать эндпоинт

Зарегистрируйтесь на apipick.com/dashboard/api-keys. Новые аккаунты получают 100 кредитов бесплатно — без карты. Создайте key и попробуйте:

curl -X POST https://www.apipick.com/api/search/web \
  -H "x-api-key: pk_yourkey" \
  -H "Content-Type: application/json" \
  -d '{"query": "what is retrieval augmented generation"}'

Получите компактный ranked-список с title, URL и snippet. Подтверждение в curl сэкономит часы дебага позже.

2Забрать tool schema (не писать руками)

API Pick публикует готовые tool schemas на GET /api/search/web/tool-schema. Ответ содержит OpenAI-определение функции и Claude tool use.

curl https://www.apipick.com/api/search/web/tool-schema

Кэшируйте результат — он редко меняется. Ручная запись function schema — самый частый источник багов в коде агента (неверный тип, забытое required, отсутствующий description).

3Зарегистрировать инструмент в агенте

OpenAI Assistants

from openai import OpenAI
import requests

client = OpenAI()
schema = requests.get("https://www.apipick.com/api/search/web/tool-schema").json()

assistant = client.beta.assistants.create(
    name="Research Agent",
    model="gpt-4o",
    instructions="Use web_search whenever the user asks about current events or anything that changes after your training cutoff.",
    tools=[{"type": "function", "function": schema["openai"]}],
)

Anthropic Claude

import anthropic
import requests

schema = requests.get("https://www.apipick.com/api/search/web/tool-schema").json()
client = anthropic.Anthropic()

response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    tools=[schema["claude"]],
    messages=[{"role": "user", "content": "Summarise this week's RAG research."}],
)

LangChain

from langchain.tools import tool
import requests

@tool
def web_search(query: str) -> dict:
    """Real-time web search. Use for any question that needs current information."""
    return requests.post(
        "https://www.apipick.com/api/search/web",
        headers={"x-api-key": "pk_yourkey"},
        json={"query": query},
    ).json()

n8n

Добавьте узел HTTP Request: метод POST, URL https://www.apipick.com/api/search/web, заголовок x-api-key: pk_yourkey, JSON-body {"query": "{{ $json.query }}"}. Подключите к узлу agent или LLM Chain. SDK не нужен.

4Обработать вызов инструмента

В OpenAI Assistants, когда run встаёт на requires_action, выполните поиск и отправьте output:

import json, time, requests
from openai import OpenAI

client = OpenAI()
KEY = "pk_yourkey"

def run_with_tool(thread_id: str, assistant_id: str):
    run = client.beta.threads.runs.create(thread_id=thread_id, assistant_id=assistant_id)
    while True:
        run = client.beta.threads.runs.retrieve(thread_id=thread_id, run_id=run.id)
        if run.status == "requires_action":
            outputs = []
            for call in run.required_action.submit_tool_outputs.tool_calls:
                if call.function.name == "web_search":
                    args = json.loads(call.function.arguments)
                    result = requests.post(
                        "https://www.apipick.com/api/search/web",
                        headers={"x-api-key": KEY},
                        json=args,
                    ).json()
                    outputs.append({"tool_call_id": call.id, "output": json.dumps(result)})
            client.beta.threads.runs.submit_tool_outputs(
                thread_id=thread_id, run_id=run.id, tool_outputs=outputs,
            )
        elif run.status in ("completed", "failed", "cancelled", "expired"):
            return run
        time.sleep(0.5)

Цикл Anthropic Messages похож — когда в ответе появляется блок tool_use, вызовите API и пришлите результат блоком tool_result в следующем turn.

Шлифовка цикла

  • Описание инструмента — с точки зрения модели: 'Use this when the user asks about current events, breaking news, or anything that may have changed after your training cutoff.' Не пишите 'это web search API'.
  • В handler кэшируйте повторные query в одной сессии. Результаты стабильны на минутах — не платите 15 кредитов дважды в одном диалоге.
  • Когда важна свежесть — добавляйте start_date. 'Новости этой недели' без фильтра дат часто возвращают прошлогодние заголовки.

Что дальше

Когда агент умеет искать, естественно дать ему читать ссылки. Зарегистрируйте URL Content Extract API вторым инструментом — та же auth, та же JSON-форма, до 25 URL за вызов. 'Search + Extract' — минимально полезный исследовательский агент.

Часто задаваемые вопросы

Работает с OpenAI Responses API вместо Assistants?

Да. Тот же tool schema передаётся в client.responses.create() через tools=[{...}]. Handler идентичен: распарсить tool_calls, вызвать POST /api/search/web, вернуть JSON.

Нужно ли форматировать результаты перед возвратом модели?

Нет. POST /api/search/web уже возвращает ranked title + URL + LLM-friendly snippet. Сырой JSON отдаётся как tool result, модель цитирует сниппеты и линкует URL.

Сколько стоит один turn агента?

Каждый веб-поиск — 15 кредитов (≈ $0.015 при $5 / 5 000). Типичный turn с одним вызовом инструмента остаётся заметно ниже цента — расходы доминирует LLM.

Что если модель никогда не вызывает инструмент?

Сделайте описание конкретным. 'Use this for any question that requires current or post-training information' работает гораздо лучше, чем 'web search'. Модель использует инструменты, чьё назначение понимает.

Можно ограничить страной или диапазоном дат?

Да. Передайте country_code (ISO 3166-1 alpha-2) и/или start_date / end_date (YYYY-MM-DD). Чтобы выбор делал модель — добавьте параметрами в schema; чтобы зашить значения — пропишите в handler, если у агента фиксированные locale или свежесть.

API, использованные в статье

Sarah Choy
Автор
Sarah Choy
CEO, API Pick

Сара Чой — CEO API Pick. Пишет о продакшен-готовых API для AI-агентов и LLM-воркфлоу.