Как проверить контроллер Computer Use API без подключения модели
19 офлайн-тестов на Python: проверка действий, идентификаторов снимков и результата формы. Код подключения включён, но с реальным API не проверен.
В интеграции Computer Use есть два отдельных вопроса: возвращает ли модель поддерживаемые действия и умеет ли приложение выполнить их, не приняв сообщение об успехе за результат? Здесь мы начинаем со второго. Python-контроллер и 19 офлайн-тестов работают без API-ключа, браузерной сессии и расходов на модель.
Скачать контроллер. Тесты прошли на Python 3.9.6, включая повтор из свежего архива. Адаптер run_live.py не запускался и не проверялся с реальным провайдером. Настоящих снимков API-сеанса, измерений потребления ресурсов и доказательств совместимости здесь нет.
Сначала запустите локальные тесты
Достаточно Python 3.9+ и стандартной библиотеки. Из каталога api-kit:
python3 -B -m unittest discover -s . -p 'test_*.py' -v
15 случаев относятся к контроллеру, четыре — к записям получателя. Ответы модели и среда выполнения имитируются, без сети и браузера. Байты вместо скриншотов не являются изображениями и не подходят для отправки провайдеру.
| Файл | Назначение |
|---|---|
controller.py | Проверка действий, возврат наблюдений, остановка по результату |
test_controller.py | Синтетические ответы и имитация среды выполнения |
test_receiver.py | Проверка изменений записей в памяти |
run_live.py | Адаптер Playwright/HTTPS Responses для последующей проверки |
README.md | Команды и условия реального подключения |
Разделите модель, выполнение и проверку
Модель выбирает действие, среда выполнения управляет браузером, а независимый проверяющий код оценивает результат приложения. В учебной форме используйте уникальный адрес @example.test для каждой попытки.
Сравнивайте /submissions до запуска и во время выполнения. Прежняя последовательность должна остаться неизменной, а в конце должна добавиться ровно одна запись с ожидаемым адресом. Старая запись, дубликат, другой адрес и зелёный баннер не проходят эту проверку. Условие относится только к стенду; в рабочей системе нужен собственный признак результата, например ID сохранённого черновика.
Следуйте одному протоколу
Код опирается на структурированные действия из руководства OpenAI Computer Use. Контроллер отправляет первый снимок, принимает упорядоченные действия computer_call, выполняет разрешённые операции и возвращает изображение в computer_call_output с соответствующим call_id. Следующий запрос содержит previous_response_id.
Идентификаторы связывают наблюдение с запросом действия. Изображение с неправильным ID не заменяет корректный результат инструмента. Документация служит основанием протокола, но не доказывает совместимость незапущенного адаптера с конкретной моделью.
Перед подключением проверьте вместе модель, эндпоинт и схему инструмента. Успех текстового запроса не доказывает поддержку Computer Use. В наборе нет выбранного по умолчанию провайдера или модели и не заявлена совместимость с маршрутами Ofox.
Проверяйте действия до исполнения
Поддерживаются левый клик, ввод до 200 символов, выбранные одиночные клавиши, ограниченная прокрутка и снимок. Координаты должны помещаться в текущем изображении; логические значения, неконечные числа и некорректные структуры отклоняются. Максимум — 12 действий в ответе и по умолчанию четыре обращения к модели. Неизвестное действие останавливает выполнение.
В одном ответе допускается один computer call. Повторный ID, незавершённый ответ и ожидающая решения проверка безопасности приводят к остановке, а не автоматическому согласию. Это не полная реализация всех действий и согласований.
Результат проверяется до и после каждого действия, чтобы после асинхронного сохранения не нажать кнопку повторно. Адаптер также кратко опрашивает получателя после клика или клавиши. Эти правила проверены локально, но не доказывают работоспособность настоящего браузерного соединения.
Проследите путь одного действия
Контроллер — код приложения между ответом модели и исполнителем браузера. Он отклоняет неподдерживаемые действия, сохраняет связь запроса с наблюдением и прекращает работу после подтверждения результата приложением. Пример предназначен для разработчиков, реализующих этот слой, и не является готовым агентом для промышленной эксплуатации.
Ниже синтетический учебный ответ, соответствующий ожидаемой локальным контроллером структуре. Координаты относятся к условной области просмотра размером 100 × 100, а не к кнопке на странице QA.
{
"id": "response_demo_1",
"status": "completed",
"output": [{
"type": "computer_call",
"call_id": "call_demo_1",
"actions": [{"type": "click", "button": "left", "x": 10, "y": 20}]
}]
}
Внешний status означает завершение генерации ответа, но не выполнение клика и не сохранение формы. Контроллер проверяет пакет действий, выполняет разрешённые по порядку, проверяет приёмник и при необходимости возвращает новое наблюдение. Для продолжения результат снимка связывается с call_demo_1, а previous_response_id — с response_demo_1. Это разные идентификаторы, их нельзя взаимозаменять.
Запустите небольшой пример без браузера и модели
Сохраните код как walkthrough.py рядом с controller.py и выполните python3 -B walkthrough.py. Используются контроллер из набора и намеренно упрощённая имитация среды выполнения. Он считает задачу завершённой после первого действия, позволяя увидеть, почему второй запланированный клик пропускается.
from controller import run
class DemoRuntime:
width, height = 100, 100
def __init__(self):
self.actions = []
self.done = False
def screenshot(self):
return b"offline-placeholder-not-a-real-png"
def assert_allowed(self):
pass # Fake only: a real runtime must enforce its allowed surface.
def complete(self):
return self.done
def perform(self, action):
self.actions.append(action)
self.done = True # Simulated outcome, not receiver verification.
runtime = DemoRuntime()
def transport(payload):
return {
"id": "response_demo_1",
"status": "completed",
"output": [{
"type": "computer_call",
"call_id": "call_demo_1",
"actions": [
{"type": "click", "x": 10, "y": 20},
{"type": "click", "x": 30, "y": 40}
]
}]
}
result = run(transport, runtime, "Synthetic controller walkthrough")
assert len(runtime.actions) == 1
print(result["status"], result["turns"], len(runtime.actions))
Локально получен вывод verified 1 1: статус успеха, один синтетический ход, одно выполненное действие. Но verified доверяет DemoRuntime.complete(), который здесь специально упрощён. Это не доказательство сохранения формы. В реальном исполнителе нужен независимый критерий результата. Байты-заглушки изображения также нельзя отправлять реальному API как PNG.
Замените заглушку завершения данными приёмника
В браузерном адаптере критерий строже: прежние записи остаются неизменными и появляется ровно одна новая с уникальным адресом этого запуска.
| Изменение | Решение | Причина |
|---|---|---|
| Старые записи + один текущий адрес | Принять | Одно совпадающее добавление |
| Без изменений | Продолжить проверку или остановиться без подтверждения | Сохранение пока не доказано |
| Старые записи + две новые копии | Отклонить | Дублирование |
| Изменённая история + текущий адрес | Отклонить | Нарушена база сравнения |
| Старые записи + другой адрес | Отклонить | Результат не соответствует вводу |
Четыре теста приёмника проверяют корректное добавление, другой адрес, лишние записи и изменённую историю в памяти. Строка «без изменений» описывает правило продолжения адаптера, а не пятый тест. Реальная интеграция должна учитывать задержки, параллельные операции и ошибки чтения. Этот изолированный стенд не является системой приёма заявок в рабочем сервисе. Практикум QA показывает ручной сбор тех же данных до и после.
Что установили 19 тестов
Проверены неправильные структуры и координаты, неподдерживаемый ввод, соответствие вызова и снимка, предел шагов, повторные вызовы, ранняя остановка и точные изменения записей. Регрессионные случаи запрещают дальнейшие действия после завершения, а также дубликаты и неверный адрес.
Для завершённых ответов с корректным ID журнал сохраняет данные об использовании (usage), включая финальный ответ без действий. При ошибке исполнения сохраняются попытки действий. Синтетические данные об использовании не отражают фактических начислений, а код не гарантирует файл отчёта при любой ошибке запуска. Тесты не измеряют точность модели, зрительное понимание и успех реальных задач.
Начинайте диагностику с первой нарушенной границы
| Сообщение | Что проверять | Следующий шаг |
|---|---|---|
Coordinates outside current viewport | Валидация координат | Сравнить с текущими размерами реального снимка |
Unsupported action type | Поддерживаемые операции | Проверить тип, не выполнять неизвестное действие |
Missing or repeated call id | Связь вызовов | Просмотреть ID ответа, вызова и историю повторов |
Safety check requires human review | Ожидание разрешения | Остановиться: интерфейса согласования в примере нет |
Model stopped before receiver verification | Критерий завершения | Проверить приёмник, а не текст модели |
Turn limit reached | Ограниченный цикл | До повтора выяснить, не было ли уже отправки |
Весь пакет проверяется до исполнения: неподдерживаемое действие в конце остановит его ещё до первого шага. После начала исполнения ошибка следующего действия уже не отменяет эффекты предыдущего. Журнал различает попытку действия и действие, обработка которого завершилась без ошибки, но не откатывает изменения. Перед новым запуском прочитайте результат на принимающей стороне.
Проблемы подключения разобраны в руководстве по разрешениям. Для задач без формы нужен другой результат: например, таблица конкурентов должна иметь читаемый файл доказательств с URL, а не запись адреса электронной почты.
Условия реального запуска
Офлайн-тесты подтверждают только проверенные сценарии контроллера. Перед подключением реального исполнителя выберите протокол провайдера и независимый критерий завершения задачи.
run_live.py создаёт новый контекст Playwright Chromium, ограничивает обычные запросы страниц источником (origin) локального стенда и требует явно заданный HTTPS Responses URL. Он не подключается к личному профилю. Неожиданный источник страницы или новая вкладка останавливают выполнение. Это ограничение не является универсальной защитной песочницей. Адаптер не повторяет неудачные запросы к модели автоматически.
По документации Playwright установите отдельное окружение и запишите реальные версии пакета и браузера. Зависимости адаптера пока не установлены и не закреплены как проверенные. Переменные COMPUTER_RESPONSES_URL, COMPUTER_MODEL, COMPUTER_API_KEY задаются через окружение; ключ не должен попасть в архив или репозиторий.
Нужны разрешения на браузер и расходы. Адаптер нельзя использовать для обхода отказа доступа. Для каждой попытки берите новый синтетический адрес и каталог результата. Четыре вызова и лимит выходных токенов не являются денежным бюджетом: отдельно проверьте тариф и лимит аккаунта. Тайм-аут не исключает начислений; перед повтором изучите данные об использовании и сохранённые записи формы.
Подтвердите интеграцию собственными результатами
Для проверки интеграции сохраните ID модели, хост эндпоинта, версии, задачу, очищенные от секретов ответы и данные об использовании, ID вызовов, снимки и итоговые записи. Просмотрите журналы перед публикацией. Повторите запуск из чистого окружения с новым тестовым адресом и сообщите результаты и фактическое использование по каждой попытке отдельно. Нельзя заменить неработающий инструмент текстовым ответом и назвать это успешным Computer Use. Сейчас подтверждены только 19 офлайн-тестов.
Часто задаваемые вопросы
- Можно ли считать пример проверенной интеграцией с API?
- Нет. Контроллер и получатель прошли 19 офлайн-тестов, но адаптер не запускался. Совместимость с провайдером, настоящий браузер и расходы не проверены.
- Можно ли запустить тесты без API-ключа?
- Да. Тесты стандартной библиотеки используют синтетические ответы и подставной runtime, не вызывают поставщика и не запускают браузер.
- Что означает статус verified?
- Переданная среда выполнения сообщила о завершении. В учебном примере это симуляция; реальной интеграции нужны независимые доказательства результата приложения.
- Ограничение ходов гарантирует денежный бюджет?
- Нет. Число итераций не равно стоимости. Нужны проверенные тарифы, учёт использования и ограничения расходов на стороне аккаунта.


