allowUngroupedKeyHint:'When disabled, API Keys not assigned to any group cannot make requests (403 Forbidden). Keep disabled to ensure all Keys belong to a specific group.'
allowUngroupedKeyHint:'When disabled, API Keys not assigned to any group cannot make requests (403 Forbidden). Keep disabled to ensure all Keys belong to a specific group.'
},
},
gatewayForwarding:{
title:'Request Forwarding',
description:'Control how requests are forwarded to upstream OAuth accounts',
fingerprintUnification:'Fingerprint Unification',
fingerprintUnificationHint:'Unify X-Stainless-* headers across users sharing the same OAuth account. Disabling passes through each client\'s original headers.',
metadataPassthrough:'Metadata Passthrough',
metadataPassthroughHint:'Pass through client\'s original metadata.user_id without rewriting. May improve upstream cache hit rates.',
},
site:{
site:{
title:'Site Settings',
title:'Site Settings',
description:'Customize site branding',
description:'Customize site branding',
...
@@ -4461,6 +4475,14 @@ export default {
...
@@ -4461,6 +4475,14 @@ export default {
thinkingSignatureHint:'Automatically strip signatures and retry when upstream returns thinking block signature validation errors',
thinkingSignatureHint:'Automatically strip signatures and retry when upstream returns thinking block signature validation errors',
thinkingBudget:'Thinking Budget Rectifier',
thinkingBudget:'Thinking Budget Rectifier',
thinkingBudgetHint:'Automatically set budget to 32000 and retry when upstream returns budget_tokens constraint error (≥1024)',
thinkingBudgetHint:'Automatically set budget to 32000 and retry when upstream returns budget_tokens constraint error (≥1024)',
apikeySignature:'API Key Signature Rectifier',
apikeySignatureHint:
'Automatically strip signatures and retry when API Key accounts receive signature-related errors (built-in patterns always apply)',
apikeyPatterns:'Custom Match Patterns',
apikeyPatternsHint:
'Additional keywords matched against the response body (case-insensitive). Built-in patterns always apply; use these for supplementary matching.',
apikeyPatternPlaceholder:'e.g., thinking_error',
addPattern:'Add Pattern',
saved:'Rectifier settings saved',
saved:'Rectifier settings saved',
saveFailed:'Failed to save rectifier settings'
saveFailed:'Failed to save rectifier settings'
},
},
...
@@ -4568,6 +4590,62 @@ export default {
...
@@ -4568,6 +4590,62 @@ export default {
failedToSave:'Failed to save rule',
failedToSave:'Failed to save rule',
failedToDelete:'Failed to delete rule',
failedToDelete:'Failed to delete rule',
failedToToggle:'Failed to toggle status'
failedToToggle:'Failed to toggle status'
},
// TLS Fingerprint Profiles
tlsFingerprintProfiles:{
title:'TLS Fingerprint Profiles',
description:'Manage TLS fingerprint profiles for simulating specific client TLS handshake characteristics',
createProfile:'Create Profile',
editProfile:'Edit Profile',
deleteProfile:'Delete Profile',
noProfiles:'No profiles configured',
createFirstProfile:'Create your first TLS fingerprint profile',
columns:{
name:'Name',
description:'Description',
grease:'GREASE',
alpn:'ALPN',
actions:'Actions'
},
form:{
pasteYaml:'Paste YAML Configuration',
pasteYamlPlaceholder:'Paste YAML output from TLS Fingerprint Collector here...',
pasteYamlHint:'Paste the YAML copied from TLS Fingerprint Collector to auto-fill all fields.',
constconfirmDelete=async()=>{if(!deletingAcc.value)return;try{awaitadminAPI.accounts.delete(deletingAcc.value.id);showDeleteDialog.value=false;deletingAcc.value=null;reload()}catch(error){console.error('Failed to delete account:',error)}}
constconfirmDelete=async()=>{if(!deletingAcc.value)return;try{awaitadminAPI.accounts.delete(deletingAcc.value.id);showDeleteDialog.value=false;deletingAcc.value=null;reload()}catch(error){console.error('Failed to delete account:',error)}}