Неофициальный Python-клиент для alphaxiv: как мы нашли скрытый API и упаковали его в пакет. AlphaXiv.. AlphaXiv. api-client.. AlphaXiv. api-client. arxiv.. AlphaXiv. api-client. arxiv. claude code.. AlphaXiv. api-client. arxiv. claude code. llm-агент.. AlphaXiv. api-client. arxiv. claude code. llm-агент. mcp.

Если вы работаете с научными статьями, то наверняка знакомы с arXiv — основным репозиторием препринтов в области CS, математики и физики. alphaxiv — это надстройка над ним: платформа добавляет к каждой статье раздел для обсуждений и, что важнее для нас, AI-ассистента, который умеет отвечать на вопросы по содержанию конкретной статьи. Спросить про методологию, попросить объяснить формулу, уточнить, какие результаты получены на каком датасете — всё это прямо на странице статьи.

Проблема возникает, когда нужно выйти за пределы браузера. Допустим, вы хотите автоматически получать краткое изложение статей из свежей подборки, встроить ассистента в свой исследовательский пайплайн или подключить его к LLM-агенту. Официальной документации API у alphaxiv нет в публичном доступе — ни ссылки с сайта, ни упоминаний в блоге. Пакетов на PyPI на момент написания тоже не было. (UPD: смотрите актуальную информацию в последнем разделе)

Мы решили разобраться, как работает ассистент под капотом, и оформили результат в виде Python-пакета aurelle-py. В этой статье — как именно мы нашли API, что внутри, и как использовать пакет в своих проектах.

Как нашли API

Никакого реверс-инжиниринга здесь не было — только браузерные DevTools и 15 минут наблюдения.

Открываем страницу любой статьи на alphaxiv, жмём F12, переходим на вкладку Network и фильтруем по Fetch/XHR. Затем задаём вопрос через интерфейс «Ask AI» и смотрим, какой запрос уходит.

Вкладка Network в DevTools: запрос к api.alphaxiv.org в момент обращения к ассистенту

Вкладка Network в DevTools: запрос к api.alphaxiv.org в момент обращения к ассистенту

В списке появляется POST-запрос к api.alphaxiv.org/assistant/v2/chat. Открываем его — во вкладке Payload видим тело запроса, в Headers — заголовок авторизации, в Preview — SSE-поток в ответе. Всё что нужно, лежит на поверхности.

Заголовок авторизации выглядит так:

Authorization: Bearer <токен>

Токен — это не постоянный API-ключ, а короткоживущий JWT, который браузер получает от Clerk (сервис аутентификации, используемый alphaxiv). Это первая проблема для программного доступа: токен протухает. Однако оказалось, что alphaxiv поддерживает и постоянные ключи — они создаются в личном кабинете.

Страница «API Keys» в личном кабинете alphaxiv

Страница «API Keys» в личном кабинете alphaxiv

Ключ из личного кабинета работает точно так же, как браузерный JWT, и не имеет срока действия. Именно его aurelle-py использует в качестве основного способа авторизации.

Тело запроса, которое мы увидели в DevTools, выглядит примерно так:

{
  "message": "Какие результаты были получены в области круглых тензоров в 2026 году?",
  "files": [],
  "llmChatId": null,
  "model": "aurelle-1",
  "thinking": false,
  "webSearch": "off",
  "parentMessageId": null,
  "paperVersionId": "some-version-uuid",
  "selectionPageRange": null,
  "assistantVariant": "paper"
}

Поле model сразу привлекло внимание: aurelle-1. Это название нигде публично не упоминается — ни в блоге alphaxiv, ни в документации, ни в открытых источниках. По всей видимости, это внутреннее имя модели или её конфигурации. Для нас это просто строка, которую нужно передавать в каждом запросе.

Ответ приходит в формате Server-Sent Events — потоком событий, а не единым JSON.

Что внутри: эндпоинт, SSE и параметры

Эндпоинт и авторизация

Единственный эндпоинт, с которым работает ассистент:

POST https://api.alphaxiv.org/assistant/v2/chat
Authorization: Bearer {AURELLE_API_KEY}
Content-Type: application/json

Ключ создаётся в личном кабинете alphaxiv и передаётся в каждом запросе. Никакой дополнительной аутентификации не требуется.

