AI Security School SDK
Python-клиент для работы с агентными средами полигона AI Security School.
SDK получает документацию конкретной задачи и вызывает тот же agent-env API,
которым пользуется браузер: состояние, действия, проверку и сброс.
Установка
Требуется Python 3.12 или новее.
python -m pip install ai-security-school-sdk
Для воспроизводимой установки этой версии:
python -m pip install ai-security-school-sdk==0.2.0
Версия 0.2.0 меняет публичный интерфейс SDK. Вместо отдельных лабораторий и
прогонов используются существующие экземпляры agent-env и их задачи.
Подключение и документация
На странице операции откройте «Подключить Python SDK», создайте токен и передайте
его через переменную окружения. Токен ограничен выбранной операцией.
AI_SECURITY_SCHOOL_BASE_URL можно задать для другого развёртывания; по умолчанию
используется https://plgn.aisecschool.ru.
export AI_SECURITY_SCHOOL_TOKEN="YOUR_TOKEN"
from ai_security_school_sdk import Client
with Client.from_env() as client:
for env in client.envs.list():
print(env.instance_id, env.title)
for task in env.tasks.list():
print(task.task_id, task.title)
task = client.tasks.get("YOUR_TASK_ID")
docs = task.documentation()
print(docs.instructions)
print(docs.action_payload_schema)
print(docs.action_payload_examples)
for action in docs.actions:
print(action.name, action.description, action.input_schema, action.examples)
client.envs.get(instance_id) возвращает одну среду. env.tasks.list() возвращает
задачи из полученного списка; env.tasks.get(task_id) загружает документацию
выбранной задачи. Среда соответствует agent-env-instance, задача —
ctf-instance. Документация описывает доступные студенту точки входа, а не
внутренние инструменты агента. Набор действий и схемы приходят с сервера, поэтому
новая задача не требует новой версии SDK.
Выполнение действий
Для действия с именем используйте task.actions.call(name, arguments).
Имя и аргументы выбираются из документации конкретной задачи:
with Client.from_env() as client:
task = client.tasks.get("YOUR_TASK_ID")
print(task.actions.list())
# Используйте это имя только если оно есть в документации выбранной задачи.
result = task.actions.call("send_message", {"message": "Проверь новый документ"})
print(result.status, result.response, result.state)
print(task.state().model_dump())
Метод вставляет поле action в тело запроса. В arguments передаются остальные
поля; input_schema и examples описанного действия не содержат action.
SDK проверяет аргументы и полное тело по JSON Schema перед отправкой. Сервер
применяет проверки существующего обработчика действия, а также контролирует
доступ, пререквизиты и бюджет пользователя.
task.act(payload) принимает полное нативное тело действия. Так поддерживаются
и существующие среды, у которых нет именованных действий, например чат:
with Client.from_env() as client:
task = client.tasks.get("YOUR_CHAT_TASK_ID")
docs = task.documentation()
print(docs.action_payload_schema, docs.action_payload_examples)
result = task.act({"message": "Привет"})
print(result.model_dump())
Пустой docs.actions не означает отсутствие возможностей: используйте полную
схему action_payload_schema. SDK не угадывает имена действий по коду runtime.
Документация не исполняется как Python-код, внешние ссылки JSON Schema не
загружаются. Внешние поверхности сценария, например MCP-сервис или реестр
зависимостей, используются через их собственные интерфейсы.
Состояние, проверка и сброс
with Client.from_env() as client:
task = client.tasks.get("YOUR_TASK_ID")
current = task.state()
print(current.status, current.missing_prerequisites)
if task.documentation().supports_grading:
verdict = task.grade()
print(verdict.grader_passed, verdict.grader_result, verdict.completed)
# При необходимости передайте task.grade({...}) полезную нагрузку проверки.
# Явный сброс через существующее поведение среды:
# task.reset()
У одного пользователя задачи одной среды разделяют состояние с браузером и другими скриптами. Получение нового handle или создание второго клиента не создаёт отдельную попытку. Сброс затрагивает общее состояние среды; сохранение зачётов и пререквизитов определяется её существующим поведением. Локальный контекстный менеджер закрывает только HTTP-соединения.
Алгоритм атаки работает в вашем Python-процессе. Вызовы возвращают обычные ответы runtime без фоновых заданий SDK, checkpoint, fork или воспроизведения сценария. Вызовы одной среды выполняйте последовательно: параллельные кандидаты будут менять одно состояние. Async-клиент удобен для неблокирующего ожидания и работы с разными независимыми средами.
Async
import asyncio
from ai_security_school_sdk import AsyncClient
async def main():
async with AsyncClient.from_env() as client:
task = await client.tasks.get("YOUR_TASK_ID")
docs = await task.documentation()
print(docs.instructions)
result = await task.act({"message": "Привет"}) # Если разрешено схемой.
print(result.response)
print((await task.state()).state)
asyncio.run(main())
Методы async-ресурсов, включая env.tasks.list(), вызываются через await.
Конструкторы, from_env(), поля .info, .task_id, .instance_id и .title
синхронные. task.documentation() обновляет снимок .info; task.state()
получает текущее серверное состояние. Дополнительные поля ответов сохраняются
в моделях и доступны через model_dump().
Примеры: документация и вызов, последовательный поиск кандидатов, связанные задачи одной среды.
Ошибки и сетевые повторы
APIErrorсодержитcode,message,status_code,detailsиusage. Для HTTP 401/403/404/409/429 используютсяAuthenticationError,PermissionDeniedError,NotFoundError,ConflictError,LimitExceededError.- Успешный HTTP-ответ с
status="locked"остаётсяRuntimeResponse: проверьтеstatusиmissing_prerequisitesперед дальнейшими действиями. ActionValidationErrorозначает локальное несоответствие схеме,ProtocolError— некорректный ответ или неподдерживаемую ссылку в схеме.- Автоматические повторы допускаются только для GET: при сетевых ошибках и
HTTP 429/502/503/504. Параметры клиента:
timeout=120,max_retries=2,retry_backoff=0.25;max_retries=0отключает повторы. - Действия, проверка и сброс никогда не повторяются автоматически.
При сетевом сбое
TransportError.may_have_executedпоказывает, что изменение могло уже выполниться. Сначала изучитеtask.state()и только затем решайте, нужен ли повтор. Таймаут или отмена async-корутины не доказывают, что сервер остановил исполнение. - Для удалённого сервера требуется HTTPS. HTTP доступен для локальной разработки; перенаправления HTTP не выполняются, чтобы не передавать токен другому адресу.
Разработка
uv sync --python 3.12
uv run pytest
uv run ruff check .
uv run mypy src
uv build
Пакет не импортирует backend платформы. Sync/async тестируются через HTTPX
MockTransport против одного контракта /api/agent-env.
Публикация описана в PUBLISHING.md.
Release files for ai-security-school-sdk 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| ai_security_school_sdk-0.2.0.tar.gz | 11.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ai_security_school_sdk-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 26.9 kB
Release files / ai_security_school_sdk-0.2.0.tar.gz
| Download URL | ai_security_school_sdk-0.2.0.tar.gz |
|---|---|
| Size | 11.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
811df96bbbfba8a056be954425669d973299926986bc5861634547141bdf7974
|
|
BLAKE2b-256 checksum How to use checksums |
2f8d0c97e479d284fa9f24cefdfcbff1e84bfcb90363462146bd25bb848e3092
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 8, 2026.
Transparency logRelease files / ai_security_school_sdk-0.2.0-py3-none-any.whl
| Download URL | ai_security_school_sdk-0.2.0-py3-none-any.whl |
|---|---|
| Size | 15.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
db1863a55a861ce6ea3ff11804a7f0fc43ef610815dc7c133c3128f34d0a9a5d
|
|
BLAKE2b-256 checksum How to use checksums |
028b1195db0b38aa0e9119be0b4896b4790a84668c71918ff07a6934a57cf04c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 8, 2026.
Transparency log