Решение капчи для
агентов на OpenAI Agents SDK
У агента, встретившего проверку, нет в наборе инструментов ничего, что могло бы на неё ответить, поэтому он зависает или галлюцинирует обходной путь. Дайте ему сервис решения капчи как инструмент, и блокировка станет ещё одним вызовом.
import time
import requests
CAPTCHANO_KEY = "cn-YOUR_API_KEY"
HEADERS = {"Authorization": f"Bearer {CAPTCHANO_KEY}"}
def solve(task: dict) -> dict:
"""Block until solved; returns e.g. {"token": "...", "userAgent": "..."}."""
r = requests.post(
"https://api.captchano.com/v1/solve",
params={"wait": 60},
json=task,
headers=HEADERS,
timeout=75,
)
data = r.json()
# A solve can outlast the 60 s wait: poll the task until it finishes.
while data.get("status") in ("queued", "solving"):
time.sleep(5)
data = requests.get(
f"https://api.captchano.com/v1/task/{data['id']}",
headers=HEADERS,
timeout=30,
).json()
if data.get("status") != "ready":
raise RuntimeError(data.get("error") or data)
return data["solution"]
from agents import Agent, function_tool
@function_tool
def solve_captcha(kind: str, sitekey: str, url: str) -> str:
"""Return a token for a captcha blocking the current page."""
return solve({"type": kind, "sitekey": sitekey, "url": url})["token"]
agent = Agent(name="browser", tools=[solve_captcha])Почему это нужно именно агентам
Парсер, наткнувшийся на проверку, падает с ошибкой, и вы его чините. Агент проваливается молча: он рассуждает о заблокированной странице, придумывает правдоподобный следующий шаг и сообщает о прогрессе, которого не было. Такой сбой хуже, потому что он незаметен. Типизированный инструмент решения превращает неоднозначный тупик в детерминированный результат, по которому агент может ветвиться.
Что возвращает инструмент
- Токен или cookie — в зависимости от типа проверки. Системы с оценкой сессии возвращают cookie и набор заголовков, с которыми она была получена.
- Использованный user agent, чтобы агент мог воспроизвести его при отправке.
- Стоимость решения, чтобы агент, работающий в рамках бюджета, мог её учитывать, а не тратить вслепую.
Как ограничить цикл
Задайте агенту бюджет решений на запуск. Каждый ответ сообщает свою стоимость, поэтому супервизор может прервать цикл, когда расходы превысят порог, а не узнать об этом из счёта. При цене $0.00598 за решение типичный запуск агента стоит несколько центов или меньше, но бесконечный цикл повторов — всё равно бесконечный цикл повторов.
Оставьте вызов инструмента блокирующим
Примеры вызывают ?wait=60, поэтому инструмент возвращает готовый токен за один шаг. Для агентов это важнее, чем для скриптов: инструмент, который возвращает «ещё решается», заставляет модель рассуждать об опросе, а с этим она справляется плохо. Если нужен больший предел, увеличьте wait до 120 секунд. Форматы запросов для всех типов проверок — в справочнике API.
Как решение встраивается в OpenAI Agents SDK
OpenAI Agents SDK превращает типизированную функцию Python в инструмент с помощью function_tool. Сервис решения капчи становится одним из инструментов агента.
- 01Задекорируйте функцию
Оберните вызов API в @function_tool с типизированными аргументами.
- 02Добавьте его агенту
Передайте его в списке tools агента.
- 03Проинструктируйте агента
Укажите ему вызывать инструмент с sitekey и URL, когда на странице появляется капча.
- 04Трассируйте
Трассировка SDK показывает каждый вызов инструмента и результат, включая возвращаемую нами стоимость.
Как передать токен на страницу
Агент получает токен и передаёт его своему браузерному или HTTP-инструменту.
Где интеграции обычно ломаются
Типизируйте каждый аргумент, чтобы сгенерированная схема была точной и модель правильно её заполняла.
Установите HTTP-тайм-аут больше значения wait, чтобы инструмент не падал, пока решение ещё выполняется.
Частые вопросы о капче в OpenAI Agents SDK
Работает ли это с моделями не от OpenAI?
SDK поддерживает других провайдеров через свой интерфейс моделей, а сам инструмент — обычный HTTP, так что да.
Можно ли использовать это с handoffs?
Да. Дайте инструмент тому агенту, который управляет браузером; остальные могут передавать ему управление.
Где хранить API-ключ?
В переменной окружения, которая читается внутри функции инструмента, и никогда — в инструкциях агента.
Как ограничить расходы?
Отслеживайте поле cost каждого результата в контексте запуска и отказывайте в новых решениях после превышения бюджета.
Полезные руководства
Готовы начать?
Начните с бесплатного 3-дневного пробного периода, а по мере роста трафика платите за каждое успешное решение. Для пробного периода карта не нужна.