Тело запроса

Разберём поля, которые реально влияют на поведение:

Поле

Тип

Описание

message

string

Текст запроса к ассистенту

model

string

Генеративная модель

llmChatId

string | null

UUID сессии для multi-turn диалога; null — новая сессия

paperVersionId

string | null

Внутренний ID версии статьи на alphaxiv; при передаче модель работает с конкретным PDF

webSearch

string

"off" или "full" — включить веб-поиск

thinking

bool

Режим «размышления» перед ответом

assistantVariant

string

Всегда "paper" — вариант "homepage" зависает вне браузера

parentMessageId

string | null

API не возвращает это значение, поэтому поле всегда null

selectionPageRange

null

В браузере используется для вопросов по выделенному фрагменту; программно не работает

Формат ответа: Server-Sent Events

Ответ приходит не единым JSON, а потоком событий (Content-Type: text/event-stream). Каждое событие — отдельная строка вида:

data: {"type": "delta_output_text", "value": "The attention mechanism"}
data: {"type": "delta_output_text", "value": " allows the model to..."}
data: {"type": "tool_use", "toolUseId": "tu_01", "kind": "Answer PDF Queries", "content": "{}"}
data: {"type": "tool_result_text", "toolUseId": "tu_01", "content": "{"result": "..."}"}

Три типа событий:

Тип события

Что содержит

delta_output_text

Фрагмент текста ответа; нужно собирать последовательно

tool_use

Модель вызвала инструмент; поле kind указывает, какой именно

tool_result_text

Результат работы инструмента в виде JSON-строки

UUID созданной сессии приходит не в теле ответа, а в заголовке: llm-chat-id. Его нужно сохранить, чтобы передать в llmChatId следующего запроса.

Встроенные инструменты модели

При ответе на вопрос о статье модель самостоятельно выбирает, какие инструменты вызвать. Из наблюдений за реальными запросами удалось выявить пять:

Инструмент

Что делает

Answer PDF Queries

Загружает и читает PDF статьи с arXiv напрямую

Fetch arXiv Abstract

Получает аннотацию статьи

Full Text Papers Search

Полнотекстовый поиск по индексу alphaxiv

Embedding Similarity Search

Семантический поиск по близости

Agentic Paper Retrieval

Многошаговый поиск статей

Rate limit

alphaxiv ограничивает частоту запросов: 40 запросов в 60 секунд. При превышении лимита API возвращает HTTP 429, а в заголовках ответа передаёт информацию об ограничении:

ratelimit: limit=40, remaining=0, reset=60

aurelle-py при получении 429 немедленно выбрасывает RateLimitError с атрибутом reset_in — количество секунд до сброса счётчика.

Ограничения, выявленные опытным путём

Несколько вещей, которые не очевидны из структуры запроса, но важны на практике:

  • Multi-turn без истории. llmChatId позволяет продолжать сессию, но parentMessageId API не возвращает — получить историю предыдущих сообщений через API невозможно, эндпоинты истории возвращают 404. Модель может не помнить начало разговора.

  • assistantVariant="homepage" зависает. Этот вариант рассчитан на браузерный контекст с активной сессией. В программном клиенте запрос уходит, но ответа не приходит. Всегда используйте "paper".

  • webSearch принимает только "off" и "full". Значение "on" не работает.

  • Веб-поиск и paperVersionId несовместимы. Комбинация этих двух параметров может привести к тому, что запрос зависнет. Используйте что-то одно.

Что известно публично

Перед разработкой пакета мы проверили, нет ли уже готовых решений или хотя бы описания API в открытых источниках.
10 марта 2026 года alphaxiv опубликовал Claude Skill — интеграцию для работы со статьями прямо в Claude. Skill описывает два эндпоинта: резолвинг arXiv ID в внутренний versionId и получение структурированного обзора статьи. Это GET-запросы для готовых обзоров — интерактивный чат-эндпоинт там не упоминается.
В репозитории alphaXiv/feedback разработчики и пользователи обсуждают API в issues — но на уровне «хотим программный доступ», без спецификаций. Клиентских библиотек на PyPI или GitHub обнаружить не удалось.
При этом форма создания ключа в личном кабинете явно упоминает API — это и стало отправной точкой: раз ключи выдаются, значит, есть что вызывать.

