NVIDIA משיקה את Switchyard: פרוקסי Rust לניתוב תעבורת LLM בין OpenAI ל-Anthropic

הבעיה מוכרת לכל צוות שמריץ סוכני קוד: Claude Code מדבר Anthropic Messages API, Codex CLI מדבר OpenAI, והמודל שהצוות רוצה להריץ יושב מאחורי vLLM, NVIDIA NIM או Ollama. כתיבה מחדש של הסוכן לא באה בחשבון, אז שכבת התרגום חייבת לשבת במקום אחר. Switchyard הוא התשובה של NVIDIA, פרוקסי וספריית Rust שמנתבת בקשות בין ספקים, מתרגמת בין פורמטי OpenAI ו-Anthropic, רושמת מטריקות תפעוליות וחושפת אלגוריתמי ניתוב מודולריים. הקוד משוחרר תחת רישיון Apache 2.0 עם תיעוד ב-docs.nvidia.com/nemo/switchyard.
מה Switchyard עושה בפועל
הלקוחות שומרים על ה-API המקורי שלהם. Switchyard מפענח את הבקשה הנכנסת לטיפוסי Rust נייטרליים לספק, מריץ אלגוריתם ניתוב שבוחר בקאנד, מקודד מחדש את הבקשה בפורמט ה-wire של אותו בקאנד, קורא לו, ומתרגם את התגובה, כולל אירועי סטרימינג, חזרה לצורה שהלקוח מצפה לה. השרת מקבל שלושה פורמטים נכנסים: OpenAI Chat Completions, OpenAI Responses, ו-Anthropic Messages. כל אחד מהשלושה יכול לפנות לכל נתיב, וכל לקוח LLM מוגדר בוחר פורמט עליון משלו. הניתוק הזה הוא העיקר: ה-API של הסוכן וה-API של הבקאנד כבר לא חייבים להתאים.
שלוש דרכים להריץ את הכלי
נתיב ה-Launcher מכוון לסוכני קוד. מתקינים את הכלי המפורסם עם `uv tool install --python 3.12 "nemo-switchyard[cli]"`, ואז מריצים `switchyard launch claude`, `switchyard launch codex`, או `switchyard launch openclaw` מול פריסה ארוזה או קובץ TOML משלכם. נתיב השרת מתקין את הפרוקסי העצמאי עם `cargo install --locked switchyard-server`, מאמת קונפיגורציה עם `--dry-run`, ומאזין על מארח ופורט שבוחרים. נתיב הספרייה משתמש ב-`switchyard-libsy`, שמטמיע את אלגוריתמי הניתוב באפליקציית Rust בלי להחזיק סטאק HTTP משלו, האלגוריתם מחליט לאן לנתב ומחזיר כל קריאת מודל לקורא.
אלגוריתמי ניתוב: מ-passthrough ועד stage_router
נתיב הוא מזהה מודל גלוי-לקוח בתוספת האלגוריתם שמאחוריו. השרת תומך בארבעה: `passthrough` שולח כל בקשה ליעד יחיד; `random` מחלק תעבורה בין יעדים עם משקלים יחסיים אופציונליים ו-seed אופציונלי לשחזור רצף הבחירה, זה המסלול לניסויי A/B ועלויות; `llm_classifier` קורא ליעד מסווג לקבלת פסק יכולת, ואז מנתב ליעד חלש או חזק, נדרש `base_threshold`, ופרמטרים כמו `min_confidence`, `capability_elevated_floor`, ו-`session_affinity` מכוונים אותו, כשכל מה שהשופט לא מצליח להכריע נופל לחזק; מצב `escalation` מריץ כל תור על הדרגה החלשה קודם ונותן לשופט להחליט אם להריץ מחדש על החזקה. `stage_router` מנקד אותות תוצאות-כלי והתקדמות-סוכן מתורים אחרונים כדי לבחור יעד מסוגל או יעיל, וחוסך קריאת מסווג ברוב התורים. תפקידים כמו חזק, חלש, מסוגל ויעיל הם תפקידים בתוך נתיב, לא תכונות קבועות של מודל, אותו מודל עליון יכול לשמש תפקידים שונים בנתיבים שונים.
תצפיתיות ומטריקות
`GET /metrics` מחזיר טקסט Prometheus מספק OpenTelemetry ברמת התהליך. המשפחות מכסות בקשות, שגיאות, זמן קריאת-מודל, זמן תור-מלא, טוקני פרומפט, השלמה, מטמון, יצירת-מטמון, והסקה, וניסיונות HTTP עליונים לפי תוצאה וקוד. תווית `tier` נושאת `strong` או `weak` להחלטות מסווג ניתנות להבחנה, וקריאות מסווג מוחרגות מהמשפחות האלה. המטריקה המעניינת יותר היא `switchyard_routing_overhead_ms`, שמדווחת את זמן הריצה של האלגוריתם עצמו, נותנת לצוותים תמונה כמה עולה הניתוב לפני שבכלל מגיעים למודל.
אזהרת pre-alpha: לא לייצור
הכלי ניתן לפריסה כבר עכשיו, הבינארי מותקן מ-crates.io והלאנצ'ר מ-PyPI, והוא מארח-עצמית בכל מקום, אבל NVIDIA מסמנת את Switchyard כ-pre-alpha וניסיוני, מזהירה שהוא לא לשימוש בייצור, ומצהירה שה-API והאלגוריתמים צפויים להשתנות משמעותית לפני v1.0. מי שבונה תשתית סוכנים ורוצה לבדוק ניתוב חוצה-ספקים בלי לכתוב מתרגמים בעצמו יכול להתחיל לשחק; מי שצריך יציבות חוזית יצטרך לחכות.