Как добавить веб-поиск в реальном времени в 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, использованные в статье
Сара Чой — CEO API Pick. Пишет о продакшен-готовых API для AI-агентов и LLM-воркфлоу.