Пакет aurelle-py

Результат исследования API оформлен в виде Python-пакета aurelle-py.

Установка

pip install aurelle-py

С поддержкой MCP-сервера:

pip install "aurelle-py[mcp]"

Структура пакета

src/aurelle/
├── __init__.py       # публичный API: AurelleClient, AsyncAurelleClient, типы
├── client.py         # синхронный клиент
├── async_client.py   # асинхронный клиент
├── models.py         # Pydantic v2: ChatRequest, ChatResponse, StreamChunk, ToolUse
├── sse.py            # парсер SSE-потока
├── exceptions.py     # AurelleError, AuthError, RateLimitError, AurelleAPIError
└── mcp/
    └── server.py     # MCP-сервер, точка входа aurelle-mcp

Ключевые архитектурные решения

Для синхронного и асинхронного клиентов выбран httpx — это избавило от необходимости тащить aiohttp как отдельную зависимость только ради async.

SSE-парсер вынесен в отдельный модуль. sse.py принимает итератор строк и ничего не знает об HTTP. Это позволяет тестировать логику разбора событий без сети — просто передавая список строк. Все 64 unit-теста работают без API-ключа и без сетевых запросов.

Если alphaxiv изменит формат запроса — получим понятную ошибку валидации на старте, а не загадочный сбой в рантайме. Поэтому входящий запрос и SSE-структуры описаны Pydantic v2 моделями.

Типизированные исключения. Вместо голого Exception — иерархия: AuthError на 401/403, RateLimitError на 429 (с атрибутом reset_in), AurelleAPIError на остальные 4xx/5xx. Это позволяет обрабатывать разные ситуации раздельно.

Sync и async с одинаковым интерфейсом. AurelleClient и AsyncAurelleClient предоставляют идентичные методы — chat(), stream(), ask_paper(). Можно переключиться между ними, заменив одну строку импорта.

Типы данных

@dataclass
class ChatResponse:
    text: str              # собранный текст ответа
    chat_id: str           # UUID сессии (для multi-turn)
    tool_uses: list[ToolUse]
    raw_events: list[dict]

@dataclass
class StreamChunk:
    delta: str             # фрагмент текста (пустой для tool-событий)
    event_type: str        # "delta_output_text" | "tool_use" | "tool_result_text"

@dataclass
class ToolUse:
    tool_use_id: str
    kind: str              # например, "Answer PDF Queries"
    content: str           # JSON-строка с данными инструмента

Тесты

Пакет покрыт 74 тестами: 64 unit-теста и 10 интеграционных.

# Только unit-тесты — без API-ключа, работают офлайн
pytest

# Интеграционные тесты — требуют AURELLE_API_KEY
pytest -m integration

Unit-тесты используют respx для мокирования httpx на уровне транспорта — реальные HTTP-запросы не уходят. Интеграционные тесты помечены @pytest.mark.timeout(120) и делают паузу между запросами, чтобы не упираться в rate limit.

Примеры использования

Простой вопрос к ассистенту

Базовый сценарий — задать вопрос и получить ответ:

from aurelle import AurelleClient

with AurelleClient() as client:
    response = client.chat("В чём преимущество реализации расчётов с помощью круглых тензоров на современных GPU?")
    print(response.text)
    print(f"chat_id: {response.chat_id}")
    print(f"tool_uses: {len(response.tool_uses)}")
Вывод:

Реализация расчетов с помощью круглых (циклических) тензоров (circular tensors) или архитектур, использующих циклическую обработку данных (например, Ring Attention), предоставляет ряд критических преимуществ на современных GPU, особенно в задачах глубокого обучения и крупномасштабного моделирования.

Основные преимущества можно разделить на вычислительную эффективность, оптимизацию памяти и масштабируемость:

1. Масштабируемость контекста и устранение узких мест памяти

