Переводите PDF в BabelDOC на кастомном OpenAI base URL.

Updated 2026-07-30

Переводчик BabelDOC изначально OpenAI-совместим: три флага (--openai, --openai-base-url, --openai-api-key) плюс --openai-model выбирают эндпоинт и модель. Направьте base URL на https://api.apisrouter.com/v1 и переводите документы с Claude, DeepSeek, GLM или Gemini через один ключ.

Короткий ответ: три флага маршрутизируют каждый вызов перевода.

Командная строка BabelDOC принимает эндпоинт напрямую: --openai включает LLM-переводчик, --openai-base-url задаёт, куда идут запросы, --openai-api-key аутентифицирует, а --openai-model выбирает id модели. Собственные примеры README показывают именно этот набор флагов, а примечание о сервисе перевода гласит, что поддерживаются только OpenAI-совместимые LLM, что делает мультивендорный OpenAI-совместимый шлюз естественным выбором, а не обходным путём. Поскольку id модели пересылается как простая строка, работает всё, что обслуживает эндпоинт: сама апстримная документация рекомендует OpenAI-совместимо-дружелюбные модели семейств GLM и DeepSeek, и через APIsRouter они соседствуют с id Claude и Gemini за тем же base URL.

babeldoc --files paper.pdf \
  --lang-in en --lang-out zh \
  --openai \
  --openai-model "deepseek-v4-flash" \
  --openai-base-url "https://api.apisrouter.com/v1" \
  --openai-api-key "$APISROUTER_API_KEY"

Как BabelDOC превращает PDF в вызовы моделей.

BabelDOC (funstory-ai на GitHub, около 9K звёзд, от команды за Immersive Translate) — переводчик PDF-документов, сохраняющий вёрстку: он разбирает структуру документа, защищает формулы и рисунки, находит абзацы, переводит их с помощью LLM и пересобирает PDF как переведённую моно-версию и параллельную дуал-версию. Он поставляется как CLI и Python API и является self-hosted аналогом размещённого сервиса BabelDOC. Фаза перевода — это то, где эндпоинт имеет значение. Документ превращается во множество запросов chat-completions размером с абзац, дросселируемых флагом --qps (по умолчанию 4 запроса в секунду) и обрабатываемых пулом воркеров (pool-max-workers, по умолчанию равный значению QPS). Эта форма имеет два следствия. Во-первых, перевод — это объёмная нагрузка: длинный PDF — это сотни небольших вызовов, так что цена за токен быстро накапливается. Во-вторых, в отличие от нагрузок retrieval, где модель в основном читает, перевод пишет примерно столько же, сколько читает, так что цена выходных токенов важна не меньше цены входных при сравнении id. BabelDOC также кеширует переводы, так что повторный запуск документа переиспользует предыдущие результаты, если вы не передадите --ignore-cache. CSV-глоссарии (--glossary-files) фиксируют терминологию по всему прогону, а --max-pages-per-part разбивает очень большие документы на части, которые переводятся и объединяются автоматически.

Полная настройка: флаги CLI или TOML-файл конфига.

Для повторного использования те же настройки живут в TOML-файле, передаваемом через --config. Таблица [babeldoc] принимает идентичные ключи в kebab-case: openai, openai-model, openai-base-url, openai-api-key, плюс опции пропускной способности и вывода. Это держит ключ вне истории вашей shell и делает профиль перевода воспроизводимым между документами. Конфиг ниже — практичный объёмный профиль: быстрый id для основной массы документов, QPS, поднятый под пуловый шлюз, и оба режима вывода сохранены. Замените openai-model на более сильный id для документов, где нюансы важнее пропускной способности.

[babeldoc]
lang-in = "en-US"
lang-out = "zh-CN"
qps = 10
pool-max-workers = 10

# Translation service
openai = true
openai-model = "deepseek-v4-flash"
openai-base-url = "https://api.apisrouter.com/v1"
openai-api-key = "sk-YOUR-APISROUTER-KEY"

# Output control
no-dual = false
no-mono = false
watermark-output-mode = "no_watermark"

Выбор модели перевода.

Рабочий процесс сравнения конкретен: переведите одни и те же десять страниц двумя id (кеш, привязанный к прогону, держит их раздельно), прочитайте дуал-версии бок о бок и проверьте лог использования по ключу на предмет того, во что обошёлся каждый проход. Большинство команд приходят к быстрому варианту по умолчанию плюс премиальному профилю для документов, которые этого заслуживают, оба как TOML-файлы.

  • Объёмные документы (руководства, статьи, читаемые один раз) подходят под deepseek-v4-flash: качество перевода держится для технической прозы, а цена за страницу близка к незначительной.
  • Перевод на китайский — родная площадка для glm-5.2 и семейства DeepSeek; сама апстримная документация указывает на модели GLM и DeepSeek как на хорошо ведущие себя OpenAI-совместимые варианты.
  • Документы, критичные к нюансам (контракты, публикуемые переводы), оправдывают claude-sonnet-4-6 или claude-haiku-4-5-20251001, которые более верно отслеживают терминологию и регистр на длинных документах.
  • Выходные токены здесь важны. Перевод пишет примерно столько же, сколько читает, так что сравнивайте id и по столбцу цены на вывод, а не только на ввод.
  • Сочетайте глоссарии с быстрыми id. CSV-глоссарий фиксирует терминологию, на которой быстрые модели иногда плывут, что закрывает большую часть разрыва в качестве на техническом тексте.

Оплата по факту · дешевле официальных цен

Selected models are priced below official list prices. Exact input, output, cache, and per-request prices are shown for each model.

