feat: add per-channel HTTP transport controls
This commit is contained in:
@@ -284,6 +284,8 @@ const SENSITIVE_FORM_FIELDS = [
|
||||
'force_format',
|
||||
'thinking_to_content',
|
||||
'proxy',
|
||||
'http_protocol',
|
||||
'http2_connection_shards',
|
||||
'pass_through_body_enabled',
|
||||
'system_prompt',
|
||||
'system_prompt_override',
|
||||
@@ -339,6 +341,9 @@ function hasAdvancedSettingsValues(values: ChannelFormValues): boolean {
|
||||
values.thinking_to_content ||
|
||||
values.pass_through_body_enabled ||
|
||||
values.system_prompt_override ||
|
||||
(values.http_protocol && values.http_protocol !== 'auto') ||
|
||||
(values.http2_connection_shards != null &&
|
||||
values.http2_connection_shards > 1) ||
|
||||
values.claude_beta_query ||
|
||||
values.upstream_model_update_check_enabled ||
|
||||
values.upstream_model_update_auto_sync_enabled ||
|
||||
@@ -745,6 +750,8 @@ export function ChannelMutateDrawer({
|
||||
'disable_task_polling_sleep'
|
||||
)
|
||||
const currentProxy = form.watch('proxy')
|
||||
const currentHttpProtocol = form.watch('http_protocol')
|
||||
const currentHttp2ConnectionShards = form.watch('http2_connection_shards')
|
||||
const currentSystemPrompt = form.watch('system_prompt')
|
||||
const currentSystemPromptOverride = form.watch('system_prompt_override')
|
||||
const currentAllowServiceTier = form.watch('allow_service_tier')
|
||||
@@ -1014,7 +1021,9 @@ export function ChannelMutateDrawer({
|
||||
currentDisableTaskPollingSleep ||
|
||||
currentProxy?.trim() ||
|
||||
currentSystemPrompt?.trim() ||
|
||||
currentSystemPromptOverride
|
||||
currentSystemPromptOverride ||
|
||||
(currentHttpProtocol && currentHttpProtocol !== 'auto') ||
|
||||
(currentHttp2ConnectionShards != null && currentHttp2ConnectionShards > 1)
|
||||
)
|
||||
let fieldPassthroughConfigured = false
|
||||
if (currentType === 1 || currentType === 57) {
|
||||
@@ -4185,6 +4194,129 @@ export function ChannelMutateDrawer({
|
||||
)}
|
||||
/>
|
||||
|
||||
<FormField
|
||||
control={form.control}
|
||||
name='http_protocol'
|
||||
render={({ field }) => (
|
||||
<FormItem>
|
||||
<FormLabel>{t('HTTP Protocol')}</FormLabel>
|
||||
<Select
|
||||
items={[
|
||||
{
|
||||
value: 'auto',
|
||||
label: t('Auto'),
|
||||
},
|
||||
{
|
||||
value: 'http1',
|
||||
label: t('HTTP/1.1'),
|
||||
},
|
||||
]}
|
||||
value={field.value || 'auto'}
|
||||
onValueChange={(value) => {
|
||||
const nextProtocol =
|
||||
value === 'http1' ? 'http1' : 'auto'
|
||||
field.onChange(nextProtocol)
|
||||
if (nextProtocol === 'http1') {
|
||||
form.setValue(
|
||||
'http2_connection_shards',
|
||||
1,
|
||||
{
|
||||
shouldDirty: true,
|
||||
shouldValidate: true,
|
||||
}
|
||||
)
|
||||
}
|
||||
}}
|
||||
>
|
||||
<FormControl>
|
||||
<SelectTrigger>
|
||||
<SelectValue />
|
||||
</SelectTrigger>
|
||||
</FormControl>
|
||||
<SelectContent
|
||||
alignItemWithTrigger={false}
|
||||
>
|
||||
<SelectGroup>
|
||||
<SelectItem value='auto'>
|
||||
{t('Auto')}
|
||||
</SelectItem>
|
||||
<SelectItem value='http1'>
|
||||
{t('HTTP/1.1')}
|
||||
</SelectItem>
|
||||
</SelectGroup>
|
||||
</SelectContent>
|
||||
</Select>
|
||||
<FormDescription>
|
||||
{t(
|
||||
'Auto negotiates HTTP/2 when available. HTTP/1.1 forces multiple keep-alive connections under concurrency.'
|
||||
)}
|
||||
</FormDescription>
|
||||
<FormMessage />
|
||||
</FormItem>
|
||||
)}
|
||||
/>
|
||||
|
||||
<FormField
|
||||
control={form.control}
|
||||
name='http2_connection_shards'
|
||||
render={({ field }) => {
|
||||
const http1Selected =
|
||||
currentHttpProtocol === 'http1'
|
||||
const shardItems = Array.from(
|
||||
{ length: 8 },
|
||||
(_, index) => {
|
||||
const value = String(index + 1)
|
||||
return { value, label: value }
|
||||
}
|
||||
)
|
||||
return (
|
||||
<FormItem>
|
||||
<FormLabel>
|
||||
{t('HTTP/2 Connection Shards')}
|
||||
</FormLabel>
|
||||
<Select
|
||||
items={shardItems}
|
||||
value={String(field.value || 1)}
|
||||
disabled={http1Selected}
|
||||
onValueChange={(value) => {
|
||||
field.onChange(Number(value))
|
||||
}}
|
||||
>
|
||||
<FormControl>
|
||||
<SelectTrigger disabled={http1Selected}>
|
||||
<SelectValue />
|
||||
</SelectTrigger>
|
||||
</FormControl>
|
||||
<SelectContent
|
||||
alignItemWithTrigger={false}
|
||||
>
|
||||
<SelectGroup>
|
||||
{shardItems.map((item) => (
|
||||
<SelectItem
|
||||
key={item.value}
|
||||
value={item.value}
|
||||
>
|
||||
{item.label}
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectGroup>
|
||||
</SelectContent>
|
||||
</Select>
|
||||
<FormDescription>
|
||||
{http1Selected
|
||||
? t(
|
||||
'HTTP/2 connection shards are unavailable when HTTP/1.1 is selected.'
|
||||
)
|
||||
: t(
|
||||
'Spread HTTP/2 traffic across multiple reusable connections to the same upstream origin (1-8).'
|
||||
)}
|
||||
</FormDescription>
|
||||
<FormMessage />
|
||||
</FormItem>
|
||||
)
|
||||
}}
|
||||
/>
|
||||
|
||||
<FormField
|
||||
control={form.control}
|
||||
name='system_prompt'
|
||||
|
||||
@@ -245,6 +245,11 @@ export const ERROR_MESSAGES = {
|
||||
INVALID_MODEL_MAPPING: 'Invalid model mapping format',
|
||||
INVALID_PROXY:
|
||||
'Proxy address must use HTTP, HTTPS, SOCKS5, or SOCKS5H and include a valid host',
|
||||
INVALID_HTTP_PROTOCOL: 'HTTP protocol must be Auto or HTTP/1.1',
|
||||
INVALID_HTTP2_CONNECTION_SHARDS:
|
||||
'HTTP/2 connection shards must be between 1 and 8',
|
||||
INVALID_HTTP1_WITH_SHARDS:
|
||||
'HTTP/2 connection shards must be 1 when HTTP/1.1 is selected',
|
||||
CREATE_FAILED: 'Failed to create channel',
|
||||
UPDATE_FAILED: 'Failed to update channel',
|
||||
DELETE_FAILED: 'Failed to delete channel',
|
||||
|
||||
@@ -39,6 +39,8 @@ const ADVANCED_SETTINGS_FIELDS = new Set<FieldPath<ChannelFormValues>>([
|
||||
'thinking_to_content',
|
||||
'pass_through_body_enabled',
|
||||
'proxy',
|
||||
'http_protocol',
|
||||
'http2_connection_shards',
|
||||
'system_prompt',
|
||||
'system_prompt_override',
|
||||
'allow_service_tier',
|
||||
|
||||
@@ -70,6 +70,37 @@ function isOptionalProxyURL(value: string | undefined): boolean {
|
||||
}
|
||||
}
|
||||
|
||||
export const HTTP_PROTOCOL_AUTO = 'auto'
|
||||
export const HTTP_PROTOCOL_HTTP1 = 'http1'
|
||||
export const MAX_HTTP2_CONNECTION_SHARDS = 8
|
||||
|
||||
export function normalizeHttpProtocol(
|
||||
value: string | undefined | null
|
||||
): 'auto' | 'http1' {
|
||||
const normalized = String(value || '')
|
||||
.trim()
|
||||
.toLowerCase()
|
||||
if (normalized === HTTP_PROTOCOL_HTTP1) {
|
||||
return HTTP_PROTOCOL_HTTP1
|
||||
}
|
||||
return HTTP_PROTOCOL_AUTO
|
||||
}
|
||||
|
||||
export function normalizeHttp2ConnectionShards(
|
||||
value: number | undefined | null
|
||||
): number {
|
||||
if (value == null || Number.isNaN(value) || value === 0) {
|
||||
return 1
|
||||
}
|
||||
if (value < 1) {
|
||||
return 1
|
||||
}
|
||||
if (value > MAX_HTTP2_CONNECTION_SHARDS) {
|
||||
return MAX_HTTP2_CONNECTION_SHARDS
|
||||
}
|
||||
return value
|
||||
}
|
||||
|
||||
function parseOptionalJson(value: string | undefined): unknown {
|
||||
if (!value?.trim()) return undefined
|
||||
return JSON.parse(value)
|
||||
@@ -225,6 +256,8 @@ export const channelFormSchema = z
|
||||
.string()
|
||||
.optional()
|
||||
.refine(isOptionalProxyURL, ERROR_MESSAGES.INVALID_PROXY),
|
||||
http_protocol: z.enum(['auto', 'http1']).optional(),
|
||||
http2_connection_shards: z.number().int().optional(),
|
||||
pass_through_body_enabled: z.boolean().optional(),
|
||||
system_prompt: z.string().optional(),
|
||||
system_prompt_override: z.boolean().optional(),
|
||||
@@ -340,6 +373,23 @@ export const channelFormSchema = z
|
||||
'Vertex AI API Key mode does not support batch creation'
|
||||
)
|
||||
}
|
||||
|
||||
const protocol = normalizeHttpProtocol(data.http_protocol)
|
||||
const shards = data.http2_connection_shards ?? 1
|
||||
if (shards < 1 || shards > MAX_HTTP2_CONNECTION_SHARDS) {
|
||||
addRequiredIssue(
|
||||
ctx,
|
||||
'http2_connection_shards',
|
||||
ERROR_MESSAGES.INVALID_HTTP2_CONNECTION_SHARDS
|
||||
)
|
||||
}
|
||||
if (protocol === HTTP_PROTOCOL_HTTP1 && shards > 1) {
|
||||
addRequiredIssue(
|
||||
ctx,
|
||||
'http2_connection_shards',
|
||||
ERROR_MESSAGES.INVALID_HTTP1_WITH_SHARDS
|
||||
)
|
||||
}
|
||||
})
|
||||
|
||||
export type ChannelFormValues = z.infer<typeof channelFormSchema>
|
||||
@@ -378,6 +428,8 @@ export const CHANNEL_FORM_DEFAULT_VALUES: ChannelFormValues = {
|
||||
force_format: false,
|
||||
thinking_to_content: false,
|
||||
proxy: '',
|
||||
http_protocol: HTTP_PROTOCOL_AUTO,
|
||||
http2_connection_shards: 1,
|
||||
pass_through_body_enabled: false,
|
||||
system_prompt: '',
|
||||
system_prompt_override: false,
|
||||
@@ -416,6 +468,8 @@ export function transformChannelToFormDefaults(
|
||||
force_format: false,
|
||||
thinking_to_content: false,
|
||||
proxy: '',
|
||||
http_protocol: HTTP_PROTOCOL_AUTO as 'auto' | 'http1',
|
||||
http2_connection_shards: 1,
|
||||
pass_through_body_enabled: false,
|
||||
system_prompt: '',
|
||||
system_prompt_override: false,
|
||||
@@ -424,10 +478,17 @@ export function transformChannelToFormDefaults(
|
||||
if (channel.setting) {
|
||||
try {
|
||||
const parsed = JSON.parse(channel.setting)
|
||||
const protocol = normalizeHttpProtocol(parsed.http_protocol)
|
||||
const shards = normalizeHttp2ConnectionShards(
|
||||
parsed.http2_connection_shards
|
||||
)
|
||||
extraSettings = {
|
||||
force_format: parsed.force_format || false,
|
||||
thinking_to_content: parsed.thinking_to_content || false,
|
||||
proxy: parsed.proxy || '',
|
||||
http_protocol: protocol,
|
||||
http2_connection_shards:
|
||||
protocol === HTTP_PROTOCOL_HTTP1 ? 1 : shards,
|
||||
pass_through_body_enabled: parsed.pass_through_body_enabled || false,
|
||||
system_prompt: parsed.system_prompt || '',
|
||||
system_prompt_override: parsed.system_prompt_override || false,
|
||||
@@ -540,8 +601,8 @@ export function transformChannelToFormDefaults(
|
||||
/**
|
||||
* Build the setting JSON string from form extra settings
|
||||
*/
|
||||
function buildSettingJSON(formData: ChannelFormValues): string {
|
||||
const settingObj = {
|
||||
export function buildSettingJSON(formData: ChannelFormValues): string {
|
||||
const settingObj: Record<string, unknown> = {
|
||||
force_format: formData.force_format || false,
|
||||
thinking_to_content: formData.thinking_to_content || false,
|
||||
proxy: formData.proxy?.trim() || '',
|
||||
@@ -549,6 +610,20 @@ function buildSettingJSON(formData: ChannelFormValues): string {
|
||||
system_prompt: formData.system_prompt || '',
|
||||
system_prompt_override: formData.system_prompt_override || false,
|
||||
}
|
||||
|
||||
const protocol = normalizeHttpProtocol(formData.http_protocol)
|
||||
const shards =
|
||||
protocol === HTTP_PROTOCOL_HTTP1
|
||||
? 1
|
||||
: normalizeHttp2ConnectionShards(formData.http2_connection_shards)
|
||||
|
||||
// Omit defaults so unchanged channels keep equivalent JSON.
|
||||
if (protocol === HTTP_PROTOCOL_HTTP1) {
|
||||
settingObj.http_protocol = HTTP_PROTOCOL_HTTP1
|
||||
} else if (shards > 1) {
|
||||
settingObj.http2_connection_shards = shards
|
||||
}
|
||||
|
||||
return JSON.stringify(settingObj)
|
||||
}
|
||||
|
||||
|
||||
@@ -86,6 +86,8 @@ export interface ChannelSettings {
|
||||
pass_through_body_enabled?: boolean
|
||||
system_prompt?: string
|
||||
system_prompt_override?: boolean
|
||||
http_protocol?: 'auto' | 'http1' | string
|
||||
http2_connection_shards?: number
|
||||
}
|
||||
|
||||
export interface ChannelOtherSettings {
|
||||
|
||||
@@ -503,6 +503,7 @@
|
||||
"Auto Disabled": "Auto Disabled",
|
||||
"Auto group behavior": "Auto group behavior",
|
||||
"Auto Group Chain": "Auto Group Chain",
|
||||
"Auto negotiates HTTP/2 when available. HTTP/1.1 forces multiple keep-alive connections under concurrency.": "Auto negotiates HTTP/2 when available. HTTP/1.1 forces multiple keep-alive connections under concurrency.",
|
||||
"Auto refresh": "Auto refresh",
|
||||
"Auto Sync Upstream Models": "Auto Sync Upstream Models",
|
||||
"Auto-disable rules": "Auto-disable rules",
|
||||
@@ -2226,6 +2227,13 @@
|
||||
"How to reset my quota?": "How to reset my quota?",
|
||||
"How to select keys: random or sequential polling": "How to select keys: random or sequential polling",
|
||||
"How will you use the platform?": "How will you use the platform?",
|
||||
"HTTP Protocol": "HTTP Protocol",
|
||||
"HTTP protocol must be Auto or HTTP/1.1": "HTTP protocol must be Auto or HTTP/1.1",
|
||||
"HTTP/1.1": "HTTP/1.1",
|
||||
"HTTP/2 Connection Shards": "HTTP/2 Connection Shards",
|
||||
"HTTP/2 connection shards are unavailable when HTTP/1.1 is selected.": "HTTP/2 connection shards are unavailable when HTTP/1.1 is selected.",
|
||||
"HTTP/2 connection shards must be 1 when HTTP/1.1 is selected": "HTTP/2 connection shards must be 1 when HTTP/1.1 is selected",
|
||||
"HTTP/2 connection shards must be between 1 and 8": "HTTP/2 connection shards must be between 1 and 8",
|
||||
"https://api.day.app/yourkey/{{title}}/{{content}}": "https://api.day.app/yourkey/{{title}}/{{content}}",
|
||||
"https://api.example.com": "https://api.example.com",
|
||||
"https://ark.ap-southeast.bytepluses.com": "https://ark.ap-southeast.bytepluses.com",
|
||||
@@ -4250,6 +4258,7 @@
|
||||
"Special usable group rules make extra token groups visible to, or hide default ones from, users of a specific user group.": "Special usable group rules make extra token groups visible to, or hide default ones from, users of a specific user group.",
|
||||
"Special visibility rules": "Special visibility rules",
|
||||
"Spend limited": "Spend limited",
|
||||
"Spread HTTP/2 traffic across multiple reusable connections to the same upstream origin (1-8).": "Spread HTTP/2 traffic across multiple reusable connections to the same upstream origin (1-8).",
|
||||
"SQLite stores all data in a single file. Make sure that file is persisted when running in containers.": "SQLite stores all data in a single file. Make sure that file is persisted when running in containers.",
|
||||
"SSL/TLS": "SSL/TLS",
|
||||
"SSRF Protection": "SSRF Protection",
|
||||
|
||||
@@ -503,6 +503,7 @@
|
||||
"Auto Disabled": "Désactivé automatiquement",
|
||||
"Auto group behavior": "Comportement du groupe auto",
|
||||
"Auto Group Chain": "Chaîne de groupes automatique",
|
||||
"Auto negotiates HTTP/2 when available. HTTP/1.1 forces multiple keep-alive connections under concurrency.": "Le mode Auto négocie HTTP/2 lorsque c’est disponible. HTTP/1.1 force plusieurs connexions keep-alive en concurrence.",
|
||||
"Auto refresh": "Actualisation automatique",
|
||||
"Auto Sync Upstream Models": "Synchronisation automatique des modèles en amont",
|
||||
"Auto-disable rules": "Règles de désactivation automatique",
|
||||
@@ -2226,6 +2227,13 @@
|
||||
"How to reset my quota?": "Comment réinitialiser mon quota ?",
|
||||
"How to select keys: random or sequential polling": "Comment sélectionner les clés : sondage aléatoire ou séquentiel",
|
||||
"How will you use the platform?": "Comment allez-vous utiliser la plateforme ?",
|
||||
"HTTP Protocol": "Protocole HTTP",
|
||||
"HTTP protocol must be Auto or HTTP/1.1": "Le protocole HTTP doit être Auto ou HTTP/1.1",
|
||||
"HTTP/1.1": "HTTP/1.1",
|
||||
"HTTP/2 Connection Shards": "Fragments de connexion HTTP/2",
|
||||
"HTTP/2 connection shards are unavailable when HTTP/1.1 is selected.": "Les fragments de connexion HTTP/2 sont indisponibles lorsque HTTP/1.1 est sélectionné.",
|
||||
"HTTP/2 connection shards must be 1 when HTTP/1.1 is selected": "Les fragments de connexion HTTP/2 doivent être 1 lorsque HTTP/1.1 est sélectionné",
|
||||
"HTTP/2 connection shards must be between 1 and 8": "Les fragments de connexion HTTP/2 doivent être compris entre 1 et 8",
|
||||
"https://api.day.app/yourkey/{{title}}/{{content}}": "https://api.day.app/yourkey/{{title}}/{{content}}",
|
||||
"https://api.example.com": "https://api.example.com",
|
||||
"https://ark.ap-southeast.bytepluses.com": "https://ark.ap-southeast.bytepluses.com",
|
||||
@@ -4250,6 +4258,7 @@
|
||||
"Special usable group rules make extra token groups visible to, or hide default ones from, users of a specific user group.": "Les règles de groupes utilisables spéciaux rendent des groupes de jetons supplémentaires visibles pour les utilisateurs d’un groupe donné, ou leur masquent des groupes par défaut.",
|
||||
"Special visibility rules": "Règles de visibilité spéciales",
|
||||
"Spend limited": "Dépenses limitées",
|
||||
"Spread HTTP/2 traffic across multiple reusable connections to the same upstream origin (1-8).": "Répartit le trafic HTTP/2 sur plusieurs connexions réutilisables vers la même origine amont (1-8).",
|
||||
"SQLite stores all data in a single file. Make sure that file is persisted when running in containers.": "SQLite stocke toutes les données dans un seul fichier. Assurez-vous que ce fichier est persisté lors de l'exécution dans des conteneurs.",
|
||||
"SSL/TLS": "SSL/TLS",
|
||||
"SSRF Protection": "Protection SSRF",
|
||||
|
||||
@@ -503,6 +503,7 @@
|
||||
"Auto Disabled": "自動無効化",
|
||||
"Auto group behavior": "auto グループの動作",
|
||||
"Auto Group Chain": "自動グループチェーン",
|
||||
"Auto negotiates HTTP/2 when available. HTTP/1.1 forces multiple keep-alive connections under concurrency.": "自動は利用可能な場合に HTTP/2 を交渉します。HTTP/1.1 は同時実行時に複数のキープアライブ接続を使用します。",
|
||||
"Auto refresh": "自動更新",
|
||||
"Auto Sync Upstream Models": "アップストリームモデルの自動同期",
|
||||
"Auto-disable rules": "自動無効化ルール",
|
||||
@@ -2226,6 +2227,13 @@
|
||||
"How to reset my quota?": "クォータをリセットするには?",
|
||||
"How to select keys: random or sequential polling": "キーの選択方法: ランダムまたは順次ポーリング",
|
||||
"How will you use the platform?": "プラットフォームをどのように使用しますか?",
|
||||
"HTTP Protocol": "HTTP プロトコル",
|
||||
"HTTP protocol must be Auto or HTTP/1.1": "HTTP プロトコルは自動または HTTP/1.1 である必要があります",
|
||||
"HTTP/1.1": "HTTP/1.1",
|
||||
"HTTP/2 Connection Shards": "HTTP/2 接続シャード",
|
||||
"HTTP/2 connection shards are unavailable when HTTP/1.1 is selected.": "HTTP/1.1 選択時は HTTP/2 接続シャードを使用できません。",
|
||||
"HTTP/2 connection shards must be 1 when HTTP/1.1 is selected": "HTTP/1.1 選択時、HTTP/2 接続シャードは 1 である必要があります",
|
||||
"HTTP/2 connection shards must be between 1 and 8": "HTTP/2 接続シャードは 1 から 8 の間である必要があります",
|
||||
"https://api.day.app/yourkey/{{title}}/{{content}}": "https://api.day.app/yourkey/{{title}}/{{content}}",
|
||||
"https://api.example.com": "https://api.example.com",
|
||||
"https://ark.ap-southeast.bytepluses.com": "https://ark.ap-southeast.bytepluses.com",
|
||||
@@ -4250,6 +4258,7 @@
|
||||
"Special usable group rules make extra token groups visible to, or hide default ones from, users of a specific user group.": "特殊利用可能グループルールにより、特定ユーザーグループのユーザーに追加のトークングループを表示したり、デフォルトのものを非表示にしたりできます。",
|
||||
"Special visibility rules": "特殊表示ルール",
|
||||
"Spend limited": "支出制限中",
|
||||
"Spread HTTP/2 traffic across multiple reusable connections to the same upstream origin (1-8).": "同一上流オリジンへの再利用可能な複数接続に HTTP/2 トラフィックを分散します(1-8)。",
|
||||
"SQLite stores all data in a single file. Make sure that file is persisted when running in containers.": "SQLite はすべてのデータを単一ファイルに保存します。コンテナで実行する場合は、ファイルが永続化されていることを確認してください。",
|
||||
"SSL/TLS": "SSL/TLS",
|
||||
"SSRF Protection": "SSRF保護",
|
||||
|
||||
@@ -503,6 +503,7 @@
|
||||
"Auto Disabled": "Автоматически отключено",
|
||||
"Auto group behavior": "Поведение группы auto",
|
||||
"Auto Group Chain": "Автоматическая цепочка групп",
|
||||
"Auto negotiates HTTP/2 when available. HTTP/1.1 forces multiple keep-alive connections under concurrency.": "Авто согласовывает HTTP/2 при наличии. HTTP/1.1 использует несколько keep-alive соединений при параллельных запросах.",
|
||||
"Auto refresh": "Автообновление",
|
||||
"Auto Sync Upstream Models": "Автоматическая синхронизация моделей провайдера",
|
||||
"Auto-disable rules": "Правила автоотключения",
|
||||
@@ -2226,6 +2227,13 @@
|
||||
"How to reset my quota?": "Как сбросить мою квоту?",
|
||||
"How to select keys: random or sequential polling": "Как выбирать ключи: случайно или последовательный опрос",
|
||||
"How will you use the platform?": "Как вы будете использовать платформу?",
|
||||
"HTTP Protocol": "HTTP-протокол",
|
||||
"HTTP protocol must be Auto or HTTP/1.1": "HTTP-протокол должен быть Auto или HTTP/1.1",
|
||||
"HTTP/1.1": "HTTP/1.1",
|
||||
"HTTP/2 Connection Shards": "Шарды соединений HTTP/2",
|
||||
"HTTP/2 connection shards are unavailable when HTTP/1.1 is selected.": "Шарды соединений HTTP/2 недоступны при выборе HTTP/1.1.",
|
||||
"HTTP/2 connection shards must be 1 when HTTP/1.1 is selected": "При выборе HTTP/1.1 число шардов соединений HTTP/2 должно быть 1",
|
||||
"HTTP/2 connection shards must be between 1 and 8": "Число шардов соединений HTTP/2 должно быть от 1 до 8",
|
||||
"https://api.day.app/yourkey/{{title}}/{{content}}": "https://api.day.app/yourkey/{{title}}/{{content}}",
|
||||
"https://api.example.com": "https://api.example.com",
|
||||
"https://ark.ap-southeast.bytepluses.com": "https://ark.ap-southeast.bytepluses.com",
|
||||
@@ -4250,6 +4258,7 @@
|
||||
"Special usable group rules make extra token groups visible to, or hide default ones from, users of a specific user group.": "Правила особых доступных групп показывают дополнительные группы токенов пользователям определённой группы или скрывают от них группы по умолчанию.",
|
||||
"Special visibility rules": "Особые правила видимости",
|
||||
"Spend limited": "Ограничение расходов",
|
||||
"Spread HTTP/2 traffic across multiple reusable connections to the same upstream origin (1-8).": "Распределяет трафик HTTP/2 по нескольким переиспользуемым соединениям к одному upstream-источнику (1-8).",
|
||||
"SQLite stores all data in a single file. Make sure that file is persisted when running in containers.": "SQLite хранит все данные в одном файле. Убедитесь, что файл сохраняется при работе в контейнерах.",
|
||||
"SSL/TLS": "SSL/TLS",
|
||||
"SSRF Protection": "Защита от SSRF",
|
||||
|
||||
@@ -503,6 +503,7 @@
|
||||
"Auto Disabled": "Vô hiệu hóa tự động",
|
||||
"Auto group behavior": "Cách hoạt động của nhóm auto",
|
||||
"Auto Group Chain": "Chuỗi nhóm tự động",
|
||||
"Auto negotiates HTTP/2 when available. HTTP/1.1 forces multiple keep-alive connections under concurrency.": "Tự động đàm phán HTTP/2 khi khả dụng. HTTP/1.1 buộc dùng nhiều kết nối keep-alive khi có đồng thời.",
|
||||
"Auto refresh": "Tự động làm mới",
|
||||
"Auto Sync Upstream Models": "Tự động đồng bộ mô hình nguồn",
|
||||
"Auto-disable rules": "Quy tắc tự động tắt",
|
||||
@@ -2226,6 +2227,13 @@
|
||||
"How to reset my quota?": "Cách đặt lại hạn mức của tôi?",
|
||||
"How to select keys: random or sequential polling": "Cách chọn khóa: thăm dò ngẫu nhiên hay tuần tự",
|
||||
"How will you use the platform?": "Bạn sẽ sử dụng nền tảng như thế nào?",
|
||||
"HTTP Protocol": "Giao thức HTTP",
|
||||
"HTTP protocol must be Auto or HTTP/1.1": "Giao thức HTTP phải là Tự động hoặc HTTP/1.1",
|
||||
"HTTP/1.1": "HTTP/1.1",
|
||||
"HTTP/2 Connection Shards": "Phân mảnh kết nối HTTP/2",
|
||||
"HTTP/2 connection shards are unavailable when HTTP/1.1 is selected.": "Không thể dùng phân mảnh kết nối HTTP/2 khi chọn HTTP/1.1.",
|
||||
"HTTP/2 connection shards must be 1 when HTTP/1.1 is selected": "Khi chọn HTTP/1.1, phân mảnh kết nối HTTP/2 phải là 1",
|
||||
"HTTP/2 connection shards must be between 1 and 8": "Phân mảnh kết nối HTTP/2 phải từ 1 đến 8",
|
||||
"https://api.day.app/yourkey/{{title}}/{{content}}": "https://api.day.app/yourkey/{{title}}/{{content}}",
|
||||
"https://api.example.com": "https://api.example.com",
|
||||
"https://ark.ap-southeast.bytepluses.com": "https://ark.ap-southeast.bytepluses.com",
|
||||
@@ -4250,6 +4258,7 @@
|
||||
"Special usable group rules make extra token groups visible to, or hide default ones from, users of a specific user group.": "Quy tắc nhóm khả dụng đặc biệt hiển thị thêm nhóm token cho người dùng của một nhóm cụ thể, hoặc ẩn các nhóm mặc định khỏi họ.",
|
||||
"Special visibility rules": "Quy tắc hiển thị đặc biệt",
|
||||
"Spend limited": "Đã giới hạn chi tiêu",
|
||||
"Spread HTTP/2 traffic across multiple reusable connections to the same upstream origin (1-8).": "Phân tán lưu lượng HTTP/2 trên nhiều kết nối tái sử dụng tới cùng một nguồn upstream (1-8).",
|
||||
"SQLite stores all data in a single file. Make sure that file is persisted when running in containers.": "SQLite lưu trữ tất cả dữ liệu trong một tệp duy nhất. Đảm bảo tệp được lưu trữ lâu dài khi chạy trong container.",
|
||||
"SSL/TLS": "SSL/TLS",
|
||||
"SSRF Protection": "Bảo vệ SSRF",
|
||||
|
||||
@@ -503,6 +503,7 @@
|
||||
"Auto Disabled": "自動停用",
|
||||
"Auto group behavior": "自動分組行為",
|
||||
"Auto Group Chain": "自動分組鏈",
|
||||
"Auto negotiates HTTP/2 when available. HTTP/1.1 forces multiple keep-alive connections under concurrency.": "自動在可用時協商 HTTP/2。HTTP/1.1 會在並發時使用多條保持連線的連線。",
|
||||
"Auto refresh": "自動重新整理",
|
||||
"Auto Sync Upstream Models": "自動同步上游模型",
|
||||
"Auto-disable rules": "自動停用規則",
|
||||
@@ -2226,6 +2227,13 @@
|
||||
"How to reset my quota?": "如何重置我的配額?",
|
||||
"How to select keys: random or sequential polling": "金鑰選擇方式:隨機或順序輪詢",
|
||||
"How will you use the platform?": "您將如何使用本平台?",
|
||||
"HTTP Protocol": "HTTP 協定",
|
||||
"HTTP protocol must be Auto or HTTP/1.1": "HTTP 協定必須是自動或 HTTP/1.1",
|
||||
"HTTP/1.1": "HTTP/1.1",
|
||||
"HTTP/2 Connection Shards": "HTTP/2 連線分片",
|
||||
"HTTP/2 connection shards are unavailable when HTTP/1.1 is selected.": "選擇 HTTP/1.1 時無法使用 HTTP/2 連線分片。",
|
||||
"HTTP/2 connection shards must be 1 when HTTP/1.1 is selected": "選擇 HTTP/1.1 時,HTTP/2 連線分片必須為 1",
|
||||
"HTTP/2 connection shards must be between 1 and 8": "HTTP/2 連線分片必須在 1 到 8 之間",
|
||||
"https://api.day.app/yourkey/{{title}}/{{content}}": "https://api.day.app/yourkey/{{title}}/{{content}}",
|
||||
"https://api.example.com": "https://api.example.com",
|
||||
"https://ark.ap-southeast.bytepluses.com": "https://ark.ap-southeast.bytepluses.com",
|
||||
@@ -4250,6 +4258,7 @@
|
||||
"Special usable group rules make extra token groups visible to, or hide default ones from, users of a specific user group.": "特殊可用分組規則可以讓特定用戶分組的用戶額外看到某些令牌分組,或對其屏蔽預設可選的令牌分組。",
|
||||
"Special visibility rules": "特殊可見性規則",
|
||||
"Spend limited": "消費受限",
|
||||
"Spread HTTP/2 traffic across multiple reusable connections to the same upstream origin (1-8).": "將 HTTP/2 流量分散到同一上游來源的多條可重用連線(1-8)。",
|
||||
"SQLite stores all data in a single file. Make sure that file is persisted when running in containers.": "SQLite 將所有數據儲存在單個檔案中。在容器中執行時請確保該檔案已持久化。",
|
||||
"SSL/TLS": "SSL/TLS",
|
||||
"SSRF Protection": "SSRF 保護",
|
||||
|
||||
@@ -503,6 +503,7 @@
|
||||
"Auto Disabled": "自动禁用",
|
||||
"Auto group behavior": "自动分组行为",
|
||||
"Auto Group Chain": "自动分组链",
|
||||
"Auto negotiates HTTP/2 when available. HTTP/1.1 forces multiple keep-alive connections under concurrency.": "自动在可用时协商 HTTP/2。HTTP/1.1 会在并发时使用多条保持连接的连接。",
|
||||
"Auto refresh": "自动刷新",
|
||||
"Auto Sync Upstream Models": "自动同步上游模型",
|
||||
"Auto-disable rules": "自动禁用规则",
|
||||
@@ -2226,6 +2227,13 @@
|
||||
"How to reset my quota?": "如何重置我的配额?",
|
||||
"How to select keys: random or sequential polling": "密钥选择方式:随机或顺序轮询",
|
||||
"How will you use the platform?": "您将如何使用本平台?",
|
||||
"HTTP Protocol": "HTTP 协议",
|
||||
"HTTP protocol must be Auto or HTTP/1.1": "HTTP 协议必须是自动或 HTTP/1.1",
|
||||
"HTTP/1.1": "HTTP/1.1",
|
||||
"HTTP/2 Connection Shards": "HTTP/2 连接分片",
|
||||
"HTTP/2 connection shards are unavailable when HTTP/1.1 is selected.": "选择 HTTP/1.1 时不可用 HTTP/2 连接分片。",
|
||||
"HTTP/2 connection shards must be 1 when HTTP/1.1 is selected": "选择 HTTP/1.1 时,HTTP/2 连接分片必须为 1",
|
||||
"HTTP/2 connection shards must be between 1 and 8": "HTTP/2 连接分片必须在 1 到 8 之间",
|
||||
"https://api.day.app/yourkey/{{title}}/{{content}}": "https://api.day.app/yourkey/{{title}}/{{content}}",
|
||||
"https://api.example.com": "https://api.example.com",
|
||||
"https://ark.ap-southeast.bytepluses.com": "https://ark.ap-southeast.bytepluses.com",
|
||||
@@ -4250,6 +4258,7 @@
|
||||
"Special usable group rules make extra token groups visible to, or hide default ones from, users of a specific user group.": "特殊可用分组规则可以让特定用户分组的用户额外看到某些令牌分组,或对其屏蔽默认可选的令牌分组。",
|
||||
"Special visibility rules": "特殊可见性规则",
|
||||
"Spend limited": "消费受限",
|
||||
"Spread HTTP/2 traffic across multiple reusable connections to the same upstream origin (1-8).": "将 HTTP/2 流量分散到同一上游源站的多条可复用连接(1-8)。",
|
||||
"SQLite stores all data in a single file. Make sure that file is persisted when running in containers.": "SQLite 将所有数据存储在单个文件中。在容器中运行时请确保该文件已持久化。",
|
||||
"SSL/TLS": "SSL/TLS",
|
||||
"SSRF Protection": "SSRF 保护",
|
||||
|
||||
Reference in New Issue
Block a user