В современных больших языковых моделях (LLM) стандартный механизм внимания (Attention) имеет квадратичную сложность по памяти и вычислениям. Использование циклических структур (например, в Ring-Attention) позволяет:

  • Параллелизм по последовательности: Разбить длинную последовательность на части и передавать их между GPU по кругу (кольцевая топология). Это позволяет обрабатывать контексты длиной в миллионы токенов, которые не помещаются в память одного GPU. Efficient Training of Large Language Models on Distributed Infrastructures: A Survey

  • Эффективное использование KV-кэша: Циклический обмен блоками Key-Value между GPU минимизирует простои и позволяет эффективно перекрывать вычисления (computation) и передачу данных (communication). Mesh-Attention: A New Communication-Efficient Distributed Attention with Improved Data Locality

2. Оптимизация доступа к памяти (Memory Locality)

Современные GPU крайне чувствительны к паттернам доступа к памяти. Циклические тензоры позволяют реализовать:

  • Циклический сдвиг и переиспользование кэша: Вместо копирования данных для операций типа свертки с периодическими граничными условиями, можно использовать математические свойства циклических индексов. Это уменьшает количество промахов в L2-кэше и повышает пропускную способность. Sawtooth Wavefront Reordering: Enhanced CuTile FlashAttention on NVIDIA GB10

  • Векторизация: Круглые тензоры естественным образом ложатся на регулярные сетки потоков (warps), что позволяет максимально использовать пропускную способность памяти через выравнивание (coalescing).

3. Алгоритмические преимущества в специфических задачах

Для определенных классов задач использование круговой топологии тензоров является математически оптимальным:

  • Обработка сигналов и FFT: Реализация быстрых преобразований Фурье и сверток через циклические тензоры позволяет эффективно задействовать Tensor Cores. A GPU Based Memory Optimized Parallel Method For FFT Implementation

  • Периодические граничные условия: В физическом моделировании (например, модель Изинга или квантовая хромодинамика) использование циклических структур данных устраняет необходимость в сложной логике проверки границ в ядрах CUDA, что ускоряет выполнение кода. A Performance Study of the 2D Ising Model on GPUs

Сравнение подходов

Характеристика

Линейные тензоры

Циклические/Круглые тензоры

Масштабируемость

Ограничена памятью одного узла

Позволяет объединять память многих GPU (Ring/Mesh)

Граничные условия

Требуют паддинга (padding) или условий

Реализуются естественным переходом индекса

Эффективность кэша

Высокая для локальных операций

Максимальная при циклическом переиспользовании

Сложность реализации

Низкая (стандартные библиотеки)

Высокая (требует кастомных ядер или MPI/NCCL)


Критический взгляд и ограничения

Несмотря на преимущества, реализация “круглых” расчетов сталкивается с аппаратными ограничениями:

  1. Задержки связи: В кольцевых топологиях (Ring Attention) общая задержка растет пропорционально количеству GPU в кольце.

  2. Сложность планирования: Написание эффективных ядер для циклических структур требует глубокого понимания архитектуры (например, использование CuTile или Triton для управления тайлингом). Sawtooth Wavefront Reordering: Enhanced CuTile FlashAttention on NVIDIA GB10

Вопрос по конкретной статье

Удобный метод ask_paper() принимает arXiv ID и вопрос — ID статьи подставляется в сообщение автоматически:

from aurelle import AurelleClient

with AurelleClient() as client:
    response = client.ask_paper(
        arxiv_id="math/0211159",
        question="Как мне это поможет в разработке ИИ-агентов??",
    )
    print(response.text)
Вывод:

Статья The Entropy Formula for the Ricci Flow and its Geometric Applications Григория Перельмана — это фундаментальный труд по дифференциальной геометрии, который привел к доказательству гипотезы Пуанкаре. Прямого руководства по написанию кода для LLM-агентов там нет, однако идеи Перельмана имеют глубокие (хотя и теоретические) параллели с современными вызовами в ИИ.

Ниже представлен критический разбор того, как математический аппарат этой работы соотносится с разработкой агентов.

1. Геометрический поток и оптимизация весов

Перельман исследует поток Риччи — процесс, который сглаживает неровности геометрии многообразия. В разработке ИИ это можно сопоставить с ландшафтом функции потерь (loss landscape).

  • Критический взгляд: Многие современные методы оптимизации (например, градиентный спуск с моментом) пытаются найти кратчайший путь к минимуму в сложном пространстве. Поток Риччи предлагает способ “эволюции” всей поверхности.

  • Применение в агентах: Если рассматривать пространство состояний агента как геометрический объект, то методы Перельмана могли бы помочь в поиске инвариантов — характеристик системы, которые не меняются при обучении, что критически важно для стабильности агентов.