МодельОфициальная ценаНаша цена
DeepSeek V4 Flash$0.14 / $0.28 per M$0.10 / $0.30 per M
GLM-5.2$1.14 / $4.00 per M$1.10 / $4.00 per M
Gemini 3.5 Flash$1.50 / $9.00 per M$1.20 / $7.20 per M
Claude Haiku 4.5 20251001$1.00 / $5.00 per M$0.80 / $4.00 per M
Claude Sonnet 4.6$3.00 / $15.00 per M$2.40 / $12.00 per M

Сбои и настройка пропускной способности.

QPS — это регулятор, который взаимодействует со шлюзом. Значение по умолчанию 4 запроса в секунду консервативно; пуловая ёмкость апстрима обычно выдерживает больше, и поднятие --qps (с pool-max-workers, следующим за ним) — это то, как 300-страничный документ перестаёт занимать весь день. Наращивайте его, наблюдая за ответами 429, а не прыгая сразу к большому числу, потому что абзац с ограничением скорости повторяет попытку и замедляет весь прогон. Флаги применяются только когда задан --openai. Передача base URL без --openai оставляет переводчик отключённым, что проявляется как прогон, который разбирает PDF, но никогда не переводит. Id моделей — это точные строки против листинга /v1/models эндпоинта; опечатка роняет первый вызов абзаца с model-not-found. 401 означает, что ключ и base URL не принадлежат друг другу. Проблемы вёрстки — не проблемы эндпоинта. Наложение текста, потерянные формулы или сломанные таблицы восходят к стороне разбора PDF (попробуйте --enhance-compatibility, --ocr-workaround для сканированных документов или переключатель rich-text), и смена моделей их не исправит. Обратное тоже верно: неверно переведённая терминология — это проблема модели или глоссария, а не парсера. Кеш может маскировать изменения. После смены модели передайте --ignore-cache, если хотите, чтобы новый id заново перевёл контент, уже покрытый старым id; иначе кешированные абзацы остаются как были.

Кто направляет BabelDOC через шлюз.

  • Исследователи, переводящие статьи массово, где сотни мелких вызовов на документ делают объёмное ценообразование и видимость использования по ключу всей игрой.
  • Команды, стандартизирующие двуязычную документацию, запускающие быстрый профиль по умолчанию и премиальный профиль против одного и того же эндпоинта с разными строками моделей.
  • Пользователи на рынках, где сильнейшие модели перевода для их языковой пары принадлежат разным вендорам: id GLM, DeepSeek, Claude и Gemini — все за одним ключом.
  • Self-hosters, заменяющие размещённый сервис для конфиденциальных документов, оставляя разбор локальным и отправляя только текст абзацев на один проверяемый эндпоинт.
  • Разработчики без доступа к биллингу конкретного вендора. Доступ на основе пополнения без требования карты убирает зависимость от регистрации у каждого провайдера.

Проверьте эндпоинт и отладьте первый документ.

Перечислите модели, которые может адресовать ваш ключ, прежде чем начинать долгий прогон; --openai-model должен точно совпадать с обслуживаемым id. Затем переведите что-нибудь крошечное (PDF на одну страницу, либо --pages 1 на файле побольше) от начала до конца. 401 на первом абзаце означает, что ключ не соответствует base URL. Model-not-found — это опечатка в id. Прогон, который разбирает документ, но никогда не вызывает эндпоинт, означает, что пропущен --openai. Частые зависания с сообщениями о повторных попытках указывают на QPS, заданный выше, чем выдерживает эндпоинт; снизьте его и наращивайте заново. Как только документы пошли потоком, консоль APIsRouter показывает модель на запрос, счётчики токенов и расходы. Стоимость перевода масштабируется с длиной документа в обоих направлениях (вход и выход), и лог использования по ключу — это то, как вы узнаёте реальную стоимость за страницу для каждой модели, а не оцениваете её на глаз.

curl -s https://api.apisrouter.com/v1/models \
  -H "Authorization: Bearer $APISROUTER_API_KEY" | head -50

# then a one-page smoke test
babeldoc --config babeldoc.toml --files sample.pdf --pages 1

Частые вопросы

Поддерживает ли BabelDOC кастомные OpenAI-совместимые эндпоинты?

Да, нативно. CLI предоставляет --openai-base-url и --openai-api-key наряду с --openai-model, а TOML-конфиг принимает те же ключи. Апстримный README заявляет, что OpenAI-совместимые LLM — это поддерживаемый тип переводчика.

Может ли BabelDOC переводить моделями Claude, GLM или DeepSeek?

Да. Id модели пересылается как простая строка эндпоинту за флагом --openai-base-url, так что работает любой id каталога. Сама апстримная документация рекомендует модели семейств GLM и DeepSeek как хорошо ведущие себя варианты.

Сколько вызовов API стоит один PDF?

BabelDOC переводит фрагменты размером с абзац, так что документ превращается в сотни небольших вызовов chat-completions, дросселируемых --qps. И входные, и выходные токены масштабируются с длиной документа; лог использования по ключу показывает точную стоимость по каждому документу.

Какой QPS стоит выставить против шлюза?

Начните около значения по умолчанию 4 и наращивайте, наблюдая за ответами 429; пуловые эндпоинты обычно выдерживают больше, а pool-max-workers следует за значением QPS, если не задан отдельно. Стабильно более высокий QPS — это разница между минутами и часами на длинных документах.

Я сменил модель, но перевод не изменился. Почему?

Кеш перевода. BabelDOC переиспользует кешированные результаты по документу; передайте --ignore-cache после смены --openai-model, чтобы новый id заново перевёл ранее покрытый контент.

Влияет ли выбор эндпоинта на вёрстку, формулы или таблицы?

Нет. Разбор, анализ вёрстки и восстановление PDF выполняются локально независимо от эндпоинта. У проблем вёрстки свои собственные флаги (--enhance-compatibility, --ocr-workaround); base URL решает только, какая модель переводит текст.