תיעוד 82
תצורת שער יישומי Claude
מדריך עזר לכל אפשרות ב-
gateway.yaml: מאזין ו-TLS, OIDC, הפעלה (session), מאגר נתונים של Postgres, שרתי יעד (upstreams) של Amazon Bedrock, Claude Platform on AWS, Google Cloud's Agent Platform ו-Microsoft Foundry, ניתוב דגמים, מדיניות מנוהלת וטלמטריה.
פריסה של שער יישומי Claude (Claude apps gateway) מוגדרת על ידי קובץ YAML יחיד, שבדרך כלל נקרא gateway.yaml. הקובץ מגדיר את כל מה שהשער עושה: היכן הוא מאזין, כיצד מפתחים מתחברים, לאן נשלח העיבוד (inference), ואילו מדיניות וטלמטריה חלות. דף זה מהווה מדריך עזר לכל אפשרות בקובץ זה.
כדי לכתוב את הקובץ הראשון שלך, התחל מ-המדריך המהיר, שבונה תצורה עובדת מינימלית ומריץ אותה. לאחר שיש לך תצורה שאתה מרוצה ממנה, מדריך הפריסה מסביר כיצד לארוז אותה במכולה (container) ולארח אותה ב-Kubernetes, ב-Cloud Run או בפלטפורמה משלך.
השער קורא את הקובץ פעם אחת, בעת ההפעלה, באמצעות claude gateway --config /path/to/gateway.yaml. כל אפשרות מאומתת מול סכמה בעת העלייה, כך שתצורה שגויה נכשלת כבר בהתחלה עם שגיאה ברמת השדה, ולא בעת השימוש הראשון.
הדוגמה המלאה בסוף דף זה כוללת את כל החלקים.
#מבנה הקובץ
חמישה חלקים הם חובה. כל שאר החלקים הם רשות, וחלק שלא צוין מקבל את ערכי ברירת המחדל שלו. מפתחות לא מוכרים גורמים לכישלון בעלייה, כך ששגיאת הקלדה צפה כשגיאה מוגדרת ולא כהגדרה שמתעלמים ממנה בשקט.
חלקים נדרשים:
listen: כתובת האזנה, כתובת URL ציבורית, סיום TLSoidc: ספק הזהויות שלך (IdP), כולל מנפיק (issuer), לקוח, מיפוי תביעות (claims) ומי רשאי להתחברsession: אסימוני ה-bearer שהשער מנפיק, יחד עם מפתח סודי ומשך חייםstore: בסיס נתונים PostgreSQL, עבור הרשאות מכשיר (device grants) ומוני הגבלת קצבupstreams: לאן העיבוד נשלח, בין אם ל-Anthropic, ל-Amazon Bedrock, ל-Claude Platform on AWS, ל-Google Cloud's Agent Platform, או ל-Microsoft Foundry
חלקים אופציונליים:
admin: אימות עבור Admin API ושמירת נתונים למגבלות הוצאהenforcement: התנהגות fail-open או fail-closed באכיפת מגבלות הוצאהpricing: תעריפים חוזיים ומכפיל עבור מונה ההוצאות ועבור נתוני העלות שהמפתחים רואיםmodelsו-auto_include_builtin_models: רשימת דגמים שנבחרה על ידי מנהל מערכת ומזהים לפי כל upstreammanaged: מדיניות הגדרות מנוהלות לפי קבוצות IdPtelemetry: העברת OTLP אל מערך הניטור והתצפיתיות (observability) שלךaccess_control,limits,timeouts,rate_limits: רשימות התרה וחסימה של IP, מגבלות גודל בקשה, זמן עד בייט ראשון (time-to-first-byte) מול ה-upstream, ומגבלות התחברות לפי כתובת IPload_test_mode: בדיקת עומסים לשער ללא קריאה לספק דגמים
#הרחבת סודות
אל תכתוב סודות כגון client_secret, jwt_secret, או postgres_url ישירות בתוך gateway.yaml. הפנה אליהם באמצעות אחת התבניות שלהלן, והשער יפענח את הערך בעת העלייה מתוך משתנה סביבה או קובץ:
| תבנית | מתפענח ל | שימוש |
|---|---|---|
${VAR} | משתנה הסביבה VAR. העלייה נכשלת אם אינו מוגדר. | משתני סביבה במכולה, AWS Secrets Manager דרך הזרקת משתני סביבה |
${file:/path} | תוכן הקובץ בנתיב המוחלט הזה, לאחר קיצוץ רווחים. ההפניה חייבת להיות כל ערכו של השדה: שלא כמו ${VAR}, היא אינה מורחבת בתוך מחרוזת ארוכה יותר, לכן עבור סיסמת בסיס נתונים הגדר את store.password במקום להטמיע אותה בתוך postgres_url. | חיבורי כרכי סודות (Secret volume mounts) ב-Kubernetes, סוכן Vault, SOPS |
#חלקים נדרשים
#listen
בלוק listen שולט במקום שבו השער משרת: כתובת ההאזנה והיציאה (port), המקור הנראה מבחוץ (origin), וסיום TLS אופציונלי.
| שדה | נדרש | תיאור |
|---|---|---|
host | לא | כתובת האזנה. ברירת מחדל 0.0.0.0. |
port | לא | יציאת האזנה. ברירת מחדל 8080. |
public_url | אלא אם כן host הוא loopback | מקור ה-https:// הנראה מבחוץ, המשמש לבניית ה-redirect_uri של ה-IdP ומטא-נתונים של גילוי (discovery). נדרש בכל פעם ש-host אינו כתובת loopback, בין אם TLS מסתיים בפרוקסי כמו ALB, Ingress או Cloud Run, ובין אם בשער עצמו דרך tls, מכיוון שהשער לעולם אינו גוזר את המקור שלו מכותרות X-Forwarded-*: לקוחות יכולים לזייף אותן. העלייה נכשלת בלעדיו. ההגדרה trusted_proxies להלן קובעת רק את פענוח ה-IP של הלקוח. נדרש גם כדי להפעיל טלמטריה, מכיוון שהשער בונה מכתובת URL זו את נקודת הקצה של OTLP שהוא דוחף ללקוחות. |
tls.cert / tls.key | לא | נתיבי PEM אם השער מסיים TLS בעצמו. |
trusted_proxies | לא | טווחי CIDR או כתובות IP של מאזני עומסים שלפני השער. כאשר מוגדר, השער נותן אמון ב-X-Forwarded-For רק מעמיתים אלה ומתעד את כתובת ה-IP האמיתית של הלקוח לצורך הגבלת קצב לפי IP וביקורת (audit). שווה ערך ל-set_real_ip_from ב-nginx. ערכי X-Forwarded-For שנכתבים כ-ipv4:port או [ipv6]:port, כפי שמאזני עומסים מסוימים עושים, נקראים לאחר הסרת היציאה. כתובת IPv6 עם יציאה בסופה וללא סוגריים מרובעים עלולה להיקרא ככתובת שונה או לא להיקרא כלל, לכן כבה את אפשרות היציאה בכל פרוקסי שכותב בתבנית זו. |
#oidc
בלוק oidc מחבר את השער לספק הזהויות שלך וקובע מי יכול להתחבר. הוא מציין את המנפיק (issuer) ולקוח ה-OAuth, ממפה את התביעות (claims) הנושאות דוא"ל וקבוצות, ומגביל את ההתחברות לפי דומיין דוא"ל או קבוצה.
OpenID Connect (OIDC) הוא פרוטוקול ה-SSO שהשער משתמש בו מול ספק הזהויות שלך: ראה הגדרת ספק זהויות לגבי מה לרשום בצד ה-IdP.
| שדה | נדרש | תיאור |
|---|---|---|
issuer | כן | בסיס הגילוי של OIDC. חייב לשרת גילוי בכתובת /.well-known/openid-configuration. השתמש ב-HTTPS בסביבת ייצור: השער מקבל מנפיק http://. מנפיק loopback כמו http://localhost:8081 נדחה על ידי מנגנון ההגנה מפני SSRF, אלא אם כן CLAUDE_GATEWAY_ALLOW_LOOPBACK=1 מוגדר בסביבת השער. |
client_id / client_secret | כן | מתוך רישום לקוח ה-OAuth שלך. |
allowed_email_domains | לא | דחיית אסימוני id_token שתביעת ה-email שלהם אינה באחד מהדומיינים הללו, ללא תלות באותיות גדולות או קטנות. שכבת הגנה נוספת מפני הגדרה שגויה של IdP מרובה דיירים (multi-tenant). ללא תלות בהגדרה זו, אסימון id_token שתביעת email_verified שלו היא במפורש false נדחה תמיד. |
allowed_groups | לא | הגבלת התחברות לחברים בקבוצות IdP אלו, בהתאמה מול groups_claim. משתמש בדומיין דוא"ל מורשה שאינו שייך לאף אחת מקבוצות אלה יידחה. מחייב את ה-IdP לפלוט את תביעת הקבוצות. ההתאמה היא השוואת מחרוזת מדויקת ותלוית רישיות מול הערכים באותה תביעה, והשער אינו מרחיב קבוצות מקוננות: כדי לקבל חברים של תת-קבוצה, ציין את תת-הקבוצה כאן או הגדר את ה-IdP לפלוט חברות שטוחה (flattened membership). |
groups_claim | לא | איזו תביעת id_token נושאת חברות בקבוצה. ברירת מחדל groups. התוכנה Microsoft Entra פולטת תפקידי אפליקציה תחת roles. מקבל מפתח שטוח או RFC 6901 JSON Pointer כגון /resource_access/gateway/roles עבור תביעות מקוננות. |
google_groups | לא | חיפוש קבוצות המשתמש המחובר דרך ה-Directory API של Google Workspace Admin SDK, מכיוון ש-id_token של Google אינו נושא תביעת קבוצות. הגדר את service_account_json_path לנתיב קובץ מפתח של חשבון שירות עם האצלת סמכויות לכל הדומיין (domain-wide delegation) בהיקף https://www.googleapis.com/auth/admin.directory.group.readonly, ואת admin_email למנהל מערכת ב-Workspace שחשבון השירות מתחזה אליו: ה-Directory API דורש מנהל אמיתי כנושא. כתובות הדוא"ל של קבוצות המשתמש הופכות לתביעת הקבוצות שלו, כך ש-allowed_groups ו-managed.policies.match.groups מותאמים לפי כתובות הדוא"ל של הקבוצות. |
email_claim | לא | איזו תביעת id_token נושאת את הדוא"ל של המשתמש. ברירת מחדל email. ספקי IdP מסוימים, כגון ADFS ו-Entra B2C, פולטים upn או preferred_username במקום זאת. מקבל מפתח שטוח, מצביע JSON, או רשימת מפתחות חלופיים כאשר המפתח הראשון שנמצא הוא זה שנמצא בשימוש. |
scopes | לא | עקיפה מלאה של היקפי ה-OIDC שהשער מבקש. ברירת מחדל [openid, profile, email, offline_access]. הגדר זאת כאשר ה-IdP שלך דוחה היקפים שאינו מזהה, או דורש היקף מותאם אישית כדי לפלוט קבוצות או דוא"ל. חייב לכלול את openid. הסרת offline_access משביתה אסימוני רענון (refresh tokens), כך שמפתחים יבצעו שוב התחברות בדפדפן בכל session.ttl_hours. ראה הגדרת ספק זהויות עבור מתכוני היקפים לכל IdP, כגון תהליך אסימון הרענון של Google. |
scope_on_refresh | לא | שליחת scope נוספת, עם אותה רשימה כמו בבקשת ההתחברות, כאשר השער מחליף אסימון רענון. ברירת מחדל false: בקשת הרענון משמיטה את scope. רוב ספקי ה-IdP מחזירים id_token בכל רענון ואינם זקוקים לכך. הגדר true כאשר ה-IdP שלך מחזיר id_token ברענון רק אם התבקש openid מחדש, כפי ש-Okta מתעדת עבור מענק הרענון שלה. ללא id_token, כל רענון תלוי בכך שנקודת הקצה userinfo של ה-IdP תקבל את אסימון הגישה שרוענן. אם אתה מתנה התחברות או מתאים מדיניות לפי קבוצות ו-id_token בזמן רענון של ה-IdP משמיט אותן, הגדר גם userinfo_fallback: true כדי שהשער ישלים אותן מנקודת הקצה userinfo. ספק IdP שהעניק פחות היקפים מאלה שהתבקשו יכול לדחות את הרענון עם invalid_scope, כולל עבור הפעלות קיימות אם תוסיף ערכים ל-scopes כאשר הגדרה זו מופעלת. בטל את המפתח אם רענונים מתחילים להיכשל ב-token_endpoint לאחר שהגדרת אותו. דורש Claude Code גרסה v2.1.260 ומעלה בשרת השער. |
extra_auth_params | לא | פרמטרים נוספים של שאילתה המצורפים לבקשת ההרשאה של ה-IdP, כלשונם. זהו מנגנון העקיפה עבור התנהגות ספציפית ל-IdP, כגון access_type: offline עבור אסימוני רענון של Google, domain_hint עבור דיירי Entra מסוימים, או acr_values עבור תהליכי אימות מוגבר (step-up). לא ניתן לעקוף פרמטרי פרוטוקול המנוהלים על ידי השער: state, nonce, redirect_uri, PKCE, scope, response_type, response_mode, ו-client_id. |
userinfo_fallback | לא | כאשר ה-id_token משמיט דוא"ל או קבוצות, הבא אותם מ-/userinfo. נדרש עבור אסימוני גישה קלי משקל של Keycloak, שרת הארגון של Okta, ואסימונים מינימליים של ADFS. ה-id_token נשאר הסמכות העליונה: userinfo רק ממלא פערים. ברירת מחדל false. |
use_pkce | לא | שליחת אתגר PKCE (S256) בבקשת ההרשאה. ברירת מחדל true. הגדר false רק אם ה-IdP שלך דוחה PKCE עבור לקוח סודי זה. |
clock_skew_seconds | לא | סובלנות לסטיית שעון בעת אימות תביעות זמן ב-id_token. ברירת מחדל 0, שהיא מחמירה. הגדל אם אתה רואה שגיאות "token expired / not yet valid" מיד לאחר ההתחברות עקב סטיית שעון בין המארח ל-IdP. |
token_endpoint_auth_method | לא | עקיפת שיטת האימות של token-endpoint. מקבל client_secret_basic או client_secret_post. משא ומתן אוטומטי כברירת מחדל. |
id_token_signed_response_alg | לא | אלגוריתם חתימת id_token הצפוי. ברירת מחדל RS256. הגדר עבור ספקי IdP שחותמים באמצעות ES256, PS256, או EdDSA. |
additional_authorized_parties | לא | ערכי azp נוספים לקבלה מעבר ל-client_id, עבור תהליכי תיווך והחלפת אסימונים ב-Keycloak. |
discovery_url | לא | הבאת מסמך הגילוי מכתובת URL זו במקום לגזור אותו מ-issuer, עבור ספקי IdP שמאחורי פרוקסי שמשכתב את מארח המנפיק. הנתיב חייב להכיל /.well-known/. |
use_proxy | לא | שליחת בקשות ה-IdP של השער עצמו דרך פרוקסי ההעברה (forward proxy) ב-HTTPS_PROXY או HTTP_PROXY, תוך כיבוד NO_PROXY. הערך false שומר על בקשות אלו ישירות. דורש גרסה v2.1.227 ומעלה: ראה בקשות IdP דרך פרוקסי העברה להלן. |
form_action_origins | לא | מקורות נוספים עבור הוראת ה-Content-Security-Policy: form-action של דף /device. השער כבר מאפשר את 'self' ואת מקור ה-authorization_endpoint שהתגלה, אך Chrome אוכף את form-action כנגד כל שרשרת ההפניה מחדש. אם ה-IdP שלך מפנה דרך מארח שני, כגון Azure AD באיחוד מול ADFS, תצורת hub-spoke ב-Okta, או רכיב יירוט SSO ארגוני, רשום כל מקור שבקשת ההרשאה עשויה לעבור דרכו בהפניה מחדש. |
ca_cert_pem | לא | תעודת ה-CA עצמה בקידוד PEM, ולא נתיב לקובץ. היא מחליפה את מאגר האמון של המערכת עבור בקשות IdP בלבד. כדי לטעון קובץ מחובר, כתוב ${file:/etc/gateway/idp-ca.pem}. משמש עבור Keycloak או Dex שמאחורי PKI ארגוני. |
#בקשות IdP דרך פרוקסי העברה
שרתי ה-upstream לעיבוד מכבדים את HTTPS_PROXY ואת HTTP_PROXY בכל הגרסאות. הבקשות של השער עצמו ל-IdP, לגילוי, ל-JWKS, לאסימון ול-userinfo, נשלחות ישירות אלא אם כן תגדיר oidc.use_proxy: true, מה שדורש גרסה v2.1.227 ומעלה. כאשר משתנה פרוקסי מוגדר, use_proxy אינו מוגדר, והמנפיק אינו מכוסה על ידי NO_PROXY, השער שומר על בקשות אלו ישירות ורושם הודעה בעת העלייה המבקשת ממך לבחור: use_proxy: false שומר עליהן ישירות ומשתיק את ההודעה.
כאשר מוגדר use_proxy: true, ה-pod מפענח את שם המארח של כל נקודת קצה של ה-IdP בעצמו ומבקש מהפרוקסי לבצע CONNECT לכתובת ה-IP המפוענחת, כך שהפרוקסי חייב לקבל CONNECT לכתובת ה-IP של כל מארח שמסמך הגילוי מציין, ולא רק למנפיק. השתמש בכתובת פרוקסי בתבנית http://. ההגדרות ca_cert_pem ו-מנגנון ההגנה מפני SSRF חלים גם על הנתיב שעובר בפרוקסי.
יציאה דרך פרוקסי בלבד משנה את שניהם: כל עוד היא פעילה, בקשות IdP עוברות דרך הפרוקסי אלא אם תגדיר use_proxy: false, והשער מוסר לפרוקסי כל שם מארח של IdP מבלי לפענח אותו תחילה.
#יציאה דרך פרוקסי בלבד
הגדר CLAUDE_GATEWAY_PROXY_IS_EGRESS_BOUNDARY=1 בסביבת השער, לצד HTTPS_PROXY, כאשר ה-pod מגיע למארחים אחרים רק דרך פרוקסי העברה זה ואינו יכול לפענח שמות DNS ציבוריים בעצמו, או כאשר הפרוקסי מסרב ל-CONNECT לכתובת IP. דורש גרסה v2.1.277 ומעלה. זהו משתנה סביבה ולא מפתח ב-gateway.yaml כדי ששום דבר בקובץ התצורה לא יוכל להקל בבדיקת הכתובות של השער.
export HTTPS_PROXY=http://proxy.corp.example.com:3128
export NO_PROXY=
export no_proxy=
export CLAUDE_GATEWAY_PROXY_IS_EGRESS_BOUNDARY=1השער רושם שורת network: אחת בעת העלייה כאשר יציאה דרך פרוקסי בלבד פעילה.
כל שורה להלן מייצגת סוג אחד של בקשה יוצאת בשער שבו מוגדר HTTPS_PROXY, כברירת מחדל וכאשר יציאה דרך פרוקסי בלבד פעילה.
| בקשה יוצאת | ברירת מחדל | יציאה דרך פרוקסי בלבד פעילה |
|---|---|---|
שרתי upstream מסוג provider: anthropic, החלפת אסימון Workload Identity Federation, ייצואי telemetry.forward_to | מפוענח ונבדק מקומית, ולאחר מכן CONNECT לכתובת ה-IP שנבדקה דרך הפרוקסי. אספן טלמטריה שרשום ב-NO_PROXY מושג ישירות במקום זאת | שם המארח נמסר לפרוקסי |
| גילוי IdP, JWKS, אסימון, ו-userinfo | ישיר אלא אם כן מוגדר oidc.use_proxy: true, ואז CONNECT לכתובת ה-IP שנבדקה | שם המארח נמסר לפרוקסי, אלא אם כן oidc.use_proxy: false שומר על IdP פנימי כישיר |
| שרתי upstream של Amazon Bedrock, Claude Platform on AWS, Google Cloud's Agent Platform, ו-Microsoft Foundry: בדיקות קבוצות Google | שם המארח נמסר לפרוקסי | ללא שינוי |
יציאה דרך פרוקסי בלבד נשארת כבויה אלא אם סביבת השער עומדת בכל שלושת התנאים הבאים:
HTTPS_PROXYאוHTTP_PROXYמוגדר.NO_PROXYו-no_proxyריקים. אם הפלטפורמה שלך מזריקה אחד מהם לתוך pods, הגדר את שניהם לערך ריק במכולת השער. רישום אספן טלמטריה ב-NO_PROXYמשאיר את היציאה דרך פרוקסי בלבד כבויה.CLAUDE_GATEWAY_ALLOW_LOOPBACKאינו מופעל. לא ניתן לשלב אספן או IdP על ה-loopback של ה-pod עצמו עם יציאה דרך פרוקסי בלבד, מכיוון שכתובת loopback שנמסרת לפרוקסי תהיה הכתובת של מארח הפרוקסי עצמו, לכן תן לשירותים אלה כתובת שהפרוקסי יכול להגיע אליה במקום זאת. מאותה סיבה השער דוחה שמות בתבניתlocalhostלחלוטין כאשר יציאה דרך פרוקסי בלבד פעילה.
כאשר אחד מתנאים אלה אינו מתקיים, השער רושם אזהרה בעת העלייה המציינת את המשתנה שעצר זאת, ושומר על התנהגות ברירת המחדל.
ברגע שיציאה דרך פרוקסי בלבד פעילה, אשר כל יעד בפרוקסי, כולל אספן פנימי וכל מארח המוגדר לפי כתובת IP. אתה עדיין יכול לשמור על IdP פנימי כישיר באמצעות oidc.use_proxy: false.
אזהרה: הפעל זאת רק כאשר רשימת ההיתרים (allowlist) של הפרוקסי מחמירה לפחות כמו הבדיקה של השער עצמו. הפרוקסי חייב לסרב לנקודות קצה של מטא-נתונים בענן כגון
169.254.169.254ו-metadata.google.internal, לכתובות link-local, ול-loopback של מארח הפרוקסי עצמו, ועליו לסרב להן לפי הכתובת שהשם מתפענח אליה, ולא רק לפי השם, מכיוון שהשער אינו תופס עוד שם מארח שמתפענח לאחת מהן. פרוקסי שמתחבר לכל מקום שהוא מתבקש מסיר את מנגנון ההגנה מפני SSRF של השער עבור בקשות אלו.
#session
בלוק session מעצב את אסימוני ה-bearer שהשער מנפיק לאחר ההתחברות: המפתח הסודי שחותם עליהם וכמה זמן הם חיים.
| שדה | נדרש | תיאור |
|---|---|---|
jwt_secret | כן | לפחות 32 בתים של אנטרופיה, לדוגמה מ-openssl rand -base64 32. חותם על אסימוני HS256 bearer של השער. מקבל מחרוזת בודדת או מערך לצורך החלפה (rotation): אינדקס 0 חותם וכל הערכים מאמתים. כדי להחליף מפתח, הוסף מפתח סודי חדש בהתחלה, המתן ttl_hours, ולאחר מכן הסר את הישן. |
ttl_hours | לא | משך החיים של אסימון bearer של השער. ברירת מחדל 1. ה-CLI מרענן בשקט לפני התפוגה כאשר ה-IdP מנפיק אסימוני רענון. משך חיים קצר יותר שולל הרשאות מהר יותר: משך חיים ארוך יותר מבצע פחות פניות הלוך ושוב ל-IdP. אם ה-IdP שלך אינו יכול להנפיק אסימוני רענון מכיוון ש-offline_access אינו זמין, אין רענון שקט, לכן העלה ערך זה ל-8 או 12 כדי להימנע משליחת מפתחים חזרה להתחברות בדפדפן מדי שעה. |
#store
בלוק store מכוון את השער לבסיס הנתונים PostgreSQL שלו, המחזיק הרשאות מכשיר ומוני הגבלת קצב.
| שדה | נדרש | תיאור |
|---|---|---|
postgres_url | כן | כתובת URL של postgres:// או postgresql://. חובה: נקודת המפגש של הרשאת המכשיר, שבה קריאת החזרה של הדפדפן כותבת וה-CLI המתשאל קורא, זקוקה למצב משותף בין עותקים (cross-replica state). השער מריץ את מיגרציות הסכמה שלו בעת העלייה ובעת שדרוג, לכן התפקיד (role) זקוק להרשאות ליצור ולשנות טבלאות בסכמת היעד. ראה שדרוגים ו-Postgres. |
username | לא | עוקף את המשתמש ב-postgres_url. |
password | לא | פרטי הזדהות לבסיס הנתונים. הגדר כאן ולא בתוך postgres_url כדי שהסוד יישאר מחוץ לכתובת ה-URL. מקבל כל תו וגובר על פרטי הזדהות ב-URL. |
max_connections | לא | גודל מאגר החיבורים (connection-pool) של Postgres לכל עותק. ברירת מחדל 5, שהיא שמרנית וידידותית לבסיסי נתונים משותפים. כאשר מגבלות הוצאה מופעלות, הנתיב הראשי מבצע מספר פעולות לכל בקשת עיבוד, לכן הגדל ערך זה עבור בסיס נתונים ייעודי תחת עומס, ושמור על מכפלת העותקים בערך זה מתחת ל-max_connections של בסיס הנתונים. |
connect_timeout_seconds | לא | שניות שהשער ממתין בעת פתיחת חיבור ל-Postgres. מספר שלם מ-1 עד 60, ברירת מחדל 5. הגדל זאת אם ניסיונות חיבור נכשלים עקב פסק זמן כאשר מופע שער חדש מופעל. דורש Claude Code גרסה v2.1.274 ומעלה בשרת השער. גרסאות קודמות מסרבות להפעיל כאשר המפתח מוגדר. |
לפיתוח מקומי, כוון את postgres_url למכולת Postgres זמנית, לדוגמה docker run --rm -p 5432:5432 -e POSTGRES_HOST_AUTH_METHOD=trust postgres.
#upstreams
השדה upstreams הוא רשימה סדורה. השער מעביר עיבוד ל-upstream הראשון שמפענח את הדגם המבוקש.
במקרים של 5xx, 429, 401, 403, 404, או פסק זמן, השער עובר ל-upstream הבא (failover): שגיאות 4xx אחרות אינן גורמות למעבר, מכיוון ששגיאות אלו מיוחסות לבקשה ולא ל-upstream. שגיאת 401 או 403 פירושה שפרטי ההזדהות של השער עצמו נכשלו מול אותו upstream. שגיאת 404 פירושה שאותו upstream אינו משרת את הדגם המבוקש, כך ש-upstream מאוחר יותר ברשימה עדיין יכול לשרת אותו.
אם תגדיר forward_user_identity: true ב-upstream, שגיאת 429 שהוא מחזיר לבקשה שנשאה את הדוא"ל של המפתח אינה גורמת למעבר ל-upstream הבא. ראה כיצד דחיית מגבלה לפי משתמש מגיעה למפתח.
מעבר על 404 דורש שער בגרסה v2.1.198 ומעלה. מהדורות קודמות החזירו את ה-404 הראשון ללקוח גם כאשר upstream מאוחר יותר ברשימה שירת את הדגם.
מספר upstreams מאותו ספק חייבים להגדיר name: ייחודי.
לקוחות Amazon Bedrock, Claude Platform on AWS, Google Cloud's Agent Platform, ו-Microsoft Foundry נבנים פעם אחת בעת ההפעלה, וערכות ה-SDK שלהם מרעננות פרטי הזדהות באופן פנימי, כך שהחלפת פרטי הזדהות בענן אינה דורשת הפעלה מחדש. מפתחות ומזהי bearer סטטיים של Anthropic API נקראים בעת ההפעלה: ראה Anthropic API.
#הודעות שגיאה של Upstream
השער מחזיר את תגובת השגיאה של אחד ה-upstreams, או 502 משלו, בהתאם לאופן שבו ה-upstreams ענו:
- upstream החזיר סטטוס שהשער אינו עובר הלאה בגינו: תגובתו של אותו upstream. השער אינו מנסה upstreams נוספים.
- כל upstream שהשער ניסה נכשל באופן שגורם למעבר הלאה: ה-
429האחרון. כאשר אף אחד לא החזיר429, השער מעדיף, לפי הסדר, את ה-401או403האחרון, ה-404האחרון, וה-501האחרון. כאשר אף אחד לא החזיר אף אחד מאלה, השער מחזיר502משלו,all upstreams failed (N attempted), כאשר N סופר כל ערך ב-upstreams, כולל ערכים שהשער דילג עליהם מכיוון שאינם משרתים את הדגם המבוקש.
כאשר השער מחזיר תגובה של upstream, הוא שומר על קוד הסטטוס של ה-upstream. השאלה אם הוא שומר על הודעת ה-upstream תלויה בספק. גוף שגיאה מ-Anthropic API מגיע למפתח ללא שינוי.
שרתי ה-upstream של Amazon Bedrock, Claude Platform on AWS, Google Cloud's Agent Platform, ו-Microsoft Foundry יכולים לכלול את מזהי החשבון, ה-ARNs של התפקידים ומזהי הפרויקט שלך בטקסט השגיאה שלהם. השער מתעד את הטקסט המלא ב-יומן המבצעי. מה שהמפתח רואה מאותם upstreams תלוי בדחייה:
400או413במעטפת השגיאה הסטנדרטית של Anthropic: הודעת ה-upstream עצמה, כגוןprompt is too long. Claude Platform on AWS, Agent Platform ו-Microsoft Foundry מחזירים מעטפת זו עבור דחיות של ה-API של הדגם.400או413במבנה של הספק עצמו: אסימוןcapability_rejected:. כאשר השער אינו יכול לסווג את הדחייה,upstream rejected the requestב-400אוrequest too large for this upstreamב-413.- כל סטטוס אחר: נוסח כללי לפי סטטוס, כגון
upstream rate limit exceededב-429.
לדוגמה, השער מחליף את Input is too long for requested model. של Amazon Bedrock ב-capability_rejected: prompt_too_long. התוכנה Claude Code מבצעת דחיסה אוטומטית על אסימון זה, בדיוק כפי שהיא עושה על prompt is too long.
שמירה על הודעת 400 או 413 של upstream ענן, או החלפתה באסימון capability_rejected:, דורשת שער בגרסה v2.1.233 ומעלה.
#Anthropic API
ה-upstream המינימלי של Anthropic הוא מפתח API מתוך Claude Console:
upstreams:
- provider: anthropic
auth:
api_key: ${ANTHROPIC_API_KEY}
# OR an OAuth bearer (e.g. a Workload-Identity-Federation-exchanged token):
# oauth_token: ${file:/var/run/secrets/anthropic-oauth-token}
# base_url: https://api.anthropic.com
# default; override for a forward proxyשתי תבניות האימות נבדלות בכותרת שהן שולחות:
api_key: שולחx-api-key. החלף אותו ב-Claude Console ועדכן את משתנה הסביבה.oauth_token: שולחAuthorization: Bearer. השתמש בתבנית bearer כאשר הארגון שלך מנפיק אסימונים קצרי מועד במקום מפתחות API ארוכי טווח. ה-bearer נקרא פעם אחת בעת ההפעלה, לכן רענון מתבצע על ידי חיבור מחדש של הסוד והפעלה מחדש.
במקום מפתח סטטי או bearer, באפשרותך להשתמש ב-Workload Identity Federation. צור כלל איחוד לפי מדריך Workload Identity Federation, ולאחר מכן חבר את ה-OIDC JWT של עומס העבודה שלך כקובץ, כגון אסימון חשבון שירות מוטל (projected service-account token) ב-Kubernetes או id-token של פלטפורמת CI. השער מחליף את ה-JWT באסימון bearer קצר מועד ומרענן אותו אוטומטית. קובץ האסימון נקרא מחדש בכל החלפה, כך שאסימונים מוטלים שהוחלפו נקלטים ללא הפעלה מחדש.
upstreams:
- provider: anthropic
auth:
federation_rule_id: ${ANTHROPIC_FEDERATION_RULE_ID}
organization_id: ${ANTHROPIC_ORGANIZATION_ID}
identity_token_file: /var/run/secrets/anthropic/id-token
# workspace_id: wrkspc_...
# required if the rule covers >1 workspace
# service_account_id: svac_...
# optional expected-target check#כותרות זהות לפי משתמש עבור פרוקסי שאתה מפעיל
באפשרותך לכוון את ה-base_url של upstream מסוג provider: anthropic לפרוקסי שאתה מפעיל במקום ל-Anthropic API. כדי ליידע את הפרוקסי איזה מפתח שלח כל בקשה, הגדר forward_user_identity: true באותו upstream. הפרוקסי יכול אז לייחס הוצאות לכל מפתח. דורש שער המריץ Claude Code בגרסה v2.1.233 ומעלה.
לדוגמה, עבור פרוקסי בכתובת upstream-gateway.internal.example.com:
upstreams:
- provider: anthropic
base_url: https://upstream-gateway.internal.example.com
auth:
api_key: ${PROXY_KEY}
forward_user_identity: true
# default falseהשער מוסיף כותרות אלו לכל בקשה שהוא מעביר לאותו upstream:
| כותרת | ערך |
|---|---|
x-litellm-end-user-id | הדוא"ל של המפתח, כאשר ה-IdP סיפק כזה. |
x-claude-gateway-user-id | הנושא של המפתח ב-IdP, מתוך תביעת sub של האסימון. |
x-claude-gateway-user-email | הדוא"ל של המפתח, כאשר ה-IdP סיפק כזה. |
כאשר אסימון ה-IdP אינו נושא דוא"ל, השער שולח רק את x-claude-gateway-user-id ומשמיט את שתי כותרות הדוא"ל. אם ה-IdP שלך שם את הדוא"ל בתביעה אחרת, הגדר את oidc.email_claim לתביעה זו.
כאשר הפרוקסי שלך עונה 429 לבקשה שנשאה את הדוא"ל של המפתח, השער מחזיר תגובה זו למפתח כפי שהיא במקום לעבור ל-upstream הבא, כך שתקציב או הגבלת קצב לפי משתמש של הפרוקסי שלך נשמרים. תגובות אחרות של הפרוקסי פועלות לפי כללי המעבר הרגילים. אם אסימון ה-IdP של מפתח אינו נושא דוא"ל, השער מעביר את בקשותיו ללא כותרות הדוא"ל, כך ש-429 לאחת מבקשות אלו נחשב למגבלת קיבולת של upstream ועובר הלאה. לפני גרסה v2.1.267 בשרת השער, כל 429 עבר הלאה.
הגדר forward_user_identity רק ב-upstream שה-base_url שלו הוא פרוקסי שאתה מפעיל. השער שולח כתובות דוא"ל של מפתחים לכל שרת ש-base_url מציין. אם base_url הוא ה-Anthropic API, שזו ברירת המחדל, השער מסרב לפעול.
#Amazon Bedrock
עבור פריסת Amazon Bedrock בצד הלקוח שהשער מחליף או ניצב לפניה, ראה Claude Code ב-Amazon Bedrock. ה-upstream בצד השער:
upstreams:
- provider: bedrock
region: us-east-1
auth: {}
# preferred: AWS default credential chain
# OR explicit credentials:
# auth:
# aws_access_key_id: ${AWS_AKID}
# aws_secret_access_key: ${AWS_SK}
# aws_session_token: ${AWS_ST}
# OR a Bedrock API bearer token:
# auth:
# aws_bearer_token: ${AWS_BEARER_TOKEN}
# Override the bedrock-runtime endpoint for FIPS or VPC-endpoint deployments:
# base_url: https://bedrock-runtime-fips.us-east-1.amazonaws.comבלוק auth ריק משתמש בשרשרת פרטי ההזדהות של ברירת המחדל של ה-SDK של AWS: משתני סביבה, ~/.aws/credentials, תפקיד משימה ב-ECS, מטא-נתונים של מופע EC2, או IRSA ב-EKS. בסביבת ייצור, הענק ל-pod של השער תפקיד IAM במקום להטמיע מפתחות סטטיים בתמונת מכולה.
פרטי הזדהות מפורשים חייבים להיות מלאים: השער נכשל בעת העלייה כאשר aws_access_key_id ו-aws_secret_access_key אינם מוגדרים יחד, או כאשר aws_session_token מוגדר בלעדיהם. לפני גרסה v2.1.207, בלוק auth: חלקי עבר אימות.
| הגדרה | כיצד |
|---|---|
| הרשאות IAM | הענק לישות של השער את bedrock:InvokeModel ו-bedrock:InvokeModelWithResponseStream הן על ה-ARNs של פרופיל העיבוד והן על ה-ARNs של דגמי היסוד שמתחתיו. עבור הקטלוג המובנה באזורי ארה"ב: arn:aws:bedrock:<region>:<account>:inference-profile/us.anthropic.* ו-arn:aws:bedrock:*::foundation-model/anthropic.*. הענק גם bedrock:CountTokens על ה-ARNs של דגמי היסוד. השער משתמש בזה, ללא עלות, כדי לספור את אסימוני הקלט של בקשה שהלקוח נטש, כך ש-מגבלות הוצאה יישארו מדויקות. בלעדיו השער נסוג לבקשת Bedrock של אסימון יחיד לצורך ספירה זו. |
| גישה לדגמים | Amazon Bedrock מאפשרת גישה לדגמים כברירת מחדל באזורים מסחריים. המחסום הנותר ברמת החשבון הוא טופס מקרה השימוש החד-פעמי של Anthropic: אם איש בחשבון ה-AWS שלך לא הגיש אותו, פתח את מסוף Amazon Bedrock, בחר דגם Anthropic מתוך קטלוג הדגמים, והשלם את הטופס. ראה הגשת פרטי מקרה שימוש עבור הטופס של AWS Organizations וההרשאות שהמגיש צריך. |
| EKS (IRSA) | צור תפקיד IAM עם המדיניות לעיל ומדיניות אמון עבור ספק ה-OIDC של האשכול שלך בהיקף של חשבון השירות של השער. הוסף הערת ביאור לחשבון השירות עם eks.amazonaws.com/role-arn: arn:aws:iam::<acct>:role/claude-gateway. ההגדרה auth: {} תקלוט אותו. |
| ECS / EC2 | צרף את תפקיד ה-IAM להגדרת המשימה או לפרופיל המופע. ההגדרה auth: {} תקלוט אותו. |
| בכל מקום אחר | העבר פרטי הזדהות דרך משתני הסביבה AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY ו-AWS_SESSION_TOKEN, או הגדר אותם במפורש ב-auth: עם הרחבת ${VAR}. |
| אזור | region: הוא אזור נקודת הקצה של ה-API. פרופילי עיבוד חוצי-אזורים מנתבים ברחבי האזור הגאוגרפי (ארה"ב, אירופה, APAC) ללא קשר לאיזה מהם תבחר. עבור אזורים מחוץ לארה"ב או ARNs של תפוקה מוקצית, הוסף בלוק models: עם המזהים המתאימים לכל upstream. |
#Claude Platform on AWS
הפלטפורמה Claude Platform on AWS משרתת את ה-API המקורי של Anthropic על גבי תשתית AWS בכתובת aws-external-anthropic.<region>.api.aws. היא משתמשת במזהי דגמים מקוריים, מכבדת כותרות anthropic-beta כפי שנשלחו, ומשרתת את count_tokens, כך ששום תרגום ייעודי ל-Bedrock אינו חל כאן. ספק ה-anthropicAws דורש Claude Code גרסה v2.1.198 ומעלה: מהדורות שער קודמות דוחות אותו בעת העלייה.
לגבי פריסת צד הלקוח של אותה פלטפורמה, ראה Claude Code ב-Claude Platform on AWS. ה-upstream בצד השער:
upstreams:
- provider: anthropicAws
region: us-east-1
workspace_id: wrkspc_...
auth:
api_key: ${ANTHROPIC_AWS_API_KEY}
# sent as x-api-key
# OR SigV4 via the AWS default credential chain:
# auth: {}
# OR explicit SigV4 credentials:
# auth:
# aws_access_key_id: ${AWS_ACCESS_KEY_ID}
# aws_secret_access_key: ${AWS_SECRET_ACCESS_KEY}
# Override the derived endpoint:
# base_url: https://aws-external-anthropic.us-east-1.api.awsהפלטפורמה פועלת בחשבון AWS נפרד מ-Amazon Bedrock וחותמת על בקשות SigV4 עבור שם השירות שלה, aws-external-anthropic, כך שתפקיד IAM המיועד ל-Bedrock אינו מורשה עבורה. מפתח API ב-auth.api_key מקבל עדיפות כאשר מוגדרים גם פרטי הזדהות של SigV4. בלוק auth ריק משתמש בשרשרת פרטי ההזדהות של ברירת המחדל של ה-SDK של AWS, אותה שרשרת שבה משתמש ה-upstream של Amazon Bedrock.
| שדה | נדרש | תיאור |
|---|---|---|
region | כן | אזור AWS, אותיות קטנות, ספרות ומקפים. השער גוזר ממנו את נקודת הקצה כ-https://aws-external-anthropic.<region>.api.aws. |
workspace_id | כן | נשלח ככותרת בכל בקשה: הפלטפורמה דורשת זאת. |
auth.api_key | לא | מפתח API עבור הפלטפורמה, נשלח כ-x-api-key. אינו אסימון bearer: שני מצבי האימות הם מפתח API או SigV4. |
auth.aws_access_key_id / auth.aws_secret_access_key | לא | פרטי הזדהות מפורשים של SigV4. הגדרת האחד ללא השני נכשלת בעת העלייה. auth.aws_session_token מתקבל לצידם. |
base_url | לא | עקיפת נקודת הקצה הנגזרת. |
מכיוון שהפלטפורמה מפענחת מזהי דגמים מקוריים, הקטלוג המובנה מנתב אליה ללא צורך בבלוק models:. כאשר אתה מגדיר רשימת models:, סמן את הרשומה ב-anthropicAws: עם המזהה המקורי.
#Google Cloud Agent Platform
עבור ההגדרה המקבילה בצד הלקוח, ראה Claude Code ב-Google Cloud. ה-upstream בצד השער:
upstreams:
- provider: vertex
region: us-east5
project_id: example-prod
auth: {}
# preferred: Application Default Credentials
# OR a service account key file:
# auth: { service_account_json: /secrets/sa.json }
# Override the aiplatform endpoint for Private Service Connect:
# base_url: https://us-east5-aiplatform.p.googleapis.comבלוק auth ריק משתמש ב-Application Default Credentials (ADC): משתנה GOOGLE_APPLICATION_CREDENTIALS, מטא-נתונים של GCE, או GKE Workload Identity. קובצי מפתח JSON של חשבון שירות נתמכים אך אינם מומלצים: השתמש ב-Workload Identity או צרף חשבון שירות למופע ה-GCE או Cloud Run.
הגדר region: global כדי להשתמש ב-נקודת הקצה הגלובלית עבור Agent Platform של Google Cloud במקום בנקודת קצה אזורית. Google מנתבת אז כל בקשה לאזור זמין, כך שאינך צריך לעקוב אחר זמינות הדגמים לפי אזור. הגדרת אזור ספציפי מקבעת כל בקשה אליו.
| הגדרה | כיצד |
|---|---|
| הרשאות IAM | הענק לחשבון השירות של השער את roles/aiplatform.user בפרויקט, או תפקיד מותאם אישית עם aiplatform.endpoints.predict. הפעל את Google Cloud's Agent Platform API (aiplatform.googleapis.com). |
| גישה לדגמים | ב-Model Garden, הפעל את דגמי Claude עבור הפרויקט שלך. הם מתפרסמים באזורים ספציפיים: בדוק בכרטיס הדגם את האזורים הנתמכים. |
| GKE (Workload Identity) | קשור חשבון שירות של GCP לחשבון השירות ב-Kubernetes של השער והוסף ל-KSA ביאור עם iam.gke.io/gcp-service-account: claude-gateway@<proj>.iam.gserviceaccount.com. ההגדרה auth: {} תקלוט אותו. |
| Cloud Run / GCE | הגדר את חשבון השירות של השירות לחשבון עם roles/aiplatform.user. ההגדרה auth: {} תקלוט אותו. |
| בכל מקום אחר | auth: { service_account_json: /secrets/sa.json }, הנתיב לקובץ מפתח JSON המחובר כסוד. השדה מקבל נתיב קובץ, ולא את תוכן המפתח, כך שאין כאן הרחבת ${file:…}. |
#Microsoft Foundry
עבור פריסת Microsoft Foundry בצד הלקוח, ראה Claude Code ב-Microsoft Foundry. ה-upstream בצד השער:
upstreams:
- provider: foundry
resource: example-foundry
# https://example-foundry.services.ai.azure.com
auth: { use_azure_ad: true }
# preferred: DefaultAzureCredential / Managed Identity
# OR an API key:
# auth:
# api_key: ${FOUNDRY_API_KEY}ההגדרה use_azure_ad: true מתפענחת דרך DefaultAzureCredential: זהות מנוהלת (Managed Identity) ב-AKS, ACI או App Service; ה-CLI של Azure; או פרטי הזדהות ממשתני סביבה. מפתחות API עובדים אך הם ברמת הפרויקט ואינם מתחלפים אוטומטית. נקודת הקצה של Microsoft Foundry נגזרת מ-resource:: הגדר את base_url האופציונלי כדי לעקוף אותה עבור עננים ריבוניים כגון Azure Government.
| הגדרה | כיצד |
|---|---|
| RBAC | הענק לזהות של השער את Azure AI User או Cognitive Services User על משאב ה-Microsoft Foundry. |
| פריסות | Microsoft Foundry משתמשת בשמות פריסה שנבחרו על ידי מנהל המערכת, ולא במזהי דגמים קנוניים. הוסף בלוק models: הממפה כל מזהה קנוני לשם הפריסה שלך. |
| AKS (זהות עומס עבודה) | צור איחוד של User-Assigned Managed Identity עם ספק ה-OIDC של האשכול וקשור אותה לחשבון השירות של השער. ההגדרה use_azure_ad: true תקלוט אותה דרך WorkloadIdentityCredential. |
| ACI / App Service | הפעל זהות מנוהלת המוקצית על ידי המערכת או על ידי המשתמש במשאב. ההגדרה use_azure_ad: true תקלוט אותה. |
| בכל מקום אחר | auth: { api_key: "${FOUNDRY_API_KEY}" }. שים גרשיים סביב ${…} בתוך { }. |
#כותרות סטטיות בבקשות Upstream
כדי להוסיף כותרות קבועות לבקשות שהשער שולח ל-upstream אחד, הגדר headers: באותו upstream. השתמש בזה כאשר פרוקסי שאתה מפעיל מול הספק מנתב או מייחס תעבורה לפי כותרת.
ההגדרה headers: דורשת Claude Code גרסה v2.1.277 ומעלה בשרת השער. שער בגרסה קודמת מסרב להפעיל כאשר הוא מוצא את המפתח. שדרג כל עותק לפני שתוסיף את המפתח, והסר את המפתח לפני שתחזור לגרסה קודמת.
הכותרות נשלחות לשרת ש-base_url מציין, או לנקודת הקצה של הספק עצמו כאשר base_url אינו מוגדר. הספק מקבל אותן גם הוא, אלא אם הפרוקסי שלך מסיר אותן.
דוגמה זו מגיעה ל-upstream מסוג provider: vertex דרך פרוקסי בכתובת upstream-proxy.internal.example.com. היא מגדירה את כותרת ה-x-source שהפרוקסי קורא, ושולחת אסימון ממשתנה הסביבה PROXY_TOKEN בתור x-proxy-token:
upstreams:
- provider: vertex
region: us-east5
project_id: example-prod
base_url: https://upstream-proxy.internal.example.com
auth: {}
headers:
x-source: claude-apps-gateway
x-proxy-token: ${PROXY_TOKEN}ערכים הם טקסט ASCII להדפסה ללא רווחים באף אחד מהקצוות. שים במירכאות מספר, true, או false כדי ש-YAML יקרא אותו כטקסט.
כדי לשמור סוד מחוץ לקובץ התצורה, השתמש ב-הרחבת סודות כדי לטעון את הערך ממשתנה סביבה באמצעות ${VAR} או מקובץ באמצעות ${file:/path}. ערך ${VAR} שמתפענח לערך ריק עוצר את הפעלת השער.
ההגדרה headers: עובדת בכל ספק, וכל upstream שולח רק את הכותרות שלו.
לא כל בקשה שהשער שולח ל-upstream נושאת אותן:
| בקשה שהשער שולח ל-upstream זה | נושאת headers: |
|---|---|
/v1/messages, עם הזרמה או בלעדיה, וכן /v1/messages/count_tokens | כן |
| בקשה שעברה מ-upstream אחר | כן, את ה-headers: של upstream זה בלבד |
קריאת CountTokens של Amazon Bedrock עבור בקשה שהלקוח נטש | לא |
| החלפת אסימון Workload Identity Federation | לא |
ב-upstream של Amazon Bedrock או של Claude Platform on AWS שחותם על בקשות באמצעות AWS SigV4, כותרות אלו מהוות חלק מהחתימה, ולכן על הפרוקסי שלך להעביר אותן הלאה ללא שינוי.
אם תשתמש בשם שהשער שומר לעצמו, הוא יסרב לפעול, ושגיאת ההפעלה תציין את שם הכותרת. שמות שמורים כוללים:
authorizationו-x-api-keyhost,content-type, ו-user-agent- כל שם שמתחיל ב-
anthropic-, ב-x-goog-, ב-x-amz-, או ב-x-amzn-
#ריבוי Upstreams
אותו ספק יכול להופיע יותר מפעם אחת עם name: מובחן. זה מכסה אזורים שונים, חשבונות שונים דרך שרשראות פרטי הזדהות שונות, תפוקה מוקצית (provisioned throughput) לעומת לפי דרישה (on-demand), ונסיגה בין ספקים שונים.
השער מנסה את ה-upstreams לפי הסדר. מצבים של 5xx, 429, 401, 403, 404, פסקי זמן, ונקודת קצה חסרה (501) עוברים ל-upstream הבא: שגיאות 4xx אחרות אינן עוברות.
שגיאת 429 היא ברמת הקיבולת של ה-upstream, ולכן מיצוי תפוקה מוקצית (PT) יעבור לתפוקה לפי דרישה. אם תגדיר forward_user_identity: true ב-upstream, שגיאת 429 לבקשה שנשאה את הדוא"ל של המפתח היא דחייה ברמת המשתמש ולא תעבור ל-upstream הבא.
כל בקשה מתחילה ב-upstream הראשון. בקשה מגיעה ל-upstream מאוחר יותר רק כאשר כל upstream שלפניו נכשל או אינו משרת את הדגם המבוקש.
השער אינו שומר תיעוד של upstreams שנכשלו, כך שכל עוד upstream מושבת, כל בקשה שמגיעה אליו עדיין מנסה לפנות אליו וממתינה שייכשל לפני שהיא ממשיכה הלאה.
עבור upstream של Anthropic API, ההגדרה timeouts.upstream_ttfb_ms תוחמת את זמן ההמתנה ל-upstream מושבת. הגדרה זו אינה חלה על ספקים אחרים, שבהם השער ממתין עד שעה שלמה לכך ש-upstream יתחיל להגיב.
שגיאת 404 היא ברמת זמינות הדגם ב-upstream, ולכן upstream שלא הפעיל דגם אינו חוסם upstream מאוחר יותר שמשרת אותו. שרת upstream שאינו יכול לפענח את הדגם המבוקש מדלג עליו ללא פניית רשת.
דוגמה זו מנתבת תחילה הקצאת תפוקה מוקצית ב-Amazon Bedrock, גולשת לתפוקה לפי דרישה חוצה אזורים ולחשבון שני, ונסוגה אל ה-Anthropic API הישיר כמוצא אחרון:
upstreams:
# Primary: provisioned throughput in your home region.
- name: bedrock-pt
provider: bedrock
region: us-east-1
auth: {}
# Overflow: on-demand cross-region.
- name: bedrock-od
provider: bedrock
region: us-west-2
auth: {}
# Different account: a separate Bedrock allotment via assumed-role creds.
- name: bedrock-acct2
provider: bedrock
region: us-east-1
auth:
aws_access_key_id: ${ACCT2_AKID}
aws_secret_access_key: ${ACCT2_SK}
# Last resort: direct Anthropic API.
- name: anthropic-fallback
provider: anthropic
auth:
api_key: ${ANTHROPIC_API_KEY}
# Per-upstream model IDs are keyed on the upstream's `name:`.
models:
- id: claude-opus-4-8
label: Claude Opus 4.8
upstream_model:
bedrock-pt: arn:aws:bedrock:us-east-1:111111111111:provisioned-model/abcdef
bedrock-od: us.anthropic.claude-opus-4-8
bedrock-acct2: us.anthropic.claude-opus-4-8
anthropic-fallback: claude-opus-4-8| מנוף | כיצד |
|---|---|
| אזורים שונים | שרת upstream אחד של Amazon Bedrock לכל אזור, כל אחד עם ה-region: שלו. עם auto_include_builtin_models: true, פרופילי עיבוד חוצי אזורים מנתבים אוטומטית: עבור פריסות המקובעות לאזור השתמש בבלוק models:. |
| חשבונות שונים | שרת upstream אחד של Amazon Bedrock לכל חשבון, כל אחד עם פרטי ההזדהות שלו ב-auth:. שרשרת ברירת המחדל (auth: {}) משתמשת בזהות ה-pod: עבור חשבון שני, הגדר פרטי הזדהות מפורשים או אסימון bearer. |
| תפוקה מוקצית | מפה את הדגם ל-ARN של התפוקה המוקצית ב-models: עבור שמו של אותו upstream. שרתי upstreams אחרים שומרים על מזהה ה-on-demand, כך שקיבולת ה-PT ממוצה לפני המעבר הלאה. |
| נקודות קצה של VPC / FIPS | הגדר את base_url: ב-upstream לכתובת ה-URL של נקודת קצה של ה-VPC או FIPS שלך. |
| ניתוב לפי דגם | רק מזהה דגם מותאם אישית, שאינו דגם Claude מובנה, מדלג על ה-upstreams שנעדרים ממיפוי ה-upstream_model: שלו. השער מנסה דגמים מובנים בכל upstream לפי הסדר ומשתמש במזהה ברירת המחדל של הספק כאשר אין רשומה במיפוי, ולכן עבור דגמים מובנים המיפוי משנה איזה מזהה ה-upstream מקבל ולא האם יתבצע ניסיון מולו: upstream שדוחה את המזהה פועל לפי אותם כללי מעבר כמו כל שגיאת upstream אחרת. |
מעבר בין ספקי ענן, או אל ה-Anthropic API הישיר, משנה את ההסכם, המיקום הגאוגרפי והתנאים האחרים החלים על הבקשה.
ה-CLI מחיל את אותם תנאי תכונות על שערים ללא קשר לאיזה upstream משרת בקשה נתונה, כך שמעבר ל-upstream אחר אינו שולח שדה בגוף הבקשה ש-upstream עלול לדחות.
#חלקים אופציונליים
#admin
אופציונלי. מפעיל את /v1/organizations/spend_limits, המשקף את ה-Admin API הציבורי של Anthropic, ואכיפת הוצאות לפי מפתח ב-/v1/messages. ראה מגבלות הוצאה לגבי אופן הגדרת המגבלות ואכיפתן: סעיף זה מכסה את המפתחות ב-gateway.yaml שמפעילים את התכונה ומכווננים אותה.
admin:
# Named static API keys for the admin endpoints, sent as x-api-key.
# The id appears in the audit log as admin-key:<id> so each key is
# attributable. Array for rotation: add the new key, roll clients,
# remove the old.
write_keys:
- { id: terraform, key: "${GATEWAY_ADMIN_WRITE_KEY_TF}" }
- { id: ci, key: "${GATEWAY_ADMIN_WRITE_KEY_CI}" }
read_keys:
- { id: reporting, key: "${GATEWAY_ADMIN_READ_KEY}" }
# IdP groups granted full admin via the normal gateway JWT (no API key).
admin_groups: [platform-finops]
blocked_message: request an increase at https://go.example.com/claude-limits| שדה | נדרש | תיאור |
|---|---|---|
write_keys | לא | מערך של {id, key}. כותרת x-api-key התואמת לאחד מאלה יכולה להציג, להגדיר ולמחוק מגבלות הוצאה. ערכי המפתחות חייבים להיות באורך של 32 תווים לפחות: ערכי id חייבים להיות ייחודיים בין read_keys לבין write_keys. |
read_keys | לא | מערך של {id, key}. לקריאה בלבד: כל נקודת קצה מסוג GET, כולל הצגת מגבלות, שליפת מגבלה לפי מזהה, וקריאת /effective ו-/audit. |
admin_groups | לא | שמות קבוצות IdP. אסימון JWT של השער שתביעת groups שלו כוללת אחת מאלה מקבל גישת ניהול מלאה, קריאה וכתיבה, ונרשם בביקורת בתור oidc:<sub>. השתמש בזה עבור מנהלים אנושיים: השתמש במפתחות API עבור מכונות. ערך ריק ברשימה זו עוצר את השער בעת העלייה. ראה ערכי התאמה שעוצרים את השער בעת העלייה. |
blocked_message | לא | מתווסף כלשונו לשגיאת 429 billing_error שמפתח חסום רואה. כתוב את ההנחיה המלאה, כגון כתובת URL או ערוץ Slack. כאשר אינו מוגדר, השער שולח את הודעת ברירת המחדל בלבד. ראה כיצד פועלת האכיפה. |
audit_retention_days | לא | ברירת מחדל 365. שורות admin_audit ישנות יותר נמחקות. |
spend_retention_months | לא | ברירת מחדל 13. שורות מוני spend ישנות מזה נמחקות. ברירת המחדל שומרת שנה מלאה בתוספת החודש החלקי הנוכחי לצורך דוחות בהשוואה משנה לשנה. |
identity_retention_days | לא | ברירת מחדל 90. זמן חיים ממועד הראייה האחרון עבור שורות principal_emails, המחזיקות את הדוא"ל, השם לתצוגה והקבוצות של כל מפתח (מידע המזהה אישית). קצר בכוונה משמירת ההוצאות כך שזהות שהוסרה מתיישנת ונמחקת בעוד שמוני ההוצאות האנונימיים שלה נשארים. |
group_limit_mode | לא | min (ברירת מחדל) או max. כאשר מפתח נמצא במספר קבוצות בעלות מגבלות, min אוכף את המגבילה ביותר ו-max את המקלה ביותר. משמש הן לאכיפה והן עבור /effective. |
#enforcement
בלוק enforcement שולט באופן שבו בדיקות מגבלת הוצאה מתנהגות כאשר מאגר הנתונים אינו זמין.
| שדה | נדרש | תיאור |
|---|---|---|
fail_closed_on_error | לא | ברירת מחדל false. אכיפת הוצאות נכשלת בצורה פתוחה (fails open) בעת השבתת Postgres, כך שהעיבוד ממשיך לעבוד. הגדר true כדי להיכשל בצורה סגורה (fail closed): מפתחים שעברו את המגבלה נחסמים, אך כך גם כל השאר אם המאגר אינו נגיש. דורש בלוק admin:: אכיפת הוצאות פועלת רק כאשר admin מוגדר, והשער מסרב לפעול אם תגדיר זאת כ-true ללא בלוק כזה. |
#pricing
בלוק pricing מורה למונה ההוצאות כמה לחייב במקום מחיר המחירון בדולר ארה"ב (USD), כך שהמגבלות ו-/effective ישקפו את התעריפים החוזיים שלך. הסכומים נשארים בדולר ארה"ב ומהווים הערכה, לא חשבונית. שתי דרישות מוקדמות:
- Claude Code גרסה v2.1.227 ומעלה בשרת השער. גרסאות קודמות דוחות את המפתח הלא מוכר בעת העלייה.
- בלוק
admin:או, בגרסה v2.1.268 ומעלה, בלוקmanaged:עם מדיניות אחת לפחות. השער מסרב להפעיל כאשרpricingמוגדר ללא אף אחד משני הבלוקים הללו, מכיוון ששום דבר לא יקרא אותו.
pricing:
multiplier: 0.85
overrides:
- upstream: bedrock-eu
model: claude-sonnet-4-6
input: 3.30
output: 16.50
cache_read: 0.33
cache_write: 4.125| שדה | נדרש | תיאור |
|---|---|---|
multiplier | לא | ברירת מחדל 1. המונה מכפיל כל סכום מנוטר בערך זה, בין אם לפי מחיר מחירון ובין אם לפי עקיפה (override), כך ש-0.85 מחייב ב-85% מהמחיר. חייב להיות גדול מ-0 ולכל היותר 10, וערך מעל 1 מהווה העלאת מחיר. |
overrides | לא | שורות של {upstream, model, input, output, cache_read, cache_write} בדולר ארה"ב למיליון אסימונים. כל ארבעת התעריפים נדרשים. כל אחד חייב להיות גדול מ-0 ולכל היותר 10000. |
כיצד המונה מתאים שורת עקיפה:
- שורה מחליפה את מחיר המחירון עבור בקשות ש-
upstream, המוגדר ב-upstreams[].name, משרת עבורmodel. זה כולל את התעריף הגבוה יותר של מצב מהיר, כך שבקשות רגילות ובקשות מהירות מנוטרות לפי אותם ארבעה תעריפים. - מזהה מובנה כגון
claude-sonnet-4-6, המותאם כמוmodels[].id, מכסה כל תבנית עם תאריך, תבנית אזורית של Amazon Bedrock, או תבנית של Google Cloud's Agent Platform שהמונה מתמחר כדגם זה. כל מחרוזת אחרת, כגון כינוי או ARN של פרופיל עיבוד, מותאמת למזהה שהלקוח שלח או למחרוזת שנשלחה ל-upstream, ללא תלות ברישיות. - כאשר יש חפיפה בין שורות, המונה בוחר בשורה הספציפית ביותר ולא בשורה הראשונה: שורה שה-
modelשלה הוא מחרוזת הדגם המדויקת שנשלחה ל-upstream, לאחר מכן שורה התואמת למזהה המדויק שהלקוח שלח, ולאחר מכן שורה המציינת את הדגם המובנה. - שם upstream לא מוכר מכשיל את העלייה, וכך גם שתי שורות עבור אותו upstream שמציינות את אותו הדגם, כולל שני איותים שונים של אותו דגם מובנה. השער מזהיר בעת העלייה לגבי שורה שאף דגם שניתן לבקש אינו יכול להשתמש בה.
- בקשות חיפוש באינטרנט נשארות במחיר המחירון של 0.01 דולר: המכפיל עדיין חל עליהן.
עבור תעריפים לפי אזור, תן לכל אזור upstream בעל שם משלו ושורה אחת לכל upstream.
#העלאת מחירים
בגרסה v2.1.271 ומעלה בשרת השער, באפשרותך להגדיר multiplier מעל 1, עד 10, כדי למדוד יותר ממה שהספק גובה, לדוגמה לצורך תעריף חיוב פנימי. דוגמה זו מודדת כל בקשה ב-120% מהמחיר:
pricing:
multiplier: 1.2עם בלוק admin:, התוספת חלה גם על מגבלות ההוצאה. המונה סופר 120% מהמחיר, כך שמפתחים יגיעו למגבלות שלהם מוקדם יותר. השער רושם אזהרה בעת העלייה שמציינת זאת.
המכפיל אינו משנה את מה שספק ה-upstream גובה בפועל עבור הבקשות.
אם השער גם שולח את התעריפים ללקוחות מחוברים, המפתחים זקוקים ל-Claude Code גרסה v2.1.271 ומעלה כדי לראות את התוספת. לקוחות ישנים יותר מתעלמים מ-multiplier שמעל 1 ומציגים עלויות בלעדיו.
שרת שער בגרסה נמוכה מ-v2.1.271 מסרב להפעיל אם תגדיר multiplier מעל 1.
#שליחת התעריפים ללקוחות מחוברים
בגרסה v2.1.268 ומעלה בשרת השער, השער מציב בנוסף את התעריפים מתוך pricing בתוך מדיניות managed שהוא משרת, בתור ההגדרה המנוהלת modelPricing. מפתחים שהותאמו למדיניות רואים אז את תעריפי pricing עבור ה-upstream הראשון שמשרת כל מזהה דגם ב-/usage, בשורת הסטטוס וב-OpenTelemetry. מפתח שאינו מותאם לאף מדיניות אינו מקבל הגדרות מנוהלות, כך שהנתונים שלו נשארים לפי מחיר מחירון. לקוחות מחילים את ההגדרה ב-Claude Code גרסה v2.1.242 ומעלה.
- מה שהשער מוסיף: אלא אם כן בלוק
cliשל מדיניות כבר מגדיר אתmodelPricing, השער מוסיף את ה-multiplierועבור כל מזהה דגם שלקוח יכול לבקש, את שורת העקיפה של ה-upstream הראשון שמשרת מזהה זה. תעריף שרק upstream של מעבר חלופי גובה נשאר בשער. - החרגת מדיניות אחת: הגדר את
modelPricingל-{}בבלוקcliשל אותה מדיניות, והמפתחים שלה יישארו במחיר מחירון. - שמירה על תעריפים של מדיניות עצמה: מדיניות שבלוק ה-
cliשלה מגדירmodelPricingעםmultiplierאוoverridesמשלה שומרת על ה-modelPricingבמלואו, והשער אינו מוסיף תעריפים משלו לתוכו.
#models
בלוק models הוא רשימת דגמים אופציונלית שנבחרה על ידי מנהל מערכת, המוגשת ב-/v1/models ומשמשת לתרגום מזהי דגמים לכל upstream. הוא נדרש עבור אזורי Amazon Bedrock מחוץ לארה"ב, ARNs של תפוקה מוקצית ב-Amazon Bedrock, ושמות פריסה של Microsoft Foundry.
auto_include_builtin_models: true
# false: expose only the list below
models:
- id: claude-opus-4-8
label: Claude Opus 4.8
# description: optional text shown in clients that surface it
upstream_model:
anthropic: claude-opus-4-8
bedrock: us.anthropic.claude-opus-4-8
# or an inference-profile ARN
foundry: your-opus-deployment-nameכל מפתח תחת upstream_model חייב להתאים ל-name של upstream מוגדר, אשר כברירת מחדל נקרא כשם הספק. מפתח שאינו תואם לאף upstream מכשיל את העלייה, לכן השמט שורות עבור ספקים שאינך משתמש בהם.
#managed
בלוק managed מגדיר מדיניות בקרת גישה מבוססת תפקידים הממופתחת לפי קבוצות IdP או דומיין דוא"ל. המדיניות מוערכת לפי הסדר: ההתאמה הראשונה נבחרת, ולאחר מכן ממוזגת על גבי בסיס ברירת המחדל הכולל match: {}. המדיניות מוגשת לכל משתמש ב-GET /managed/settings עם שמירה במטמון באמצעות ETag/304.
managed:
policies:
# Specific groups first.
- match: { groups: [eng-contractors] }
cli:
availableModels: [claude-sonnet-4-6]
permissions: { deny: ["WebFetch", "WebSearch"] }
# Default catch-all last: matches everyone who authenticated.
- match: {}
cli:
availableModels: [claude-opus-4-8, claude-sonnet-4-6, claude-haiku-4-5]ברירת מחדל כוללת מסוג match: {}, שבדרך כלל נרשמת אחרונה, נחשבת לשכבת בסיס. כל מדיניות אחרת יורשת מברירת המחדל הכוללת כל מפתח שאינה מגדירה בעצמה, כך שרשומות לפי תפקיד צריכות לציין רק את מה ששונה מברירת המחדל של הארגון. כללי המיזוג תלויים בסוג המפתח:
- רשימות התרה:
availableModelsו-permissions.allow. הרשימה של מדיניות ספציפית מחליפה לחלוטין את זו של הבסיס. - רשימות חסימה ומערכי hooks:
permissions.deny,permissions.ask,disabledMcpjsonServers,deniedMcpServers,blockedMarketplaces, וכל מערך מסוג אירוע ב-hooks. אלה לוקחים את האיחוד של הבסיס והמדיניות, כך שחסימה ברמת הארגון או hook ביקורת לא יימחקו בטעות על ידי עקיפה ברמת התפקיד. - מפתחות מסוג רשומה:
env,modelOverrides, ו-skillOverrides. אלה מתמזגים באופן שטוח, כך שבלוקenvלפי תפקיד עוקף מפתחות שהוא מגדיר ויורש את השאר מהבסיס.
ההגדרה availableModels נאכפת גם בצד השרת ב-/v1/messages, כך שדגם חסום מחזיר 400 ללא קשר למה שהלקוח שולח.
השער מאמת את ערך model בעצמו לפני שהוא מעביר בקשה, כך שערך שגוי לעולם אינו מגיע ל-upstream. הוא דוחה את הבקשה עם 400 בשני מקרים:
- כאשר הערך חסר או ריק, השער דוחה את הבקשה עם ההודעה
model is required. בדיקה זו דורשת שער המריץ Claude Code בגרסה v2.1.228 ומעלה. - כאשר הערך קיים אך אינו מחרוזת, השער דוחה את הבקשה עם ההודעה
model must be a string. דורש שער המריץ Claude Code בגרסה v2.1.221 ומעלה.
| מתאם | התנהגות |
|---|---|
match: {} | תואם לכל משתמש מאומת. התחל עם אחד כזה והוסף מדיניות לפי קבוצות מעליו מאוחר יותר. |
match: { groups: [a, b] } | תואם אם תביעת groups ב-JWT מכילה אחת מהקבוצות הרשומות. תלוי רישיות: הקבוצות חייבות להתאים לאותיות הגדולות והקטנות המדויקות ב-IdP. |
match: { email_domain: example.com } | תואם לחלק שאחרי ה-@ האחרון בתביעת email של ה-JWT, ללא תלות ברישיות. מקבל דומיין יחיד לכל מדיניות. |
match: { groups: [a], email_domain: example.com } | שני התנאים חייבים להתאים. |
משתמש מאומת שאינו תואם לאף מדיניות מקבל את ברירות המחדל של השער, כלומר כל דגם בקטלוג וללא הגדרות מנוהלות. הוסף match: {} בסוף אם אתה רוצה מדיניות ברירת מחדל מובטחת.
הערה: השער אינו מחזיק ספריית משתמשים משלו. הוא מאשר כל בקשה מתוך אסימון ה-IdP של המשתמש, קורא את החברות בקבוצה מתוך תביעת
groupsשל האסימון ומעריך את המדיניות מולה. אין רשימת משתמשים לספור ואין חשבונות ליצור מראש, ולכן אין נקודת קצה של SCIM, מכיוון שאין למה ש-SCIM יסנכרן.נהל את מחזור החיים של משתמשים וקבוצות במקור האמת, שהוא הקצאת ה-SCIM המקורית של ה-IdP שלך או פלטפורמת ניהול זהויות ייעודית. חברות ושלילת הרשאות המנוהלות שם זורמות לשער אוטומטית דרך האסימון. אם ברצונך בהקצאת SCIM של חשבונות Claude עצמם, זוהי יכולת של Claude for Enterprise.
שני מחזורי הפצה חלים כאן:
- תוכן מדיניות: עריכת מדיניות ופריסה מחדש מגיעות ללקוחות מחוברים בסקירה הבאה של הגדרות מנוהלות, תוך שעה, מלבד השינויים שחלים רק בהפעלה הבאה.
- חברות בקבוצה: שינוי החברות בקבוצה של משתמש משנה איזו מדיניות מתאימה לו. שינוי זה נכנס לתוקף בהנפקת ההפעלה הבאה, כלומר ברענון השקט הבא, המוגבל על ידי
session.ttl_hours.
#ערכי התאמה שעוצרים את השער בעת העלייה
בעת העלייה, השער בודק את בלוק ה-match של כל מדיניות ואת רשימת admin_groups. כל אחד מערכים אלה עוצר את השער עם שגיאה המציינת את השדה:
- רשימת
groupsריקה - רשומה ריקה בתוך
groupsאו בתוךadmin_groups - שדה
email_domainריק - שדה
email_domainהמכיל@, רווחים, או פסיק. השער מקצץ רווחים ומסיר@מוביל אחד לפני בדיקה זו. כתוב דומיין נקי אחד, כגוןexample.com.
לפני גרסה v2.1.232, השער עלה עם ערכים אלה. לכל ערך הייתה השפעה זו:
- שדה
email_domainריק: השער דילג על בדיקת הדומיין, כך שמדיניות עםemail_domainריק וללא רשימתgroupsהתאימה לכל משתמש מאומת. - רשימת
groupsריקה: המדיניות לא התאימה לאיש. - שדה
email_domainהמכיל@, רווחים, או פסיק: המדיניות לא התאימה לאיש. - רשומה ריקה בתוך
groupsאו בתוךadmin_groups: הרשומה התאימה למשתמש רק כאשר תביעתgroupsשל ה-IdP של אותו משתמש הכילה גם היא רשומה ריקה. בתוךadmin_groups, התאמה זו העניקה גישת ניהול. אם רשימתadmin_groupsשלך מעולם לא הכילה רשומה ריקה, איש לא קיבל גישת ניהול בדרך זו.
#מה נכנס ב-cli
כל ערך ב-cli הוא מסמך managed-settings.json מלא של Claude Code, אותה סכמה שהיית פורס דרך MDM או דרך /etc/claude-code/managed-settings.json, המבוטאת כאן כ-YAML. ה-CLI מחיל את המסמך שנמסר ברמת הניהול, מעל הגדרות משתמש והגדרות פרויקט, במקום הגדרות המנוהלות על ידי השרת. לכן הוא מתעלם מההגדרות המוגבלות למקורות מדיניות ברמת מערכת ההפעלה, כגון policyHelper ו-wslInheritsWindowsSettings.
השער מאמת כל מסמך מול סכמת ההגדרות של ה-CLI בעת העלייה, כך שמפתח בלתי מוכר ברמה העליונה מכשיל את העלייה עם שגיאה המציינת כל מפתח בעייתי. חלקים בסכמה שנשמרו פתוחים בכוונה עדיין מקבלים ערכים שרירותיים, מכיוון שלקוחות חדשים יותר עשויים לזהות רשומות שסכמת השער אינה מזהה. מפתחות פתוחים אלה כוללים את env, את pluginConfigs, ומפתחות מקוננים תחת permissions.
מכיוון שהאימות משתמש בסכמה המצורפת לגרסה המותקנת של השער, הצבת מפתח הגדרות ברמה העליונה שהוצג במהדורה חדשה יותר של Claude Code בתוך תצורה מנוהלת דורשת שדרוג של השער תחילה. בצע בדיקת תקינות ראשונית למדיניות חדשה על לקוח אחד לפני פריסתה המלאה.
מדריך המפתחות המלא נמצא ב-הגדרות Claude Code. המפתחות שרוב מפעילי המערכת פונים אליהם תחילה:
managed:
policies:
- match: {}
cli:
# Model access (also enforced server-side at /v1/messages)
availableModels: [claude-opus-4-8, claude-sonnet-4-6, claude-haiku-4-5]
# Permission policy
permissions:
deny:
- "WebFetch"
- "Read(./.env)"
- "Read(./secrets/**)"
disableBypassPermissionsMode: disable
# blocks --dangerously-skip-permissions
allowManagedPermissionRulesOnly: true
# ignore user/project permission rules
# Environment pushed into the CLI process. DISABLE_UPDATES blocks
# background and manual updates; DISABLE_AUTOUPDATER stops only
# background updates.
env:
DISABLE_UPDATES: "1"
# pin versions via your own distribution
# Org-wide hooks. Hook commands run on developer machines, not the
# gateway, so the path must exist on every client OS in the policy.
hooks:
PostToolUse:
- matcher: "Edit|Write"
hooks:
- { type: command, command: /usr/local/bin/audit-edit.sh }| מפתח | נאכף על ידי | השפעה |
|---|---|---|
availableModels | שער + CLI | רשימת התרת דגמים. נבדקת גם ב-/v1/messages, כך שלקוח ששונה אינו יכול לעקוף אותה. |
permissions.allow / .deny | CLI | כללי כלים ופקודות. ראה הרשאות. |
permissions.disableBypassPermissionsMode | CLI | הגדר ל-disable כדי לחסום את bypassPermissions, המצב המדלג על בקשות אישור, ואת הדגל --dangerously-skip-permissions. |
allowManagedPermissionRulesOnly | CLI | כאשר מוגדר true, הגדרות מנוהלות הופכות למקור ההגדרות היחיד של כללי הרשאות. הרשומה allowManagedPermissionRulesOnly מפרטת כל מקור ש-Claude Code מתעלמת ממנו במצב זה. |
env | CLI | משתני סביבה הממוזגים לתוך תהליך ה-CLI. משמש עבור טלמטריה, עדכון אוטומטי, ועקיפת שמות דגמים. |
hooks | CLI | הגדרות hooks ברמת הארגון. |
managedMcpServers | CLI | שרתי MCP מרוחקים המסופקים לכל מפתח תואם לצד השרתים שהם מוסיפים בעצמם, http ו-sse בלבד. ראה שרתי MCP במדיניות. דורש Claude Code גרסה v2.1.259 ומעלה בשרת השער ובקרב הלקוחות. לקוחות ישנים יותר מתעלמים מהמפתח. |
מכיוון שהגדרות אלו מגיעות דרך הרשת, ה-CLI מציג לכל מפתח תיבת דו-שיח לאישור אבטחה לפני החלת ההגדרות המפורטות להלן:
hooks- משתני
envהדורשים את אישור המפתח, כגון משתני פרוקסי וכתובת URL בסיסית - הגדרות הרצת מעטפת כגון
apiKeyHelperו-statusLine - הגדרות קובצי ההרצה הבינאריים של סביבת הבידוד:
sandbox.bwrapPath,sandbox.socatPath, ו-sandbox.ripgrep - הגדרות ארגז חול המיירטות תעבורה, מזריקות פרטי הזדהות, או מחלישות בידוד, כגון
sandbox.network.tlsTerminateוהגדרות יציאות הפרוקסי. המסמך תיבות דו-שיח לאישור אבטחה מפרט את כולן.
המסמך זיכרון אישורים מסביר כמה זמן נמשך אישור ומתי תיבת הדו-שיח מופיעה שוב.
התוכנה Claude Code מחילה חלק ממשתני ה-env שנמסרו מבלי להציג למפתח את תיבת הדו-שיח לאישור, כגון הגדרות בחירת דגם ומגבלות מספריות. משתנים אחרים שנמסרו עשויים לדרוש את אישור המפתח לפני שייכנסו לתוקף: ערך שאינו ריק של פרוקסי, של כתובת URL בסיסית, או של OTEL_EXPORTER_OTLP_ENDPOINT דורש אישור תמיד. כאשר משתנה שנמסר זקוק לאישור, תיבת הדו-שיח מציינת את שמו.
במסמך משתני סביבה ותיבת הדו-שיח לאישור מופיעים הפרטים, כולל ארבעה מתגי פרטיות שהערך הנמסר שלהם קובע האם הם זקוקים לאישור. לפני גרסה v2.1.218, התוכנה Claude Code החילה פחות משתנים מבלי לשאול את המפתח, ולכן יותר משתנים שנמסרו הפעילו את תיבת הדו-שיח.
תצורת ה-טלמטריה של השער דוחפת את OTEL_EXPORTER_OTLP_ENDPOINT, ולכן הגדרת telemetry.forward_to מפעילה את תיבת הדו-שיח בכל לקוח אינטראקטיבי. תיבת הדו-שיח מגנה על מחשב המפתח מפני שער שנפרץ או עוין, ולא על הארגון מפני המפתח.
הרצה לא אינטראקטיבית עם הדגל -p אינה יכולה להציג את תיבת הדו-שיח. היא מחילה את ההגדרות שנדחפו עבור אותה הרצה בלבד ואינה רושמת אותן כמאושרות, כך שההפעלה האינטראקטיבית הבאה של המפתח עדיין תציג את תיבת הדו-שיח. לפני גרסה v2.1.207, הרצה לא אינטראקטיבית שמרה את ההגדרות כמאושרות ושום הפעלה אינטראקטיבית מאוחרת יותר לא הציגה עבורן את תיבת הדו-שיח.
אם מפתח מסרב, Claude Code יוצאת מאותה הפעלה במקום להחיל את המדיניות. כאשר אתה דוחף hook חדש, או משתנה סביבה כלשהו שמפעיל את תיבת הדו-שיח, למדיניות רחבה, Claude Code מציגה לפיכך את תיבת הדו-שיח לכל מפתח תואם. היא מציגה את תיבת הדו-שיח בהפעלה פעילה בסקירה השעתית הבאה, ואחרת בעלייה הבאה של המפתח.
המפתח cli נקרא settings במהדורות קודמות. איות זה עדיין מתקבל ככינוי, אך פריסות חדשות צריכות להשתמש ב-cli.
#שרתי MCP במדיניות
כדי לספק שרתי MCP ללקוחות Claude Code שמדיניות מתאימה להם, הגדר את managedMcpServers בבלוק cli של אותה מדיניות. דרושה גרסה v2.1.259 ומעלה של Claude Code בשרת השער ובקרב הלקוחות.
השער בודק כל רשומה בעת העלייה לפי אותם כללים ש-Claude Code מחילה בלקוח, ואם רשומה נכשלת בבדיקה, השער מסרב לפעול ומציין את שם הרשומה.
אם תכתוב הפניית ${VAR} ב-gateway.yaml, השער מפענח אותה מתוך סביבתו בעת העלייה באמצעות הרחבת סודות לפני שהוא מריץ את בדיקות הרשומות, כך שכל לקוח תואם מקבל את הערך המילולי ויכול לקרוא אותו. הנחיות הכותרות עבור שרתים מסופקים חלות על הערך המורחב.
השער דוחה את איות ה-.mcp.json של mcpServers בתוך בלוק cli, ושגיאת העלייה שלו מציינת את managedMcpServers כמפתח שבו יש להשתמש. לפני גרסה v2.1.259, השער דחה כל הגדרת שרת MCP בתוך בלוק cli.
#שכבת Claude Desktop
אם הארגון שלך פורס גם את Claude Desktop, אותו שער משרת את שני הלקוחות. כוון את bootstrapUrl, בתוך התצורה המנוהלת של Claude Desktop, אל <listen.public_url>/user/bootstrap. התוכנה Claude Desktop גוזרת את מנפיק ה-OAuth מכתובת URL זו, מריצה את אותה התחברות עם קוד מכשיר מול שער זה, ושולפת את התצורה שלה מתוך התגובה.
הערה: דורש Claude Code גרסה v2.1.203 ומעלה בשרת השער, והרשאה מפורשת: הנתיב
/user/bootstrapמחזיר 404 אלא אם כן המדיניות המתאימה למשתמש נושאת מפתחdesktop. מפתח ריקdesktop: {}מצרף מדיניות, ומפתחdesktopעל גבי שכבת הבסיסmatch: {}מצרף כל מדיניות שיורשת אותה. יומן הביקורת מתעד כל בקשה כ-desktop_bootstrap.serveאוdesktop_bootstrap.denied.
השער גוזר חלק גדול מהתגובה מתוך בלוק ה-cli של המדיניות שהותאמה ומתצורת השער ברמה העליונה:
רשימת הדגמים, מתוך
availableModels.כלים מושבתים, מתוך רשומות
permissions.denyשל שמות כלים בלבד. אם תגדירdisabledBuiltinToolsבבלוק ה-desktopשל המדיניות, השער משרת את האיחוד של הערך שלך ושל הרשימה הנגזרת, כך שתוכל להשבית כלים נוספים בדרך זו אך לא תוכל להפעיל מחדש כלי שהשבתת דרךpermissions.deny.רשימת התרת היציאה, מתוך
sandbox.network.allowedDomains. אם תגדירcoworkEgressAllowedHostsבבלוק ה-desktopשל המדיניות, השער משתמש בערך זה במקום ברשימה הנגזרת.נקודת קצה של OTLP המצביעה על השער עצמו, ותכונות הזהות של המשתמש המחובר. השער מעביר את הייצואים שהוא מקבל בנקודת קצה זו ליעדי ה-
forward_toשלך. הוא כולל את נקודת הקצה והתכונות כאשר מוגדרים גםtelemetry.forward_toוגםlisten.public_url.התוכנה Claude Desktop מייצאת כל אות באמצעות קידוד אחד:
http/protobuf, אוhttp/jsonכאשר אתה מגדיר אתOTEL_EXPORTER_OTLP_PROTOCOLאו את אחת הווריאציות שלו לפי אות ל-http/jsonב-envשל המדיניות. לפני גרסה v2.1.261 של Claude Code בשרת השער, התגובה הגדירהhttp/jsonבכל מקרה, ולכן אספן שמקבל רק protobuf דחה את הייצואים של Claude Desktop.
כדי להגדיר את disabledBuiltinTools, את coworkEgressAllowedHosts, או את הגדרת managedMcpServers של Claude Desktop עצמה בתוך בלוק desktop של מדיניות, דרושה גרסה v2.1.232 ומעלה של Claude Code בשרת השער. ההגדרה managedMcpServers של Claude Desktop מקבלת ערך מערך ולא אובייקט.
השער משמיט מתוך תגובת ה-bootstrap מפתחות שאין להם מקבילה ב-Claude Desktop, כגון hooks וכללי הרשאות בעלי היקף מוגדר כגון Bash(npm *).
הוסף את בלוק ה-desktop האופציונלי לצד cli כדי להגדיר הגדרות Claude Desktop ישירות. כתוב הגדרות מתוך מדריך התצורה המנוהלת של Claude Desktop כשמות מפתחות שטוחים. השמט מפתחות ש-Claude Desktop קוראת רק מ-MDM או מקבצים מקומיים, כגון bootstrapUrl: השער דוחה אותם בעת העלייה. לפני גרסה v2.1.232, השער קיבל רשימה קבועה של 11 מפתחות של תכונות, כגון chatTabEnabled ו-disableAutoUpdates, ודחה כל מפתח אחר בעת העלייה. לפני גרסה v2.1.227, השער דחה בעת העלייה גם את chatTabEnabled ואת chatAdvancedFileAnalysisEnabled.
managed:
policies:
- match: { groups: [eng-contractors] }
cli:
availableModels: [claude-sonnet-4-6]
desktop:
isLocalDevMcpEnabled: false
disableAutoUpdates: true
banner: { text: "Contractor build: internal use only" }כל מפתח הוא אופציונלי: Claude Desktop מחילה את ברירת המחדל שלה עבור כל מפתח שאתה משמיט. השער מאמת כל בלוק desktop בעת העלייה מול סכמת התצורה ש-Claude Desktop עצמה משתמשת בה, כך שטעות צפה בעת הפעלת השער כשגיאה המציינת את המפתח במקום להגיע לכל מחשב שולחני מחובר. השער נכשל בעת העלייה כאשר בלוק מכיל:
- מפתח לא מוכר
- מפתח מוכר שערכו יידחה או יימחק בשקט על ידי Claude Desktop, כגון ערך ריק או תת-מפתח ששמו שגוי בתוך רשומה מקוננת. לפני גרסה v2.1.260, השער השמיט בשקט שדה ששמו שגוי בתוך אובייקט מקונן של רשומת
managedMcpServersאוorgPluginSettingsבמקום להיכשל בעת העלייה. - מפתח שהשער מחשב בעצמו: חיבור העיבוד, רשימת הדגמים, וממסר ה-OTLP. הגדר אותם דרך
upstreams,models, והסעיףforward_toשבתוךtelemetry. - כינוי מדור קודם של מפתח נוכחי. בשגיאת העלייה, השער מציין את המפתח הקנוני שיש לכתוב.
אם תשתמש בערך שהוצא משימוש או במבנה רשומה מיושן, כגון רשומת managedMcpServers ללא transport, השער יעלה וירשום אזהרה המציינת את החלופה.
השער מאמת בלוק desktop מול הסכמה המצורפת לגרסה המותקנת שלו, בדיוק כפי שהוא עושה עבור בלוק ה-cli. כדי למסור הגדרה שהוצגה במהדורה חדשה יותר של Claude Desktop, שדרג תחילה את השער. לדוגמה, userPluginMarketplacesEnabled ו-userPluginUploadsEnabled זקוקים ל-Claude Code גרסה v2.1.260 ומעלה בשרת השער ול-Claude Desktop גרסה 1.37937.0 ומעלה במכונות של החברים.
אם תגדיר orgPluginSettings בבלוק ה-desktop של מדיניות, השער משרת אותו בתבנית מערך ש-Claude Desktop 1.15200.0 ומעלה קוראת. מחשבים שולחניים ישנים יותר מתעלמים מהמערך ואינם אוכפים שום מדיניות כלי תוספים, לכן עדכן את החברים לגרסה 1.15200.0 ומעלה לפני שתסתמך על כך.
השער משלים מפתחות שבלוק ה-desktop של מדיניות אינו מגדיר מתוך בלוק ה-desktop של ברירת המחדל הכוללת match: {}, באותו אופן שבו הוא משלים את בלוק ה-cli של מדיניות מתוך הבסיס. אם תגדיר disabledBuiltinTools או builtinToolPolicy גם בבסיס וגם במדיניות תפקיד, השער שומר על ההגבלה של הבסיס:
disabledBuiltinTools: השער משתמש באיחוד של רשימת הבסיס ורשימת המדיניות.builtinToolPolicy: אם הגדרת כלי לערך שאינוallowבבסיס, השער שומר על ערך זה גם אם הגדרתallowעבור אותו כלי במדיניות תפקיד.
עבור כל מפתח אחר, אם הגדרת אותו במדיניות התפקיד, השער משתמש בערך של מדיניות התפקיד. השער מחליף מערך או אובייקט מקונן כגון banner במלואו, כך שאם תגדיר banner.text במדיניות תפקיד, השער ישמיט את banner.backgroundColor של הבסיס.
אם אינך פורס את Claude Desktop, השמט את desktop מהמדיניות שלך לחלוטין: השער יחזיר אז 404 מ-/user/bootstrap עבור כל משתמש.
#עדיפות מול מקורות ניהול אחרים
אם למכשיר יש גם מדיניות שנמסרה דרך MDM או קובץ managed-settings.json מקומי, הגדרות שנמסרו על ידי השער מקבלות עדיפות ראשונה. המסמך עדיפות בתוך רמת הניהול בדף ההגדרות המנוהלות מפרט מתי מקורות מקומיים חלים, ומכיל את המפתחות ש-Claude Code קוראת מכל מקור ניהול ללא קשר לאיזה מקור נבחר, כגון מפתחות נעילת סביבת הבידוד, forceRemoteSettingsRefresh, ומיזוג env לכל משתנה. רכיב policyHelper המוגדר בפרופיל MDM או בקובץ ההגדרות המנוהלות רץ רק כאשר השער אינו מוסר הגדרות: הרשומה מציינת מה הפלט שלו מחליף.
מארחים מטמיעים כגון Claude Desktop יכולים לספק מדיניות דרך אפשרות ה-SDK של managedSettings. המסמך הגדרות אב ממארחים מטמיעים מציין מתי Claude Code מחילה אותה, והמסמך הגבלת הגדרות אב מפרט אילו הגדרות בכיוון התרה עדיין חלות ללא נעילות ה-allowManaged*Only.
מדיניות השער חלה על כל הפעלה של Claude Code במכונה, כולל ריצות לא אינטראקטיביות של claude -p והפעלות שנוצרו על ידי ה-Agent SDK. אם השער אינו נגיש בעת העלייה, הפעלות מחוברות יוצאות עם שגיאה במקום לרוץ ללא המדיניות שלהן.
#telemetry
ה-CLI שולח מדדים (metrics), יומנים (logs), וכאשר מופעל, עקבות (traces) אל השער, אשר מעביר אותם כלשונם לכל יעד מוגדר. הייצואים משתמשים בפרוטוקול OpenTelemetry Protocol (OTLP) על גבי HTTP. כדי לדלג על הממסר ולגרום להפעלות לייצא ישירות לאספן שלך, ציין את שם האספן במדיניות. ראה ניטור שימוש עבור המדדים והאירועים שה-CLI פולט.
ה-CLI מחתים כל ייצוא בזהות המשתמש המאומת, הנקראת מתוך ה-JWT שהונפק על ידי השער: התכונות user.id, user.email, ו-user.groups. ייחוס עלויות ושימוש לפי מפתח פועל לפיכך ללא כל הגדרה בצד המפתח.
הפעלות Claude Desktop ו-Cowork המחוברות דרך השער מחתימות את הטלמטריה שלהן ב-user.email וב-user.groups לצד enduser.id, כך שתוכל לכסות שימוש במסוף, ב-Desktop וב-Cowork בשאילתה יחידה על user.email או user.groups. התכונה user.groups היא רשימת קבוצות ה-IdP מופרדת בפסיקים.
טלמטריה של Desktop ו-Cowork נושאת בנוסף את enduser.sub, תביעת ה-sub שספק הזהויות שלך מנפיק עבור המשתמש, שנשארת ללא שינוי כאשר כתובת הדוא"ל של המשתמש משתנה. הפעלות מסוף מחתימות את אותו ערך תחת user.id, כך ששאילתה המתאימה בין enduser.sub לבין user.id של המסוף מכסה יחד את השימוש של משתמש יחיד במסוף, ב-Desktop וב-Cowork. בייצואי Desktop ו-Cowork, התכונה user.id היא מזהה אנונימי, ולא הנושא.
כמו כל נתוני ה-OpenTelemetry מ-Claude Code, תכונות אלו נשלחות רק ליעדים שהארגון שלך מגדיר, לעולם לא ל-Anthropic.
אם רשימת הקבוצות של משתמש ארוכה מ-255 תווים לאחר קידוד אחוזים, או ששם קבוצה מכיל פסיק או סימן שווה, השער משמיט את user.groups מהטלמטריה של ה-Desktop וה-Cowork של אותו משתמש במקום לקטוע אותה. הפעלות המסוף של אותו משתמש עדיין נושאות את הרשימה המלאה.
השער משמיט את enduser.sub כאשר הנושא ארוך מ-255 תווים לאחר קידוד אחוזים, או מכיל רווח, תו מחוץ ל-ASCII הניתן להדפסה, או אחד מהתווים , ; = \ " %. הטלמטריה של Desktop ו-Cowork של אותו משתמש שומרת על שאר התכונות שלה.
דרושה גרסה v2.1.265 ומעלה של Claude Code בשרת השער עבור user.email ו-user.groups בטלמטריה של Desktop ו-Cowork, וגרסה 1.24012 ומעלה של Claude Desktop במחשב של כל מפתח עבור user.groups.
דרושה גרסה v2.1.274 ומעלה של Claude Code בשרת השער עבור enduser.sub.
telemetry:
forward_to:
- url: https://otel-collector.internal.example.com
headers:
Authorization: ${OTLP_TOKEN}
# Per-signal opt-in. Default: metrics only.
metrics: true
logs: false
traces: false
- url: https://api.datadoghq.com/api/v2/otlp
headers:
DD-API-KEY: ${DD_API_KEY}אזהרה: כל יעד בוחר ב-
metrics, ב-logs, וב-tracesבאופן עצמאי, וברירת המחדל היא מדדים בלבד. האותות נבדלים ברמת הרגישות שלהם:
- מדדים: מונים מצטברים כגון כמויות אסימונים, כמויות בקשות, וזמני השהיה.
- יומנים ועקבות: יכולים לשאת פקודות Bash מלאות, קלטי כלים, ונתיבי קבצים, המכסים כל מה ש-Claude Code עושה במחשב המפתח.
הפעל יומנים ועקבות רק ביעדים בעלי בקרות הגישה ומדיניות שמירת הנתונים הנדרשים לנתונים אלה.
כל כתובת URL ב-forward_to חייבת להשתמש ב-https://, למעט חריג אחד עבור אספן בממשק ה-loopback של השער עצמו:
- כתובת
http://localhost:<port>עוברת את אימות התצורה, אך מנגנון ההגנה מפני SSRF חוסם כל ייצוא עםECONNREFUSED_SSRF, אלא אם כן תגדירCLAUDE_GATEWAY_ALLOW_LOOPBACK=1בסביבת השער. - כתובת
http://127.0.0.1:<port>אוhttp://[::1]:<port>מכשילה את העלייה אלא אם משתנה זה מוגדר.
עבור אספן בתוך האשכול, חשוף אותו ב-HTTPS בכתובת הפנימית שלו, או הרץ אותו כ-sidecar כאשר המשתנה מוגדר.
כאשר מוגדר HTTPS_PROXY, השער שולח ייצואים דרך אותו פרוקסי.
כדי להגיע לאספן פנימי ישירות, הוסף אותו ל-NO_PROXY לפי שם מארח או לפי דומיין עם נקודה מובילה כגון .internal.example.com, מה שדורש Claude Code גרסה v2.1.277 ומעלה בשרת השער. ודא שהשער יכול להגיע לאספן ללא הפרוקסי. רשומה ללא נקודה מובילה תואמת לשם המדויק בלבד, ולא לשמות שתחתיו. טווחי CIDR אינם נתמכים להתאמה.
כאשר יציאה דרך פרוקסי בלבד מופעלת, אשר את האספן בפרוקסי במקום זאת, מכיוון שכל רשומה ב-NO_PROXY משאירה את היציאה דרך פרוקסי בלבד כבויה.
הטלמטריה כבויה ב-CLI כברירת מחדל. כאשר אתה מגדיר גם את telemetry.forward_to וגם את listen.public_url, השער מפעיל אותה עבור לקוחות מחוברים על ידי דחיפת שישה משתני סביבה דרך /managed/settings:
CLAUDE_CODE_ENABLE_TELEMETRY=1OTEL_METRICS_EXPORTER,OTEL_LOGS_EXPORTER, ו-OTEL_TRACES_EXPORTER, שכל אחד מהם מוגדר ל-otlpאם לפחות יעדforward_toאחד מפעיל את אותו אות, ול-noneאחרת.OTEL_EXPORTER_OTLP_ENDPOINT=<public_url>OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
לפני Claude Code גרסה v2.1.265 בשרת השער, השער דחף את כל שלושת בוררי הייצוא כ-otlp, כולל עבור אותות שאף יעד לא בחר לקבל.
נקודת הקצה שנדחפת נבנית מתוך כתובת ה-URL הציבורית, כך שמדדים ויומנים אינם זקוקים לתצורת OTEL מצד המפתחים או המדיניות.
מפתחים המחוברים דרך /login אינם יכולים לנתב מחדש ייצואים באמצעות תצורת OTEL משלהם:
- משתנים שהוגדרו מקומית: התוכנה Claude Code מחילה את המשתנים שנדחפו ברמת הניהול, כך שכל אחד מהם עוקף את הערך שמפתח הגדיר עבורו מקומית.
- נקודות קצה שהוגדרו מקומית: כאשר ייצוא OTLP/HTTP מופעל, ה-CLI מתעלם מכל נקודת קצה שהוגדרה מקומית, בין אם השער דחף את משתני הטלמטריה ובין אם לא. הייצואים שלו מגיעים לשער, אלא אם כן מדיניות מציינת את האספן שלך כנקודת הקצה.
ללא יעד forward_to עבור אות מסוים, השער מקבל אותו ומשליך אותו. אם מפתחים כבר מייצאים טלמטריה של Claude Code לאחד האספנים שלך, הוסף אותו כיעד ב-forward_to, עם יומנים או עקבות מופעלים אם הם מייצאים כאלה, כדי שהוא ימשיך לקבל את הנתונים שלהם לאחר שיתחברו. כדי לדלג על הממסר במקום זאת, ציין את שם האספן במדיניות.
הפעלת עקבות דורשת בנוסף CLAUDE_CODE_ENHANCED_TELEMETRY_BETA=1 בכל לקוח. הגדר זאת בבלוק env של מדיניות מנוהלת, מכיוון שהשער אינו דוחף זאת בעצמו. מפתחים מאשרים זאת באותה תיבת דו-שיח לאישור אבטחה שנקודת הקצה שנדחפה כבר מפעילה.
הגדר זאת ל-1 רק במדיניות של הקבוצות שאתה רוצה לעקוב אחריהן. מדיניות שאינה מגדירה זאת יורשת את הערך ממדיניות ברירת המחדל הכוללת match: {} אם אותה מדיניות מגדירה ערך כזה, לפי כללי המיזוג. כדי למנוע מלקוחות של קבוצה לשלוח עקבות גם כאשר מפתח מגדיר את המשתנה מקומית, הגדר אותו ל-0 במדיניות של אותה קבוצה.
הן קידודי OTLP ב-protobuf והן ב-JSON מועברים הלאה, וכל מערכת backend התואמת ל-OpenTelemetry מתאימה כיעד.
#ייצוא ישירות לאספן שלך
כדי שהפעלות המחוברות דרך /login ישלחו טלמטריה ישירות לאספן שלך במקום דרך הממסר, הגדר את OTEL_EXPORTER_OTLP_ENDPOINT לכתובת ה-URL הבסיסית ב-https:// של האספן בבלוק ה-env של מדיניות מנוהלת. התוכנה Claude Code מצרפת /v1/metrics, /v1/logs, או /v1/traces לכתובת ה-URL שתגדיר, כגון https://otel-collector.example.com:4318, ומייצאת כל אות לשם על גבי OTLP/HTTP. דורש Claude Code גרסה v2.1.265 ומעלה במחשב של כל מפתח. לקוחות ישנים יותר מייצאים דרך הממסר.
כדי לבצע אימות מול האספן, הגדר את OTEL_EXPORTER_OTLP_HEADERS באותו בלוק env. הפעלות לעולם אינן שולחות את אסימון הפעלת השער של המפתח לאספן ששמו צוין בדרך זו.
כאשר אתה מוסיף או משנה נקודת קצה זו במדיניות, Claude Code מבקשת מכל מפתח לאשר אותה ב-תיבת הדו-שיח לאישור אבטחה לפני החלתה בהפעלה אינטראקטיבית.
התוכנה Claude Code בודקת את נקודת הקצה לפני שהיא מייצאת אות ישירות, ומשאירה את האות בממסר כאשר בדיקה נכשלת. הבדיקות כוללות:
- נקודת הקצה מגיעה מהשער עצמו. אם הגדרת את אותו משתנה בפרופיל MDM או בקובץ
managed-settings.jsonמקומי, הייצואים נשארים בממסר. - כתובת ה-URL משתמשת ב-
https://, או ב-http://לכתובת loopback. - כתובת ה-URL מתפענחת לנתיב המסתיים ב-
/v1/<signal>, ללא שאילתה או מקטע. התוכנה Claude Code בונה נתיב זה בעצמה מתוך המשתנה הכללי. היא משתמשת במשתנה לפי אות כגוןOTEL_EXPORTER_OTLP_METRICS_ENDPOINTכפי שנכתב, לכן כלול שם את הנתיב המלא. - כתובת ה-URL אינה המארח של השער עצמו. נקודת קצה המופנית לשער שומרת על נתיב הממסר ואסימון ההפעלה שלו.
- לא אתה ולא המפתח הגדרתם את
otelHeadersHelperבאף מקור הגדרות. כאשר רכיב עזר מוגדר, כל אות נשאר בממסר.
נקודת הקצה שאתה מציין משנה רק את היעד שאליו הייצואים נשלחים. אתה עדיין בוחר אילו אותות מיוצאים בכלל באמצעות בוררי ה-OTEL_*_EXPORTER.
נקודת הקצה לבדה אינה מפעילה את הייצוא, לכן הגדר בנוסף את המשתנים שעושים זאת, אלא אם השער כבר דוחף אותם:
- אם השער כבר דוחף את משתני הטלמטריה, הם מכסים את ההפעלה, הבוררים והפרוטוקול, ונקודת הקצה המפורשת שלך עוקפת את ערך ה-
<public_url>שנדחף. הגדר בוררOTEL_*_EXPORTERל-otlpבעצמך רק עבור אות שאף יעד ב-forward_toאינו מפעיל. - אם הוא אינו דוחף אותם, הגדר בנוסף את
CLAUDE_CODE_ENABLE_TELEMETRY=1, את בוררי ה-OTEL_*_EXPORTER, ואתOTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf.
כאשר המפתח מתנתק, או מתחבר לשער אחר, הייצואים לאספן נעצרים ו-Claude Code משליכה כל מקבץ שנותר במקום לשלוח אותו.
#כאשר יעד נכשל
השער אינו שומר במאגר זמני, אינו מנסה שוב, ואינו שומר טלמטריה, ולכן הוא משליך ייצוא שאינו מגיע ליעדו במקום למסור אותו באיחור. כל יעד מצליח או נכשל בפני עצמו, והלקוח המייצא מקבל תגובת הצלחה בכל מקרה, כך שמסירה שנכשלה מופיעה רק ביומן של השער.
לאחר חמש מסירות רצופות שנכשלו ליעד מסוים, השער משהה את ההעברה אליו במקטעים של 30 שניות, ומתעד כל השהיה ביומן, עד שמסירה מצליחה. כל תגובת שגיאה, פסק זמן, או שגיאת חיבור נחשבים למסירה שנכשלה, למעט 400, 413, 415, 422, ו-431, שמשמעותם שהאספן סירב למטען הייצוא כבלתי תקין או גדול מדי.
מטען שסורב אינו מקדם ואינו מאפס את ספירת הכשלונות: השער ממשיך להעביר ליעד ורושם אזהרה המציינת את שמו ואת הסטטוס, בסירוב הראשון של היעד ובכל סירוב המאה לאחר מכן.
#כוונון HTTP
ארבעה בלוקים אופציונליים ברמה העליונה, access_control, limits, timeouts, ו-rate_limits, מכווננים את ממשק ה-HTTP. ברירות המחדל מתאימות לרוב הפריסות.
| בלוק | מפתח | ברירת מחדל | תיאור |
|---|---|---|---|
access_control | allow_cidrs / deny_cidrs | ריק | התרה וחסימה של IP נכנס לפי כתובת לקוח, לאחר פענוח של trusted_proxies. הרשימה deny_cidrs נבדקת תחילה: לקוח שהיא מתאימה לו נדחה גם אם הוא מתאים בנוסף ל-allow_cidrs. אם allow_cidrs אינה ריקה, השער פועל כברירת מחדל חוסמת. הנתיבים /healthz ו-/readyz פטורים מ-allow_cidrs. כאשר פרוקסי מהימן שולח רשומת X-Forwarded-For שאינה כתובת IP, הלקוח האמיתי אינו ידוע והשער רושם אזהרה פעם אחת המציינת מה לבדוק. כאשר אחת מהרשימות חלה על הבקשה, הוא מסרב לה עם 403 וסיבת ביקורת xff_unparseable. כאשר אף אחת מהן אינה חלה, הוא משרת את הבקשה ומשתמש בכתובת של הפרוקסי עצמו כ-IP של הלקוח לצורך הגבלות קצב לפי IP וביקורת. |
limits | max_request_bytes | 32 MiB | גודל מקסימלי לגוף בקשה נכנסת: בקשות החורגות מקבלות 413 לפני שגוף הבקשה נשמר במאגר. הגדל זאת עבור בקשות עם קבצים או תמונות גדולים. |
limits | max_request_header_bytes | לא מוגדר | כאשר מוגדר, כותרות החורגות מהגודל מחזירות 431. |
limits | max_url_length | לא מוגדר | כאשר מוגדר, כתובת URL ארוכה מדי מחזירה 414. |
timeouts | upstream_ttfb_ms | 120000 | זמן המתנה מקסימלי לכותרות התגובה של ה-upstream (זמן עד בייט ראשון). גוף התגובה מוזרם לאחר מכן ללא מגבלת זמן שעון. חל על נתיב ה-Anthropic הישיר: בכל ספק אחר השער ממתין עד שעה לתחילת התגובה. |
rate_limits | device_authorization.max / .window_seconds | 30 / 600 | הגבלת קצב לפי IP בנקודת הקצה להרשאת מכשיר שאינה דורשת אימות. הגדל עבור ארגון גדול מאחורי IP יציאה משותף או NAT. המסמך פריסות רחבות מראה כיצד לקבוע את הגודל. מגבלות אלו חלות רק על תהליך ההתחברות באמצעות הרשאת מכשיר, ולא על עיבוד ב-/v1/messages. ראה עמידות קוד משתמש בפני התקפת כוח גס. |
rate_limits | device_verify.max / .window_seconds | 10 / 600 | הגבלת קצב לפי IP על הגשות user_code ב-/device. זה מה שמונע ממישהו לנחש קוד של מפתח אחר. המסמך פריסות רחבות מראה עד כמה להעלות זאת. |
אם תשאיר את שתי רשימות ה-access_control ריקות, שזו ברירת המחדל, השער ישרת כל כתובת לקוח, כך שרק הרשת שלך תגביל מי יכול להגיע אליו. עניין זה משמעותי מכיוון ששער יכול לדחוף הגדרות מנוהלות המריצות פקודות במחשבי מפתחים.
כאשר allow_cidrs ריקה, השער מזהיר בשני מקומות, מבלי לשנות את אופן המענה לבקשה כלשהי:
- בעת העלייה: אזהרה ביומן המבצעי ממליצה להתיר רק את הטווחים הפרטיים
10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,100.64.0.0/10,127.0.0.0/8,::1/128, ו-fc00::/7, בנוסף לכל טווח פנימי אחר שממנו המפתחים שלך מתחברים. אם תקשור את השער לכתובת loopback ולא תגדירtrusted_proxiesוגם לאpublic_url, כמו בפיתוח מקומי, האזהרה אינה מופיעה. - בזמן ריצה: בפעם הראשונה שבקשה מגיעה מכתובת שמחוץ לטווחים פרטיים אלה, השער רושם אזהרה ופולט אירוע ביקורת
access.public_clientהנושא את ה-IP של הלקוח. שניהם מופעלים פעם אחת לכל תהליך. כתובות link-local,169.254.0.0/16ו-fe80::/10, אינן נספרות כציבוריות. השער עונה על/healthzו-/readyzלפני שבדיקה זו רצה, כך שבדיקות תקינות מטווחים ציבוריים אינן מפעילות אותה.
שני האותות משתמשים בכתובת הלקוח כפי שהשער מפענח אותה. אם מאזן עומסים, העברת יציאות, או מנהרה מעבירים תעבורה ואינם רשומים ב-listen.trusted_proxies, השער רואה את כתובת הממסר, שהיא בדרך כלל פרטית, ולכן לא אזהרת זמן הריצה ולא רשימת התרה פרטית יתפסו תעבורה שמועברת דרכו.
מאחורי חזית כזו, הגדר תחילה את listen.trusted_proxies כדי שהשער יראה את כתובות הלקוח האמיתיות, ושמור על השער ועל כל מה שלפניו כבלתי נגישים מהאינטרנט הציבורי בכל מקרה.
#load_test_mode
בלוק load_test_mode מאפשר לך לבצע בדיקות עומסים לשער ללא קריאה לספק דגמים. כל עוד הוא מופעל, השער בונה וחותם על כל בקשת ספק כרגיל, משליך אותה במקום לשלוח אותה, ומזרים תשובה מוכנה מראש חזרה דרך נתיב התגובה הרגיל שלו. התשובה היא טקסט מילוי המתחיל במשפט המציין שהוא מוכן מראש.
דורש גרסה v2.1.283 ומעלה. גרסאות קודמות מסרבות לפעול כאשר המפתח מוגדר, לכן שדרג כל עותק לפני שתוסיף את הבלוק והסר אותו לפני שתבצע שחזור לגרסה קודמת.
הדוגמה להלן מפעילה את המצב עם ערכי ברירת המחדל, תשובה של 750 אסימוני פלט המוזרמת לאורך כ-10 שניות:
load_test_mode:
enabled: true
reply_tokens: 750
# roughly how many tokens of text each canned reply carries
reply_seconds: 9.5
# how long a streamed reply takes| שדה | נדרש | תיאור |
|---|---|---|
enabled | כן | הערך true מפעיל את המצב. הערך false שומר על המספרים שלך בקובץ כאשר המצב כבוי. השער מסרב לפעול אם הבלוק קיים בלעדיו. |
reply_tokens | לא | ברירת מחדל 750. בערך כמה אסימוני טקסט נושאת כל תשובה מוכנה מראש, מספר שלם מ-1 עד 100000. |
reply_seconds | לא | ברירת מחדל 9.5. כמה זמן נמשכת תשובה מוזרמת, מ-0 עד 600. הערך 0 שולח את כל התשובה בבת אחת. תשובה לבקשה שאינה מוזרמת מוחזרת תמיד בבת אחת. |
בדיקת עומסים במצב זה מכסה את השער, את ה-Postgres שלך, ואת כל מה שלפני השער. היא אינה מכסה את המגבלות, המהירות או נתיב הרשת של הספק.
כל עוד המצב מופעל, בקשה יכולה לשאת כותרת x-load-test-user המכילה מספר שלם של עד שבע ספרות, והשער סופר כל מספר כמפתח נפרד עם הדוא"ל והקבוצות של המפתח שהאסימון שלו הגיע עם הבקשה. הקצה לפריסת בדיקת העומסים בסיס נתונים ריק משלה, מכיוון שהשער מסרב לפעול כאשר המצב מופעל מול בסיס נתונים שבו מפתח כלשהו כבר ביצע הוצאה כלשהי.
אזהרה: לעולם אל תפעיל זאת עבור שער שמפתחים משתמשים בו. כל בקשה מקבלת את התשובה המוכנה מראש ושום דגם אינו נקרא. השער רושם אזהרת
load_test_mode is onבעת העלייה ומסמן כל אירוע ביקורת של עיבוד ב-load_test: trueכל עוד המצב מופעל.
#דוגמה מלאה
תצורת ייחוס מלאה זו כוללת את כל החלקים העיקריים: בלוקי כוונון ה-HTTP שומרים על ערכי ברירת המחדל שלהם. העתק אותה, מחק את מה שאינך צריך, ומלא את הערכים שלך. התצורה ב-מדריך המהיר היא גרסה מינימלית של זו.
# Run with:
# claude gateway --config gateway.yaml
#
# Operational log verbosity is controlled by the CLAUDE_GATEWAY_LOG_LEVEL
# environment variable (debug | info | warn | error; default info). debug
# also logs the claim names in each id_token, for groups_claim diagnosis.
# It does not affect audit events, which are always emitted.
listen:
host: 0.0.0.0
port: 8080
public_url: https://claude-gateway.internal.example.com
# Omit the tls block when running behind a TLS-terminating ingress.
# tls:
# cert: /certs/gateway.crt
# key: /certs/gateway.key
# trusted_proxies:
# - 10.0.0.0/8
oidc:
issuer: https://example.okta.com
client_id: 0oa1example2
client_secret: ${OIDC_CLIENT_SECRET}
allowed_email_domains:
- example.com
# Required when the issuer is the Okta org server, whose id_tokens
# can omit email and groups; the gateway fills them from /userinfo.
userinfo_fallback: true
# allowed_groups: [claude-code-users]
# Okta emits groups only when the `groups` scope is requested and the
# app's groups claim filter allows them. The contractors policy below
# matches on groups, so the scope is requested here.
scopes: [openid, profile, email, offline_access, groups]
# extra_auth_params: { access_type: offline, prompt: consent }
# Google
# groups_claim: groups
# Entra app roles: use `roles`
# email_claim: email
session:
jwt_secret: ${GATEWAY_JWT_SECRET}
# openssl rand -base64 32
# ttl_hours: 1
store:
postgres_url: ${GATEWAY_POSTGRES_URL}
# max_connections: 5
# connect_timeout_seconds: 5
# Enables /v1/organizations/spend_limits (mirrors the Anthropic Admin API)
# and per-developer spend enforcement on /v1/messages. Omit to disable.
# Caps themselves are set via the admin API, not here.
# admin:
# write_keys:
# - { id: terraform, key: "${GATEWAY_ADMIN_WRITE_KEY_TF}" }
# read_keys:
# - { id: reporting, key: "${GATEWAY_ADMIN_READ_KEY}" }
# admin_groups: [platform-finops]
# blocked_message: request an increase at https://go.example.com/claude-limits
#
# audit_retention_days: 365
#
# spend_retention_months: 13
#
# identity_retention_days: 90
#
# group_limit_mode: min
# enforcement:
# fail_closed_on_error: false
# Load test this deployment without calling a model provider. Never on a
# gateway that developers use: every request gets a canned reply.
# load_test_mode:
# enabled: true
#
# reply_tokens: 750
#
# reply_seconds: 9.5
# Meter at contracted rates instead of USD list price. Requires admin: or a
# managed: policy. With managed:, the same rates also go to signed-in clients.
# Rates below are placeholders, not real contract prices.
# pricing:
# multiplier: 0.85
# overrides:
# - { upstream: anthropic, model: claude-sonnet-4-6, input: 3.30, output: 16.50, cache_read: 0.33, cache_write: 4.125 }
upstreams:
- provider: anthropic
auth:
api_key: ${ANTHROPIC_API_KEY}
# - provider: bedrock
# region: us-east-1
# auth: {}
# - provider: anthropicAws
# region: us-east-1
# workspace_id: wrkspc_...
# auth:
# api_key: ${ANTHROPIC_AWS_API_KEY}
# - provider: vertex
# region: us-east5
# project_id: example-prod
# auth: {}
# - provider: foundry
# resource: example-foundry
# auth: { use_azure_ad: true }
auto_include_builtin_models: true
models:
- id: claude-opus-4-8
label: Claude Opus 4.8
upstream_model:
anthropic: claude-opus-4-8
# bedrock: us.anthropic.claude-opus-4-8
# anthropicAws: claude-opus-4-8
# vertex: claude-opus-4-8
# foundry: <your-opus-deployment-name>
- id: claude-sonnet-4-6
label: Claude Sonnet 4.6
upstream_model:
anthropic: claude-sonnet-4-6
- id: claude-haiku-4-5
label: Claude Haiku 4.5
upstream_model:
anthropic: claude-haiku-4-5
managed:
policies:
- match: { groups: [contractors] }
cli:
availableModels: [claude-haiku-4-5]
# Constrain the Default picker option to availableModels instead of
# the tier default, so contractors don't get a 400 on the default.
enforceAvailableModels: true
# allow auto-approves these tools; it does not block the rest.
# Add deny rules to restrict tools.
permissions: { allow: [Read, Grep] }
- match: {}
cli:
availableModels: [claude-opus-4-8, claude-sonnet-4-6, claude-haiku-4-5]
permissions:
allow: [Read, Grep, Bash, Edit]
deny: ["WebFetch"]
env: { HTTP_PROXY: http://proxy.example.com:8080 }
telemetry:
forward_to:
- url: https://otel.internal.example.com:4318
headers:
Authorization: Bearer ${OTEL_TOKEN}#הגדרות מנוהלות בצד הלקוח
כל האמור לעיל מגדיר את שרת השער. עליך לכוון את מכונות המפתחים לשער בנפרד, בכל מכשיר, דרך ההגדרות המנוהלות של Claude Code. השער אינו יכול לדחוף את מפתחות ההתחברות בעצמו, מכיוון שהם אלה שמיידעים את הלקוח היכן נמצא השער.
עבור ה-CLI, הגדר מפתחות אלו בקובץ managed-settings.json המתאים למערכת ההפעלה. שני מפתחות ההתחברות מנתבים את ה-/login של כל מפתח אל השער שלך:
{
"forceLoginMethod": "gateway",
"forceLoginGatewayUrl": "https://claude-gateway.internal.example.com",
"parentSettingsBehavior": "merge"
}הערך "parentSettingsBehavior": "merge" שומר על תקינות מסירת רשימת התרת היציאה מ-Claude Desktop להפעלות Claude Code המוטמעות בתוכה: המסמך מסירת מדיניות להפעלות Claude Desktop מסביר את המנגנון והיכן חייבת להימצא ההרשאה.
פרוס את הקובץ managed-settings.json לכל מכשיר, בדרך כלל דרך פלטפורמת ה-MDM שלך. נתיב הקובץ שונה בכל פלטפורמה. ראה היכן כל מנגנון שומר את המדיניות.
כברירת מחדל, מדיניות registry ב-Windows או קובץ plist של managed-preferences ב-macOS מחליפים את הקובץ managed-settings.json במקום להתמזג איתו, מלבד מפתחות החריגים והבדיקות חוצות המקורות לעיל. כל שלושת המפתחות בקטע קוד זה פועלים לפי כלל המקור בעל העדיפות הגבוהה ביותר, כך שציי מחשבים המוסרים מדיניות דרך Group Policy או פרופילי תצורה חייבים למקם את כל השלושה באותו מנגנון במקום זאת.
עבור Claude Desktop, הגדר את המפתח bootstrapUrl בתוך התצורה המנוהלת של Claude Desktop עצמה ל-<listen.public_url>/user/bootstrap. תהליך ההתחברות והמדיניות לפי קבוצה יתאימו אז לאלה של ה-CLI ברגע שמדיניות מסכימה להצטרף בצד השרת עם מפתח desktop: ללא ההצטרפות, /user/bootstrap מחזיר 404. ראה שכבת Claude Desktop עבור החלק של צד השרת.
התוכנה Claude Code מכבדת את forceLoginGatewayUrl, את gatewayInternalNetworks, ואת הערך "gateway" של forceLoginMethod אך ורק ממקור מנוהל במכשיר: managed-settings.json, קובץ ה-plist ב-macOS או ה-registry של HKLM ב-Windows, או policy helper. מפתח שמגדיר אותם בקובץ ~/.claude/settings.json שלו אינו משפיע, וכך גם להגדרתם במטען הנתונים של השער אין כל השפעה.
#נושאים קשורים
- סקירת שער יישומי Claude: מדריך מהיר וחיבור מפתחים
- מדריך פריסה: הגדרת IdP, תמונת מכולה, Kubernetes ו-Cloud Run, ותפעול
- מגבלות הוצאה: תקרות לכל מפתח וה-Admin API