2. Формула энтропии и “интеллектуальное сжатие”

Центральное место в работе занимает введение функционала энтропии для потока Риччи. Перельман доказал монотонность этой величины, что позволило исключить появление определенных типов сингулярностей.

  • Связь с ИИ: Обучение ИИ часто интерпретируется через принцип минимальной длины описания (MDL) или максимизацию взаимной информации.

  • Проблема агентов: Агенты часто “галлюцинируют” или зацикливаются (сингулярности в поведении). Математическое доказательство того, что определенная “энергия” или “энтропия” системы всегда растет (или падает), могло бы стать фундаментом для создания гарантированно предсказуемых агентов. Однако на текущий момент перенос этих формул из гладких многообразий в дискретные веса нейросетей остается открытой математической проблемой.

3. Топологические перестройки (Surgery)

Перельман ввел метод “хирургии”: когда поток Риччи доходит до критической точки (сингулярности), он “разрезает” пространство и продолжает процесс.

  • Аналогия в архитектуре: Это напоминает динамическую смену топологии нейросети или динамическое дерево рассуждений (Tree of Thoughts) у агентов. Когда агент заходит в тупик в своих рассуждениях, ему нужна “хирургия” — отсечение неверной ветви и перестройка контекста.

  • Ограничение: В ИИ мы делаем это эвристически (через промпты или обрезку контекста). Перельман же дает строгий формализм того, как менять структуру, сохраняя глобальные свойства объекта.


Резюме: стоит ли внедрять это сейчас?

Если вы занимаетесь прикладной разработкой ( LangChain, CrewAI), эта статья вам не поможет напрямую. Она находится на совершенно ином уровне абстракции.

Однако, если вы работаете над фундаментальными алгоритмами обучения (AI Safety, Representation Learning или Geometric Deep Learning):

  1. Геометрическое глубокое обучение: Посмотрите, как методы Перельмана вдохновляют на создание нейросетей, работающих на неевклидовых пространствах (графы, гиперболические пространства).

  2. Теория информации: Формула энтропии Перельмана может дать новые идеи для функций регуляризации, которые предотвращают “схлопывание” представлений (representation collapse).

Вердикт: Это чтение для тех, кто хочет переизобрести основы ИИ через 10-20 лет, а не для тех, кому нужно запустить чат-бота завтра.

Асинхронный клиент

import asyncio
from aurelle import AsyncAurelleClient

async def main():
    async with AsyncAurelleClient() as client:
        response = await client.chat("Explain O(n²) attention complexity")
        print(response.text)

        async for chunk in client.stream("Помоги объяснить ребёнку доказательство math/0211159 ?"):
            print(chunk.delta, end="", flush=True)

asyncio.run(main())

Веб-поиск и режим thinking

# Поиск по свежим статьям с привлечением веб-поиска
response = client.chat("Найди лучший социполитический и ценностный бенчмарк для русского языка", web_search=True)

# Режим «размышления» перед ответом
response = client.chat("Какие актуальные подходы к дообучению LLM для задач устного счёта?", thinking=True)

Обработка ошибок

from aurelle.exceptions import RateLimitError, AuthError
import time

try:
    response = client.chat("Как мне написать такую же статью, как quant-ph/9904050 ?")
except AuthError:
    print("Проверьте AURELLE_API_KEY")
except RateLimitError as exc:
    print(f"Превышен rate limit. Повтор через {exc.reset_in}с")
    time.sleep(exc.reset_in or 60)

Подключение к Claude через MCP

aurelle-py включает MCP-сервер, который позволяет использовать alphaxiv-ассистента прямо в чате с Claude — без написания кода. Это, пожалуй, самый удобный сценарий для исследователя: спросить о статье можно прямо в процессе разговора с моделью.

Сервер предоставляет два инструмента:

Инструмент

Описание

ask_arxiv_paper(arxiv_id, question)

Задать вопрос по конкретной статье

research_question(query, web_search)

Общий исследовательский запрос с опциональным веб-поиском

Установка

pip install "aurelle-py[mcp]"

