כמה עולה לסוכן לתרגם קובץ משאבים
הרצה 20260812T160551Z-92885b, נאספה 2026-08-12
כל נתון בעמוד הזה מגיע מהתוצרים המפורטים בתחתית. נתוני הטוקנים הם החשבונאות של Claude עצמו מתוך הזרם ומאובייקטי התוצאה במצב הדפסה. נתוני המטבע הם קירובים המדווחים על ידי Claude Code CLI, ולא סכומי חיוב.
השאלה
סוכן קוד שמתבקש לתרגם קובץ משאבים של i18n יכול לעשות את העבודה בעצמו, או למסור את הקובץ למתרגם שרץ על אותו מחשב. הראשון מוציא טוקני API על כל ערך. השני אינו מוציא דבר על הערכים, ו־BetterTranslator מסוגל לעשות זאת בלי סוכן בלולאה כלל. המדד בוחן כמה עולה כל דרך, על קובץ אחד, בטוקנים, בדולרים מקורבים, בבקשות ובזמן שעון.
שלוש זרועות נמדדו, בשמות שהתוצרים נוקבים בהם.
| זרוע | מה קורה | מי מתרגם |
|---|---|---|
| direct | Claude Code קורא את הקובץ וכותב את התרגום בעצמו. לא מוגדר שרת MCP. | הסוכן |
| mcp-path | Claude Code קורא ל־translate_file בשרת ה־MCP המקומי של BetterTranslator ומתשאל את job_status. תוכן הקובץ לעולם אינו נכנס לשיחה. | המודל המקומי |
| mcp-value | Claude Code שולח את הערכים דרך translate_text וכותב את הקובץ בעצמו. | המודל המקומי |
דרך רביעית, החלון של BetterTranslator עצמו או bt translate בלי סוכן כלל, מוציאה אפס טוקני API מעצם בנייתה ונישאת באומדן כשורת האפס.
איך נבנתה הבדיקה
| Held constant | Value |
|---|---|
| Agent | Claude Code CLI 2.1.228 |
| Model | claude-opus-5 |
| Prompt | identical across arms apart from one sentence |
| Session | fresh session per run |
| Repetitions | three per cell, the first excluded as cache warm-up |
| Language pair | English to Czech |
| Local engine | TranslateGemma, translategemma-4b-it-Q4_K_M.gguf, Q4_K_M |
| MCP transport | stdio, server bettertranslator 1.0.0, protocol 2024-11-05, 10 tools |
| Host | Windows 11, .NET SDK 10.0.302 |
| Corpus | 4,666 keys in 627,920 bytes, sha256 a8fdce5a, of which 1,242 were eligible under the selection rule |
ערך מתאים לחתך כאשר הוא מחרוזת באורך 20 עד 180 תווים שאין בה קו אנכי לריבוי, תגית HTML או שבירת שורה, ושעדיין מכילה לפחות 4 מילים ו־20 אותיות ASCII לאחר הסרת אסימוני המקומות השמורים. כל ערך שנבחר הוא פרוזה שמתרגם חייב לשנות. כל חתך הוא תחילית של החתך הגדול ממנו. גיבוב המקור המלא הוא a8fdce5aba678743b2aac57a9b8c06405e41b836cd174051fc09357da648a633.
| Slice | Keys | Bytes | sha256 |
|---|---|---|---|
| slice-10 | 10 | 1,205 | be639f19 |
| slice-50 | 50 | 5,109 | f0214d54 |
| slice-200 | 200 | 21,295 | 6a58de05 |
| slice-500 | 500 | 55,642 | 57e3b4d6 |
הערת חשבונאות: גרסת Claude Code הזו אינה פולטת מדדים או אירועים של OpenTelemetry, ולכן החשבונאות לכל בקשה נקראת מגושי ה־usage שב־stream-json של Claude ומאובייקט התוצאה במצב הדפסה. נוסו 4 תצורות של מייצא, ואף אחת לא הפיקה פלט. כבדיקה צולבת, מערך הבדיקה משווה את שני המקורות בכל הרצה: 22 מתוך 33 הרצות מסכימות בטווח של 2 אחוזים, ו־11 שאינן מסכימות נושאות את שני המספרים ב־summary.csv.
לפי חתך
| Slice and arm | Requests | cacheCreation | cacheRead | Total tokens | Approx USD | Wall clock s | Values delivered |
|---|---|---|---|---|---|---|---|
| slice-10 direct | 3.0 | 17,546 | 103,780 | 121,337 | 0.2602 | 23.4 | 10 of 10 |
| slice-10 mcp-path | 7.0 | 18,289 | 269,247 | 287,669 | 0.3362 | 17.3 | 10 of 10 |
| slice-50 direct | 3.0 | 22,704 | 105,376 | 128,091 | 0.4016 | 64.0 | 50 of 50 |
| slice-50 mcp-path | 13.5 | 18,523 | 541,119 | 560,011 | 0.4827 | 27.3 | 49 of 50 |
| slice-200 direct | 4.0 | 50,665 | 144,893 | 195,574 | 0.9510 | 143.4 | 198 of 200 |
| slice-200 mcp-path | 26.5 | 13,656 | 1,125,718 | 1,140,077 | 0.7553 | 78.6 | 195 of 200 |
| slice-500 direct | 3.5 | 92,294 | 140,597 | 232,903 | 2.2062 | 539.3 | 498 of 500 |
| slice-500 mcp-path | 24.0 | 24,068 | 1,032,698 | 1,057,235 | 0.8214 | 57.2 | none |
הזרוע השלישית, לשם השלמות. היא לא הורצה ב־500 מפתחות על פי הנחיה.
| Slice and repetition | Requests | Total tokens | Approx USD | Wall clock s | Values delivered | Gate |
|---|---|---|---|---|---|---|
| slice-10 | 5.0 | 212,361 | 0.3693 | 35.3 | 10 of 10 | pass, spread 32.7 percent |
| slice-50 | 15.5 | 740,057 | 0.8774 | 162.0 | 50 of 50 | pass, spread 48.0 percent |
| slice-200 rep 2 | 15 | 1,000,865 | 2.6973 | 639.2 | 198 of 200 | fail, model fallback |
| slice-200 rep 3 | 9 | 478,525 | 3.0136 | 206.1 | 0 of 200 | fail, model fallback and session limit |
מה ההאצלה משנה
הזרוע המואצלת מול הסוכן שמתרגם את הקובץ בעצמו. השורה של 500 מפתחות אינה בת השוואה, משום שהזרוע המואצלת לא הפיקה קובץ.
| Slice | Delta tokens | Delta tokens percent | Delta USD approximate | Delta USD percent | Delta requests | Delta wall clock s |
|---|---|---|---|---|---|---|
| slice-10 | +166,332 | +137.1% | +0.0760 | +29.2% | +4.0 | -6.1 |
| slice-50 | +431,920 | +337.2% | +0.0811 | +20.2% | +10.5 | -36.8 |
| slice-200 | +944,503 | +482.9% | -0.1957 | -20.6% | +22.5 | -64.8 |
| slice-500 | not comparable |
טוקנים וכסף אינם מדרגים את הזרועות האלה באותו אופן. בטוקנים אין נקודת חצייה בשום מקום בין 10 ל־500 מפתחות: הנתיב המואצל עולה יותר בכל חתך שנמדד. בדולרים מקורבים שני הקווים נחתכים בסביבות 87 מפתחות, משום שהנתיב המואצל מחליף קלט טרי בקריאות מהמטמון, ואלה מחויבות הרבה מתחת לו. ב־200 מפתחות הנתיב המואצל הוא הזול מבין השניים בכסף, אף שהוא מוציא כמעט פי שישה טוקנים.
לאן הולכים הטוקנים: המטען אכן נשאר מחוץ להקשר. בחתך הקטן ביותר, כל חילופי ה־MCP הם 306 בתים של ארגומנטים לכלים ו־707 בתים של תוצאות כלים מול קובץ קלט בן 1,205 בתים, וכל משטח הכלים מוסיף 743 טוקנים של יצירת מטמון מעל נתיב הסוכן. המחיר הוא מספר הבקשות. כל תשאול job_status הוא בקשת API מלאה שמשמיעה מחדש את השיחה כולה, ולכן החשבון של הזרוע נקבע לפי תדירות השאלה אם המודל המקומי סיים: 7.0 בקשות ב־10 מפתחות, 26.5 ב־200. הרצפה המותאמת עם קובץ ריק היא 244,502 טוקנים. השאירו את כל השאר קבוע ותנו לזרוע את מספר הבקשות של נתיב הסוכן, כפי שהיו עושים קריאה חוסמת או כלי המתנה, ואותה עבודה על 200 מפתחות נוחתת בסביבות 183,575 טוקנים מול 195,574. הנתון האחרון הוא אריתמטיקה על עלות מדודה לכל בקשה, ולא הרצה מדודה.
הקובץ כולו
נאמד, לא נמדד: הקובץ בן 4,666 המפתחות אינו נכנס לחלון הקשר אחד, ולכן האומדן חוזר על החתך הגדול ביותר שנמדד, 200 מפתחות, כ־24 מנות. זו אריתמטיקה על הרצות שנמדדו.
| Path | Tokens | Approx USD | Claude requests | Wall clock |
|---|---|---|---|---|
| Claude Code alone (direct) | 4,693,764 | 22.82 | 96 | 0h57m |
| Claude Code plus local BetterTranslator (mcp-path) | 27,361,836 | 18.13 | 636 | 0h31m |
| Claude Code plus local BetterTranslator (mcp-value) | 24,020,760 | 64.74 | not published | 2h49m |
| BetterTranslator alone, no agent | 0 | 0.00 | 0 | not published |
שני תאים נמנעים מפרסום. למספר הבקשות של mcp-value אין בסיס שעובר את השער ב־200 מפתחות, משום ששתי החזרות נסוגו למודל אחר. זמן השעון המקומי נמנע מפרסום משום שהתוצרים סותרים זה את זה.
שורת mcp-path זולה יותר בכסף מנתיב הסוכן רק מעל נקודת האיזון של 87 מפתחות, והיא מגיעה למחיר הזה עם 27,361,836 טוקנים מול 4,693,764. אומדן mcp-value נשען על הרצות שהשער החריג, ויש לקרוא אותו כחסם עליון ולא כתוצאה.
שער ההגינות
הרצה עוברת רק כאשר קובץ הפלט שלה הוא אובייקט JSON שקבוצת המפתחות וסדר המפתחות שלו תואמים לחתך בדיוק, שכל ערכיו הם מחרוזות לא ריקות, שקבוצת המקומות השמורים בכל ערך תואמת למקור, ושאף ערך שלו אינו זהה למקורו. לבדיקה האחרונה יש הקלה אחת: ערך רשאי להיות זהה למקורו כאשר כל מילה אלפביתית בו היא מותג, פרוטוקול או אסימון לוקאל שברשימת ההיתר, או מתחילה באות גדולה, מה שמכסה שמות מוצרים ושמות פרטיים בכתיב כותרת, או כאשר הערך הוא שורת פקודה הנושאת שם קובץ הפעלה או דגל ארוך.
על פני כל 33 ההרצות שתועדו, summary.csv מדווח על 0 כשלים בקבוצת המפתחות, 0 כשלים בסדר המפתחות ו־0 כשלים במקומות שמורים. 29 מתוך 33 ההרצות הפיקו קובץ כלשהו. כל החרגה שלהלן היא ערך לא מתורגם, נסיגה למודל אחר, מגבלת הפעלה או קובץ חסר.
| Arm | Slice | Rep | Total tokens | Requests | Values | Reason |
|---|---|---|---|---|---|---|
| mcp-path | slice-50 | 2 | 581,184 | 14 | 49 of 50 | 1 value equal to its source outside the allowlist |
| mcp-path | slice-50 | 3 | 538,837 | 13 | 49 of 50 | 1 value equal to its source outside the allowlist |
| mcp-path | slice-200 | 2 | 1,549,789 | 36 | 195 of 200 | 4 values equal to their source outside the allowlist |
| mcp-path | slice-200 | 3 | 730,364 | 17 | 195 of 200 | 4 values equal to their source outside the allowlist |
| mcp-value | slice-200 | 2 | 1,000,865 | 15 | 198 of 200 | model fallback across claude-opus-5 and claude-opus-4-8 |
| mcp-value | slice-200 | 3 | 478,525 | 9 | 0 of 200 | model fallback, then API error 429 on the account session limit |
| mcp-path | slice-500 | 2 | 513,111 | 12 | 0 of 500 | output file was never written |
| mcp-path | slice-500 | 3 | 1,601,358 | 36 | 0 of 500 | output file was never written |
מתוך 33 הרצות, 33 חייבו בקשה, 1 הסתיימו במגבלת ההפעלה של החשבון ו־3 נסוגו מהמודל שהתבקש, מה שהופך אותן לבלתי ניתנות להשוואה.
מגבלות
שרת ה־MCP עולה יותר טוקנים, לא פחות. בכל חתך שנמדד הוא הוציא יותר מהסוכן שמתרגם את הקובץ בעצמו: 137.1 אחוזים יותר ב־10 מפתחות, 337.2 אחוזים ב־50, 482.9 אחוזים ב־200. היתרון הנתמך שלו הוא כסף מעל נקודת האיזון של 87 מפתחות, והיתרון הזה קיים משום שקריאות מהמטמון מחויבות מתחת לקלט טרי. זה אינו חיסכון בטוקנים ואינו הופך לכזה באף גודל שנמדד כאן.
לא קיימת שום הערכת איכות. שום דבר בהרצה הזו אינו מדרג נאמנות, שטף או משמעות. המדידה היחידה ברמת הערך היא האם ערך הפלט שונה ממקורו. בחתכים שעליהם נמדד, המנוע המקומי השאיר 2.3 אחוזים מהערכים באנגלית. נתיב הסוכן עבר את השער בכל חתך. ההשוואה הזו מכסה ערכים לא מתורגמים ותו לא. כל טענה על טיב התרגום של אחד הצדדים נמצאת מחוץ לתוצרים האלה.
הנתיב המואצל לא הפיק קובץ ב־500 מפתחות. כל 3 החזרות חויבו על בקשות ולא סיפקו דבר. הסוכן הפסיק להמתין בזמן שהמשימה המקומית עדיין רצה, ושרת ה־MCP מת יחד עם ההפעלה שהתחילה אותו, ולכן העבודה שהושלמה נזרקה. ההרצות האלה הן כשל אספקה ולא תוצאה זולה, ומשום כך הן מוחרגות מטבלת ההפרשים ומשום כך לחתך הגדול ביותר אין נתון להשוואה ישירה.
המספרים לקובץ כולו הם אומדנים. אף הרצה מעולם לא תרגמה את כל 4,666 המפתחות תחת מדידה. האומדן מכפיל את החתך בן 200 המפתחות ב־24. חלוקה שונה למנות, או פגיעה במגבלת הקשר או הפעלה באמצע הדרך, משנות את התוצאה.
מעט חזרות. שתי חזרות בנות השוואה לכל תא, משום שחזרה 1 מוחרגת כחימום מטמון. הדוח מסמן את התאים שהפיזור בהם רחב: נתיב הסוכן ב־500 מפתחות (15.0 אחוזים), mcp-value ב־10 מפתחות (32.7 אחוזים) וב־50 מפתחות (48.0 אחוזים).
קובץ אחד, זוג אחד, מחשב אחד. קובץ en.json יחיד שתורגם מאנגלית לצ'כית, על מארח Windows אחד, עם מודל מקומי אחד בקוונטיזציה אחת, מול גרסת CLI אחת ומודל Claude אחד. שני צידי ההשוואה הזו משתנים עם הזמן.
שחזור הבדיקה
btbench prepare --source <path to en.json> --model claude-opus-5 --sizes 10,50,200,500
btbench run --run <run-id> --arms direct,mcp-path --reps 3
btbench collect --run <run-id>
btbench compare --run <run-id>
prepare בודק את שרת ה־MCP, מגבב את המקור וחותך את החתכים. run מבצע כל זרוע וכל חזרה בהפעלה חדשה. collect גוזר מחדש את summary.csv מהתמלילים. compare כותב את compare.md. המתזמר הוא פרויקט .NET שנבנה ל־btbench.
התוצרים
כל נתון שלמעלה נפתר לאחד מהקבצים האלה, אל הסעיף, שורת הטבלה והעמודה שהמרשם מתעד. הארבעה שהנתונים מצטטים נוסעים יחד עם האתר, כך שהבדיקה רצה במצב לא מקוון.
| קובץ | תוכן |
|---|---|
| report.md | הדוח המלא, כל הזרועות וכל החתכים |
| compare.md | ההשוואה הישירה בין שתי הזרועות |
| summary.csv | שורה אחת לכל הרצה, כל שדה שנמדד |
| environment.json | גרסאות, קומיט ב־git, בדיקת MCP, מודל מקומי, גיבובי הקורפוס |
| raw.jsonl | שורה אחת לכל בקשת API |
| runs.jsonl | שורה אחת לכל הרצה כפי שתועדה בידי המתזמר |
| logs | תמלילי stream-json ופלט שגיאות לכל הרצה |