PDF ها را با BabelDOC روی یک base URL سفارشی OpenAI ترجمه کنید.
Updated 2026-07-30
مترجم BabelDOC از طراحی سازگار با OpenAI است: سه flag (--openai، --openai-base-url، --openai-api-key) بهعلاوه --openai-model endpoint و مدل را انتخاب میکنند. base URL را به https://api.apisrouter.com/v1 اشاره دهید و سندها را با Claude، DeepSeek، GLM، یا Gemini از طریق یک کلید ترجمه کنید.
پاسخ سریع: سه flag هر فراخوانی ترجمه را مسیردهی میکند.
خط فرمان BabelDOC مستقیم endpoint را میگیرد: --openai مترجم LLM را فعال میکند، --openai-base-url تعیین میکند درخواستها کجا بروند، --openai-api-key احراز هویت میکند، و --openai-model id مدل را انتخاب میکند. مثالهای خود README دقیقاً همین مجموعه flag را نشان میدهند، و یادداشت سرویس-ترجمه آن بیان میکند فقط LLM های سازگار با OpenAI پشتیبانی میشوند، که یک gateway چند-vendor سازگار با OpenAI را تطابق طبیعی میکند نه یک راهحل موقت. چون id مدل بهعنوان رشته ساده فوروارد میشود، هر چیزی که endpoint سرویس دهد کار میکند: خود مستندات upstream مدلهای سازگار با OpenAI-friendly از خانوادههای 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، حدود ۹ هزار ستاره، از تیم پشت Immersive Translate) یک مترجم سند PDF است که چیدمان را حفظ میکند: ساختار سند را parse میکند، فرمولها و شکلها را محافظت میکند، پاراگرافها را پیدا میکند، آنها را با یک LLM ترجمه میکند، و PDF را بهعنوان یک نسخه mono ترجمهشده و یک نسخه dual کنار-هم بازمیسازد. بهصورت یک CLI و یک API پایتون عرضه میشود، و همتای self-hosted سرویس میزبانیشده BabelDOC است. مرحله ترجمه جایی است که endpoint اهمیت دارد. یک سند به بسیاری درخواست chat-completions بهاندازه پاراگراف تبدیل میشود، محدودشده توسط flag --qps (پیشفرض ۴ پرسوجو در ثانیه) و پردازششده توسط یک worker pool (pool-max-workers، پیشفرض به مقدار QPS). آن شکل دو پیامد دارد. اول، ترجمه یک workload حجمی است: یک PDF بلند صدها فراخوانی کوچک است، پس قیمت هر-token سریع انباشته میشود. دوم، برخلاف workload های retrieval که مدل بیشتر میخواند، ترجمه تقریباً بهاندازهای که میخواند مینویسد، پس قیمت output-token بهاندازه قیمت input وقتی id ها را مقایسه میکنید اهمیت دارد. BabelDOC ترجمهها را هم cache میکند، پس اجرای دوباره یک سند نتایج قبلی را دوباره استفاده میکند مگر --ignore-cache را پاس دهید. CSV های واژهنامه (--glossary-files) اصطلاحات را در سرتاسر اجرا pin میکنند، و --max-pages-per-part سندهای بسیار بزرگ را به بخشهایی تقسیم میکند که بهطور خودکار ترجمه و merge میشوند.
راهاندازی کامل: flag های CLI یا فایل پیکربندی TOML.
برای استفاده تکراری، همان تنظیمات در یک فایل TOML پاسدادهشده با --config زندگی میکنند. جدول [babeldoc] همان کلیدها را بهصورت kebab-case میپذیرد: openai، openai-model، openai-base-url، openai-api-key، بهعلاوه گزینههای throughput و output. این کلید را از تاریخچه شل شما بیرون نگه میدارد و یک پروفایل ترجمه را در سرتاسر سندها بازتولیدپذیر میکند. پیکربندی زیر یک پروفایل حجمی عملی است: یک id سریع برای عمده سندها، QPS بالابردهشده برای تطابق با یک gateway pooled، و هر دو حالت output نگهداشتهشده. openai-model را برای سندهایی که ظرافت بیشتر از throughput اهمیت دارد به یک 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"انتخاب یک مدل ترجمه.
workflow مقایسه ملموس است: همان ده صفحه را با دو id ترجمه کنید (cache کلیددار به ازای هر اجرا آنها را جدا نگه میدارد)، dual ها را کنار هم بخوانید، و usage log هر-کلید را برای اینکه هر pass چقدر هزینه داشته چک کنید. بیشتر تیمها روی یک پیشفرض سریع بهعلاوه یک پروفایل premium برای سندهایی که سزاوارش هستند فرود میآیند، هر دو بهعنوان فایلهای TOML.
- سندهای حجمی (راهنماها، مقالههایی که یکبار خوانده میشوند) با deepseek-v4-flash تناسب دارند: کیفیت ترجمه برای نثر فنی حفظ میشود و هزینه هر-صفحه نزدیک به ناچیز است.
- ترجمه با مقصد چینی یک بازی خانگی برای glm-5.2 و خانواده DeepSeek است؛ خود مستندات upstream به مدلهای GLM و DeepSeek بهعنوان انتخابهای سازگار با OpenAI خوشرفتار اشاره میکند.
- سندهای حساس-به-ظرافت (قراردادها، ترجمههای منتشرشده) claude-sonnet-4-6 یا claude-haiku-4-5-20251001 را توجیه میکنند، که اصطلاحات و register را در سرتاسر سندهای بلند وفادارتر دنبال میکنند.
- token های output اینجا اهمیت دارند. ترجمه بهاندازهای که میخواند مینویسد، پس id ها را در ستون قیمت output هم مقایسه کنید، نه فقط input.
- واژهنامهها را با id های سریع جفت کنید. یک CSV واژهنامه اصطلاحاتی را که مدلهای سریع گاهی روی آنها drift میکنند pin میکند، که بیشتر شکاف کیفیت روی متن فنی را میبندد.
پرداخت بر اساس مصرف · پایینتر از قیمت رسمی
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 |
حالتهای شکست و تنظیم throughput.
QPS دکمهای است که با gateway تعامل دارد. پیشفرض ۴ پرسوجو در ثانیه محافظهکارانه است؛ ظرفیت upstream pooled معمولاً بیشتر را تحمل میکند، و بالابردن --qps (با pool-max-workers که آن را دنبال میکند) روشی است که یک سند ۳۰۰-صفحهای کل بعدازظهر را نمیگیرد. آن را در حالی که مراقب پاسخهای ۴۲۹ هستید بالا ببرید نه اینکه سرد به یک عدد بزرگ بپرید، چون یک پاراگراف rate-limited دوباره تلاش میکند و کل اجرا را کند میکند. flag ها فقط وقتی --openai تنظیم شده اعمال میشوند. پاسدادن یک base URL بدون --openai مترجم را غیرفعال رها میکند، که بهشکل اجرایی ظاهر میشود که PDF را parse میکند اما هرگز ترجمه نمیکند. id های مدل رشتههای دقیق در برابر فهرست /v1/models endpoint هستند؛ یک غلطتایپی اولین فراخوانی پاراگراف را با model-not-found شکست میدهد. یک ۴۰۱ یعنی کلید و base URL به هم تعلق ندارند. مشکلات چیدمان مشکلات endpoint نیستند. متن همپوشان، فرمولهای گمشده، یا جدولهای شکسته به سمت parsing PDF ردیابی میشوند (--enhance-compatibility، --ocr-workaround برای سندهای اسکنشده، یا toggle rich-text را امتحان کنید)، و عوضکردن مدلها آنها را برطرف نمیکند. عکس آن هم صادق است: اصطلاحات غلطترجمهشده یک مسئله مدل یا واژهنامه است، نه یک مسئله parser. cache میتواند تغییرات را پنهان کند. بعد از عوضکردن مدلها، اگر میخواهید id جدید محتوایی را که id قدیمی از قبل پوشش داده دوباره ترجمه کند --ignore-cache را پاس دهید؛ در غیر این صورت پاراگرافهای cacheشده همانطور که بودند میمانند.
چه کسانی BabelDOC را از طریق یک gateway مسیردهی میکنند.
- پژوهشگرانی که مقالهها را بهصورت انبوه ترجمه میکنند، جایی که صدها فراخوانی کوچک به ازای هر سند قیمتگذاری حجمی و دید usage هر-کلید را کل بازی میکند.
- تیمهایی که مستندات دوزبانه را استاندارد میکنند، یک پروفایل پیشفرض سریع و یک پروفایل premium را در برابر همان endpoint با رشتههای مدل مختلف اجرا میکنند.
- کاربرانی در بازارهایی که قویترین مدلهای ترجمه برای جفت زبانشان نزد vendor های مختلف است: id های GLM، DeepSeek، Claude، و Gemini همه پشت یک کلید.
- self-hoster هایی که سرویس میزبانیشده را برای سندهای محرمانه جایگزین میکنند، parsing را محلی نگه میدارند و فقط متن پاراگراف را به یک endpoint قابلممیزی میفرستند.
- توسعهدهندگان بدون دسترسی به صورتحساب یک vendor خاص. دسترسی مبتنی بر شارژ بدون الزام کارت وابستگی ثبتنام هر-provider را حذف میکند.
endpoint را تأیید کنید و اولین سند را عیبیابی کنید.
مدلهایی را که کلید شما میتواند آدرس دهد قبل از شروع یک اجرای طولانی فهرست کنید؛ --openai-model باید دقیقاً با یک id سرویسدادهشده مطابقت داشته باشد. سپس چیز کوچکی را (یک PDF یک-صفحهای، یا --pages 1 روی یک سند بزرگتر) سرتاسری ترجمه کنید. یک ۴۰۱ روی اولین پاراگراف یعنی کلید با base URL مطابقت ندارد. Model-not-found یک غلطتایپی id است. اجرایی که parse میکند اما هرگز endpoint را فرا نمیخواند --openai را گم کرده. توقفهای مکرر با پیامهای retry به QPS ای اشاره دارد که بالاتر از آنچه endpoint تحمل میکند تنظیم شده؛ آن را پایین بیاورید و دوباره بالا ببرید. وقتی سندها جاری شوند، کنسول APIsRouter مدل، شمارش token، و هزینه هر-درخواست را نشان میدهد. هزینه ترجمه در هر دو جهت (input و output) با طول سند مقیاس میگیرد، و usage log هر-کلید روشی است که یاد میگیرید هزینه واقعی هر-صفحه شما برای هر مدل چقدر است بهجای تخمین آن.
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 از endpoint های سفارشی سازگار با OpenAI پشتیبانی میکند؟
بله، بهصورت native. CLI مقادیر --openai-base-url و --openai-api-key را در کنار --openai-model افشا میکند، و پیکربندی TOML همان کلیدها را میپذیرد. README upstream بیان میکند LLM های سازگار با OpenAI نوع مترجم پشتیبانیشده هستند.
آیا BabelDOC میتواند با مدلهای Claude، GLM، یا DeepSeek ترجمه کند؟
بله. id مدل بهعنوان رشته ساده به endpoint پشت --openai-base-url فوروارد میشود، پس هر id کاتالوگی کار میکند. خود مستندات upstream مدلهای خانواده GLM و DeepSeek را بهعنوان انتخابهای خوشرفتار توصیه میکند.
یک PDF چند فراخوانی API هزینه دارد؟
BabelDOC قطعات بهاندازه پاراگراف را ترجمه میکند، پس یک سند به صدها فراخوانی کوچک chat-completions محدودشده توسط --qps تبدیل میشود. هم token های input و هم output با طول سند مقیاس میگیرند؛ usage log هر-کلید هزینه دقیق هر-سند را نشان میدهد.
چه QPS ای باید در برابر یک gateway تنظیم کنم؟
نزدیک پیشفرض ۴ شروع کنید و در حالی که مراقب پاسخهای ۴۲۹ هستید بالا ببرید؛ endpoint های pooled معمولاً بیشتر را تحمل میکنند، و pool-max-workers مقدار QPS را دنبال میکند مگر جداگانه تنظیم شود. یک QPS بالاتر پایدار تفاوت بین دقیقهها و ساعتها روی سندهای بلند است.
مدلها را عوض کردم اما ترجمه تغییر نکرد. چرا؟
cache ترجمه. BabelDOC نتایج cacheشده را به ازای هر سند دوباره استفاده میکند؛ بعد از عوضکردن --openai-model، --ignore-cache را پاس دهید تا id جدید محتوای قبلاً پوششدادهشده را دوباره ترجمه کند.
آیا انتخاب endpoint روی چیدمان، فرمولها، یا جدولها اثر میگذارد؟
خیر. parsing، تحلیل چیدمان، و بازسازی PDF صرفنظر از endpoint بهصورت محلی اجرا میشوند. مسائل چیدمان flag های خودشان را دارند (--enhance-compatibility، --ocr-workaround)؛ base URL فقط تصمیم میگیرد کدام مدل متن را ترجمه کند.