Claude Desktop

Добавьте в файл конфигурации:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%Claudeclaude_desktop_config.json

{
  "mcpServers": {
    "aurelle": {
      "command": "aurelle-mcp",
      "env": {
        "AURELLE_API_KEY": "your_key_here"
      }
    }
  }
}

После перезапуска Claude Desktop в чате появятся два новых инструмента.

Claude Code

Создайте файл .mcp.json в корне проекта:

{
  "mcpServers": {
    "aurelle": {
      "type": "stdio",
      "command": "aurelle-mcp",
      "env": {
        "AURELLE_API_KEY": "your_key_here"
      }
    }
  }
}

Важный момент: .mcp.json читается только при запуске, поэтому после создания или изменения файла нужно перезапустить Claude Code.

Ограничения

Multi-turn без полноценной истории. llmChatId позволяет продолжать сессию, передавая UUID из предыдущего ответа. Однако parentMessageId в ответах не возвращается, а эндпоинты истории чата отдают 404. Модель может не удерживать контекст начала разговора.

assistantVariant="homepage" зависает. Этот вариант, судя по всему, рассчитан на браузерный контекст. В программном клиенте ответа не приходит. Для всех запросов используется "paper".

webSearch и paperVersionId лучше не совмещать. При одновременной передаче обоих параметров запрос может зависнуть. Стоит использовать что-то одно в зависимости от задачи.

API недокументирован. Всё описанное выше получено наблюдением за реальными запросами и может измениться без предупреждения. Рекомендуется фиксировать версию пакета и проверять работоспособность после обновлений alphaxiv.

Заключение

Пакет доступен на GitHub и в PyPI — если работаете с arXiv и хотите встроить alphaxiv-ассистента в свои скрипты или агентные пайплайны, попробуйте. Будем рады обратной связи.

Надеемся, что alphaxiv со временем опубликует официальную документацию API и, возможно, собственный клиент — это сделает интеграцию надёжнее и избавит от необходимости опираться на результаты наблюдений за браузерным трафиком.


UPD — день публикации

Пока статья готовилась к выходу, картина успела дополниться. Фиксируем для полноты.

Документация API всё-таки существует. По адресу api-dev.alphaxiv.org работает Scalar UI с полной OpenAPI 3.0 спецификацией — 190 эндпоинтов, включая весь Assistant API. URL нигде публично не упоминался до 12 марта 2026 года, не индексируется ни одной поисковой системой (Wayback Machine не имеет ни одного снапшота, site:api-dev.alphaxiv.org даёт ноль результатов). Обнаружить его можно было только в исходном коде стороннего проекта.

Параллельный запуск. В тот же день, 13 марта 2026, на PyPI появился пакет alphaxiv_cat — автосгенерированный SDK из той же OpenAPI-спецификации с помощью Stainless, покрывающий все 190 эндпоинтов платформы. Мы не знали о его существовании: репозитории AlphaxivCat были созданы за четыре часа до нашего исследования.

Чем aurelle-py отличается от alphaxiv_cat:

  • Написан вручную для внутренних задач, не сгенерирован

  • MCP-сервер. aurelle-mcp — единственная из двух библиотек с готовой интеграцией для Claude Desktop и Claude Code. alphaxiv_cat не реализует MCP, несмотря на то что в самом API alphaxiv есть нативный /mcp/v1 эндпоинт.

  • Структурированный SSE. alphaxiv_cat возвращает Stream[object] из чат-эндпоинта — без парсинга типов событий. aurelle-py разбирает поток на delta_output_text, tool_use, tool_result_text и возвращает типизированные ChatResponse и StreamChunk.

  • Фокус на исследовательском сценарии. ask_paper(arxiv_id, question) — одна строка вместо ручной сборки параметров. Явные предупреждения об известных ограничениях API (multi-turn, зависания при совмещении параметров) — то, чего нет в автосгенерированной документации.

Проекты занимают разные ниши: alphaxiv_cat — полный SDK для всей платформы, aurelle-py — специализированный клиент для AI-ассистента с акцентом на LLM-интеграцию.


Над статьёй работали: Аничков Егор, Ершов Даниил, Боловцов Сергей

Автор: SGERCEN

Источник

Rambler's Top100